1. Що таке GladeVCP?

GladeVCP — це компонент LinuxCNC, який додає можливість додавати нову панель інтерфейсу користувача до інтерфейсів користувача LinuxCNC, таких як:

  • AXIS

  • Доторкливий

  • G-екран

  • GMOCCAPY

На відміну від PyVCP, GladeVCP не обмежується відображенням і налаштуванням контактів HAL, оскільки в коді Python можна виконувати довільні дії — фактично, за допомогою GladeVCP і Python можна створити повний користувацький інтерфейс LinuxCNC.

GladeVCP використовує редактор інтерфейсу користувача WYSIWYG Glade, який спрощує створення візуально привабливих панелей. Він базується на зв’язках PyGObject з багатим набором віджетів GTK3, і фактично всі ці віджети можуть бути використані в додатку GladeVCP - не тільки спеціалізовані віджети для взаємодії з HAL і LinuxCNC, які описані тут.

1.1. PyVCP проти GladeVCP: короткий огляд

Обидва підтримують створення панелей з «віджетами HAL» – елементами інтерфейсу користувача, такими як світлодіоди, кнопки, повзунки тощо, значення яких пов’язані з виводом HAL, який, у свою чергу, взаємодіє з рештою LinuxCNC.

PyVCP:

  • Набір віджетів: використовує віджети TkInter.

  • Створення інтерфейсу користувача: цикл "редагування XML-файлу / виконання результату / оцінка вигляду".

  • Немає підтримки для вбудовування обробки користувацьких подій.

  • Взаємодія з LinuxCNC поза межами вводу/виводу HAL не підтримується.

GladeVCP:

  • Набір віджетів: спирається на набір віджетів GTK3.

  • Створення інтерфейсу користувача: використовує WYSIWYG-редактор інтерфейсу користувача Glade.

  • Будь-яка зміна виводу HAL може бути спрямована на зворотний виклик до визначеного користувачем обробника подій Python.

  • Будь-який сигнал GTK (натискання клавіші/кнопки, вікно, введення/виведення, таймер, мережеві події) може бути пов’язаний з користувацькими обробниками в Python.

  • Пряма взаємодія з LinuxCNC: виконання довільних команд, наприклад, ініціювання команд MDI для виклику підпрограми G-коду, а також підтримка операцій зміни стану через віджети дій.

  • Кілька незалежних панелей GladeVCP можуть бути запущені на різних вкладках.

  • Розділення зовнішнього вигляду та функціональності інтерфейсу користувача: зміна зовнішнього вигляду без зміни коду.

2. Короткий огляд панелі-прикладу

Вікна панелей GladeVCP можна запускати у трьох різних конфігураціях:

  • завжди видимий, інтегрований в AXIS з правого боку, точно так само, як і панелі PyVCP,

  • як вкладка в AXIS, Touchy, Gscreen або GMOCCAPY; в AXIS це створить третю вкладку, окрім вкладок Preview та DRO, які потрібно викликати явно,

  • як окреме вікно верхнього рівня, яке можна іконіфікувати/деіконіфікувати незалежно від головного вікна.

Встановлено LinuxCNC

Якщо ви використовуєте встановлену версію LinuxCNC, наведені нижче приклади знаходяться у configuration picker у гілці Зразки конфігурацій > програми > GladeVCP.

Оформлення замовлення через Git

Наведені нижче інструкції застосовуються лише якщо ви використовуєте git checkout. Відкрийте термінал і перейдіть до каталогу, створеного git, а потім виконайте команди, як показано.

Note
Щоб наступні команди працювали на вашому git checkout, спочатку потрібно запустити make, потім sudo make setuid, а потім . ./scripts/rip-environment. Більше інформації про git checkout можна знайти на сторінці LinuxCNC wiki.

Запустіть зразок панелі GladeVCP, інтегрованої в AXIS, подібно до PyVCP, наступним чином:

$ cd configs/sim/axis/gladevcp
$ linuxcnc gladevcp_panel.ini
images/example-panel-small.png

Запустіть ту саму панель, але як вкладку всередині AXIS:

$ cd configs/sim/axis/gladevcp
$ linuxcnc gladevcp_tab.ini
images/example-tabbed-small.png

Щоб запустити цю панель усередині «Touchy»:

$ cd configs/sim/touchy/gladevcp
$ linuxcnc gladevcp_touchy.ini
images/touchy-tab-33.png

Функціонально ці налаштування ідентичні - вони відрізняються лише вимогами до розміру екрану та видимістю. Оскільки можна запускати кілька компонентів GladeVCP паралельно (з різними іменами компонентів HAL), можливі також змішані налаштування - наприклад, панель з правого боку та одна або кілька вкладок для рідше використовуваних частин інтерфейсу.

2.1. Огляд прикладу панелі

Під час запуску configs/sim/axis/gladevcp_panel.ini або configs/sim/axis/gladevcp_tab.ini, перейдіть до «Show HAL Configuration» (Показати конфігурацію HAL) — ви знайдете компонент HAL gladevcp і зможете спостерігати за значеннями його контактів під час взаємодії з віджетами на панелі. Налаштування HAL можна знайти в «configs/axis/gladevcp/manual-example.hal».

Приклад панелі має дві рамки внизу. Панель налаштована таким чином, що скидання ESTOP активує рамку «Налаштування», а ввімкнення машини активує рамку «Команди» внизу. Віджети HAL у рамці «Налаштування» пов’язані зі світлодіодами та мітками у рамці «Статус», а також з поточним і підготовленим номером інструменту — пограйтеся з ними, щоб побачити ефект. Виконання команд «T<номер інструменту>» та «M6» у вікні MDI змінить поля поточного та підготовленого номера інструменту.

Кнопки в рамці «Команди» є «віджетами дій MDI» — натискання на них призведе до виконання команди MDI в інтерпретаторі. Третя кнопка «Виконати підпрограму Oword» є розширеним прикладом — вона бере кілька значень виводів HAL з рамки «Налаштування» і передає їх як параметри до підпрограми Oword. Фактичні параметри, отримані підпрограмою, відображаються командами «(DEBUG, )» — див. «../../nc_files/oword.ngc» для тіла підпрограми.

Щоб побачити, як панель інтегрована в AXIS, дивіться оператор [DISPLAY]GLADEVCP у файлі configs/sim/axis/gladevcp/gladevcp_panel.ini, оператор ' [DISPLAY]EMBED*» у файлі configs/sim/axis/gladevcp/gladevcp_tab.ini та оператори «[HAL]POSTGUI_HALFILE» у файлах configs/sim/axis/gladevcp/gladevcp_tab.ini та configs/sim/axis/gladevcp/gladevcp_panel.ini.

2.2. Огляд опису інтерфейсу користувача

Користувацький інтерфейс створюється за допомогою редактора Glade UI — щоб його ознайомитися, потрібно встановити Glade. Щоб редагувати користувацький інтерфейс, виконайте команду

$ glade configs/axis/gladevcp/manual-example.ui

На новіших системах необхідна програма glade може називатися glade-gtk2.

У центральному вікні відображається зовнішній вигляд інтерфейсу користувача. Усі об’єкти інтерфейсу користувача та об’єкти підтримки знаходяться у правому верхньому вікні, де ви можете вибрати конкретний віджет (або натиснувши на нього в центральному вікні). Властивості вибраного віджета відображаються і можуть бути змінені в правому нижньому вікні.

Щоб побачити, як команди MDI передаються з віджетів MDI Action, перегляньте віджети, перелічені в розділі «Actions» у верхньому правому вікні, а також у правому нижньому вікні, на вкладці «General», у властивості «MDI command».

2.3. Вивчення зворотного виклику Python

Подивіться, як зворотний виклик Python інтегровано в приклад:

  • У Glade дивіться віджет мітки hits (звичайний віджет GTK+).

  • У віджеті button1 перегляньте вкладку «Сигнали» та знайдіть сигнал «натиснуто», пов’язаний з обробником «on_button_press».

  • У hitcounter.py подивіться на метод on_button_press та як він встановлює властивість label в об’єкті hits.

Це лише торкається концепції — механізм зворотного виклику буде розглянуто детальніше в розділі Програмування GladeVCP.

3. Створення та інтеграція користувацького інтерфейсу Glade

3.1. Передумова: встановлення Glade

Щоб переглянути або змінити файли інтерфейсу користувача Glade, вам потрібно встановити Glade 3.38.2 або пізнішої версії — він потрібен не лише для запуску панелі GladeVCP. Якщо команда «glade» відсутня, встановіть її за допомогою команди:

$ sudo apt install glade

Потім перевірте встановлену версію, яка має бути дорівнює або перевищувати 3.6.7:

$ glade --version

Glade містить внутрішній інтерпретатор Python, і підтримується тільки Python 3. Це стосується Debian Bullseye, Ubuntu 21 і Mint 21 або пізніших версій. Старіші версії не працюватимуть, ви отримаєте помилку Python.

3.2. Запуск Glade для створення нового інтерфейсу користувача

У цьому розділі описано лише початкові кроки, специфічні для LinuxCNC. Більш детальну інформацію та підручник з Glade можна знайти на сайті http://glade.gnome.org. Деякі поради та підказки щодо Glade також можна знайти на сайті YouTube.

Або змініть існуючий компонент інтерфейсу, запустивши glade <файл>.ui, або запустіть новий, просто виконавши команду glade з оболонки.

  • Якщо LinuxCNC не було встановлено з пакета, середовище оболонки LinuxCNC потрібно налаштувати за допомогою команди source <linuxcncdir>/scripts/rip-environment, інакше Glade не знайде специфічні для LinuxCNC віджети.

  • Коли вас запитають про незбережені налаштування, просто прийміть значення за замовчуванням і натисніть «Закрити».

  • На панелі інструментів «Toplevels» виберіть «GtkWindow» (перший запис) як вікно верхнього рівня. Встановіть «window1» як ідентифікатор у правій панелі під вкладкою «General». Це найменування важливе, оскільки GladeVCP залежить від нього.

  • За допомогою кнопки з трьома крапками ви можете знайти специфічні віджети LinuxCNC.

  • Додайте контейнер, такий як HAL_Box або HAL_Table з HAL Python, до фрейму.

  • Виберіть та розмістіть деякі елементи, такі як світлодіод, кнопка тощо, в контейнері.

Це виглядатиме так:

images/glade-manual-small.png

Glade має тенденцію писати багато повідомлень у вікно оболонки, які в основному можна ігнорувати. Виберіть «Файл»→«Зберегти як», дайте йому ім’я, наприклад «myui.ui», і переконайтеся, що він збережений як файл «GtkBuilder» (кнопка в лівому нижньому куті діалогового вікна «Зберегти»). GladeVCP також правильно обробляє старий формат «libglade», але немає сенсу його використовувати. Стандартним розширенням файлів GtkBuilder є «.ui».

3.3. Тестування панелі

Тепер ви готові спробувати (поки запущено LinuxCNC, наприклад, AXIS) за допомогою:

gladevcp myui.ui

GladeVCP створює компонент HAL з іменем, що відповідає базовому імені файлу інтерфейсу користувача — в даному випадку «myui» — якщо це не замінено опцією -c <ім'я компонента>. Якщо ви використовуєте AXIS, просто спробуйте «Показати конфігурацію HAL» і перевірте його контакти.

Ви можете задатися питанням, чому віджети, що містять «HAL_Hbox» або «HAL_Table», відображаються сірим кольором (неактивними). Контейнери HAL мають пов’язаний з ними контакт HAL, який за замовчуванням вимкнений, що призводить до того, що всі віджети, що містяться в них, відображаються як неактивні. Типовим випадком використання є пов’язування цих контактів контейнерів HAL із сигналом «halui.machine.is-on» або одним із сигналів «halui.mode», щоб забезпечити активність деяких віджетів лише в певному стані.

Щоб просто активувати контейнер, виконайте команду HAL setp gladevcp.<ім'я-контейнера> 1.

3.4. Підготовка файлу команд HAL

Рекомендований спосіб зв’язування контактів HAL у панелі GladeVCP — зібрати їх в окремому файлі з розширенням «.hal». Цей файл передається через опцію POSTGUI_HALFILE= у розділі HAL вашого файлу INI.

Caution
Не додавайте командний файл GladeVCP HAL до розділу AXIS [HAL]HALFILE= ini, це не матиме бажаного ефекту – див. наступні розділи.

3.5. Інтеграція в AXIS, як-от PyVCP

Розмістіть панель GladeVCP на правій бічній панелі, вказавши наступне у файлі INI:

[DISPLAY]
# додати панель GladeVCP там, де раніше розміщувався PyVCP:
GLADEVCP= -u ./hitcounter.py ./manual-example.ui

[HAL]
# Команди HAL для компонентів GladeVCP у вкладці мають виконуватися через POSTGUI_HALFILE
POSTGUI_HALFILE =  ./manual-example.hal

[RS274NGC]
# Тут розміщені субтитри Oword, специфічні для демоверсії gladevcp
SUBROUTINE_PATH = ../../nc_files/gladevcp_lib

Ім’я компонента HAL за замовчуванням для програми GladeVCP, запущеної з опцією GLADEVCP, таке: gladevcp.

Командний рядок, який фактично виконує AXIS у вищезгаданій конфігурації, виглядає наступним чином:

halcmd loadusr -Wn gladevcp gladevcp -c gladevcp -x {XID} -u ./hitcounter.py ./manual-example.ui

Ви можете додавати тут довільні параметри gladevcp, якщо вони не конфліктують із вищезазначеними параметрами командного рядка.

Можна створити власну назву компонента HAL, додавши параметр -c:

[DISPLAY]
# додати панель GladeVCP там, де раніше розміщувався PyVCP:
GLADEVCP= -c example -u ./hitcounter.py ./manual-example.ui

Командний рядок, який фактично виконує AXIS для вищезазначеного:

halcmd loadusr -Wn example gladevcp -c example -x {XID} -u ./hitcounter.py ./manual-example.ui
Note
Позначення файлів, такі як ./hitcounter.py, ./manual-example.ui тощо, вказують, що файли знаходяться в тому ж каталозі, що й файл INI. Можливо, вам доведеться скопіювати їх до свого каталогу (або вказати правильний абсолютний чи відносний шлях до файлу(-ів)).
Note
Параметр [RS274NGC]SUBROUTINE_PATH= встановлюється лише для того, щоб панель прикладів могла знайти підпрограму Oword (oword.ngc) для віджета MDI Command. У вашій конфігурації він може бути непотрібним. Відносний шлях ../../nc_files/gladevcp_lib побудований для роботи з каталогами, скопійованими за допомогою конфігураційного селектора, та при використанні налаштування «run-in-place».

3.6. Вбудовування як вкладка

Для цього відредагуйте ваш INI-файл та додайте до розділів DISPLAY та HAL наступне:

[DISPLAY]
# додайте панель GladeVCP як вкладку поруч із «Попередній перегляд/DRO»:
EMBED_TAB_NAME=GladeVCP demo
EMBED_TAB_COMMAND=halcmd loadusr -Wn gladevcp gladevcp -c gladevcp -x {XID} -u ./gladevcp/hitcounter.py ./gladevcp/manual-example.ui

[HAL]
# Команди HAL для компонентів GladeVCP у вкладці мають виконуватися через POSTGUI_HALFILE
POSTGUI_HALFILE =  ./gladevcp/manual-example.hal

[RS274NGC]
# Тут розміщені субтитри Oword, специфічні для демоверсії gladevcp
SUBROUTINE_PATH = ../../nc_files/gladevcp_lib

Зверніть увагу на спосіб запуску команди tab за допомогою halcmd loadusr — це гарантує, що POSTGUI_HALFILE буде запущено лише після того, як компонент HAL буде готовий. У рідкісних випадках ви можете запустити тут команду, яка використовує вкладку, але не має пов’язаного компонента HAL. Таку команду можна запустити без «halcmd loadusr», і це означає для AXIS, що йому не потрібно чекати на компонент HAL, оскільки його немає.

Змінюючи назву компонента у наведеному вище прикладі, зверніть увагу, що назви, що використовуються в -Wn <компонент> та -c <компонент>, мають бути ідентичними.

Спробуйте, запустивши AXIS — поруч із вкладкою DRO має з’явитися нова вкладка під назвою «GladeVCP demo». Виберіть цю вкладку, і ви побачите приклад панелі, який чудово вписується в AXIS.

Note
Переконайтеся, що файл інтерфейсу користувача є останнім параметром, переданим до GladeVCP в обох операторах GLADEVCP= та EMBED_TAB_COMMAND=.

3.7. Інтеграція в Touchy

Щоб додати вкладку GladeVCP до «Touchy», відредагуйте свій INI-файл наступним чином:

[DISPLAY]
# додати панель GladeVCP як вкладку
EMBED_TAB_NAME=GladeVCP demo
EMBED_TAB_COMMAND=gladevcp -c gladevcp -x {XID} -u ./hitcounter.py -H ./gladevcp-touchy.hal  ./manual-example.ui

[RS274NGC]
# Тут розміщені субтитри Oword, специфічні для демоверсії gladevcp
SUBROUTINE_PATH = ../../nc_files/gladevcp_lib
Note
Позначення файлів, такі як ./hitcounter.py, ./manual-example.ui тощо, вказують, що файли знаходяться в тому ж каталозі, що й файл INI. Можливо, вам доведеться скопіювати їх до свого каталогу (або вказати правильний абсолютний чи відносний шлях до файлу(-ів)).

Зверніть увагу на такі відмінності в налаштуваннях вкладки AXIS:

  • Файл команд HAL дещо змінено, оскільки «Touchy» не використовує компоненти «halui», тому його сигнали недоступні, а також було використано деякі скорочення.

  • Немає опції INI 'POSTGUI_HALFILE=", але передача файлу команд HAL у рядку 'EMBED_TAB_COMMAND=" є прийнятною.

  • Заклинання halcmd loaduser -Wn … не потрібне.

4. Параметри командного рядка GladeVCP

Див. також man gladevcp. Ось параметри командного рядка GladeVCP:

Використання: gladevcp [options] myfile.ui

Опції:

-h, --help::
    Показати це довідкове повідомлення та вийти.

-c NAME::
    Встановіть назву компонента на NAME. За замовчуванням використовується базова назва файлу інтерфейсу користувача.

-d::
    Увімкнути вивід налагодження

-g GEOMETRY::
    Встановити геометрію WIDTHxHEIGHT+XOFFSET+YOFFSET. Значення вказані в пікселях, XOFFSET/YOFFSET посилається на верхній лівий кут екрана.
    Використовуйте -g WIDTHxHEIGHT для встановлення лише розміру або -g +XOFFSET+YOFFSET для встановлення лише положення

-H FILE::
    Виконайте оператори HAL з ФАЙЛУ за допомогою halcmd після налаштування та готовності компонента

-m MAXIMUM::
    Примусово розгорнути вікно панелі.
    Разом з опцією -g geometry можна перемістити панель на другий монітор і змусити її використовувати весь екран.

-t THEME::
    Встановити тему gtk. За замовчуванням використовується системна тема. Різні панелі можуть мати різні теми.

-x XID::
    Переприєднати GladeVCP до існуючого вікна XID замість створення нового вікна верхнього рівня

-u FILE::
    Використання файлів як додаткових користувацьких модулів з обробниками

-U USEROPT::
    передавати USEROPTS до модулів Python

5. Розуміння процесу запуску GladeVCP

Кроки інтеграції, описані вище, виглядають дещо складними, і це так. Тому корисно зрозуміти процес запуску LinuxCNC та те, як це пов’язано з GladeVCP.

Звичайний процес запуску LinuxCNC виконує наступне:

  • Середовище реального часу запущено.

  • Усі компоненти HAL завантажено.

  • Компоненти HAL пов’язані між собою за допомогою скриптів .hal cmd.

  • task, iocontrol і, зрештою, запускається користувацький інтерфейс.

  • До появи GladeVCP припущення було таким: до моменту запуску інтерфейсу користувача весь HAL завантажений, налаштований та готовий до роботи.

Впровадження GladeVCP призвело до наступної проблеми:

  • Панелі GladeVCP потрібно вбудувати в головне вікно графічного інтерфейсу.

  • Панелі GladeVCP потрібно вбудувати в головне вікно графічного інтерфейсу, наприклад, AXIS, Touchy, Gscreen або GMOCCAPY (вбудоване вікно або як вбудована вкладка).

  • Це вимагає запуску головного графічного інтерфейсу, перш ніж вікно GladeVCP можна буде підключити до головного графічного інтерфейсу.

  • Однак, GladeVCP також є компонентом HAL і створює власні виводи HAL.

  • Як наслідок, усі HAL-з’єднання, що включають виводи GladeVCP HAL як джерело або призначення, повинні виконуватися після налаштування графічного інтерфейсу.

Це є метою POSTGUI_HALFILE. Ця опція INI перевіряється графічними інтерфейсами користувача. Якщо графічний інтерфейс користувача виявляє цю опцію, він запускає відповідний файл HAL після налаштування будь-якої вбудованої панелі GladeVCP. Однак він не перевіряє, чи панель GladeVCP фактично використовується, і в цьому випадку файл HAL cmd просто запускається у звичайному режимі. Отже, якщо ви НЕ запускаєте GladeVCP через GLADEVCP або EMBED_TAB тощо, а пізніше в окремому вікні оболонки або за допомогою іншого механізму, командний файл HAL у POSTGUI_HALFILE буде виконано занадто рано. Припускаючи, що тут є посилання на штифти GladeVCP, це призведе до помилки з повідомленням про те, що компонент GladeVCP HAL недоступний.

Отже, якщо ви запускаєте GladeVCP з окремого вікна оболонки (тобто не запускається графічним інтерфейсом у вбудованому режимі):

  • Ви не можете покладатися на опцію INI POSTGUI_HALFILE, яка призводить до виконання команд HAL «у потрібний момент часу», тому закоментуйте це у файлі INI.

  • Явно передайте файл команд HAL, який посилається на піни GladeVCP, до GladeVCP за допомогою опції -H <файл halcmd> (див. попередній розділ).

6. Довідник з віджетів HAL

GladeVCP включає в себе набір віджетів Gtk з приєднаними HAL-контактами, які називаються HAL-віджетами і призначені для управління, відображення або іншої взаємодії з шаром HAL LinuxCNC. Вони призначені для використання з редактором користувальницького інтерфейсу Glade. При правильній установці HAL-віджети повинні з’явитися в групі віджетів Glade «HAL Python». Багато полів, специфічних для HAL, в розділі «Загальні» Glade мають пов’язані підказки, що з’являються при наведенні курсору миші.

Сигнали HAL бувають двох типів: біти та числа. Біти — це сигнали увімкнення/вимкнення. Числа можуть бути типу «float», «s32» або «u32». Більш детальну інформацію про типи даних HAL дивіться в HAL manual. Віджети GladeVCP можуть або відображати значення сигналу за допомогою індикатора, або змінювати значення сигналу за допомогою елемента управління. Таким чином, існує чотири класи віджетів GladeVCP, які ви можете підключити до сигналу HAL. Інший клас допоміжних віджетів дозволяє організувати та позначити вашу панель.

6.1. Найменування віджетів та пінів HAL

Більшість віджетів HAL мають один пов’язаний пін HAL з тим самим ім’ям HAL, що й у віджета (glade: General→Name).

Винятками з цього правила наразі є:

  • «HAL_Spinbutton» та «HAL_ComboBox», які мають два виводи: <назвавіджета>-f (число з плаваючою комою) та <назвавіджета>-s (s32)

  • «HAL_ProgressBar», який має вхідний контакт <назвавіджета>-значення та вхідний контакт <назвавіджета>-шкала.

6.2. Атрибути та методи Python віджетів HAL

Віджети HAL є екземплярами GtKWidgets і, отже, успадковують методи, властивості та сигнали відповідного класу GtkWidget. Наприклад, щоб з’ясувати, які методи, властивості та сигнали, пов’язані з GtkWidget, має «HAL_Button», перегляньте опис https://lazka.github.io/pgi-docs/# Gtk-3.0/classes/Button.html#Gtk.Button[GtkButton] в PyGObject API Reference.

Простий спосіб дізнатися про спадковість певного віджета HAL такий: запустіть glade, розмістіть віджет у вікні та виберіть його; потім виберіть вкладку «Signals» (Сигнали) у вікні «Properties» (Властивості). Наприклад, вибравши віджет «HAL_LED», ви побачите, що «HAL_LED» походить від «GtkWidget», який, у свою чергу, походить від «GtkObject» і, зрештою, від «GObject».

Повну ієрархію класів можна переглянути, викликавши GtkInspector у графічному інтерфейсі Glade, вибравши віджет і натиснувши Control-Shift-I. Якщо Inspector не відкривається, його можна увімкнути з терміналу, ввівши:

gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true

Інспектор також зручний для тестування змін стилю CSS «на льоту», а також для визначення всіх властивостей та сигналів, доступних для віджета.

Віджети HAL також мають кілька атрибутів Python, специфічних для HAL:

hal_pin

Базовий об’єкт HAL pin у Python, якщо віджет має один тип pin

hal_pin_s, hal_pin_f

Піни s32 та float віджетів HAL_Spinbutton та HAL_ComboBox – зверніть увагу, що ці віджети не мають атрибута hal_pin!

hal_pin_scale

Вхідний пін з плаваючою комою віджета HAL_ProgressBar, що представляє максимальне абсолютне значення вхідних даних.

Існує кілька специфічних для HAL методів віджетів HAL, але єдиний релевантний метод:

<halpin>.get()

Отримати значення поточного виводу HAL, де <halpin> – це відповідна назва виводу HAL, зазначена вище.

6.3. Налаштування значень піна та віджета

Як правило, якщо вам потрібно встановити значення віджета виводу HAL з коду Python, зробіть це, викликавши базовий «сеттер» Gtk (наприклад, set_active(), set_value()). Не намагайтеся встановити значення пов’язаного виводу безпосередньо за допомогою halcomp[pinname] = value, оскільки віджет не помітить цю зміну!

Може виникнути спокуса «встановити вхідні контакти віджета HAL» програмно. Зверніть увагу, що це суперечить основній меті вхідного контакту — він повинен бути пов’язаний із сигналами, що генеруються іншими компонентами HAL, і реагувати на них. Хоча наразі в HAL Python немає захисту від запису на вхідні контакти, це не має сенсу. Однак для тестування ви можете використовувати setp _pinname_ _value_ у відповідному файлі HAL.

Цілком прийнятно встановлювати значення виходу HAL-контакту за допомогою halcomp[pinname] = value, за умови, що цей HAL-контакт не пов’язаний з віджетом, тобто був створений методом hal_glib.GPin(halcomp.newpin(<name>,<type>,<direction>)) (приклад див. у GladeVCP Programming).

6.4. Сигнал зміни виводу Hal

Подієве програмування означає, що інтерфейс користувача повідомляє ваш код, коли «щось відбувається» — через зворотний виклик, наприклад, коли натиснуто кнопку. Вихідні віджети HAL (ті, що відображають значення виводу HAL), такі як LED, Bar, VBar, Meter тощо, підтримують сигнал hal-pin-changed, який може викликати зворотний виклик у вашому коді Python, коли — ну, вивід HAL змінює своє значення. Це означає, що більше немає потреби в постійному опитуванні змін виводу HAL у вашому коді, віджети роблять це у фоновому режимі і повідомляють вам про це.

Ось приклад того, як встановити сигнал hal-pin-changed для HAL_LED у редакторі інтерфейсу Glade:

images/hal-pin-change-66.png

Приклад у configs/apps/gladevcp/complex показує, як це обробляється в Python.

6.5. Кпонки

Ця група віджетів походить від різних кнопок Gtk і складається з віджетів HAL_Button, HAL_ToggleButton, HAL_RadioButton та CheckButton. Усі вони мають один вихідний BIT-контакт, названий так само, як і віджет. Кнопки не мають додаткових властивостей порівняно з базовими класами Gtk.

  • HAL_Button: миттєва дія, стан не зберігається. Важливий сигнал: натиснуто

  • HAL_ToggleButton, HAL_CheckButton: зберігає стан увімкнено/вимкнено. Важливий сигнал: toggled

  • HAL_RadioButton: група типу «один з багатьох». Важливий сигнал: toggled (для кожної кнопки).

  • Важливі поширені методи: set_active(), get_active()

  • Важливі властивості: label, image

images/checkbutton.png
Figure 1. Кнопка перевірки
images/radiobutton.png
Figure 2. Перемикачі
images/button.png
Figure 3. Кнопка перемикання
Tip

Визначення груп радіокнопок у Glade:

  • Виберіть активну кнопку за замовчуванням.

  • У діалоговому вікні «Вибрати радіокнопку в цьому проекті» іншої кнопки «Загальні→Група» виберіть назву активної кнопки за замовчуванням.

Див. configs/apps/gladevcp/by-widget/ для отримання інформації про програми GladeVCP та файл інтерфейсу користувача для роботи з радіокнопками.

6.6. Масштаби

HAL_HScale та HAL_VScale походять від GtkHScale та GtkVScale відповідно.

<widgetname>

вихідний штифт FLOAT

<widgetname>-s

вихідний контакт s32

Щоб зробити шкалу корисною в Glade, додайте «Налаштування» (Загальне → Налаштування → Нове або існуюче налаштування) і відредагуйте об’єкт налаштування. Він визначає значення за замовчуванням/мінімальне/максимальне/кроку. Також встановіть налаштування «Розмір сторінки» і «Крок сторінки» на нуль, щоб уникнути попереджень.

images/hscale.png
Figure 4. Приклад HAL_HScale

6.7. SpinButton

HAL SpinButton походить від GtkSpinButton та містить два контакти:

<widgetname>-f

вихідний штифт FLOAT

<widgetname>-s

вихідний контакт s32

Щоб бути корисними, кнопки спіну потребують значення налаштування, наприклад, шкали, див. вище.

images/spinbutton.png
Figure 5. Приклад SpinButton

6.8. Hal_Dial

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

  • Проти годинникової стрілки = зменшення кількості

  • За годинниковою стрілкою = збільшення кількості

  • Колесо вгору = збільшення кількості

  • Коліщатко вниз = зменшення кількості

  • Подвійне клацання лівою кнопкою миші = масштаб x10

  • Подвійне клацання правою кнопкою миші = масштаб /10

6.8.1. Піни

hal_dial експортує значення лічильника у вигляді виводів HAL:

<widgetname>

вихідний контакт s32

<widgetname>-масштабований

вихідний штифт FLOAT

<widgetname>-дельта-масштаб

вихідний штифт FLOAT

6.8.2. Властивості

hal_dial має такі властивості:

cpr

Встановлює кількість обертів за оберт, допустимі значення в діапазоні від 25 до 360
за замовчуванням = 100

show_counts

Встановіть це значення на False, якщо ви хочете приховати відображення підрахунків посередині віджета.
за замовчуванням = True

мітка

Встановіть вміст мітки, яка може відображатися над значенням підрахунку.
Якщо мітка довша за 15 символів, вона буде скорочена до 15 символів.
за замовчуванням = порожнє

center_color

Це дозволяє змінити колір колеса. Використовується кольоровий рядок GDK.
за замовчуванням = #bdefbdefbdef (сірий)

count_type_shown

Доступні три підрахунки: 0) Необроблені підрахунки СЛР 1) Масштабовані підрахунки 2) Дельта-масштабовані підрахунки.
за замовчуванням = 1

  • Підрахунок базується на вибраній серцево-легеневій реанімації – він рахуватиме як позитивні, так і негативні значення. Доступний як контакт s32.

  • Масштабований підрахунок – це підрахунок серцево-легеневої реанімації (СЛР), помножений на шкалу – він може бути як додатним, так і від’ємним.
    Якщо ви зміните шкалу, вихід негайно відобразить зміну. Він доступний як вивід FLOAT.

  • Дельта-масштабований підрахунок – це ЗМІНА підрахунку серцево-легеневої реанімації, помножена на масштаб.
    Якщо змінити масштаб, масштабуватимуться лише підрахунки після цієї зміни, а потім додадуться до поточного значення.
    Доступний як вивід FLOAT.

scale_adjustable

Встановіть для цього параметра значення «Хибно», якщо ви хочете заборонити зміну масштабу подвійним клацанням на віджеті.
Якщо для цього параметра значення «Хибно», коефіцієнт масштабування не відображатиметься на віджеті.
за замовчуванням = «Так»

масштаб

Встановіть це значення для масштабування підрахунків.
за замовчуванням = 1.0

6.8.3. Пряме керування програмою

Існують способи безпосереднього керування віджетом за допомогою Python.

Використання goobject для встановлення перелічених вище властивостей:

[widget name].set_property("cpr",int(value))
[widget name].set_property("show_counts, True)
[widget name].set_property("center_color",gtk.gdk.Color('#bdefbdefbdef'))
[widget name].set_property('label', 'Test Dial 12345')
[widget name].set_property('scale_adjustable', True)
[widget name].set_property('scale', 10.5)
[widget name].set_property('count_type_shown', 0)

Існують методи Python:

  • [widget name].get_value()
    Поверне значення counts як ціле число s32

  • [widget name].get_scaled_value()
    Поверне значення counts як число з плаваючою комою

  • [widget name].get_delta_scaled_value()
    Повертає значення counts як число з плаваючою комою

  • [widget name].set_label("string")
    Встановлює вміст мітки за допомогою "рядка"

Випромінюються два сигнали GObject:

  • count_changed
    Викликається, коли лічильник віджета змінюється, наприклад, через прокручування коліщатком.

  • scale_changed
    Викликається, коли масштаб віджета змінюється, наприклад, після подвійного клацання.

Підключіться до них ось так:

[widget name].connect('count_changed', [count function name])
[widget name].connect('scale_changed', [scale function name])

Функції зворотного виклику використовуватимуть цей шаблон:

def [count function name](widget, count,scale,delta_scale):

Це поверне: віджет, поточну кількість, масштаб та дельта-масштаб цього віджета.

images/Hal_Dial.png
Figure 6. Приклад Hal_Dial

6.9. Джог-колесо

Віджет «jogwheel» імітує справжнє колесо прокрутки. Ним можна керувати за допомогою миші. Ви можете просто використовувати коліщатко миші, коли курсор миші знаходиться над віджетом JogWheel, або натиснути ліву кнопку миші і рухати курсор по колу, щоб збільшити або зменшити значення.

  • Проти годинникової стрілки = зменшення кількості

  • За годинниковою стрілкою = збільшення кількості

  • Колесо вгору = збільшення кількості

  • Коліщатко вниз = зменшення кількості

Оскільки переміщення миші методом перетягування може бути швидшим, ніж оновлення віджета, ви можете втратити рахунок, якщо будете рухатися занадто швидко. Рекомендується використовувати коліщатко миші, а метод перетягування застосовувати лише для дуже грубих рухів.

6.9.1. Піни

jogwheel експортує значення лічильника як вивід HAL:

<widgetname>-s

вихідний контакт s32

6.9.2. Властивості

jogwheel має такі властивості:

розмір

Встановлює розмір віджета в пікселях, допустимі значення в діапазоні від 100 до 500, за замовчуванням = 200

cpr

Встановлює кількість обертів за оберт, допустимі значення в діапазоні від 25 до 100, за замовчуванням = 40

show_counts

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

мітка

Встановіть вміст мітки, яка може відображатися над значенням лічильника. Мета полягає в тому, щоб дати користувачеві уявлення про використання цього колеса прокрутки. Якщо мітка довша за 12 символів, вона буде скорочена до 12 символів.

6.9.3. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання GObject для встановлення перелічених вище властивостей:

[widget name].set_property("size",int(value))
[widget name].set_property("cpr",int(value))
[widget name].set_property("show_counts, True)

Існує два методи Python:

  • [widget name].get_value()
    Поверне значення counts як ціле число

  • [widget name].set_label("string")
    Встановлює вміст мітки за допомогою "рядка"

images/JogWheel.png
Figure 7. Приклад поворотного колеса

6.10. Контроль швидкості

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

Значення регулюється за допомогою двох кнопок для збільшення або зменшення значення. Крок збільшення змінюватиметься, поки кнопка натиснута. Значення кожного кроку збільшення, а також час між двома змінами можна встановити за допомогою властивостей віджета.

6.10.1. Піни

speedcontrol пропонує деякі HAL-піни:

<widgetname>-значення

out float pin
Показане значення віджета.

<widgetname>-масштабоване значення

out float pin
Показано значення, поділене на значення шкали, це дуже корисно, якщо швидкість відображається в одиницях/хв, але LinuxCNC очікує, що вона буде в одиницях/секунда.

<widgetname>-масштаб

in float pin
Шкала, яку потрібно застосувати.
За замовчуванням – 60.

<widgetname>-збільшення

in bit pin
Поки контакт увімкнено, значення збільшуватиметься.
Дуже зручно з підключеним миттєвим перемикачем.

<widgetname>-зменшення

in bit pin
Поки контакт увімкнено, значення зменшуватиметься.
Дуже зручно з підключеним миттєвим перемикачем.

6.10.2. Властивості

speedcontrol має такі властивості:

висота

Integer
Висота віджета в пікселях.
Допустимі значення від 24 до 96.
За замовчуванням – 36.

значення

Float
Початкове значення для встановлення.
Допустимі значення знаходяться в діапазоні від 0,001 до 99999,0.
Значення за замовчуванням – 10,0.

мін

Float
Мінімальне дозволене значення.
Дозволені значення: від 0,0 до 99999,0.
За замовчуванням: 0,0.
Якщо ви зміните це значення, приріст буде скинуто до значення за замовчуванням, тому може знадобитися встановити новий приріст.

макс.

Float
Максимально допустиме значення.
Допустимі значення: від 0,001 до 99999,0.
За замовчуванням: 100,0.
Якщо ви зміните це значення, приріст буде скинуто до значення за замовчуванням, тому може знадобитися встановити новий приріст.

приріст

Float
Встановлює застосовуване приростання для кожного клацання миші.
Допустимі значення: від 0,001 до 99999,0 та -1.
Значення за замовчуванням: -1, що дає 100 приростів від мінімуму до максимуму.

inc_speed

Integer
Встановлює затримку таймера для збільшення швидкості, утримуючи натиснутими кнопки.
Допустимі значення від 20 до 300.
За замовчуванням – 100.

unit

String
Встановлює одиницю вимірювання, яка відображатиметься на смузі після значення.
Дозволено будь-який рядок.
Значення за замовчуванням — "".

колір

Color
Встановлює колір смужки.
Дозволено будь-який шістнадцятковий колір.
Значення за замовчуванням — "#FF8116".

шаблон

String
Текстовий шаблон для відображення значення. Використовується форматування Python.
Будь-який дозволений формат.
Значення за замовчуванням — "%.1f".

do_hide_button

Boolean
Показувати чи приховувати кнопку збільшення або зменшення.
True (Так) чи False (Хибно).
За замовчуванням = False (Хибно).

6.10.3. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання GObject для встановлення перелічених вище властивостей:

[widget name].set_property("do_hide_button",bool(value))
[widget name].set_property("color","#FF00FF")
[widget name].set_property("unit", "mm/min")
etc.

Також існують методи Python для зміни віджета:

[widget name].set_adjustment(gtk-adjustment)

Ви можете призначити існуюче налаштування елементу управління, таким чином легко замінити існуючі повзунки без значних змін у коді. Зверніть увагу, що після зміни налаштування може знадобитися встановити нове збільшення, оскільки воно буде скинуто до значення за замовчуванням (100 кроків від MIN до MAX):

  • [widget name].get_value()
    Повертає значення counts як число з плаваючою комою

  • [widget name].set_value(float(value))
    Встановлює для віджета задане значення

  • [widget name].set_digits(int(value))
    Встановлює цифри значення, яке буде використано

  • [widget name].hide_button(bool(value))
    Приховати або показати кнопку

images/SpeedControl.png
Figure 8. Приклад керування швидкістю

6.11. Мітка

hal_label — це простий віджет, заснований на GtkLabel, який представляє значення HAL-піна у визначеному користувачем форматі.

label_pin_type

Тип HAL піна (0:s32, 1:float, 2:u32), див. також підказку «Загальне→Тип піна HAL» (зверніть увагу, що це відрізняється від PyVCP, який має три віджети міток, по одному для кожного типу).

text_template

Визначає текст, що відображається — рядок формату Python для перетворення значення виводу в текст. За замовчуванням використовується %s (значення перетворюються за допомогою функції str()), але може містити будь-який аргумент, допустимий для методу format() Python.
Приклад: Distance: %.03f відобразить текст і значення виводу з 3 десятковими цифрами, доповненими нулями для виводу FLOAT.

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

  • HAL_HideTable

  • HAL_Table

  • State_Sensitive_Table

  • HAL_HBox (застарілий)

Ці контейнери призначені для використання для знечутливості (засірення) або приховування їхніх дочірніх об’єктів.
Знечутливі дочірні об’єкти не реагуватимуть на ввід.

HAL_HideTable

Має один вхідний контакт HAL BIT, який контролює, чи приховані його дочірні віджети.

Закріпити:
<Panel_basename>.<widgetname>

in bit pin
Якщо PIN-код низький, то дочірні віджети видно, що є станом за замовчуванням.

HAL_Table і HAL_Hbox

Мають один вхідний контакт HAL BIT, який контролює, чи є їхні дочірні віджети чутливими чи ні.

Закріпити:
<Panel_basename>.<widgetname>

in bit pin
Якщо PIN-код низький, то дочірні віджети неактивні, що є станом за замовчуванням.

State_Sensitive_Table

Відповідає на стан інтерпретатора LinuxCNC.
Опціонально можна вибрати відповідь на «must-be-all-homed», «must-be-on» та «must-be-idle».
Ви можете комбінувати їх. При Estop завжди буде нечутливим.
(Не має контакту).

Warning
HAL_Hbox є застарілим — використовуйте HAL_Table.
Якщо поточні панелі використовують його, це не призведе до збою. Ви просто більше не знайдете його в редакторі GLADE.
У майбутніх версіях GladeVCP цей віджет може бути повністю вилучені, і тоді вам доведеться оновити панель.
Tip

Якщо ви виявите, що якась частина вашої програми GladeVCP «сіра» (нечутлива), перевірте, чи не встановлений або не підключений контакт HAL_Table.

6.13. LED

hal_led імітує справжній індикаторний світлодіод.
Він має один вхідний бітовий контакт, який контролює його стан: увімкнено або вимкнено.

6.13.1. Властивості

Світлодіоди мають кілька властивостей, які визначають їхній зовнішній вигляд та відчуття:

on_color

Рядок, що визначає колір світлодіода під час увімкнення.
Може бути будь-якою дійсною назвою gdk.Color.
Не працює на Ubuntu 8.04.

off_color

Рядок, що визначає колір світлодіода у вимкненому стані.
Може бути будь-якою дійсною назвою gdk.Color або спеціальним значенням dark. dark означає, що колір вимкнено буде встановлено на значення 0,4 для кольору ввімкнено.
Не працює на Ubuntu 8.04.

pick_color_on, pick_color_off

Кольори для станів УВІМК. та ВИМК.
Вони можуть бути представлені як рядки #RRRRGGGGBBBB та є необов’язковими властивостями, що мають пріоритет над on_color та off_color.

led_size

Радіус світлодіода (для квадрата - половина сторони світлодіода)

led_shape

Форма світлодіода.
Допустимі значення: 0 для круглої, 1 для овальної та 2 для квадратної форми.

led_blink_rate

Якщо встановлено і світлодіод увімкнено, то він блимає.
Період блимання дорівнює "led_blink_rate", вказаному в мілісекундах.

create_hal_pin

Вибрати/зняти вибір зі створення виводу HAL для керування світлодіодом.
Без створення виводу HAL світлодіодом можна керувати за допомогою функції Python.

6.13.2. Сигнали

Як вхідний віджет, LED також підтримує сигнал hal-pin-changed. Якщо ви хочете отримувати повідомлення у своєму коді, коли змінюється HAL-контакт світлодіода, підключіть цей сигнал до обробника, наприклад on_led_pin_changed, і надайте обробник наступним чином:

def on_led_pin_changed(self,hal_led,data=None):
    print("on_led_pin_changed() - HAL pin value:",hal_led.hal_pin.get())

Це буде викликано на будь-якому фронті сигналу, а також під час запуску програми для повідомлення поточного значення.

images/leds.png
Figure 9. Приклад світлодіодів

6.14. Індикатор прогресу

Note

Цей віджет може зникнути.
Натомість використовуйте віджети HAL_HBar та HAL_VBar.

6.14.1. Піни

HAL_ProgressBar походить від gtk.ProgressBar та має два вхідні виводи HAL з плаваючою комою:

<widgetname>

поточне значення, яке буде відображатися

<widgetname>-масштаб

максимальне абсолютне значення вхідного сигналу

6.14.2. Властивості

HAL_ProgressBar має такі властивості:

масштаб

Шкала значень.
Встановлює максимальне абсолютне значення вхідного значення. Те саме, що й встановлення виводу <widgetname>.scale.
Число з плаваючою комою, діапазон від -224 до +224.

green_limit

Нижня межа зеленої зони

yellow_limit

Нижня межа жовтої зони

red_limit

Нижня межа червоної зони

text_template

Текстовий шаблон для відображення поточного значення <назвавіджета>.
Для dict {"value":value} можна використовувати форматування Python.

images/progressbar2.png
Figure 10. Приклад HAL_ProgressBar

6.15. Комбінований список

HAL_ComboBox походить від gtk.ComboBox. Він дозволяє вибирати значення зі спадного списку.

6.15.1. Піни

HAL_ComboBox експортує два піни HAL:

<widgetname>-f

Поточне значення, тип FLOAT

<widgetname>-s

Поточне значення, тип s32

6.15.2. Властивості

HAL_ComboBox має таку властивість, яку можна встановити в Glade:

колона

Індекс стовпця.
Тип s32.
Допустимий діапазон від -1 до 100.
Значення за замовчуванням -1.

У режимі за замовчуванням цей віджет встановлює піни на індекс вибраного запису списку. Тож, якщо ваш віджет має три мітки, він може приймати лише значення 0, 1 та 2.

У режимі стовпця (column > -1) значення, що відображається, вибирається з масиву ListStore, як визначено в Glade. Зазвичай визначення вашого віджета матиме два стовпці в ListStore: один із текстом, що відображається в спадному меню, та цілочисельне або дійсне значення, яке використовується для цього вибору.

У configs/apps/by-widget/combobox.{py,ui} наведено приклад, який використовує режим стовпця для вибору значення з плаваючою комою зі ListStore.

Якщо ви, як і я, не знаєте, як редагувати ComboBox ListStores та CellRenderer, дивіться https://youtu.be/Z5_F-rW2cL8.

6.16. Бари

Віджети HAL_Bar та HAL_VBar для горизонтальних та вертикальних стовпчиків, що представляють значення з плаваючою комою.

6.16.1. Піни

HAL_Bar та HAL_VBar мають по одному вхідному виводу FLOAT HAL.

6.16.2. Властивості

HAL_Bar та HAL_VBar, обидва смужки мають такі властивості:

інвертувати

Поміняйте напрямки min та max.
Інвертований HBar зростає справа наліво, інвертований VBar — зверху вниз.

min, max

Мінімальне та максимальне значення бажаного діапазону. Якщо поточне значення знаходиться поза цим діапазоном, це не є помилкою.

показати обмеження

Використовується для вибору/зняття вибору тексту обмежень на смузі.

нуль

Нульова точка діапазону.
Якщо вона знаходиться в межах мінімального/максимального діапазону, то смуга буде зростати від цього значення, а не від лівого (або правого) боку віджета.
Корисно для відображення значень, які можуть бути як додатними, так і від’ємними.

force_width, force_height

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

text_template

Як і в Label, встановлює формат тексту для мінімальних/максимальних/поточних значень.
Можна використовувати для вимкнення відображення значень.

значення

Встановлює значення для відображення стовпчика відповідно до введеного значення.
Використовується лише для тестування в редакторі GLADE.
Значення буде встановлено з виводу HAL.

цільове значення

Встановлює цільовий рядок на введене значення.
Використовується лише для тестування в редакторі GLADE.
Значення можна встановити у функції Python.

target_width

Ширина лінії, що позначає цільове значення.

bg_color

Колір фону (неактивного) смужки.

target_color

Колір цільової лінії.

z0_color, z1_color, z2_color

Кольори різних зон значень.
Значення за замовчуванням: green, yellow та red.
Опис зон дивіться у властивостях z*_border.

z0_border, z1_border

Визначте верхні межі колірних зон.
За замовчуванням увімкнено лише одну зону. Якщо ви хочете більше однієї зони, встановіть z0_border та z1_border на бажані значення, щоб зона 0 заповнювалася від 0 до першої межі, зона 1 заповнювалася від першої до другої межі, а зона 2 — від останньої межі до 1.
Межі встановлюються як дроби.
Діапазон допустимих значень — від 0 до 1.

images/hal_hbar.png
Figure 11. Горизонтальна смуга
images/vscale.png
Figure 12. Вертикальна смуга

6.17. Метр

HAL_Meter — це віджет, схожий на PyVCP-метр — він представляє значення з плаваючою комою.

6.17.1. Піни

HAL_Meter має один вхідний контакт FLOAT HAL.

6.17.2. Властивості

HAL-метр має такі властивості:

min, max

Мінімальне та максимальне значення бажаного діапазону.
Якщо поточне значення знаходиться поза цим діапазоном, це не є помилкою.

force_size

Примусовий діаметр віджета.
Якщо не встановлено, розмір буде визначатися з упаковки або з фіксованого розміру віджета, а метр заповнить весь доступний простір з урахуванням співвідношення сторін.

text_template

Як і в Label, встановлює текстовий формат для поточного значення.
Можна використовувати для вимкнення відображення значення.

мітка

Велика етикетка над центром лічильника.

підмітка

Невелика етикетка під центром лічильника.

bg_color

Колір фону лічильника.

z0_color, z1_color, z2_color

Кольори різних зон значень.
Значення за замовчуванням: green, yellow та red.
Опис зон дивіться у властивостях z*_border.

z0_border, z1_border

Визначте верхні межі колірних зон.
За замовчуванням увімкнено лише одну зону. Якщо ви хочете більше однієї зони, встановіть z0_border та z1_border на бажані значення, щоб зона 0 заповнювалася від мінімального до першого межі, зона 1 заповнювалася від першого до другого межі, а зона 2 — від останнього межі до максимального.
Межі встановлюються як значення в діапазоні мінімум-максимум.

images/hal_meter.png
Figure 13. Приклади вимірювачів HAL

6.18. HAL_Graph

Цей віджет призначений для відображення значень з плином часу.

6.19. Попередній перегляд траєкторії інструменту Gremlin для файлів NGC

Gremlin — це віджет попереднього перегляду сюжету, схожий на вікно попереднього перегляду AXIS. Він передбачає роботу в середовищі LinuxCNC, такому як AXIS або Touchy. Для підключення до нього перевіряє змінну середовища INI_FILE_NAME. Gremlin відображає поточний файл NGC — він відстежує зміни та перезавантажує файл ngc, якщо ім’я файлу в AXIS/Touchy змінюється. Якщо ви запускаєте його в додатку GladeVCP, коли LinuxCNC не працює, ви можете отримати трасування, оскільки віджет Gremlin не може знайти стан LinuxCNC, наприклад поточне ім’я файлу.

6.19.1. Піни

Gremlin не експортує жодних HAL-пінів.

6.19.2. Властивості

Гремлін має такі властивості:

enable_dro

Це відображає падіння на графіку.
За замовчуванням = true.

show_velocity

Тут відображається швидкість інструменту.
За замовчуванням = true.

use_commanded

Це вибирає значення DRO для використання: командні або фактичні.
За замовчуванням = true.

metric_units

Це вибирає одиниці вимірювання DRO: метричні або імперські.
За замовчуванням = true.

show_rapids

Це вказує плотеру показати швидкі рухи.
За замовчуванням = true.

show_dtg_

Це вибирає, щоб DRO відображав значення залишкової відстані.
За замовчуванням = true.

use_relative

Це вибирає, щоб DRO відображав значення відносно координат системи користувача або машини.
За замовчуванням = true.

show_live_plot

Це вказує плотеру, чи потрібно малювати, чи ні.
За замовчуванням = true.

show_limits

Це вказує плотеру показати межі можливостей машини.
За замовчуванням = true.

show_lathe_radius

Це вибирає відображення DRO для осі X у радіусі або діаметрі, якщо в режимі токарного верстата (можна вибрати у файлі INI з LATHE = 1).
За замовчуванням = true.

show_extents_option

Це вказує плотеру показати межі машини.
За замовчуванням = true.

show_tool

Це вказує плотеру намалювати інструмент.
За замовчуванням = true.

show_program

Показує програму G-коду.
За замовчуванням = True

use_joints_mode

Використовується в нетривіальних машинах (наприклад, роботах).
За замовчуваннямt = false.

grid_size

Встановлює розмір сітки (відображається лише у вікнах X, Y та Z).
За замовчуванням — 0

use_default_controls

Це вимикає стандартні елементи керування мишею.
Це найбільш корисно при використанні сенсорного екрану, оскільки стандартні елементи керування не працюють належним чином. Ви можете програмно додати елементи керування за допомогою Python та техніки обробки файлів.
За замовчуванням = true.

вид

Може бути будь-яким із x, y, y2, z, z2, p (перспектива).
За замовчуванням використовується z вигляд.

enable_dro

Тип = boolean.
Чи малювати DRO на графіку чи ні.
За замовчуванням = true.

mouse_btn_mode

Тип = integer.
Обробка кнопок миші: призводить до різних функцій кнопки:

  • 0 = за замовчуванням: поворот ліворуч, переміщення посередині, масштабування праворуч

  • 1 = масштабування ліворуч, рух посередині, поворот праворуч

  • 2 = ліворуч, поворот посередині, масштабування праворуч

  • 3 = масштабування ліворуч, поворот посередині, переміщення праворуч

  • 4 = ліворуч, масштабування посередині, поворот праворуч

  • 5 = поворот ліворуч, масштабування посередині, рух праворуч

  • 6 = ліворуч, середній зум, правий зум

Режим 6 рекомендується для плазмових та токарних верстатів, оскільки для таких машин обертання не потрібне.

6.19.3. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання GObject для встановлення перелічених вище властивостей:

[widget name].set_property('view','P')
[widget name].set_property('metric_units',False)
[widget name].set_property('use_default_controls',False)
[widget name].set_property('enable_dro' False)
[widget name].set_property('show_program', False)
[widget name].set_property('show_limits', False)
[widget name].set_property('show_extents_option', False)
[widget name].set_property('show_live_plot', False)
[widget name].set_property('show_tool', False)
[widget name].set_property('show_lathe_radius',True)
[widget name].set_property('show_dtg',True)
[widget name].set_property('show_velocity',False)
[widget name].set_property('mouse_btn_mode', 4)

Існують методи Python:

[widget name].show_offsets = True
[widget name].grid_size = .75
[widget name].select_fire(event.x,event.y)
[widget name].select_prime(event.x,event.y)
[widget name].start_continuous_zoom(event.y)
[widget name].set_mouse_start(0,0)
[widget name].gremlin.zoom_in()
[widget name].gremlin.zoom_out()
[widget name].get_zoom_distance()
[widget name].set_zoom_distance(dist)
[widget name].clear_live_plotter()
[widget name].rotate_view(x,y)
[widget name].pan(x,y)
Підказки
  • Якщо встановити всі параметри побудови графіка на значення false, але show_offsets на значення true, то замість графічного графіка отримаєте сторінку зміщень.

  • Якщо ви отримаєте відстань масштабування перед зміною подання, а потім скинете відстань масштабування, це набагато зручніше для користувача.

  • Якщо ви оберете елемент у попередньому перегляді, вибраний елемент буде використано як центральна точка обертання

images/gremlin.png
Figure 14. Приклад Гремліна

6.20. HAL_Offset

Віджет HAL_Offset використовується для відображення зміщення однієї осі.

6.20.1. Властивості

HAL_Offset має такі властивості:

display_units_mm

Відображати в метричних одиницях.

joint_number

Використовується для вибору осі (технічно, який шарнір) відображається.
На верстаті Trivialkins (фрезерному, токарному, фрезерному) номер осі та шарніра:

0:X 1:Y 2:Z 3:A 4:B 5:C 6:U 7:V 8:W
mm_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.

imperial_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.

reference_type
0:G5x 1:tool 2:G92 3:Обертання навколо Z

6.21. DRO віджет

Віджет DRO використовується для відображення поточного положення осі.

6.21.1. Властивості

Він має такі властивості:

display_units_mm

Використовується для перемикання одиниць відображення між метричною та імперською системами. Значення за замовчуванням – False.

фактичний

Виберіть фактичне (зворотне) положення або задане положення. За замовчуванням встановлено значення «True».

діаметр

Відображення діаметра для токарного верстата. За замовчуванням False.

mm_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю. Значення за замовчуванням — "%10.3f".

imperial_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю. Значення за замовчуванням — "%9.4f".

joint_number

Використовується для вибору осі (технічно, який шарнір) відображається. За замовчуванням – 0.
На верстаті Trivialkins (фрезерний, токарний, фрезерний) номер осі в порівнянні з номером шарніра:

0:X 1:Y 2:Z 3:A 4:B 5:C 6:U 7:V 8:W +
reference_type
  • 0 = absolute (походження машини).

  • 1 = relative (до поточного початку координат користувача - G5x).

  • 2 = distance-to-go (відносно поточного початку координат користувача). За замовчуванням is 0.

font_family

Вкажіть сімейство шрифтів, наприклад, mono. За замовчуванням використовується sans. Якщо шрифт не існує, буде використано поточний системний шрифт. За замовчуванням використовується sans.

font_size

Вкажіть розмір шрифту від 8 до 96. За замовчуванням – 26.

font_weight

Вкажіть товщину шрифту. Виберіть світліший, звичайний, жирний або жирніший. За замовчуванням вибрано жирний шрифт.

unhomed_color

Колір тексту, коли його не розміщено, вказано як колір Gdk.RGBA. За замовчуванням – червоний, Gdk.RGBA(червоний=1.000000, зелений=0.000000, синій=0.000000, альфа=1.000000)

homed_color

Колір тексту, коли вказано колір Gdk.RGBA, визначається як колір Gdk.RGBA. За замовчуванням – зелений, Gdk.RGBA(червоний=0.000000, зелений=0.501961, синій=0.000000, альфа=1.000000)

Підказки
  • Якщо ви хочете, щоб відображення було вирівняно по правому краю, встановіть для горизонтального вирівнювання значення «Кінець».

  • Фон віджета насправді прозорий, тому якщо ви розмістите його над зображенням, цифри DRO будуть відображатися поверх нього без фону. Для цього існує спеціальна техніка. Дивіться анімовані діаграми функцій нижче.

  • Віджет DRO — це модифікований віджет міток gtk. Таким чином, багато з того, що можна зробити з міткою gtk, можна зробити і з віджетом DRO.

  • Властивості шрифту також можна встановити з таблиці стилів CSS, яка має найвищий пріоритет і замінить значення, встановлені властивостями GObject.

6.21.2. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання GObject для встановлення перелічених вище властивостей
[widget name].set_property("display_units_mm", True)
[widget name].set_property("actual", True)
[widget name].set_property("diameter", True)
[widget name].set_property("mm_text_template", "%10.3f")
[widget name].set_property("imperial_text_template", "%9.4f")
[widget name].set_property("joint_number", 3)
[widget name].set_property("reference_type", 3)
[widget name].set_property("font_family", "mono")
[widget name].set_property("font_size", 30)
[widget name].set_property("font_weight", "bold")
# Легше читати кольори, викликаючи функцію:
def str_to_rgba(color):
  c = Gdk.RGBA()
  c.parse(color)
  return c

[widget name].set_property("unhomed_color", str_to_rgba("magenta"))
[widget name].set_property("homed_color", str_to_rgba("cyan"))
Використання таблиці стилів CSS для налаштування властивостей шрифту

Кольори можна вказати в одному з кількох форматів, усі вони вказуватимуть один і той самий колір: червоний, *#ff0000, *rgb(255,0,0) або rgba(255,0,0,255).

Кольори можуть позначатися разом:

.dro_unhomed {color: magenta}
.dro_homed {color: cyan}

або окремо за назвою віджета:

#[widget name].dro_unhomed {color: magenta}
#[widget name].dro_homed {color: cyan}

На інші властивості стилю потрібно посилатися за назвою віджета:

#[widget name], #[widget name], #[widget name] {
    font-family: mono;
    font-size: 60px;
    font-weight: lighter;
}
Існує два методи Python
[widget name].set_dro_inch()
[widget name].set_dro_metric()

6.22. Віджет Combi_DRO

Віджет «Combi_DRO» використовується для відображення поточного значення, відносного положення осі та відстані, що залишається до кінця, в одному DRO.
При натисканні на DRO порядок DRO буде змінюватися.
У відносному режимі буде відображатися фактична система координат.

6.22.1. Властивості

Combi_DRO має такі властивості:

joint_number

Використовується для вибору осі (технічно, який шарнір) відображається.
На верстаті Trivialkins (фрезерному, токарному, фрезерному) номери осей/шаблонів:

0:X 1:Y 2:Z etc.
фактичний

Виберіть фактичне (зворотний зв’язок) або командне положення.

metric_units

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

auto_units

Одиниці вимірювання перемикатимуться між метричною та імперською системами залежно від того, чи активний G-код – G20 або G21.
За замовчуванням встановлено значення TRUE (ІСТИНА).

діаметр

Відображати положення як діаметр чи радіус.
У режимі діаметра DRO відображатиме значення з’єднання, помножене на 2.

mm_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.
Значення за замовчуванням — "%10.3f".

imperial_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.
Значення за замовчуванням — "%9.4f".

homed_color

Колір переднього плану номерів DRO, якщо з’єднання має вихідне положення.
За замовчуванням – зелений.

unhomed_color

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

abs_color

Колір фону індикатора DRO, якщо головний індикатор DRO показує абсолютні координати.
За замовчуванням – синій.

кrel_color

Колір фону індикатора DRO, якщо головний індикатор DRO показує відносні координати.
За замовчуванням – чорний.

dtg_color

Колір фону індикатора, якщо головний індикатор показує відстань, що залишилася.
За замовчуванням – жовтий.

font_size

Розмір шрифту для великих чисел, для малих буде в 2,5 рази меншим.
Значення має бути цілим числом у діапазоні від 8 до 96.
За замовчуванням – 25.

toggle_readout

Лівою кнопкою миші можна перемикати режими відображення DRO [«Rel», «Abs», «DTG»].
Знявши прапорець, можна вимкнути цю функцію. Перемикання можна виконати за допомогою [widget name].toggle_readout().
Значення має бути булевим.
За замовчуванням — TRUE.

cycle_time

Час, протягом якого DRO очікує між двома опитуваннями.
Це налаштування слід змінювати лише в тому випадку, якщо ви використовуєте більше 5 DRO одночасно, тобто в 6-осьовій конфігурації, щоб уникнути надмірного уповільнення основної програми DRO.
Значення повинно бути цілим числом у діапазоні від 100 до 1000. FIXME unit=ms ?
За замовчуванням – 150.

6.22.2. Пряме керування програмою

Використання GObject для встановлення перелічених вище властивостей:

[назва віджета].set_property(property, value)

Існує кілька методів Python для керування віджетом:

  • [назва віджета].set_to_inch(state)
    Встановлює для DRO відображення імперських одиниць.
    state = boolean (True або False)
    За замовчуванням – FIXME.

  • [widget name].set_auto_units(state)
    Якщо значення True, то DRO змінюватиме одиниці вимірювання відповідно до активного G-коду (G20 / G21).
    state = boolean (True або False)
    За замовчуванням значення True.

  • [widget name].set_to_diameter(state)
    Якщо значення True (Істина), указівник відображатиме діаметр, а не радіус, тобто значення осі, помножене на 2 (особливо необхідно для токарних верстатів).
    state = boolean (True або False)
    За замовчуванням False.

  • [widget name].toggle_readout()
    Змінює порядок DRO у віджеті.

  • [widget name].change_axisletter(letter)
    Змінює автоматично задану літеру осі.
    Дуже корисно для зміни укаження токарного верстата з «X» на «R» або «D».
    letter = string

  • [widget name].get_order()
    Повертає порядок DRO у віджеті, який використовується переважно для підтримки їхньої узгодженості.
    Порядок також буде передано разом із сигналом клацання.
    Повертає список, що містить порядок.

  • [widget name].set_order(order)
    Встановлює порядок DRO, головним чином використовується для підтримки їхньої узгодженості.
    order = об’єкт списку, має бути одним із:

    • ["Rel", "Abs", "DTG"] (за замовчуванням)

    • ["DTG", "Rel", "Abs"]

    • ["Abs", "DTG", "Rel"]

  • [widget name].get_position()
    Повертає позицію DRO у вигляді списку чисел з плаваючою комою.
    Порядок не залежить від порядку, що відображається в DRO, і буде задано як [Абсолютний, відносний, DTG].

    • Absolute = координати машини, залежно від фактичної властивості, нададуть фактичне або командне положення.

    • Relative = будуть координатами фактичної системи координат.

    • DTG = відстань, що залишилася.
      Здебільшого буде 0, оскільки цю функцію не слід використовувати під час руху машини через часові затримки.

Віджет видаватиме такі сигнали:

  • clicked
    Цей сигнал випромінюється, коли користувач натискає на віджет Combi_DRO.
    Він надсилає такі дані:

    • widget = widget object
      Об’єкт віджета, який надсилає сигнал.

    • joint_number = integer
      Спільний номер DRO, де «0:X 1:Y 2:Z тощо».

    • order = list object
      Порядок DRO у цьому віджеті.
      Цей порядок може бути використаний для встановлення такого ж порядку для інших віджетів Combi_DRO. [widget name].set_order(order).

  • units_changed
    Цей сигнал випромінюється, якщо змінюються одиниці вимірювання DRO.
    Він надсилатиме такі дані:

    • widget = widget object
      Об’єкт віджета, який надсилає сигнал.

    • metric_units = boolean
      Істина, якщо DRO відображає метричні одиниці, Хибність — у випадку імперських одиниць.

  • system_changed
    Цей сигнал випромінюється, якщо змінюються одиниці вимірювання DRO.
    Він надсилатиме такі дані:

    • widget = widget object
      Об’єкт віджета, який надсилає сигнал.

    • system = string
      Фактична система координат. Буде однією з G54, G55, G56, G57, G58, G59, G59.1, G59.2, G59.3 або Rel, якщо жодної не було вибрано взагалі, що відбуватиметься лише в Glade без запущеного LinuxCNC.

Ось деяка інформація, яку можна отримати за допомогою команд, яка може бути вам цікавою:

  • [widget name].system
    Фактична система, як зазначено в сигналі system_changed.

  • [widget name].homed
    Істина, якщо з’єднання має хоум-код.

  • [widget name].machine_units
    0, якщо імперські, 1, якщо метричні.

images/combi_dro.png
Figure 15. Приклад: Три Combi_DRO у вікні
X = Відносний режим
Y = Абсолютний режим
Z = Режим DTG

6.23. IconView (Вибір файлу)

Це зручний для сенсорного екрана віджет для вибору файлу та зміни каталогів.

6.23.1. Властивості

IconView віджет має такі властивості:

icon_size

Встановлює розмір відображеної значка.
Допустимі значення – цілі числа в діапазоні від 12 до 96.
За замовчуванням – 48.

start_dir

Встановлює каталог, з якого починається показ віджета вперше.
Має бути рядком, що містить дійсний шлях до каталогу.
Значення за замовчуванням — "/".

jump_to_dir

Встановлює каталог «перейти до», який вибирається відповідною кнопкою в нижньому списку кнопок (5-та кнопка, рахуючи зліва).
Повинно бути рядком, що містить дійсний шлях до каталогу.
За замовчуванням — «\~».

filetypes

Встановлює фільтр файлів для відображення об’єктів.
Має бути рядком, що містить список розширень, розділених комами, для відображення.
За замовчуванням — "ngc,py".

чорний порядок

Встановлює порядок сортування відображеної піктограми.
Має бути цілим числом від 0 до 3, де:

  • 0 = ASCENDING (відсортовано за іменами файлів)

  • 1 = DESCENDING (відсортовано за іменами файлів)

  • 2 = FOLDERFIRST (спочатку показати папки, потім файли), за замовчуванням

  • 3 = FILEFIRST (спочатку показати файли, потім папки)

6.23.2. Пряме керування програмою

Використання GObject для встановлення перелічених вище властивостей:

[widget name].set_property(property,Value)

Існують методи Python для керування віджетом:

  • [widget name].show_buttonbox(state)
    Якщо False, нижня кнопка буде прихована.
    Це корисно в користувацьких екранах зі спеціальним розташуванням кнопок, щоб не змінювати макет графічного інтерфейсу. Хорошим прикладом цього є GMOCCAPY.
    state = boolean (True або False).
    За замовчуванням True.

  • [widget name].show_filelabel(state)
    Якщо True, буде показано мітку файлу (між вікном IconView і нижньою кнопкою).
    Приховування цієї мітки може заощадити місце, але її відображення дуже корисно для налагодження.
    state = boolean (True або False).
    За замовчуванням True.

  • [widget name].set_icon_size(iconsize)
    Встановлює розмір значка.
    Має бути цілим числом у діапазоні від 12 до 96.
    За замовчуванням = 48.

  • [widget name].set_directory(directory)
    Дозволяє встановити каталог для відображення.
    directory = рядок (дійсний шлях до файлу).

  • [widget name].set_filetypes(filetypes)
    Встановлює фільтр файлів, який буде використано.
    Будуть відображатися лише файли з заданими розширеннями.
    filetypes = рядок, що містить список розширень, розділених комами.
    За замовчуванням = "ngc,py".

  • [widget name].get_selected()
    Повертає шлях до вибраного файлу або None, якщо каталог було вибрано.

  • [widget name].refresh_filelist()
    Оновлює список файлів.
    Потрібно, якщо ви додаєте файл без зміни каталогу.

Якщо поле кнопки було приховано, ви можете отримати доступ до функцій цієї кнопки через сигнали її натискання, такі як:

[widget name].btn_home.emit("clicked")
[widget name].btn_jump_to.emit("clicked")
[widget name].btn_sel_prev.emit("clicked")
[widget name].btn_sel_next.emit("clicked")
[widget name].btn_get_selected.emit("clicked")
[widget name].btn_dir_up.emit("clicked")
[widget name].btn_exit.emit("clicked")

6.23.3. Сигнали

Віджет видаватиме такі сигнали:

  • selected
    Цей сигнал випромінюється, коли користувач вибирає значок.
    Він повертає рядок, що містить шлях до файлу, якщо файл було вибрано, або None, якщо було вибрано каталог.

  • sensitive
    Цей сигнал випромінюється, коли кнопки змінюють свій стан з чутливого на нечутливий або навпаки.
    Цей сигнал корисний для синхронізації навколишнього графічного інтерфейсу користувача з кнопкою віджета. Дивіться GMOCCAPY як приклад.
    Він поверне buttonname і новий state:

    • buttonname може бути одним з btn_home, btn_dir_up, btn_sel_prev, btn_sel_next, btn_jump_to або btn_select.

    • state – це логічне значення, яке прийматиме значення True або False.

  • exit
    Цей сигнал випромінюється, коли натискається кнопка виходу для закриття IconView.
    Найчастіше потрібен, якщо програма запускається як окрема.

images/iconview.png
Figure 16. Приклад перегляду значків

6.24. Віджет калькулятора

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

6.24.1. Властивості

calculator має такі властивості:

is_editable

Це дозволяє вводити дані з клавіатури.

шрифт

Це дозволяє налаштувати шрифт відображення.

6.24.2. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання goobject для встановлення перелічених вище властивостей:

[widget name].set_property("is_editable",True)
[widget name].set_property("font","sans 25")

Існують методи Python:

  • [widget name].set_value(2.5)
    Це попередньо налаштовує дисплей і записує його.

  • [назва віджета].set_font("sans 25")

  • [widget name].set_editable(True)

  • [widget name].get_value()
    Повертає обчислене значення – число з плаваючою комою.

  • [назва віджета].set_editable(True)

  • [widget name].get_preset_value()
    Повертає записане значення: число з плаваючою комою.

6.25. Віджет Tooleditor

Це віджет tooleditor для відображення та модифікації файлу інструменту.
У режимі токарного верстата він відображає знос та зміщення інструменту окремо.
Знос позначається номером інструменту вище 10000 (стиль Fanuc).
Він перевіряє поточний файл раз на секунду, щоб побачити, чи оновив його LinuxCNC.

Note
LinuxCNC вимагає перепризначення викликів інструментів для фактичного використання зміщень зносу.

6.25.1. Властивості

tooleditor має такі властивості:

шрифт

Відображати шрифт для використання

hide_columns

Це приховає вказані стовпці.
Стовпці позначені (у порядку) таким чином: s,t,p,x,y,z,a,b,c,u,v,w,d,i,j,q.
Ви можете приховати будь-яку кількість стовпців, включаючи вибір та коментарі.

lathe_display_type

Показати формат токарного верстата

6.25.2. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання goobject для встановлення перелічених вище властивостей:

[widget name].set_properties('hide_columns','uvwijq')

Це приховає стовпці uvwij та q і покаже всі інші.

Існують методи Python:

  • [widget name].set_visible("ijq",False)
    Приховав би стовпці ij та Q, а решту залишив би як є.

  • [widget name].set_filename(path_to_file)
    Встановлює та завантажує файл інструменту.

  • [widget name].reload(None)
    Перезавантажує поточний файл інструментів.

  • [widget name].set_font('sans 16,tab='1')
    Встановлює шрифт (Pango) для вкладки, заголовка стовпця та даних інструменту.
    Параметри all_offsets, wear_offsets, tool_offsets можна встановити одночасно, додавши 1, 2 та/або 3 до рядка вкладки.
    За замовчуванням встановлюються всі вкладки.

  • [widget name].set_title_font('sans 16,tab='1')
    Встановлює шрифт (Pango) тільки для заголовків стовпців.
    Параметри all_offsets, wear_offsets, tool_offsets можна встановити одночасно, додавши 1, 2 та/або 3 до рядка табуляції.
    За замовчуванням встановлені всі табуляції.

  • [widget name].set_tab_font('sans 16,tab='1')
    Встановлює шрифт (Pango) тільки на вкладках.
    Параметри all_offsets, wear_offsets, tool_offsets можна встановити одночасно, додавши 1, 2 та/або 3 до рядка вкладки.
    За замовчуванням встановлено всі вкладки.

  • [widget name].set_col_visible("abcUVW", False, tab='1')
    Це приховає (False) стовпці abcuvw на вкладці 1 (all_offsets)

  • [widget name].set_lathe_display(value)
    Приховує або показує вкладки зносу та зміщення інструменту, що використовуються для токарних верстатів

  • [widget name].get_toolinfo(toolnum)
    Повертає масив інформації про інструмент із запитуваним номером інструмента або поточним інструментом, якщо номер інструмента не вказано.
    Повертає None, якщо інструмент не знайдено в таблиці або якщо поточного інструмента немає.

  • [widget name].hide_buttonbox(self, True)
    Метод «Зручність» для приховування кнопок.
    Ви повинні викликати його після show_all().

  • [widget name].get_selected_tool()
    Повернути номер вибраного користувачем (виділеного) інструмента.

  • [widget name].set_selected_tool(toolnumber)
    Вибирає (підсвічує) запитуваний інструмент.

images/gtk-tooledit.png
Figure 17. Приклад Tooleditor

6.26. Зсувна сторінка

Віджет «Offsetpage» використовується для відображення/редагування зміщень всіх осей.
Він має зручні кнопки для обнулення зміщень G92 і Rotation-Around-Z.
Ви можете вибрати режим редагування тільки тоді, коли верстат увімкнений і знаходиться в режимі очікування.
У цей час ви можете безпосередньо редагувати зміщення в таблиці. Зніміть позначку з кнопки редагування, щоб «OffsetPage» відобразив зміни.

6.26.1. Властивості

Він має такі властивості:

display_units_mm

Відображення в метричних одиницях

hide_columns

Список стовпців без пробілів, які потрібно приховати. Стовпці позначені (по порядку) так: xyzabcuvwt.
Ви можете приховати будь-який зі стовпців.

hide_rows

Список рядків без пробілів, які потрібно приховати.
Рядки позначені (по порядку) так: 0123456789abc.
Ви можете приховати будь-який із рядків.

шрифт

Встановлює тип і розмір шрифту тексту.

highlight_color

Під час редагування це колір підсвічування.

foreground_color

Коли OffsetPage виявляє активну систему координат користувача, він використовуватиме цей колір для тексту.

mm_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.

imperial_text_template

Ви можете використовувати форматування Python для відображення позиції з різною точністю.

6.26.2. Пряме керування програмою

Існує кілька способів безпосереднього керування віджетом за допомогою Python.

Використання goobject для встановлення перелічених вище властивостей:

[widget name].set_property("highlight_color",gdk.Color('blue'))
[widget name].set_property("foreground_color",gdk.Color('black'))
[widget name].set_property("hide_columns","xyzabcuvwt")
[widget name].set_property("hide_rows","123456789abc")
[widget name].set_property("font","sans 25")

Існують методи Python для керування віджетом:

  • [widget name].set_filename("../../../configs/sim/gscreen/gscreen_custom/sim.var")

  • [widget name].set_col_visible("Yabuvw",False)

  • [widget name].set_row_visible("456789abc",False)

  • [widget name].set_to_mm()

  • [widget name].set_to_inch()

  • [widget name].hide_button_box(True)

  • [назва віджета].set_font("sans 20")

  • [widget name].set_highlight_color("violet")

  • [widget name].set_foreground_color("yellow")

  • [widget name].mark_active("G55")
    Дозволяє безпосередньо встановити рядок для виділення, наприклад, якщо ви хочете використовувати власні елементи керування навігацією. Див. розділ про GMOCCAPY.

  • [widget name].selection_mask = ("Tool","Rot","G5x")
    Ці рядки НЕ можна вибрати в режимі редагування.

  • [widget name].set_names([['G54','Default'],["G55","Vice1"],['Rot','Rotational']])
    Це дозволяє вам встановити текст стовпця «T» кожного/будь-якого рядка.
    Це список пар «зсув-ім’я/ім’я користувача».
    Текст за замовчуванням такий самий, як і назва зсуву.

  • [widget name].get_names()
    Це повертає список пар рядок-ключове слово/ім’я користувача.
    Стовпець з іменем користувача можна редагувати, тому збереження цього списку зручне для користувача.
    Див. set_names вище.

images/offsetpage.png
Figure 18. Приклад зсуву сторінки

6.27. Віджет HAL_sourceview

Це призначено для відображення та простого редагування G-коду. Він шукає .ngc, що підсвічує специфікації у ~/share/gtksourceview-4/language-specs/. Поточний рядок, що виконується, буде підсвічено.

За допомогою зовнішнього коду Python glue він може:

  • Пошук тексту, скасування та повторення змін.

  • Використовується для вибору рядка програми.

6.27.1. Пряме керування програмою

Існують методи Python для керування віджетом:

  • [widget name].redo()
    Повторити один рівень змін.

  • [widget name].undo()
    Скасувати один рівень змін

  • [widget name].text_search(direction=True,mixed_case=True,text='G92')
    Пошук уперед (напрямок = True) або назад,
    Пошук зі змішаним регістром (mixed_case = True) або точним збігом

  • [widget name].set_line_number(linenumber)
    Встановлює виділення рядка.
    Використовує номери рядків з вихідного коду.

  • [widget name].get_line_number()
    Повертає поточний виділений рядок.

  • [widget name].line_up()
    Переміщує виділений рядок на один рядок угору.

  • [widget name].line_down()
    Переміщує виділений рядок на один рядок вниз.

  • [widget name].load_file('filename')
    Завантажує файл.
    Використання параметра «Немає» (не рядок імені файлу) призведе до перезавантаження тієї ж програми.

  • [widget name].get_filename()
    Опис FIXME

images/hal_sourceview.png
Figure 19. Приклад перегляду джерела

6.28. Історія MDI

Це призначено для відображення та введення кодів MDI.
Він автоматично стає сірим, коли MDI недоступний, наприклад, під час аварійної зупинки та виконання програми.

6.28.1. Властивості

font_size_tree

Ціле число від 8 до 96.
Змінить розмір шрифту за замовчуванням для деревоподібного представлення на вибране значення.

font_size_entry

Ціле число від 8 до 96.
Змінить розмір шрифту за замовчуванням на вибране значення.

use_double_click

Булеве значення True вмикає функцію подвійного клацання мишею, і подвійне клацання на записі призведе до виконання цієї команди.
Не рекомендується використовувати цю функцію на реальних машинах, оскільки подвійне клацання на неправильному записі може призвести до небезпечних ситуацій.

6.28.2. Пряме керування програмою

Використання goobject для встановлення перелічених вище властивостей:

[widget name].set_property("font_size_tree",10)
[widget name].set_property("font_size_entry",20)
[widget name].set_property("use_double_click",False)

6.29. Анімовані діаграми функцій: віджети HAL у растровому зображенні

Для деяких додатків може бути бажано мати фонове зображення, наприклад функціональну діаграму, і розміщувати віджети у відповідних місцях цього зображення. Хорошим поєднанням є встановлення растрового фонового зображення, наприклад, з файлу .png, встановлення фіксованого розміру вікна GladeVCP та використання віджета Glade Fixed для розміщення віджетів на цьому зображенні. Код для наведеного нижче прикладу можна знайти в configs/apps/gladevcp/animated-backdrop:

images/small-screenshot.png
Figure 20. Приклад віджетів HAL у растровому зображенні

7. Довідник з віджетів дій

GladeVCP містить колекцію «готових дій» під назвою Віджети дій VCP для редактора інтерфейсу користувача Glade.

Note

Окрім віджетів HAL, які взаємодіють з контактами HAL, дії VCP взаємодіють з LinuxCNC та інтерпретатором G-коду.

Віджети дій VCP походять від віджета Gtk.Action.

Коротко про віджет «Дія»:

  • Це об’єкт, доступний у Glade

  • Сам по собі він не має візуального вигляду

  • Його призначення: пов’язати видимий, чутливий компонент інтерфейсу користувача, такий як меню, кнопка інструмента, кнопка, з командою. Див. властивість цих віджетів «Загальні→Пов’язані→Дія».

  • «Запланована дія» буде виконана, коли буде запущено відповідний компонент інтерфейсу користувача (натискання кнопки, клік меню тощо).

  • Це забезпечує простий спосіб виконання команд без звернення до програмування на Python.

Зовнішній вигляд дій VCP у Glade приблизно такий:

images/vcp-actions.png
Figure 21. Віджети дій

Підказки під час наведення курсора надають опис.

7.1. Віджети дій VCP

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

7.2. VCP Action Python

Цей віджет використовується для виконання невеликого довільного коду Python.

У командному рядку можуть використовуватися спеціальні ключові слова для доступу до важливих функцій.

  • ACTION для доступу до бібліотеки команд ACTION.

  • GSTAT для доступу до бібліотеки повідомлень про статус Gstat.

  • INFO для доступу до зібраних даних з INI-файлу.

  • HAL для доступу до модуля Python HAL linuxcnc.

  • STAT для доступу до необробленого стану LinuxCNC через модуль LinuxCNC Python.

  • CMD для доступу до команд LinuxCNC через модуль LinuxCNC Python.

  • EXT для доступу до функцій файлу обробника, якщо такі є.

  • linuxcnc для доступу до модуля LinuxCNC Python.

  • self для доступу до екземпляра віджета.

  • dir для доступу до списку атрибутів обробників.

Є варіанти

  • виберіть, коли віджет буде активним,

  • встановити режим перед виконанням команди.

Приклад команди для простого виведення повідомлення в термінал:

print('action activated')

Приклад команди для вимкнення машини:

CMD.state(linuxcnc.STATE_OFF)

Приклад команди для виклику функції-обробника, яка передає дані:

EXT.on_button_press(self, 100)

Ви можете використовувати крапку з комою для розділення кількох команд;

print('Вимкнути машину');CMD.state(linuxcnc.STATE_OFF)

Більше інформації про INFO та ACTION можна знайти тут: Модулі бібліотек GladeVCP.

Більше інформації про GStat можна знайти тут: GStat.

7.3. Віджети VCP ToggleAction

Це бімодальні віджети. Вони реалізують дві дії або використовують другий стан (зазвичай «натиснутий») для вказівки, що в даний момент виконується дія. Дії перемикання призначені для використання в «ToggleButtons», «ToggleToolButtons» або для перемикання елементів меню. Простим прикладом є кнопка перемикання «ESTOP».

Наразі доступні такі віджети:

  • Перемикач ESTOP надсилає команди ESTOP або ESTOP_RESET до LinuxCNC залежно від свого стану.

  • Перемикач ON/OFF надсилає команди STATE_ON та STATE_OFF.

  • Pause/Resume надсилає команди AUTO_PAUSE або AUTO_RESUME.

Наведені нижче дії перемикання мають лише одну пов’язану команду та використовують стан натиснуто, щоб вказати, що запитувана операція виконується:

  • Перемикач Run надсилає команду AUTO_RUN та чекає в натиснутому стані, поки інтерпретатор знову не буде в режимі очікування.

  • Перемикач Stop неактивний, доки інтерпретатор не перейде в активний стан (не почне виконувати G-код), а потім не дозволить користувачеві надіслати команду AUTO_ABORT.

  • Перемикач MDI надсилає задану MDI-команду та очікує її завершення в неактивному стані натиснутого.

7.4. Віджети Action_MDI Toggle та Action_MDI

Ці віджети забезпечують можливість виконання довільних команд MDI.
Віджет Action_MDI не чекає на завершення команди, як це робить перемикач Action_MDI, який залишається вимкненим до завершення команди.

7.5. Простий приклад: Виконання команди MDI при натисканні кнопки

configs/apps/gladevcp/mdi-command-example/whoareyou.ui це файл інтерфейсу Glade, який містить основні функції:

  1. Відкрийте його в Glade та вивчіть, як це робиться.

  2. Запустіть AXIS, а потім запустіть його з вікна терміналу за допомогою gladevcp whoareyou.ui.

  3. Дивіться дію hal_action_mdi1 та її властивість MDI command — вона просто виконує (MSG, "Hi, I'm an VCP_Action_MDI"), тому в AXIS має з’явитися спливаюче повідомлення, ось так:

images/whoareyou.png
Figure 22. Простий приклад Action_MDI

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

7.6. Передача параметрів за допомогою віджетів Action_MDI та ToggleAction_MDI

Опціонально, рядки MDI command можуть мати параметри, які замінюються перед тим, як вони передаються інтерпретатору. Наразі параметрами можуть бути імена виводів HAL у компоненті GladeVCP. Ось як це працює:

  • Припустимо, у вас є «HAL SpinBox» з назвою speed, і ви хочете передати його поточне значення як параметр у команді MDI.

  • HAL SpinBox матиме висновок HAL з плаваючою точкою під назвою speed-f (див. опис HalWidgets).

  • Щоб підставляти це значення в команду MDI, вставте назву виводу HAL, що міститься в ній, ось так: ${pin-name}

  • Для вищезгаданого HAL SpinBox ми могли б використовувати (MSG, "Швидкість: ${speed-f}"), щоб просто показати, що відбувається.

Приклад файлу інтерфейсу користувача — configs/apps/gladevcp/mdi-command-example/speed.ui. Ось що ви отримаєте після його запуску:

images/speed.png
Figure 23. Приклад передачі параметрів Action_MDI

7.7. Розширений приклад: передача параметрів підпрограмі з буквою "О"

Цілком нормально викликати підпрограму з літерою O в команді MDI та передавати значення виводів HAL як фактичні параметри. Приклад файлу інтерфейсу користувача знаходиться в configs/apps/gladevcp/mdi-command-example/owordsub.ui.

Розмістіть nc_files/gladevcp_lib/oword.ngc, щоб AXIS міг його знайти, та запустіть gladevcp owordsub.ui з вікна терміналу. Це виглядає так:

images/oword.png
Figure 24. Розширений приклад Action_MDI

7.8. Підготовка до дії MDI та очищення після неї

Інтерпретатор G-коду LinuxCNC має єдиний глобальний набір змінних, таких як подача, швидкість шпинделя, відносний/абсолютний режим та інші. Якщо ви використовуєте команди G-коду або підпрограми O-word, деякі з цих змінних можуть бути змінені командою або підпрограмою - наприклад, підпрограма зондування, швидше за все, встановить досить низьке значення подачі. Без додаткових запобіжних заходів ваше попереднє налаштування подачі буде перезаписано значенням підпрограми зондування.

Щоб впоратися з цим несподіваним і небажаним побічним ефектом певної підпрограми O-word або оператора G-code, що виконується за допомогою LinuxCNC ToggleAction_MDI, ви можете пов’язати обробники pre-MDI і post-MDI з певним LinuxCNC ToggleAction_MDI. Ці обробники є опціональними і надають можливість зберегти будь-який стан перед виконанням дії MDI, а потім відновити його до попередніх значень. Імена сигналів — mdi-command-start та mdi-command-stop; імена обробників можна встановити в Glade, як і будь-які інші обробники.

Ось приклад того, як значення каналу може бути збережено та відновлено такими обробниками (зверніть увагу, що канали команд та статусу LinuxCNC доступні як self.linuxcnc та self.stat через клас VCP_ActionBase):

    def on_mdi_command_start(self, action, userdata=None):
        action.stat.poll()
        self.start_feed = action.stat.settings[1]

    def on_mdi_command_stop(self, action, userdata=None):
        action.linuxcnc.mdi('F%.1f' % (self.start_feed))
        while action.linuxcnc.wait_complete() == -1:
            pass

Тільки віджет перемикання Action_MDI підтримує ці сигнали.

Note

У пізнішій версії LinuxCNC будуть доступні нові M-коди M70-M72. Вони значно спростять збереження стану перед викликом підпрограми та відновлення стану після повернення.

7.9. Використання об’єкта LinuxCNC Stat для обробки змін статусу

Багато дій залежать від стану LinuxCNC - чи знаходиться він у ручному, MDI або автоматичному режимі? Чи програма працює, призупинена або перебуває в режимі очікування? Ви не можете запустити команду MDI під час виконання програми G-коду, тому це потрібно врахувати. Багато дій LinuxCNC самостійно враховують це, і відповідні кнопки та пункти меню деактивуються, коли операція є неможливою.

При використанні обробників подій Python, які знаходяться на нижчому рівні, ніж Actions, потрібно самостійно подбати про обробку залежностей статусу. Для цього існує віджет LinuxCNC Stat: для пов’язування змін статусу LinuxCNC з обробниками подій.

LinuxCNC Stat не має видимого компонента — ви просто додаєте його до свого інтерфейсу за допомогою Glade. Після додавання ви можете пов’язати обробники з його наступними сигналами:

  • state-related:

    • state-estop: випромінюється, коли виникає умова аварійної зупинки,

    • state-estop-reset: випромінюється при скиданні машини,

    • state-on: випромінюється, коли машина ввімкнена,

    • state-off: випромінюється, коли машина вимкнена.

  • mode-related:

    • mode-manual: видається, коли LinuxCNC переходить у ручний режим,

    • mode-mdi: видається, коли LinuxCNC переходить у режим MDI,

    • mode-auto: видається, коли LinuxCNC переходить у автоматичний режим,

  • пов’язаний з інтерпретатором: видається, коли інтерпретатор G-коду переходить у цей режим

    • interp-run

    • interp-idle

    • interp-paused

    • interp-reading

    • interp-waiting

    • file-loaded

    • line-changed

  • пов’язаний з перенаправленням: видається, коли LinuxCNC перенаправлено додому чи ні

    • all-homed

    • not-all-homed

8. Програмування GladeVCP

8.1. Дії, визначені користувачем

Більшість наборів віджетів та пов’язані з ними редактори користувацького інтерфейсу підтримують концепцію зворотних викликів, тобто функцій у коді, написаному користувачем, які виконуються, коли в інтерфейсі користувача «щось відбувається» — такі події, як клацання мишею, введення символів, рух миші, події таймера, приховування та відображення вікна тощо.

Віджети виводу HAL зазвичай відображають події типу вводу, такі як натискання кнопки, на зміну значення пов’язаного виводу HAL за допомогою такого - заздалегідь визначеного - зворотного виклику. У PyVCP це єдиний тип обробки подій, що підтримується - більш складні дії, такі як виконання команд MDI для виклику підпрограми G-коду, не підтримуються.

У GladeVCP зміни виводів HAL є лише одним із типів загального класу подій (званих сигналами) у GTK+. Більшість віджетів можуть генерувати такі сигнали, а редактор Glade підтримує асоціювання таких сигналів з іменами методів або функцій Python.

Якщо ви вирішили використовувати дії, визначені користувачем, ваше завдання полягає в тому, щоб написати модуль Python, методи класу якого — або, у простому випадку, просто функції — можуть бути використані в Glade як обробники подій. GladeVCP надає можливість імпортувати ваші модулі під час запуску і автоматично пов’язує ваші обробники подій із сигналами віджетів, як це встановлено в описі інтерфейсу користувача Glade.

8.2. Основна бібліотека

Існує три бібліотеки функцій, які можна використовувати для програмування GladeVCP.

  • «Інформація»: збирає дані з INI-файлу.

  • Action: Колекція функцій для зміни станів LinuxCNC.

  • Status: Повідомляє про стан LinuxCNC. Він обгортається навколо Gstat.

Імпорт та створення екземплярів бібліотек:

з gladevcp.core імпорт Інформація, Дія

ACTION = Action()
INFO = Info()

Використання функцій бібліотеки:

print(INFO.MACHINE_IS_METRIC)
ACTION.SET_ERROR_MESSAGE('Щось пішло не так')

Більш детальну інформацію можна знайти тут: GladeVCP Libraries modules. Існує зразок конфігурації, який демонструє використання основної бібліотеки з віджетами Python GladeVCP та файлом обробника Python. Спробуйте завантажити sim/axis/gladevcp/gladevcp_panel_tester.

8.3. Приклад: додавання користувацьких зворотних викликів у Python

Це лише мінімальний приклад для передачі ідеї — деталі викладено в решті цього розділу.

GladeVCP може не лише маніпулювати або відображати піни HAL, але й писати звичайні обробники подій на Python. Це можна використовувати, серед іншого, для виконання команд MDI. Ось як це зробити:

Напишіть модуль Python подібним чином і збережіть його, наприклад, як handlers.py:

nhits = 0
def on_button_press(gtkobj,data=None):
    global nhits
    nhits += 1
    gtkobj.set_label("hits: %d" % nhits)

У Glade визначте кнопку або кнопку HAL, виберіть вкладку «Сигнали» та у властивостях GtkButton виберіть рядок «натиснуто». Введіть там «on_button_press» та збережіть файл Glade.

Потім додайте опцію -u handlers.py до командного рядка GladeVCP. Якщо ваші обробники подій розподілені по кількох файлах, просто додайте кілька опцій -u <pyfilename>.

Тепер натискання кнопки має змінити її мітку, оскільки вона встановлена у функції зворотного виклику.

Що робить прапор +-u+: всі функції Python у цьому файлі збираються і налаштовуються як потенційні обробники зворотного виклику для ваших віджетів Gtk — на них можна посилатися з вкладок «Сигнали» Glade. Обробники зворотного виклику викликаються з конкретним екземпляром об’єкта як параметром, як екземпляр GtkButton вище, тому ви можете застосувати будь-який метод GtkButton звідти.

Або зробіть щось корисніше, наприклад, виклик команди MDI!

8.4. Події зміни значення HAL

Вхідні віджети HAL, як і світлодіод, автоматично пов’язують стан свого виводу HAL (увімкнено/вимкнено) з оптичним виглядом віджета (світиться/не світиться світлодіод).

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

Для визначених користувачем виводів HAL, не пов’язаних з певним віджетом HAL, назва сигналу — «value-changed». Див. розділ Додавання виводів HAL нижче для отримання детальної інформації.

Віджети HAL постачаються із попередньо визначеним сигналом під назвою «hal-pin-changed». Докладніше див. у розділі Віджети HAL.

8.5. Модель програмування

Загальний підхід такий:

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

  • Напишіть модуль Python, який містить викликані об’єкти (див. «моделі обробників» нижче).

  • Передайте шлях до вашого модуля до GladeVCP за допомогою опції -u <модуль>.

  • GladeVCP імпортує модуль, перевіряє його на наявність обробників сигналів та підключає їх до дерева віджетів.

  • Виконується основний цикл подій.

8.5.1. Проста модель обробника

Для простих завдань достатньо визначити функції, названі на честь обробників сигналів Glade. Вони будуть викликані, коли відповідна подія відбудеться в дереві віджетів. Ось простий приклад - він передбачає, що сигнал «pressed» кнопки Gtk або HAL пов’язаний з функцією зворотного виклику «on_button_press»:

nhits = 0
def on_button_press(gtkobj,data=None):
    global nhits
    nhits += 1
    gtkobj.set_label("hits: %d" % nhits)

Додайте цю функцію до файлу Python та виконайте її наступним чином:

gladevcp -u <myhandler>.py mygui.ui

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

8.5.2. Модель обробника на основі класів

Ідея полягає в наступному: обробники пов’язані з методами класу. Базові класи інстанціюються та перевіряються під час запуску GladeVCP і пов’язуються з деревом віджетів як обробники сигналів. Отже, завдання полягає в тому, щоб написати:

  • Одне або декілька визначень класів з одним або кількома методами, в одному модулі або розділених на кілька модулів,

  • функція get_handlers у кожному модулі, яка повертатиме список екземплярів класів до GladeVCP - назви їхніх методів будуть пов’язані з обробниками сигналів.

Ось приклад мінімального модуля обробника, визначеного користувачем:

class MyCallbacks :
    def on_this_signal(self,obj,data=None):
        print("this_signal happened, obj=",obj)

def get_handlers(halcomp,builder,useropts):
    return [MyCallbacks ()]

Тепер on_this_signal буде доступний як обробник сигналів для вашого дерева віджетів.

8.5.3. Сигнали, специфічні для GladeVCP

Для панелі GladeVCP, яка реагує на вхідні сигнали HAL, може бути важливо, щоб код обробника міг визначити, що панель GladeVCP наразі активна і відображається. Наприклад, панель всередині інтерфейсу Touchy може потребувати виконання дії, коли перемикач, підключений до touchy.cycle-start, активований (так само, як і вбудовані вкладки по-різному реагують на одну і ту ж кнопку).
Щоб це стало можливим, з графічного інтерфейсу користувача (на момент написання статті — тільки Touchy) на вбудовану вкладку надсилається сигнал. Сигнал має тип «Gladevcp», а два надсилаються повідомлення — «Visible» і «Hidden». (Зверніть увагу, що сигнали мають фіксовану довжину 20 символів, тому для порівняння слід використовувати тільки перші символи, звідси [:7] нижче). Приклад обробника для цих сигналів:

    # Це перехоплює наші повідомлення з іншої програми
    def event(self,w,event):
        print(event.message_type,event.data)
        if event.message_type == 'Gladevcp':
            if event.data[:7] == 'Visible':
                self.active = True
            else:
                self.active = False

    # підключення до клієнтських подій з графічного інтерфейсу хоста
    def on_map_event(self, widget, data=None):
        top = widget.get_toplevel()
        print("map event")
        top.connect('client-event', self.event)

8.5.4. Протокол get_handlers

Якщо під час перевірки модуля GladeVCP знаходить функцію get_handlers, він викликає її наступним чином:

get_handlers(halcomp,builder,useropts)

Аргументи такі:

  • halcomp - стосується компонента HAL, що знаходиться в процесі розробки,

  • builder - дерево віджетів — результат читання визначення інтерфейсу користувача (або посилання на об’єкт типу GtkBuilder, або libglade),

  • useropts - список рядків, зібраних з опції -U <користувачі> командного рядка GladeVCP.

Потім GladeVCP перевіряє список екземплярів класів і отримує їхні імена методів. Відповідні імена методів підключаються до дерева віджетів як обробники сигналів. Враховуються тільки імена методів, які не починаються з символу «_» (підкреслення).

Зверніть увагу, що незалежно від того, чи використовуєте ви libglade чи новий формат GtkBuilder для вашого інтерфейсу Glade, до віджетів завжди можна звернутися як builder.get_object(<widgetname>). Також повний список віджетів доступний як builder.get_objects() незалежно від формату інтерфейсу.

8.6. Послідовність ініціалізації

Важливо знати, в якому стані викликається ваша функція get_handlers(), щоб розуміти, що в цьому стані можна робити, а що ні. Спочатку модулі імпортуються та ініціалізуються в порядку командного рядка. Після успішного імпорту функція get_handlers() викликається в такому стані:

  • Дерево віджетів створено, але ще не реалізовано (жодна функція верхнього рівня window.show() ще не виконана).

  • Компонент HAL halcomp налаштовано, і всі піни віджетів HAL вже додано до нього.

  • Можна безпечно додавати більше пінів HAL, оскільки halcomp.ready() на даний момент ще не викликано, тому ви можете додати свої власні піни, наприклад, у методі класу __init__().

Після імпорту всіх модулів та вилучення назв методів, виконуються такі кроки:

  • Усі відповідні імена методів будуть підключені до дерева віджетів за допомогою connect_signals()/signal_autoconnect() (залежно від типу імпортованого інтерфейсу користувача - GtkBuilder чи старий формат libglade).

  • Компонент HAL завершується за допомогою halcomp.ready().

  • Якщо як аргумент було передано ідентифікатор вікна, дерево віджетів переоформлюється для запуску в цьому вікні, а вікно верхнього рівня Glade window1 відкидається (див. FAQ).

  • Якщо файл команди HAL було передано з параметром -H halfile, він виконується за допомогою halcmd.

  • Виконується головний цикл Gtk.

Отже, коли ваш клас обробника ініціалізується, всі віджети існують, але ще не реалізовані (не відображаються на екрані). Компонент HAL також не готовий, тому доступ до значень контактів у вашому методі __init__() є небезпечним.

Якщо ви хочете, щоб при запуску програми виконувався зворотний виклик після того, як доступ до контактів HAL стане безпечним, підключіть обробник до сигналу реалізації вікна верхнього рівня window1 (що, можливо, є його єдиною реальною метою). На цьому етапі GladeVCP завершує всі завдання налаштування, файл HAL запущено, і GladeVCP готується увійти в головний цикл Gtk.

8.7. Кілька зворотних викликів з однаковим ім’ям

У межах класу імена методів повинні бути унікальними. Однак можна передавати до GladeVCP за допомогою get_handlers() кілька екземплярів класу з методами, що мають однакові імена. Коли з’являється відповідний сигнал, ці методи викликаються в порядку визначення — модуль за модулем, а в межах модуля — в порядку, в якому екземпляри класу повертаються за допомогою get_handlers().

8.8. Прапорець GladeVCP -U <користувачі>

Замість того, щоб розширювати GladeVCP для будь-якої можливої опції, яка потенційно може бути корисною для класу обробника, ви можете використовувати прапор -U <useroption> (повторюючи його, якщо бажаєте). Цей прапор збирає список рядків <useroption>. Цей список передається до функції get_handlers() (аргумент useropts). Ваш код може вільно інтерпретувати ці рядки на свій розсуд. Одним із можливих варіантів використання є передача їх до функції Python exec у вашій функції get_handlers() наступним чином:

debug = 0
...
def get_handlers(halcomp,builder,useropts):
    ...
    global debug # припускаючи, що існує глобальна змінна
    for cmd in useropts:
        exec cmd in globals()

Таким чином, ви можете передавати довільні оператори Python до вашого модуля за допомогою опції gladevcp -U, наприклад:

gladevcp -U debug=42 -U "print 'debug=%d' % debug" ...

Це має встановити debug на 2 та підтвердити, що ваш модуль справді це зробив.

8.9. Постійні змінні в GladeVCP

Неприємним аспектом GladeVCP у його попередній версії та PyVCP є те, що ви можете змінювати значення та контакти HAL за допомогою текстового введення, повзунків, полів вибору, перемикачів тощо, але їхні налаштування не зберігаються і не відновлюються при наступному запуску LinuxCNC — вони починають працювати зі значеннями за замовчуванням, встановленими в панелі або визначенні віджета.

GladeVCP має простий у використанні механізм для збереження та відновлення стану віджетів HAL та змінних програми (фактично будь-якого атрибута екземпляра типу int, float, bool або string).

Цей механізм використовує популярний формат INI-файлу для збереження та перезавантаження постійних атрибутів.

Збереження, версії програми та перевірка підпису

Уявіть, що ви перейменовуєте, додаєте або видаляєте віджети в Glade: .INI-файл, що залишився від попередньої версії програми, або зовсім інший користувацький інтерфейс не зможуть правильно відновити стан, оскільки змінні та типи могли змінитися.

GladeVCP виявляє цю ситуацію за допомогою сигнатури, яка залежить від усіх імен та типів об’єктів, що зберігаються та підлягають відновленню. У разі невідповідності сигнатури створюється новий файл INI із стандартними налаштуваннями.

8.10. Використання постійних змінних

Якщо ви хочете, щоб будь-який стан віджета Gtk, значення виводу PIN-кодів та/або атрибути класу вашого класу-обробника зберігалися під час викликів, виконайте такі дії:

  • Імпортуйте модуль gladevcp.persistence.

  • Визначте, які атрибути екземпляра та їхні значення за замовчуванням ви хочете зберегти, якщо такі є.

  • Визначте, стан яких віджетів слід зберегти.

  • Опишіть ці рішення у методі \__init()__ вашого класу-обробника через вкладений словник наступним чином:

def __init__(self, halcomp,builder,useropts):
    self.halcomp = halcomp
    self.builder = builder
    self.useropts = useropts
    self.defaults = {
        # наступні імена будуть збережені/відновлені як атрибути методу
        # механізм збереження/відновлення є строго типізованим - тип змінних буде похідним від типу
        # ініціалізаційного значення. Наразі підтримуються такі типи: int, float, bool, string
        IniFile.vars : { 'nhits' : 0, 'a': 1.67, 'd': True ,'c' : "a string"},
        # щоб зберегти/відновити весь стан віджета, який може мати сенс, додайте це:
        IniFile.widgets : widget_defaults(builder.get_objects())
        # розумною альтернативою може бути збереження лише стану всіх віджетів виводу HAL:
        # IniFile.widgets: widget_defaults(select_widgets(self.builder.get_objects(), hal_only=True,output_only = True)),
    }

Потім пов’яжіть INI-файл з цим дескриптором:

self.ini_filename = __name__ + '.ini'
self.ini = IniFile(self.ini_filename,self.defaults,self.builder)
self.ini.restore_state(self)

Після restore_state(), self матиме встановлені атрибути, якщо виконати наступне:

self.nhits = 0
self.a = 1.67
self.d = True
self.c = "a string"

Зверніть увагу, що типи зберігаються під час відновлення. У цьому прикладі припускається, що INI-файл не існував або мав значення за замовчуванням із self.defaults.

Після цього заклинання ви можете використовувати такі методи IniFile:

ini.save_state(obj)

Зберігає атрибути objs згідно зі словником IniFile.vars та стан віджета, як описано в IniFile.widgets у self.defaults.

ini.create_default_ini()

Створіть INI-файл зі значеннями за замовчуванням.

ini.restore_state(obj)

Відновіть вихідні виводи HAL та атрибути obj, як збережено/ініціалізовано за замовчуванням, як зазначено вище.

8.11. Збереження стану під час вимкнення GladeVCP

Щоб зберегти стан віджета та/або змінної після виходу, виконайте такі дії:

  • Виберіть якийсь внутрішній віджет (тип не має значення, наприклад, таблиця).

  • На вкладці «Сигнали» виберіть «GtkObject». У першому стовпці має відображатися сигнал «знищення».

  • Додайте назву обробника, наприклад, «on_destroy», до другого стовпця.

  • Додайте обробник Python, як показано нижче:

import gtk
...
def on_destroy(self,obj,data=None):
    self.ini.save_state(self)

Це збереже стан та належним чином вимкне GladeVCP, незалежно від того, чи панель вбудована в AXIS, чи є окремим вікном.

Caution

Не використовуйте window1 (вікно верхнього рівня) для підключення події «destroy». Через спосіб взаємодії панелі GladeVCP з AXIS, якщо панель вбудована в AXIS, window1 не буде правильно отримувати події destroy. Однак, оскільки під час вимкнення всі віджети знищуються, підійде будь-який. Рекомендується: використовуйте віджет другого рівня — наприклад, якщо у вашій панелі є контейнер таблиці, використовуйте його.

Наступного разу, коли ви запустите програму GladeVCP, віджети повинні відображатися в тому ж стані, в якому програма була закрита.

Caution

Рядок GtkWidget має подібну подію destroy-eventне використовуйте її для підключення до обробника on_destroy, це не працюватиме – переконайтеся, що ви використовуєте подію destroy з рядка GtkObject.

8.12. Збереження стану при натисканні Ctrl-C

За замовчуванням реакція GladeVCP на подію Ctrl-C полягає у простому виході — без збереження стану. Щоб переконатися, що цей випадок враховано, додайте виклик обробника on_unix_signal, який автоматично викликатиметься при Ctrl-C (фактично при сигналах SIGINT і SIGTERM). Приклад:

def on_unix_signal(self,signum,stack_frame):
    print("on_unix_signal(): signal %d received, saving state" % (signum))
    self.ini.save_state(self)

8.13. Ручне редагування INI-файлів (.ini)

Ви можете це зробити, але зверніть увагу, що значення в self.defaults замінять ваші зміни, якщо у ваших змінах буде синтаксична або типова помилка. Якщо помилка буде виявлена, консольне повідомлення підкаже про те, що сталося, а пошкоджений файл inifile буде перейменований з додаванням суфікса .BAD. Наступні пошкоджені файли INI замінять попередні файли .BAD.

8.14. Додавання контактів HAL

Якщо вам потрібні піни HAL, які не пов’язані з певним віджетом HAL, додайте їх наступним чином:

import hal_glib
...
# у вашому класі обробника __init__():
self.example_trigger = hal_glib.GPin(halcomp.newpin('example-trigger', hal.HAL_BIT, hal.HAL_IN))

Щоб отримати зворотний виклик при зміні значення цього піна, пов’яжіть зворотний виклик value-change з цим піном, додайте:

self.example_trigger.connect('value-changed', self._on_example_trigger_change)

та визначте метод зворотного виклику (або функцію, у цьому випадку пропустіть параметр self):

# примітка '_' - цей метод не буде видимим для дерева віджетів
def _on_example_trigger_change(self,pin,userdata=None):
    print("pin value changed to:" % (pin.get()))

8.15. Додавання таймерів

Оскільки GladeVCP використовує віджети Gtk, які базуються на базовому класі PyGObject, доступний повний функціонал GLib. Ось приклад зворотного виклику таймера:

def _on_timer_tick(self,userdata=None):
    ...
    return True # щоб перезапустити таймер; повернути False для пострілу
...
# демонструвати повільний фоновий таймер – точність відліку становить одну секунду
# для швидшого таймера (з точністю 100 мс) використовуйте це:
# GLib.timeout_add(100, self._on_timer_tick,userdata) # 10Hz
GLib.timeout_add_seconds(1, self._on_timer_tick)

8.16. Програмне налаштування властивостей віджета HAL

У Glade властивості віджетів зазвичай встановлюються фіксовано під час редагування. Однак ви можете встановлювати властивості віджетів під час виконання, наприклад, із значень файлу INI, що зазвичай робиться в коді ініціалізації обробника. Також можна встановлювати властивості із значень виводів HAL.

У наступному прикладі (припускаючи, що віджет HAL Meter називається meter) мінімальне значення лічильника встановлюється з параметра INI-файлу під час запуску, а максимальне значення встановлюється за допомогою контакту HAL, що призводить до динамічного переналаштування шкали віджета:

import linuxcnc
import os
import hal
import hal_glib

class HandlerClass:

    def _on_max_value_change(self,hal_pin,data=None):
        self.meter.max = float(hal_pin.get())
        self.meter.queue_draw() # примусово перемалювати віджет

    def __init__(self, halcomp,builder,useropts):
        self.builder = builder

        # HAL-контакт із зворотним викликом при зміні.
        # Коли значення контакту змінюється, виконується зворотний виклик.
        self.max_value = hal_glib.GPin(halcomp.newpin('max-value',  hal.HAL_FLOAT, hal.HAL_IN))
        self.max_value.connect('value-changed', self._on_max_value_change)

        inifile = linuxcnc.ini(os.getenv("INI_FILE_NAME"))
        mmin = float(inifile.find("METER", "MIN") or 0.0)
        self.meter = self.builder.get_object('meter')
        self.meter.min = mmin


def get_handlers(halcomp,builder,useropts):
    return [HandlerClass(halcomp,builder,useropts)]

8.17. Зворотний виклик зі зміною значення за допомогою hal_glib

GladeVCP використовує бібліотеку hal_glib, яку можна використовувати для підключення сигналу "спостерігача" до вхідного виводу HAL.
Цей сигнал можна використовувати для реєстрації функції, яка викликається при зміні стану виводу HAL.

Потрібно імпортувати модулі hal_glib та hal:

import hal_glib
import hal

Потім зробіть пін-код і підключіть сигнал «зміни значення» (спостерігач) до виклику функції:

class HandlerClass:
    def __init__(self, halcomp,builder,useropts):
        self.example_trigger = hal_glib.GPin(halcomp.newpin('example-trigger', hal.HAL_BIT, hal.HAL_IN))
        self.example_trigger.connect('value-changed', self._on_example_trigger_change)

І маємо функцію, яку потрібно викликати:

    def _on_example_trigger_change(self,pin,userdata=None):
        print("pin value changed to: {}".format(pin.get()))
        print("pin name= {}".format(pin.get_name()))
        print("pin type= {}".format(pin.get_type()))

        # це можна викликати поза функцією
        self.example_trigger.get()

8.18. Приклади та створення власної програми GladeVCP

Відвідайте linuxcnc_root_directory/configs/apps/gladevcp для прикладів запуску та стартових ігор для ваших власних проектів.

9. Найчастіші запитання

  1. Я отримую неочікувану подію unmap у своїй функції-обробнику одразу після запуску. Що це?

    Це наслідок того, що у вашому файлі Glade UI властивість window1 Visible встановлена на True, а також переприв’язування вікна GladeVCP до AXIS або touchy. Створюється дерево віджетів GladeVCP, включаючи вікно верхнього рівня, а потім «перепризначається в AXIS», залишаючи це вікно верхнього рівня без батьків. Щоб уникнути наявності цього непотрібного порожнього вікна, воно відключається (стає невидимим), що є причиною сигналу відключення, який ви отримуєте. Пропоноване виправлення: встановіть для window1.visible значення False та ігноруйте початкову подію відключення.

  2. Моя програма GladeVCP запускається, але вікно не з’являється там, де я очікую?

    Вікно, яке AXIS виділяє для GladeVCP, отримає «природний розмір» усіх своїх дочірніх віджетів разом. Запит розміру (ширини та/або висоти) є завданням дочірнього віджета. Однак не всі віджети запитують ширину, більшу за 0, наприклад, віджет Graph у його поточному вигляді. Якщо у вашому файлі Glade є такий віджет і саме він визначає макет, ви можете явно встановити його ширину. Зверніть увагу, що встановлення властивостей ширини та висоти window1 у Glade не має сенсу, оскільки це вікно буде втратити батьківський елемент під час переприв’язки, а отже, його геометрія не матиме впливу на макет (див. вище). Загальне правило: якщо ви вручну запускаєте файл UI за допомогою «gladevcp <uifile>» і його вікно має розумну геометрію, воно також має правильно відображатися в AXIS.

  3. Я хочу миготливий світлодіод, але він не мигає

    Я поставив галочку, щоб він блимав з інтервалом 100 мс. Він не блимає, і я отримую попередження при запуску: Попередження: значення «0» типу «gint» є недійсним або виходить за межі діапазону для властивості «led-blink-rate» типу «gint»? Це, схоже, помилка Glade. Просто перезапишіть поле частоти блимання і збережіть знову — у мене це працює.

  4. Моя панель GladeVCP в AXIS не зберігає стан після закриття AXIS, хоча я визначив обробник on_destroy, пов’язаний із сигналом знищення вікна

    Швидше за все, цей обробник пов’язаний з window1, який через переприв’язку не може бути використаний для цієї мети. Будь ласка, пов’яжіть обробник on_destroy із сигналом destroy внутрішнього вікна. Наприклад, у мене є ноутбук у window1, і я пов’язав on_destroy із сигналом destroy ноутбука, і це працює нормально. Це не працює для window1.

  5. Я хочу встановити колір фону або текст віджета HAL_Label залежно від значення його виводу HAL

    Дивіться приклад у configs/apps/gladevcp/colored-label. Налаштування кольору фону віджета GtkLabel (а HAL_Label походить від GtkLabel) є дещо складним. Віджет GtkLabel не має власного об’єкта вікна з міркувань продуктивності, а колір фону можуть мати лише об’єкти вікна. Рішенням є розміщення Label у контейнері EventBox, який має вікно, але є невидимим — див. файл coloredlabel.ui.

Я визначив віджет hal_spinbutton у Glade та встановив властивість value за замовчуванням у відповідному налаштуванні. Він повертає нуль?

Це пов’язано з помилкою в старій версії Gtk, що поширювалася з Ubuntu 8.04 та 10.04, і, ймовірно, стосується всіх віджетів, що використовують регулювання. Обхідний шлях, згаданий, наприклад, в http://osdir.com/ml/gtk-app-devel-list/2010-04/msg00129.html, не встановлює надійно значення HAL pin, краще встановити його явно в обробнику сигналів on_realize під час створення віджета. Дивіться приклад у configs/apps/gladevcp/by-widget/spinbutton.{ui,py}.

10. Усунення несправностей

  • Переконайтеся, що у вас встановлено розробницьку версію LinuxCNC. Вам більше не потрібен файл axisrc, про це згадувалося на старій вікі-сторінці GladeVCP.

  • Запустіть GladeVCP або AXIS з терміналу. Якщо ви отримаєте помилки Python, перевірте, чи все ще існує файл /usr/lib/python2.6/dist-packages/hal.so, окрім нового /usr/lib/python2.6/dist-packages/_hal.so (зверніть увагу на підкреслення); якщо так, видаліть файл hal.so. Він був замінений файлом hal.py в тому ж каталозі і заважає механізму імпорту.

  • Якщо ви використовуєте функцію запуску на місці, виконайте команду «make clean», щоб видалити будь-який випадково залишковий файл hal.so, а потім виконайте команду «make».

  • Якщо ви використовуєте віджети HAL_table або HAL_HBox, майте на увазі, що з ними пов’язаний HAL-пін, який за замовчуванням вимкнено. Цей пін контролює, чи активні дочірні елементи цих контейнерів.

11. Примітка щодо впровадження: Обробка ключів в AXIS

Ми вважаємо, що обробка ключів працює нормально, але оскільки це новий код, ми розповідаємо про нього, щоб ви могли бути уважні до проблем; будь ласка, повідомляйте нам про помилки або дивну поведінку. Ось історія:

AXIS використовує набір віджетів TkInter. Додатки GladeVCP використовують віджети Gtk і працюють в окремому контексті процесу. Вони підключаються до AXIS за допомогою протоколу Xembed. Це дозволяє дочірньому додатку, такому як GladeVCP, правильно вписуватися у вікно батьківського додатка і, теоретично, мати інтегровану обробку подій.

Однак це передбачає, що як батьківська, так і дочірня програма належним чином підтримують протокол Xembed, що робить Gtk, але не робить TkInter. Наслідком цього є те, що певні клавіші не будуть належним чином передаватися з панелі GladeVCP до AXIS за всіх обставин. Однією з таких ситуацій був випадок, коли фокус був на віджеті Entry або SpinButton: у цьому випадку, наприклад, клавіша Escape не передавалася б до AXIS і не спричиняла б переривання, як це мало б бути, що могло б мати катастрофічні наслідки.

Тому ключові події в GladeVCP обробляються явно і вибірково пересилаються до AXIS, щоб уникнути виникнення таких ситуацій. Детальніше див. функцію keyboard_forward() у файлі lib/python/gladevcp/xembed.py.

12. Додавання користувацьких віджетів

У вікі LinuxCNC є інформація про додавання користувацьких віджетів до GladeVCP. Посилання: Користувацькі віджети GladeVCP

13. Допоміжні програми GladeVCP

Підтримка надається для самостійно встановлених додатків GladeVCP, які відповідають розміщенню системних каталогів, визначеному елементами LINUXCNC_AUX_GLADEVCP та LINUXCNC_AUX_EXAMPLES, про які повідомляє скрипт linuxcnc_var:

$ linuxcnc_var LINUXCNC_AUX_GLADEVCP
/usr/share/linuxcnc/aux_gladevcp
$ linuxcnc_var LINUXCNC_AUX_EXAMPLES
/usr/share/linuxcnc/aux_examples

Системний каталог, визначений LINUXCNC_AUX_GLADEVCP (/usr/share/linuxcnc/aux_gladevcp), визначає розташування файлів Python, сумісних з GladeVCP, та відповідних підкаталогів. Файл Python імпортується під час запуску GladeVCP і стає доступним для наступних додатків GladeVCP, включаючи вбудоване використання в підтримуючих графічних інтерфейсах користувача.

Системний каталог, визначений LINUXCNC_AUX_EXAMPLES (/usr/share/linuxcnc/aux_examples), визначає розташування підкаталогів з прикладами конфігурацій, що використовуються для допоміжних програм. Дивіться розділ getting-started/running-linuxcnc для «Додавання елементів вибору конфігурації».

Для тестування можна вказати специфікацію часу виконання допоміжних програм за допомогою експортованої змінної середовища: GLADEVCP_EXTRAS. Ця змінна повинна бути списком шляхів до одного або декількох каталогів конфігурації, розділених символом (:). Зазвичай ця змінна встановлюється в оболонці, що запускає linuxcnc, або в скрипті запуску користувача ~/.profile. Приклад:

export GLADEVCP_EXTRAS=~/mygladevcp:/opt/othergladevcp

Файли, знайдені в каталогах, вказаних за допомогою змінної середовища GLADEVCP_EXTRAS, замінюють файли з однаковою назвою в підкаталогах системного каталогу, вказаного за допомогою LINUXNC_AUX_GLADEVCP (наприклад, /usr/share/linuxcnc/aux_gladevcp). Це положення дозволяє розробнику тестувати програму, експортуючи GLADEVCP_EXTRAS для визначення приватного каталогу програми без видалення системного каталогу програми. Повідомлення про відхилені дублікати виводяться на stdout.

Note

Для підтримки допоміжних програм GladeVCP потрібен модуль Python під назвою «importlib». Цей модуль може бути недоступний у старіших інсталяціях, таких як Ubuntu-Lucid.