1. Вступ
PyVCP, віртуальний контрольний модуль Python, розроблений для того, щоб інтегратор міг налаштовувати інтерфейс AXIS за допомогою кнопок та індикаторів для виконання спеціальних завдань.
Панелі керування апаратними засобами можуть використовувати багато контактів вводу/виводу та бути дорогими. Саме тут віртуальні панелі керування мають перевагу, оскільки створення PyVCP нічого не коштує.
Віртуальні панелі керування можуть використовуватися для тестування або моніторингу, щоб тимчасово замінити реальні пристрої вводу-виводу під час налагодження логіки релейно-контактних схем, або для імітації фізичної панелі перед її побудовою та підключенням до плати вводу-виводу.
На наступному малюнку показано багато віджетів PyVCP.
2. Панельне будівництво
Макет панелі PyVCP визначається за допомогою XML-файлу, який містить теги віджетів між <pyvcp> та </pyvcp>. Наприклад:
<pyvcp> <label text="This is a LED indicator"/> <led/> </pyvcp>
Якщо ви помістите цей текст у файл з назвою tiny.xml та запустите
halcmd loadusr pyvcp -c mypanel tiny.xml
PyVCP створить для вас панель, яка включає два віджети: мітку з текстом «Це світлодіодний індикатор» та світлодіод, що використовується для відображення стану сигналу HAL BIT. Він також створить компонент HAL з назвою «mypanel» (усі віджети на цій панелі підключені до контактів, що починаються з «mypanel»). Оскільки тег <halpin> не був присутній всередині тегу <led>, PyVCP автоматично назве контакт HAL для віджета світлодіода 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
Оскільки AXIS використовує той самий набір інструментів графічного інтерфейсу користувача (Tkinter), що й PyVCP, можна додати панель PyVCP у правій частині або внизу інтерфейсу користувача AXIS. Неможливо відобразити панель одночасно в обох цих місцях. Типовий приклад наведено нижче.
На додаток до або замість відображення панелі 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. Конфігурація 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 бувають двох типів: біти та числа. Біти — це сигнали увімкнення/вимкнення. Числа можуть бути типу «float», «s32», «u32», «s64» або «u64». Більш детальну інформацію про типи даних HAL див. у розділі HAL Data. Віджет PyVCP може або відображати значення сигналу за допомогою індикатора, або змінювати значення сигналу за допомогою елемента керування. Таким чином, існує чотири класи віджетів PyVCP, які можна підключити до сигналу HAL. П’ятий клас допоміжних віджетів дозволяє організувати та позначити панель.
-
Віджети для індикації бітових сигналів:
led,rectled. -
Віджети для керування бітовими сигналами:
button,checkbutton,radiobutton. -
Віджети для індикації сигналів «число»:
number,s32,u32,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 використовуються такі правила:
-
Якщо перший символ атрибута є одним із наведених нижче, він обчислюється як вираз Python:
{(["'. -
Якщо рядок прийнято функцією int(), значення обробляється як ціле число.
-
Якщо рядок приймається функцією float(), значення обробляється як число з плаваючою комою.
-
В іншому випадку рядок приймається як рядок.
Коли використовується синтаксис на основі тегів, текст усередині тегу завжди обчислюється як вираз Python.
Наведені нижче приклади демонструють поєднання форматів.
Щоб додати коментар, використовуйте синтаксис XML для коментарів.
<!-- My Comment -->Відредагуйте 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 за допомогою команди «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>
Наведений вище код створив цей приклад:
6.4. Багатомітка
Розширення текстової мітки.
Вибір текстової мітки, може відображати до 6 підписів міток, коли активовано відповідний бітовий контакт.
Приєднайте кожен контакт легенди до сигналу та отримайте описову мітку, коли сигнал має значення 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
Світлодіод використовується для індикації стану halpin-розряду (бітового). Колір світлодіода буде on_color, коли halpin має значення true, і off_color в іншому випадку.
-
<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>
Наведений вище код створив цей приклад:
Це варіант віджета «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>
Наведений вище код створив цей приклад. Також показано вертикальну рамку з рельєфом.
6.6. Кпонки
Кнопка використовується для керування виводом BIT. Вивід буде встановлений у стан True, коли кнопка натиснута і утримується, і буде встановлений у стан False, коли кнопка відпущена. Кнопки можуть використовувати наступні опціональні параметри.
-
<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> – вимкнути закріплення.
Текстова кнопка керує «бітовим» halpin. Halpin має значення false (хибність), доки кнопка не буде натиснута, тоді воно стає істинним. Кнопка є тимчасовою кнопкою.
Текстова кнопка має необов’язковий PIN-код для відключення, який створюється після додавання <disable_pin>True</disable_pin>.
<button> <halpin>"ok-button"</halpin> <text>"OK"</text> </button> <button> <halpin>"abort-button"</halpin> <text>"Abort"</text> </button>
Наведений вище код створив цей приклад:
Перемикач керує бітом halpin. Halpin буде встановлений у значення True, коли перемикач увімкнено, і у значення false, коли перемикач вимкнено. Перемикач є кнопкою типу toggle. Перемикачі можуть бути спочатку встановлені у значення TRUE або FALSE у полі initval. Також автоматично створюється контакт changepin, який може перемикати перемикач через HAL, якщо пов’язане значення змінено, для віддаленого оновлення дисплея.
<checkbutton> <halpin>"coolant-chkbtn"</halpin> <text>"Coolant"</text> <initval>1</initval> </checkbutton> <checkbutton> <halpin>"chip-chkbtn"</halpin> <text>"Chips "</text> <initval>0</initval> </checkbutton>
Наведений вище код створив цей приклад:
Кнопка перевірки охолоджувальної рідини позначена.
Зверніть увагу на додаткові пробіли в тексті «Стрічки», щоб вирівняти кнопки перевірки.
Радіо-кнопка встановить один з галпінів як істинний. Інші галпіни встановлюються як хибні. Поле initval може бути встановлено для вибору значення за замовчуванням при відображенні панелі. Тільки одна радіо-кнопка може бути встановлена як TRUE (1), або тільки галпін з найвищим номером, встановлений як TRUE, матиме це значення.
<radiobutton> <choices>["one","two","three"]</choices> <halpin>"my-radio"</halpin> <initval>0</initval> </radiobutton>
Наведений вище код створив цей приклад:
Зверніть увагу, що контакти 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 – це кількість додаткового вертикального простору.
Віджет чисел відображає значення сигналу з плаваючою комою.
<number> <halpin>"my-number"</halpin> <font>("Helvetica",24)</font> <format>"+4.4f"</format> </number>
Наведений вище код створив цей приклад:
-
<font> - — це специфікація типу та розміру шрифту Tkinter. Один шрифт, який відображатиметься щонайменше до розміру 200, — це «courier 10 pitch», тому для справді великого віджета Number ви можете вказати:
<font>("courier 10 pitch",100)</font>
-
<format> - — це формат у стилі C, який визначає, як відображається число.
Віджет s32 number відображає значення числа s32. Синтаксис такий самий, як у number, за винятком імені, яке є <s32>. Переконайтеся, що ширина достатня для відображення найбільшого числа, яке ви плануєте використовувати.
<s32> <halpin>"my-number"</halpin> <font>("Helvetica",24)</font> <format>"6d"</format> <width>6</width> </s32>
Наведений вище код створив цей приклад:
Віджет числа u32 відображає значення числа u32. Синтаксис такий самий, як і для «число», за винятком назви <u32>.
Віджет «Смуга» відображає значення сигналу FLOAT як графічно за допомогою смуги, так і числово. Колір смуги можна встановити як один колір для всього діапазону (за замовчуванням використовується колір заповнення) або встановити зміну кольору залежно від значення halpin (діапазони range1, range2 та range3 повинні бути встановлені всі; якщо ви хочете лише 2 діапазони, встановіть для них один і той самий колір).
-
<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>
Наведений вище код створив цей приклад:
Вимірювач відображає значення сигналу FLOAT за допомогою традиційного індикатора годинникового типу.
<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>
Наведений вище код створив цей приклад:
6.8. Числові вводи
Спінбокс керує контактом FLOAT. Ви можете збільшити або зменшити значення контакту, натискаючи на стрілки або вказуючи на спінбокс і прокручуючи коліщатко миші. Якщо поле param_pin встановлено на TRUE(1), буде створено контакт, який можна використовувати для встановлення спінбоксу на початкове значення та віддаленого змінення його значення без введення HID.
<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>
Наведений вище код створив цей приклад:
Шкала контролює плаваючий або s32-контакт. Ви можете збільшити або зменшити значення контакту, перетягнувши повзунок або вказавши на шкалу і прокрутивши коліщатко миші. До «halpin» буде додано «-f» і «-i», щоб сформувати плаваючий і s32-контакти. Ширина — це ширина повзунка у вертикальному напрямку та висота повзунка у горизонтальному напрямку. Якщо поле param_pin встановлено на TRUE(1), буде створено контакт, який можна використовувати для встановлення початкового значення спінбокса та віддаленого змінення його значення без введення HID.
<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>
Наведений вище код створив цей приклад:
|
Note
|
Зверніть увагу, що за замовчуванням відображається значення "min", навіть якщо воно більше за "max", окрім випадків, коли "min" є від’ємним числом. |
Dial виводить HAL float і реагує як на колесо миші, так і на перетягування. Двічі клацніть лівою кнопкою миші, щоб збільшити роздільну здатність, і двічі клацніть правою кнопкою миші, щоб зменшити роздільну здатність на один цифру. Вихід обмежений мінімальним і максимальним значеннями. <cpr> — це кількість поділок на зовнішній стороні кільця (будьте обережні з великими числами). Якщо поле param_pin встановлено на TRUE(1), буде створено контакт, який можна використовувати для встановлення початкового значення спінбокса та віддаленого змінення його значення без введення HID.
<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>
Наведений вище код створив цей приклад:
Джог-колесо імітує справжнє колесо, виводячи значення FLOAT, яке рахує вгору або вниз під час обертання колеса, або шляхом перетягування круговим рухом, або шляхом прокручування колеса миші.
Додаткові теги:
* <text>"My Text"</text> відображає текст
* <bgcolor>"grey"</bgcolor> <fillcolor>"green"</fillcolor> фонові та активні кольори
* <scale_pin>1</scale_pin> створює текст масштабу та пін FLOAT.scale для відображення масштабу поперечного перетину
* <clear_pin>1</clear_pin> створює DRO та контакт BIT.reset для скидання DRO. Потрібен scale_pin для масштабованого DRO. Shift+клацання також скидає DRO
<jogwheel> <halpin>"my-wheel"</halpin> <cpr>45</cpr> <size>250</size> </jogwheel>
Наведений вище код створив цей приклад:
6.9. Зображення
Для відображення зображень використовується тільки формат .gif. Всі зображення повинні бути однакового розміру. Зображення повинні знаходитися в тому ж каталозі, що і файл INI (або в поточному каталозі, якщо програма запускається з командного рядка за допомогою halrun/halcmd).
«image_bit» перемикається між двома зображеннями, встановлюючи halpin у значення true або false.
<image name='fwd' file='fwd.gif'/> <image name='rev' file='rev.gif'/> <vbox> <image_bit halpin='selectimage' images='fwd rev'/> </vbox>
Цей приклад було створено з наведеного вище коду. Використовуючи два файли зображень fwd.gif та rev.gif. FWD відображається, коли selectimage має значення false, а REV відображається, коли selectimage має значення true.
image_u32 аналогічний image_bit, за винятком того, що ви маєте практично необмежену кількість зображень і вибираєте зображення, встановлюючи halpin на ціле значення, де 0 відповідає першому зображенню в списку зображень, 1 — другому зображенню тощо.
<image name='stb' file='stb.gif'/> <image name='fwd' file='fwd.gif'/> <image name='rev' file='rev.gif'/> <vbox> <image_u32 halpin='selectimage' images='stb fwd rev'/> </vbox>
Наведений вище код створив наступний приклад, додавши зображення stb.gif.
Зверніть увагу, що за замовчуванням використовується мінімум, навіть якщо він встановлений вище за максимум, якщо тільки немає від’ємного мінімуму.
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>
Наведений вище код створив цей приклад:
Заповнення контейнера визначається тегом <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> <relief>RIDGE</relief> <bd>6</bd> <label><text>"a hbox:"</text></label> <led></led> <number></number> <bar></bar> </hbox>
Наведений вище код створив цей приклад:
Всередині Hbox ви можете використовувати теги <boxfill fill=""/>, <boxanchor anchor=""/> та <boxexpand expand=""/>, щоб вибрати, як елементи в полі будуть поводитися при зміні розміру вікна. За замовчуванням для Hbox використовуються значення fill="y", anchor="center", expand="yes".
Використовуйте Vbox, коли хочете розмістити віджети вертикально один на одному.
<vbox> <relief>RIDGE</relief> <bd>6</bd> <label><text>"a vbox:"</text></label> <led></led> <number></number> <bar></bar> </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>
Наведений вище код створив цей приклад:
Таблиця — це контейнер, який дозволяє розміщувати елементи у вигляді сітки рядків і стовпців. Кожен рядок починається тегом «<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)"/> <u32 halpin="test"/> </table>
Наведений вище код створив цей приклад:
Інтерфейс із вкладками може заощадити чимало місця.
<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>
Наведений вище код створив цей приклад, що показує кожну вибрану вкладку.