LinuxCNC Documentation

1. Вступ

PyVCP, віртуальний контрольний модуль Python, розроблений для того, щоб інтегратор міг налаштовувати інтерфейс AXIS за допомогою кнопок та індикаторів для виконання спеціальних завдань.

Панелі керування апаратними засобами можуть використовувати багато контактів вводу/виводу та бути дорогими. Саме тут віртуальні панелі керування мають перевагу, оскільки створення PyVCP нічого не коштує.

Віртуальні панелі керування можуть використовуватися для тестування або моніторингу, щоб тимчасово замінити реальні пристрої вводу-виводу під час налагодження логіки релейно-контактних схем, або для імітації фізичної панелі перед її побудовою та підключенням до плати вводу-виводу.

На наступному малюнку показано багато віджетів PyVCP.

pyvcp group
Figure 1. Презентація віджетів PyVCP

2. Панельне будівництво

Макет панелі PyVCP визначається за допомогою XML-файлу, який містить теги віджетів між <pyvcp> та </pyvcp>. Наприклад:

<pyvcp>
    <label text="This is a LED indicator"/>
    <led/>
</pyvcp>
pyvcp mypanel
Figure 2. Простий приклад світлодіодної панелі PyVCP

Якщо ви помістите цей текст у файл з назвою tiny.xml та запустите

halcmd loadusr pyvcp -c mypanel tiny.xml

PyVCP will create the panel for you, which includes two widgets, a Label with the text This is a LED indicator, and a LED, used for displaying the state of a HAL BOOL signal. It will also create a HAL component named mypanel (all widgets in this panel are connected to pins that start with mypanel.). Since no <halpin> tag was present inside the <led> tag, PyVCP will automatically name the HAL pin for the LED widget mypanel.led.0

Список віджетів, їхніх тегів і опцій дивіться у widget reference нижче.

Після створення панелі підключення сигналів HAL до та від контактів PyVCP виконується за допомогою halcmd:

net <signal-name> <pin-name> <opt-direction> <opt-pin-name>signal-name

Якщо ви новачок у HAL, розділ основ HAL у посібнику інтегратора – гарне місце для початку.

3. Безпека

Частини файлів PyVCP оцінюються як код Python і можуть виконувати будь-які дії, доступні програмам Python. Використовуйте XML-файли PyVCP лише з джерела, якому ви довіряєте.

4. AXIS

Since AXIS uses the same GUI toolkit (Tkinter) as PyVCP, it is possible to include a PyVCP panel at either the right side or the bottom of the AXIS user interface. It is not possible to display a panel in both of these positions simultaneously. A typical example is explained below.

На додаток до або замість відображення панелі PyVCP, як описано вище, можна відобразити одну або кілька панелей PyVCP у вигляді вбудованих вкладок у графічному інтерфейсі AXIS. Це можна зробити, виконавши наступні дії в розділі [DISPLAY] файлу INI:

EMBED_TAB_NAME    = Spindle
EMBED_TAB_COMMAND = pyvcp spindle.xml

Текстова позначка вкладки AXIS відображатиме «Шпиндель».

4.1. Приклад панелі

Помістіть файл PyVCP XML, що описує панель, у той самий каталог, де знаходиться файл INI. Припустимо, ми хочемо відобразити поточну швидкість шпинделя за допомогою віджета Bar. Помістіть наступне у файл під назвою spindle.xml:

<pyvcp>
    <label>
        <text>"Spindle speed:"</text>
    </label>
    <bar>
        <halpin>"spindle-speed"</halpin>
        <max_>5000</max_>
    </bar>
</pyvcp>

Тут ми створили панель з етикеткою та віджетом Bar, вказали, що контакт HAL, підключений до Bar, повинен називатися «spindle-speed», і встановили максимальне значення смуги на 5000 (див. widget reference нижче для всіх опцій). Щоб AXIS розпізнав цей файл і викликав його під час запуску, нам потрібно вказати наступне в розділі [DISPLAY] файлу INI:

PYVCP = spindle.xml

Якщо панель має відображатися внизу інтерфейсу користувача AXIS, нам потрібно вказати наступне в розділі [DISPLAY] INI-файлу:

PYVCP_POSITION = BOTTOM

Будь-яке значення, відмінне від BOTTOM, або пропуск цієї змінної розмістить панель PYVCP праворуч.

Щоб наш віджет фактично відображав швидкість обертання шпинделя, його потрібно підключити до відповідного сигналу HAL. Файл HAL, який буде запущений після запуску AXIS і PyVCP, можна вказати в розділі [HAL] файлу INI:

POSTGUI_HALFILE = spindle_to_pyvcp.hal

Ця зміна призведе до запуску команд HAL, зазначених у spindle_to_pyvcp.hal. У нашому прикладі вміст може виглядати так:

net spindle-rpm-filtered => pyvcp.spindle-speed

припускаючи, що сигнал під назвою «spindle-rpm-filtered» вже існує. Зверніть увагу, що під час роботи разом з AXIS усі виводи HAL віджетів панелі PyVCP мають імена, що починаються з «pyvcp.», а всі виводи HAL вбудованих віджетів вкладок PyVCP починаються з імені, вказаного як EMBED_TAB_NAME, перетвореного в нижній регістр.

pyvcp axis lathe

Ось як має виглядати щойно створена панель PyVCP в AXIS. Конфігурація sim/lathe вже налаштована таким чином.

5. Окремо стояти

У цьому розділі описано, як панелі PyVCP можуть відображатися окремо з контролером верстата LinuxCNC або без нього.

Щоб завантажити окрему панель PyVCP за допомогою LinuxCNC, використовуйте ці команди:

loadusr -Wn mypanel pyvcp -g WxH+X+Y -c mypanel <path/>panel_file.xml

Ви б використовували це, якщо б вам потрібна плаваюча панель або панель з графічним інтерфейсом, відмінним від AXIS.

  • -Wn panelname - змушує HAL чекати, поки компонент panelname закінчить завантаження (стане готовим в термінології HAL), перш ніж обробляти інші команди HAL. Це важливо, оскільки панелі PyVCP експортують контакти HAL, а інші компоненти HAL потребують їх наявності для підключення. Зверніть увагу на велику літеру W і малу літеру n. Якщо ви використовуєте опцію -Wn, ви повинні використовувати опцію -c для присвоєння імені панелі.

  • pyvcp < -g> < -c> panel.xml - створює панель з опціональною геометрією та/або назвою панелі з XML-файлу панелі. Файл panel.xml може мати будь-яку назву, що закінчується на .xml. Файл .xml - це файл, що описує, як створити панель. Ви повинні додати ім’я шляху, якщо панель не знаходиться в каталозі, де знаходиться скрипт HAL.

  • -g <WxH><+X+Y> - визначає геометрію, яка буде використовуватися при побудові панелі. Синтаксис: Ширина x Висота + X Анкер + Y Анкер. Ви можете встановити розмір, положення або і те, і інше. Точка прив’язки — це верхній лівий кут панелі. Приклад: -g 250x500+800+0. Це встановлює ширину панелі 250 пікселів, висоту 500 пікселів і прив’язує її до X800 Y0.

  • -c назва_панелі – повідомляє PyVCP, як називати компонент, а також назву вікна. Назва панелі може бути будь-якою без пробілів.

Щоб завантажити «окрему» панель PyVCP без LinuxCNC, використовуйте цю команду:

loadusr -Wn mypanel pyvcp -g 250x500+800+0 -c mypanel mypanel.xml

Мінімальна команда для завантаження панелі PyVCP:

loadusr pyvcp mypanel.xml

Ви б використовували це, якщо вам потрібна панель без контролера верстата LinuxCNC, наприклад, для тестування або автономного DRO.

Команда loadusr використовується, коли ви також завантажуєте компонент, який зупинить закриття HAL до завершення завантаження. Якщо ви завантажили панель, а потім завантажили Classic Ladder за допомогою loadusr -w classicladder, CL утримуватиме HAL відкритим (а також панель) доти, доки ви не закриєте CL. «-Wn» вище означає очікування, поки компонент «-Wn "name"» буде готовий. («name» може бути будь-яким іменем. Зверніть увагу на велику літеру W і малу літеру n.) -c вказує PyVCP створити панель з іменем «panelname» за допомогою інформації в «panel_file_name.xml». Ім’я «panel_file_name.xml» може бути будь-яким, але повинно закінчуватися на .xml — це файл, який описує, як створити панель. Ви повинні додати ім’я шляху, якщо панель не знаходиться в каталозі, в якому знаходиться скрипт HAL.

Додаткова команда, яку можна використовувати, якщо потрібно, щоб панель зупинила HAL від продовження команд / завершення роботи. Після завантаження будь-яких інших компонентів остання команда HAL має бути такою:

waitusr panelname

Це вказує HAL чекати закриття компонента «panelname», перш ніж продовжувати виконувати команди HAL. Зазвичай це встановлюється як остання команда, щоб HAL завершував роботу після закриття панелі.

6. Віджети

HAL signals come in two variants, bools and numbers. Bools are off/on signals. Numbers can be real, sint or uint. For more information on HAL data types see the HAL Data section. The PyVCP widget can either display the value of the signal with an indicator widget, or modify the signal value with a control widget. Thus there are four classes of PyVCP widgets that you can connect to a HAL signal. A fifth class of helper widgets allow you to organize and label your panel.

  • Widgets for indicating bool signals: led, rectled.

  • Widgets for controlling bool signals: button, checkbutton, radiobutton.

  • Widgets for indicating number signals: number, sint, uint, bar, meter.

  • Віджети для керування «числовими» сигналами: spinbox, scale, jogwheel.

  • Допоміжні віджети: hbox, vbox, table, label, labelframe.

6.1. Синтаксис

Кожен віджет коротко описується, потім вказано використану розмітку та зроблено знімок екрана. Усі теги всередині основного тегу віджета є необов’язковими.

6.2. Загальні примітки

Наразі підтримується синтаксис як на основі тегів, так і на основі атрибутів. Наприклад, наступні фрагменти XML обробляються однаково:

<led halpin="my-led"/>

і

<led><halpin>"my-led"</halpin></led>

Коли використовується синтаксис на основі атрибутів, для перетворення значення атрибута на значення Python використовуються такі правила:

  1. Якщо перший символ атрибута є одним із наведених нижче, він обчислюється як вираз Python: {(["' .

  2. Якщо рядок прийнято функцією int(), значення обробляється як ціле число.

  3. Якщо рядок приймається функцією float(), значення обробляється як число з плаваючою комою.

  4. В іншому випадку рядок приймається як рядок.

Коли використовується синтаксис на основі тегів, текст усередині тегу завжди обчислюється як вираз Python.

Наведені нижче приклади демонструють поєднання форматів.

Коментарі

Щоб додати коментар, використовуйте синтаксис XML для коментарів.

<!-- My Comment -->
Редагування XML-файлу

Відредагуйте XML-файл за допомогою текстового редактора. У більшості випадків ви можете клацнути правою кнопкою миші на файлі та вибрати «відкрити за допомогою текстового редактора» або щось подібне.

Кольори

Кольори можна вказати за допомогою кольорів X11 rgb за назвою «gray75» або шістнадцятковим числом «#0000ff». Повний список знаходиться тут https://sedition.com/perl/rgb.html.

Поширені Кольори (кольори з цифрами позначають відтінки цього кольору)

  • білий

  • чорний

  • синій та синій1 - 4

  • блакитний та блакитний1 - 4

  • зелений та зелений1 - 4

  • жовтий та жовтий1 - 4

  • червоний та червоний1 - 4

  • фіолетовий та пурпурний1 - 4

  • сірий та сірий0 - 100

Піни HAL

Контакти HAL забезпечують можливість «підключення» віджета до чогось. Після створення контакту HAL для віджета його можна «підключити» до іншого контакту HAL за допомогою команди «net» у файлі .hal. Докладнішу інформацію про команду «net» див. у розділі HAL Commands.

6.3. Мітка

Мітка – це спосіб додавання тексту до панелі.

  • <label></label> - створює мітку.

  • <text>"текст"</text> – текст, який потрібно вставити в підпис; порожній підпис можна використовувати як роздільник для вирівнювання інших об’єктів.

  • <font>("Helvetica",20)</font> - вкажіть шрифт і розмір тексту.

  • <relief>FLAT</relief> - вкажіть рамку навколо мітки («ПЛОСКАЯ», «ПІДНЯТА», «ЗАТОПЛАТА»), за замовчуванням — «ПЛОСКАЯ».

  • <bd>_n_</bd> - де n — ширина межі, коли використовуються межі типу «ПІДНЯТІ» або «ЗАГНУТІ».

  • <padx>_n_</padx> - де n – це кількість додаткового горизонтального простору.

  • <pady>_n_</pady> - де n – це кількість додаткового вертикального простору.

Мітка має додатковий PIN-код для відключення, який створюється під час додавання <disable_pin>True</disable_pin>.

<label>
    <text>"Це мітка:"</text>
    <font>("Helvetica",20)</font>
</label>

Наведений вище код створив цей приклад:

pyvcp label
Figure 3. Приклад простої етикетки

6.4. Багатомітка

Розширення текстової мітки.

Selectable text label, can display up to 6 label legends when associated bool pin is activated.

Приєднайте кожен контакт легенди до сигналу та отримайте описову мітку, коли сигнал має значення TRUE.

Якщо більше одного позначення має значення TRUE, буде відображено позначення з найбільшим номером «TRUE».

Якщо PIN-код відключення створено з параметром <disable_pin>True</disable_pin>, і для цього PIN-кода встановлено значення true, мітка змінить свій стан на сірий.

<multilabel>
    <legends>["Label1", "Label2", "Label3", "Label4", "Label5", "Label6"]</legends>
    <font>("Helvetica",20)</font>
    <disable_pin>True</disable_pin>
</multilabel>

У наведеному вище прикладі буде створено такі контакти.

pyvcp.multilabel.0.disable
pyvcp.multilabel.0.legend0
pyvcp.multilabel.0.legend1
pyvcp.multilabel.0.legend2
pyvcp.multilabel.0.legend3
pyvcp.multilabel.0.legend4
pyvcp.multilabel.0.legend5

Якщо у вас є більше однієї мультимітки, створені піни збільшуватимуть число ось так: pyvcp.multilabel.1.legend1.

6.5. LEDs

A LED is used to indicate the status of a bool halpin. The LED color will be on_color when the halpin is true, and off_color otherwise.

  • <led></led> - створює круглий світлодіод

  • <rectled></rectled> - створює прямокутний світлодіод

  • <halpin>name</halpin> – назва виводу, за замовчуванням – led.n, де n – ціле число, яке збільшується на 1 для кожного світлодіода.

  • <size>n</size> - n — розмір світлодіода в пікселях, за замовчуванням — 20.

  • <on_color>color</on_color> - встановлює колір світлодіода на color, коли вивід має значення true. За замовчуванням — «зелений». Див. розділ colors для отримання додаткової інформації.

  • <off_color>color</off_color> - встановлює колір світлодіода на color, коли контакт перебуває у стані хибності. За замовчуванням — «червоний».

  • <height>n</height> - встановлює висоту світлодіода в пікселях.

  • <width>n</width> - встановлює ширину світлодіода в пікселях.

  • <disable_pin>false</disable_pin> - коли значення true, до світлодіода додається контакт відключення.

  • <disabled_color>color</disabled_color> - встановлює колір світлодіода на color, коли контакт вимкнено.

Круглий світлодіод
<led>
    <halpin>"my-led"</halpin>
    <size>50</size>
    <on_color>"green"</on_color>
    <off_color>"red"</off_color>
</led>

Наведений вище код створив цей приклад:

pyvcp led
Figure 4. Приклад круглого світлодіода
Прямокутний світлодіод

Це варіант віджета «led».

<vbox>
    <relief>RIDGE</relief>
    <bd>6</bd>
    <rectled>
        <halpin>"my-led"</halpin>
        <height>"50"</height>
        <width>"100"</width>
        <on_color>"green"</on_color>
        <off_color>"red"</off_color>
    </rectled>
</vbox>

Наведений вище код створив цей приклад. Також показано вертикальну рамку з рельєфом.

pyvcp rectled
Figure 5. Простий приклад прямокутного світлодіода

6.6. Кпонки

A button is used to control a BOOL pin. The pin will be set True when the button is pressed and held down, and will be set False when the button is released. Buttons can use the following optional options.

  • <padx>n</padx> - де n – це кількість додаткового горизонтального простору.

  • <pady>n</pady> - де n – це кількість додаткового вертикального простору.

  • <activebackground>"color"</activebackground> - курсор над кольором встановлено на color.

  • <fg>"color"</fg> - колір переднього плану встановлено на color.

  • <bg>"color"</bg> - колір фону встановлено на color.

  • <disable_pin>True</disable_pin> – вимкнути закріплення.

Текстова кнопка

A text button controls a bool halpin. The halpin is false until the button is pressed then it is true. The button is a momentary button.

Текстова кнопка має необов’язковий PIN-код для відключення, який створюється після додавання <disable_pin>True</disable_pin>.

<button>
    <halpin>"ok-button"</halpin>
    <text>"OK"</text>
</button>
<button>
    <halpin>"abort-button"</halpin>
    <text>"Abort"</text>
</button>

Наведений вище код створив цей приклад:

pyvcp button
Figure 6. Приклад простих кнопок
Кнопка перевірки

A checkbutton controls a bool halpin. The halpin will be set True when the button is checked, and false when the button is unchecked. The checkbutton is a toggle type button. The checkbuttons may be set initially as TRUE or FALSE the initval field A pin called changepin is also created automatically, which can toggle the Checkbutton via HAL, if the value linked is changed, to update the display remotely.

pyvcp checkbutton1
Figure 7. Невизначена кнопка
pyvcp checkbutton2
Figure 8. Позначена кнопка
Приклад коду кнопки-перевірки
<checkbutton>
    <halpin>"coolant-chkbtn"</halpin>
    <text>"Coolant"</text>
    <initval>1</initval>
</checkbutton>
<checkbutton>
    <halpin>"chip-chkbtn"</halpin>
    <text>"Chips    "</text>
    <initval>0</initval>
</checkbutton>

Наведений вище код створив цей приклад:

pyvcp checkbutton
Figure 9. Простий приклад кнопки-перевірки

Кнопка перевірки охолоджувальної рідини позначена.
Зверніть увагу на додаткові пробіли в тексті «Стрічки», щоб вирівняти кнопки перевірки.

Перемикач

Радіо-кнопка встановить один з галпінів як істинний. Інші галпіни встановлюються як хибні. Поле initval може бути встановлено для вибору значення за замовчуванням при відображенні панелі. Тільки одна радіо-кнопка може бути встановлена як TRUE (1), або тільки галпін з найвищим номером, встановлений як TRUE, матиме це значення.

<radiobutton>
    <choices>["one","two","three"]</choices>
    <halpin>"my-radio"</halpin>
    <initval>0</initval>
</radiobutton>

Наведений вище код створив цей приклад:

pyvcp radiobutton
Figure 10. Простий приклад радіокнопки

Зверніть увагу, що контакти HAL у наведеному вище прикладі будуть називатися my-radio.one, my-radio.two та my-radio.three. На зображенні вище «one» є вибраним значенням. Використовуйте тег <orient>HORIZONTAL</orient> для горизонтального відображення.

6.7. Числові дисплеї

Числові відображення можуть використовувати такі параметри форматування

  • <font>("Font Name",n)</font>, де n – розмір шрифту.

  • <width>_n_</width>, де n – загальна ширина використаного простору.

  • <justify>_pos_</justify>, де pos має значення LEFT, CENTER або RIGHT (не працює).

  • <padx>_n_</padx>, де n – це кількість додаткового горизонтального простору.

  • <pady>_n_</pady>, де n – це кількість додаткового вертикального простору.

Номер

The number widget displays the value of a real signal.

<number>
    <halpin>"my-number"</halpin>
    <font>("Helvetica",24)</font>
    <format>"+4.4f"</format>
</number>

Наведений вище код створив цей приклад:

pyvcp number
Figure 11. Простий приклад числа
  • <font> - — це специфікація типу та розміру шрифту Tkinter. Один шрифт, який відображатиметься щонайменше до розміру 200, — це «courier 10 pitch», тому для справді великого віджета Number ви можете вказати:

<font>("courier 10 pitch",100)</font>
  • <format> - — це формат у стилі C, який визначає, як відображається число.

sint Number

The sint number widget displays the value of a sint number. The syntax is the same as number except the name which is <sint>. Make sure the width is wide enough to cover the largest number you expect to use. This was formerly known as <s32>, which is now an alias for <sint>.

<sint>
    <halpin>"my-number"</halpin>
    <font>("Helvetica",24)</font>
    <format>"6d"</format>
    <width>6</width>
</sint>

Наведений вище код створив цей приклад:

pyvcp s32
Figure 12. Simple sint Number Example
uint Number

The uint number widget displays the value of a uint number. The syntax is the same as number except the name which is <uint>. This was formerly known as <u32>, which is now an alias for <uint>.

Бар

A bar widget displays the value of a real signal both graphically using a bar display and numerically. The color of the bar can be set as one color throughout its range (default using fillcolor) or set to change color, dependent upon the value of the halpin (range1, range2 range3 must all be set, if you only want 2 ranges, set 2 of them to the same color).

  • <halpin>"my-bar"</halpin> (текст), отримує та встановлює назву піна: pyvcp.my-bar.

  • <min_>0</min_> (число), встановлює мінімальний масштаб.

  • <max_>140</max_> (число), встановлює максимальний масштаб.

  • <format>"3.1f"</format> (текст), встановлює формат числа за допомогою форматування чисел Python.

  • <bgcolor>"grey"</bgcolor> (текст), встановлює колір фону.

  • <fillcolor>"red"</fillcolor> (текст), встановлює колір заливки.

  • <range1>0,100,"green"</range1> (число, число, текст), встановлює перший діапазон і колір.

  • <range2>101,135,"orange"</range2> (число, число, текст), встановлює перший діапазон і колір.

  • <range3>136, 150,"red"</range3> число, число, текст), встановлює перший діапазон і колір.

  • <canvas_width>200</canvas_width> (число), встановлює загальну ширину.

  • <canvas_height>50</canvas_height> (число), встановлює загальну висоту.

  • <bar_height>30</bar_height> (число), встановлює висоту смуги, має бути меншою за canvas_height.

  • <bar_width>150</bar_width> (число), встановлює ширину смуги, має бути меншою за ширину_канаву.

<bar>
    <halpin>"my-bar"</halpin>
    <min_>0</min_>
    <max_>123</max_>
    <format>"3.1f"</format>
    <bgcolor>"grey"</bgcolor>
    <fillcolor>"red"</fillcolor>
    <range1>0,100,"green"</range1>
    <range2>101,135,"orange"</range2>
    <range3>136, 150,"red"</range3>
    <canvas_width>200</canvas_width>
    <canvas_height>50</canvas_height>
    <bar_height>30</bar_height>
    <bar_width>150</bar_width>
</bar>

Наведений вище код створив цей приклад:

pyvcp bar
Figure 13. Простий приклад бару
Метр

Meter displays the value of a real signal using a traditional dial indicator.

<meter>
    <halpin>"mymeter"</halpin>
    <text>"Battery"</text>
    <subtext>"Volts"</subtext>
    <size>250</size>
    <min_>0</min_>
    <max_>15.5</max_>
    <majorscale>1</majorscale>
    <minorscale>0.2</minorscale>
    <region1>(14.5,15.5,"yellow")</region1>
    <region2>(12,14.5,"green")</region2>
    <region3>(0,12,"red")</region3>
</meter>

Наведений вище код створив цей приклад:

pyvcp meter
Figure 14. Простий приклад лічильника

6.8. Числові вводи

Спінбокс

A spinbox controls a real pin. You increase or decrease the value of the pin by either pressing on the arrows, or pointing at the spinbox and rolling your mouse-wheel. If the param_pin field is set TRUE(1), a pin will be created that can be used to set the spinbox to an initial value and to remotely alter its value without HID input.

<spinbox>
    <halpin>"my-spinbox"</halpin>
    <min_>-12</min_>
    <max_>33</max_>
    <initval>0</initval>
    <resolution>0.1</resolution>
    <format>"2.3f"</format>
    <font>("Arial",30)</font>
    <param_pin>1</param_pin>
</spinbox>

Наведений вище код створив цей приклад:

pyvcp spinbox
Figure 15. Простий приклад спінбоксу
Масштаб

A scale controls a real or a sint pin. You increase or decrease the value of the pin be either dragging the slider, or pointing at the scale and rolling your mouse-wheel. The halpin will have both -f and -i added to it to form the real and sint pins. Width is the width of the slider in vertical and the height of the slider in horizontal orientation. If the param_pin field is set TRUE(1), a pin will be created that can be used to set the spinbox to an initial value and to remotely alter its value without HID input.

<scale>
    <font>("Helvetica",16)</font>
    <width>"25"</width>
    <halpin>"my-hscale"</halpin>
    <resolution>0.1</resolution>
    <orient>HORIZONTAL</orient>
    <initval>-15</initval>
    <min_>-33</min_>
    <max_>26</max_>
    <param_pin>1</param_pin>
</scale>
<scale>
    <font>("Helvetica",16)</font>
    <width>"50"</width>
    <halpin>"my-vscale"</halpin>
    <resolution>1</resolution>
    <orient>VERTICAL</orient>
    <min_>100</min_>
    <max_>0</max_>
    <param_pin>1</param_pin>
</scale>

Наведений вище код створив цей приклад:

pyvcp scale
Figure 16. Приклад простого масштабу
Note

Зверніть увагу, що за замовчуванням відображається значення "min", навіть якщо воно більше за "max", окрім випадків, коли "min" є від’ємним числом.

Циферблат

The Dial outputs a HAL real and reacts to both mouse wheel and dragging. Double left click to increase the resolution and double right click to reduce the resolution by one digit. The output is capped by the min and max values. The <cpr> is how many tick marks are on the outside of the ring (beware of high numbers). If the param_pin field is set TRUE(1), a pin will be created that can be used to set the spinbox to an initial value and to remotely alter its value without HID input.

<dial>
    <size>200</size>
    <cpr>100</cpr>
    <min_>-15</min_>
    <max_>15</max_>
    <text>"Dial"</text>
    <initval>0</initval>
    <resolution>0.001</resolution>
    <halpin>"anaout"</halpin>
    <dialcolor>"yellow"</dialcolor>
    <edgecolor>"green"</edgecolor>
    <dotcolor>"black"</dotcolor>
    <param_pin>1</param_pin>
</dial>

Наведений вище код створив цей приклад:

pyvcp dial
Figure 17. Приклад простого набору номера
Джоґвіст

Jogwheel mimics a real jogwheel by outputting a real pin which counts up or down as the wheel is turned, either by dragging in a circular motion, or by rolling the mouse-wheel.

Додаткові теги:

  • <text>"My Text"</text> відображає текст

  • <bgcolor>"grey"</bgcolor> <fillcolor>"green"</fillcolor> фонові та активні кольори

  • <scale_pin>1</scale_pin> creates scale text and a REAL.scale pin to display jog scale

  • <clear_pin>1</clear_pin> creates DRO and a BOOL.reset pin to reset DRO. Needs scale_pin for scaled DRO. Shift+click resets DRO also

<jogwheel>
    <halpin>"my-wheel"</halpin>
    <cpr>45</cpr>
    <size>250</size>
</jogwheel>

Наведений вище код створив цей приклад:

pyvcp jogwheel
Figure 18. Простий приклад джогового колеса

6.9. Зображення

Для відображення зображень використовується тільки формат .gif. Всі зображення повинні бути однакового розміру. Зображення повинні знаходитися в тому ж каталозі, що і файл INI (або в поточному каталозі, якщо програма запускається з командного рядка за допомогою halrun/halcmd).

Біт зображення

The image_bool toggles between two images by setting the halpin to true or false. This was formerly known as image_bit, which is now an alias for image_bool.

<image name='fwd' file='fwd.gif'/>
<image name='rev' file='rev.gif'/>
<vbox>
    <image_bool halpin='selectimage' images='fwd rev'/>
</vbox>

Цей приклад було створено з наведеного вище коду. Використовуючи два файли зображень fwd.gif та rev.gif. FWD відображається, коли selectimage має значення false, а REV відображається, коли selectimage має значення true.

pyvcp image01
Figure 19. Приклад хибного вибору зображення
pyvcp image02
Figure 20. Вибрати зображення Правдивий приклад
Image uint

The image_uint is the same as image_bool, except you have essentially an unlimited number of images and you select the image by setting the halpin to a integer value with 0 for the first image in the images list and 1 for the second image, etc. This was formerly known as image_u32, which is now an alias for image_uint.

<image name='stb' file='stb.gif'/>
<image name='fwd' file='fwd.gif'/>
<image name='rev' file='rev.gif'/>
<vbox>
    <image_uint halpin='selectimage' images='stb fwd rev'/>
</vbox>

Наведений вище код створив наступний приклад, додавши зображення stb.gif.

pyvcp image u32 01
Figure 21. Simple image_uint Example with halpin=0
pyvcp image01
Figure 22. Simple image_uint Example withhalpin=1
pyvcp image02
Figure 23. Simple image_uint Example withhalpin=2

Зверніть увагу, що за замовчуванням використовується мінімум, навіть якщо він встановлений вище за максимум, якщо тільки немає від’ємного мінімуму.

6.10. Контейнери

Контейнери – це віджети, які містять інші віджети. Контейнери використовуються для групування інших віджетів.

Межі

Межі контейнерів визначаються двома тегами, що використовуються разом. Тег <relief> визначає тип межі, а <bd> – її ширину.

<relief>_type_</relief>

Де тип має значення FLAT (ПЛОСКИЙ), SUNKEN (ЗАГНУТИЙ), RAISE (ПІДНЯТИЙ), GROOVE (БАЗОВИЙ) або RIDGE (ГРЕБЕНЬ).

<bd>_n_</bd>

Де n – ширина межі.

<hbox>
    <button>
        <relief>FLAT</relief>
        <text>"FLAT"</text>
        <bd>3</bd>
    </button>
    <button>
        <relief>SUNKEN</relief>
        <text>"SUNKEN"</text>
        <bd>3</bd>
    </button>
    <button>
        <relief>RAISED</relief>
        <text>"RAISED"</text>
        <bd>3</bd>
    </button>
    <button>
        <relief>GROOVE</relief>
        <text>"GROOVE"</text>
        <bd>3</bd>
    </button>
    <button>
        <relief>RIDGE</relief>
        <text>"RIDGE"</text>
        <bd>3</bd>
    </button>
</hbox>

Наведений вище код створив цей приклад:

pyvcp borders
Figure 24. Вітрина кордонів контейнерів
Заповнити

Заповнення контейнера визначається тегом <boxfill fill=""/>. Дійсні записи: none, x, y та обидва. Заповнення x – це горизонтальне заповнення, а заповнення y – вертикальне заповнення

<boxfill fill ="style"/>

Де «стиль» має значення none, x, y або обидва. За замовчуванням x для Vbox та y для Hbox.

Якір

Контейнерні якорі вказуються за допомогою тегу <boxanchor anchor=""/>. Якір вказує, де розмістити кожного веденого в його ділянці. Допустимі значення: center, n, s, e, w (для центру, півночі, півдня, сходу та заходу). Також допустимі комбінації, такі як sw, se, nw та ne.

<boxanchor anchor="position"/>

Де «позиція» – це center, n, s, e, w, ne, nw, se або sw. За замовчуванням – center.

Розгорнути

Розгортання контейнера визначається логічним тегом <boxexpand expand=""/>. Дійсні записи: "yes", "no".

<boxexpand expand="boolean"/>

Де «boolean» означає або «так», або «ні». За замовчуванням — «так».

Hbox

Використовуйте Hbox, коли хочете розмістити віджети горизонтально один біля одного.

<hbox>
    <relief>RIDGE</relief>
    <bd>6</bd>
    <label><text>"a hbox:"</text></label>
    <led></led>
    <number></number>
    <bar></bar>
</hbox>

Наведений вище код створив цей приклад:

pyvcp hbox
Figure 25. Простий приклад hbox

Всередині Hbox ви можете використовувати теги <boxfill fill=""/>, <boxanchor anchor=""/> та <boxexpand expand=""/>, щоб вибрати, як елементи в полі будуть поводитися при зміні розміру вікна. За замовчуванням для Hbox використовуються значення fill="y", anchor="center", expand="yes".

Vbox

Використовуйте Vbox, коли хочете розмістити віджети вертикально один на одному.

<vbox>
    <relief>RIDGE</relief>
    <bd>6</bd>
    <label><text>"a vbox:"</text></label>
    <led></led>
    <number></number>
    <bar></bar>
</vbox>

Наведений вище код створив цей приклад:

pyvcp vbox
Figure 26. Простий приклад VBox

Усередині Vbox ви можете використовувати теги <boxfill fill=""/>, <boxanchor anchor=""/> та <boxexpand expand=""/>, щоб вибрати, як елементи в полі будуть поводитися при зміні розміру вікна. За замовчуванням для Vbox використовуються значення fill="x", anchor="center", expand="yes".

Рамка етикетки

Рамка для етикетки — це рамка з пазом та етикеткою у верхньому лівому куті.

<labelframe text="Мітка: Згруповані світлодіоди">
<labelframe text="Group Title">
    <font>("Helvetica",16)</font>
    <hbox>
    <led/>
    <led/>
    </hbox>
</labelframe>

Наведений вище код створив цей приклад:

pyvcp labelframe
Figure 27. Простий приклад рамки етикетки
Таблиця

Таблиця — це контейнер, який дозволяє розміщувати елементи у вигляді сітки рядків і стовпців. Кожен рядок починається тегом «<tablerow/>». Вміщений віджет може охоплювати рядки або стовпці за допомогою тегу «<tablespan rows= cols=/>». Сторони комірок, до яких «прилипають» вміщені віджети, можна встановити за допомогою тегу «<tablesticky sticky=/>». Таблиця розширюється за допомогою гнучких рядків і стовпців.

Приклад коду таблиці
<table flexible_rows="[2]" flexible_columns="[1,4]">
<tablesticky sticky="new"/>
<tablerow/>
    <label>
        <text>" A (cell 1,1) "</text>
        <relief>RIDGE</relief>
        <bd>3</bd>
    </label>
    <label text="B (cell 1,2)"/>
    <tablespan columns="2"/>
    <label text="C, D (cells 1,3 and 1,4)"/>
<tablerow/>
    <label text="E (cell 2,1)"/>
    <tablesticky sticky="nsew"/>
    <tablespan rows="2"/>
    <label text="'spans\n2 rows'"/>
    <tablesticky sticky="new"/>
    <label text="G (cell 2,3)"/>
    <label text="H (cell 2,4)"/>
<tablerow/>
    <label text="J (cell 3,1)"/>
    <label text="K (cell 3,2)"/>
    <uint halpin="test"/>
</table>

Наведений вище код створив цей приклад:

pyvcp table
Figure 28. Приклад таблиці
Вкладки

Інтерфейс із вкладками може заощадити чимало місця.

<tabs>
    <names> ["spindle","green eggs"]</names>
</tabs>
<tabs>
    <names>["Шпиндель", "Зелені яйця", "Шинка"]</names>
    <vbox>
        <label>
            <text>"Швидкість шпинделя:"</text>
        </label>
        <bar>
            <halpin>"spindle-speed"</halpin>
            <max_>5000</max_>
        </bar>
    </vbox>
    <vbox>
        <label>
            <text>"(це вкладка зелених яєць)"</text>
        </label>
    </vbox>
    <vbox>
        <label>
            <text>"(ця вкладка порожня)"</text>
        </label>
    </vbox>
</tabs>

Наведений вище код створив цей приклад, що показує кожну вибрану вкладку.

pyvcp tabs1
pyvcp tabs2
pyvcp tabs3
Figure 29. Приклад простих вкладок