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, наведені нижче приклади знаходяться у configuration picker у гілці Зразки конфігурацій > програми > GladeVCP.
Наведені нижче інструкції застосовуються лише якщо ви використовуєте 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
Запустіть ту саму панель, але як вкладку всередині AXIS:
$ cd configs/sim/axis/gladevcp
$ linuxcnc gladevcp_tab.ini
Щоб запустити цю панель усередині «Touchy»:
$ cd configs/sim/touchy/gladevcp
$ linuxcnc gladevcp_touchy.ini
Функціонально ці налаштування ідентичні - вони відрізняються лише вимогами до розміру екрану та видимістю. Оскільки можна запускати кілька компонентів 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, до фрейму.
-
Виберіть та розмістіть деякі елементи, такі як світлодіод, кнопка тощо, в контейнері.
Це виглядатиме так:
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. Інший клас допоміжних віджетів дозволяє організувати та позначити вашу панель.
-
Віджети для індикації "бітових" сигналів: HAL_LED
-
Віджети для керування "бітовими" сигналами: HAL_Button HAL_RadioButton HAL_CheckButton
-
Віджети для індикації сигналів "число": HAL_Label, HAL_ProgressBar, HAL_HBar та HAL_VBar, HAL_Meter
-
Віджети для керування сигналами «числа»: HAL_SpinButton, HAL_HScale та HAL_VScale, Jog Wheel, Speed Control
-
Віджети чутливого керування: State_Sensitive_Table HAL_Table та HAL_HBox
-
Попередній перегляд траєкторії інструменту: HAL_Gremlin
-
Віджети для відображення положення осей: DRO Widget, Combi DRO Widget
-
Віджети для обробки файлів: Вибір файлу IconView
-
Віджети для відображення/редагування всіх зміщень осей: OffsetPage
-
Віджети для відображення/редагування всіх зміщень інструментів: Tooloffset editor
-
Віджет для відображення та редагування G-коду: HAL_Sourceview
-
Віджет для введення MDI та відображення історії: MDI History
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:
Приклад у 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
|
Tip
|
Визначення груп радіокнопок у Glade:
|
Див. configs/apps/gladevcp/by-widget/ для отримання інформації про програми GladeVCP та файл інтерфейсу користувача для роботи з радіокнопками.
6.6. Масштаби
HAL_HScale та HAL_VScale походять від GtkHScale та GtkVScale відповідно.
- <widgetname>
-
вихідний штифт FLOAT
- <widgetname>-s
-
вихідний контакт s32
Щоб зробити шкалу корисною в Glade, додайте «Налаштування» (Загальне → Налаштування → Нове або існуюче налаштування) і відредагуйте об’єкт налаштування. Він визначає значення за замовчуванням/мінімальне/максимальне/кроку. Також встановіть налаштування «Розмір сторінки» і «Крок сторінки» на нуль, щоб уникнути попереджень.
6.7. SpinButton
HAL SpinButton походить від GtkSpinButton та містить два контакти:
- <widgetname>-f
-
вихідний штифт FLOAT
- <widgetname>-s
-
вихідний контакт s32
Щоб бути корисними, кнопки спіну потребують значення налаштування, наприклад, шкали, див. вище.
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):
Це поверне: віджет, поточну кількість, масштаб та дельта-масштаб цього віджета.
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")
Встановлює вміст мітки за допомогою "рядка"
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))
Приховати або показати кнопку
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())
Це буде викликано на будь-якому фронті сигналу, а також під час запуску програми для повідомлення поточного значення.
6.14. Індикатор прогресу
|
Note
|
Цей віджет може зникнути. |
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.
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.
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 — від останнього межі до максимального.
Межі встановлюються як значення в діапазоні мінімум-максимум.
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, то замість графічного графіка отримаєте сторінку зміщень.
-
Якщо ви отримаєте відстань масштабування перед зміною подання, а потім скинете відстань масштабування, це набагато зручніше для користувача.
-
Якщо ви оберете елемент у попередньому перегляді, вибраний елемент буде використано як центральна точка обертання
-
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, якщо метричні.
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.
Найчастіше потрібен, якщо програма запускається як окрема.
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)
Вибирає (підсвічує) запитуваний інструмент.
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вище.
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
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:
7. Довідник з віджетів дій
GladeVCP містить колекцію «готових дій» під назвою Віджети дій VCP для редактора інтерфейсу користувача Glade.
|
Note
|
Окрім віджетів HAL, які взаємодіють з контактами HAL, дії VCP взаємодіють з LinuxCNC та інтерпретатором G-коду. |
Віджети дій VCP походять від віджета Gtk.Action.
Коротко про віджет «Дія»:
-
Це об’єкт, доступний у Glade
-
Сам по собі він не має візуального вигляду
-
Його призначення: пов’язати видимий, чутливий компонент інтерфейсу користувача, такий як меню, кнопка інструмента, кнопка, з командою. Див. властивість цих віджетів «Загальні→Пов’язані→Дія».
-
«Запланована дія» буде виконана, коли буде запущено відповідний компонент інтерфейсу користувача (натискання кнопки, клік меню тощо).
-
Це забезпечує простий спосіб виконання команд без звернення до програмування на Python.
Зовнішній вигляд дій VCP у Glade приблизно такий:
Підказки під час наведення курсора надають опис.
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, який містить основні функції:
-
Відкрийте його в Glade та вивчіть, як це робиться.
-
Запустіть AXIS, а потім запустіть його з вікна терміналу за допомогою
gladevcp whoareyou.ui. -
Дивіться дію
hal_action_mdi1та її властивістьMDI command— вона просто виконує(MSG, "Hi, I'm an VCP_Action_MDI"), тому в AXIS має з’явитися спливаюче повідомлення, ось так:
Ви помітите, що кнопка, пов’язана з дією 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. Ось що ви отримаєте після його запуску:
7.7. Розширений приклад: передача параметрів підпрограмі з буквою "О"
Цілком нормально викликати підпрограму з літерою O в команді MDI та передавати значення виводів HAL як фактичні параметри. Приклад файлу інтерфейсу користувача знаходиться в configs/apps/gladevcp/mdi-command-example/owordsub.ui.
Розмістіть nc_files/gladevcp_lib/oword.ngc, щоб AXIS міг його знайти, та запустіть gladevcp owordsub.ui з вікна терміналу. Це виглядає так:
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
|
Не використовуйте |
Наступного разу, коли ви запустите програму 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. Найчастіші запитання
-
Я отримую неочікувану подію unmap у своїй функції-обробнику одразу після запуску. Що це?
Це наслідок того, що у вашому файлі Glade UI властивість window1 Visible встановлена на True, а також переприв’язування вікна GladeVCP до AXIS або touchy. Створюється дерево віджетів GladeVCP, включаючи вікно верхнього рівня, а потім «перепризначається в AXIS», залишаючи це вікно верхнього рівня без батьків. Щоб уникнути наявності цього непотрібного порожнього вікна, воно відключається (стає невидимим), що є причиною сигналу відключення, який ви отримуєте. Пропоноване виправлення: встановіть для window1.visible значення False та ігноруйте початкову подію відключення.
-
Моя програма GladeVCP запускається, але вікно не з’являється там, де я очікую?
Вікно, яке AXIS виділяє для GladeVCP, отримає «природний розмір» усіх своїх дочірніх віджетів разом. Запит розміру (ширини та/або висоти) є завданням дочірнього віджета. Однак не всі віджети запитують ширину, більшу за 0, наприклад, віджет Graph у його поточному вигляді. Якщо у вашому файлі Glade є такий віджет і саме він визначає макет, ви можете явно встановити його ширину. Зверніть увагу, що встановлення властивостей ширини та висоти window1 у Glade не має сенсу, оскільки це вікно буде втратити батьківський елемент під час переприв’язки, а отже, його геометрія не матиме впливу на макет (див. вище). Загальне правило: якщо ви вручну запускаєте файл UI за допомогою «gladevcp <uifile>» і його вікно має розумну геометрію, воно також має правильно відображатися в AXIS.
-
Я хочу миготливий світлодіод, але він не мигає
Я поставив галочку, щоб він блимав з інтервалом 100 мс. Він не блимає, і я отримую попередження при запуску: Попередження: значення «0» типу «gint» є недійсним або виходить за межі діапазону для властивості «led-blink-rate» типу «gint»? Це, схоже, помилка Glade. Просто перезапишіть поле частоти блимання і збережіть знову — у мене це працює.
-
Моя панель GladeVCP в AXIS не зберігає стан після закриття AXIS, хоча я визначив обробник on_destroy, пов’язаний із сигналом знищення вікна
Швидше за все, цей обробник пов’язаний з window1, який через переприв’язку не може бути використаний для цієї мети. Будь ласка, пов’яжіть обробник on_destroy із сигналом destroy внутрішнього вікна. Наприклад, у мене є ноутбук у window1, і я пов’язав on_destroy із сигналом destroy ноутбука, і це працює нормально. Це не працює для window1.
-
Я хочу встановити колір фону або текст віджета 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. |