Бібліотеки — це готові модулі Python, які надають додаткові функції QtVCP. Таким чином, ви можете вибрати потрібні функції, але вам не доведеться самостійно створювати поширені.

1. Status

Status — це бібліотека, яка надсилає повідомлення GObject на основі поточного стану LinuxCNC. Це розширення об’єкта GStat класу GladeVCP.

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

Ви підключаєте виклик функції до повідомлення STATUS, яке вас цікавить, і QtVCP викличе цю функцію, коли повідомлення буде надіслано зі STATUS.

1.1. Застосування

  • Імпорт модулів Status
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    з імпорту qtvcp.core Стан
  • Створення екземпляра модуля Status
    Додайте цей код Python до розділу створення екземпляра:

    STATUS = Status()
  • Підключення до повідомлень STATUS
    Use GObject syntax.

1.2. Приклад

Наприклад, ви можете ловити повідомлення про ввімкнення та вимкнення машини.

Note
У наведеному нижче прикладі показано два поширені способи з’єднання сигналів, один з яких використовує лямбду. lambda використовується для видалення або маніпулювання аргументами зі статусного повідомлення перед викликом функції. Ви можете побачити різницю в сигнатурі викликаної функції: та, що використовує лямбду, не приймає об’єкт статусу — лямбда не передала його функції.
  • Помістіть ці команди в розділ [INITIALIZE] файлу обробника Python:

    STATUS.connect('state-on', self.on_state_on)
    STATUS.connect('state-off', lambda: w, self.on_state_off())

    У цьому прикладі коду, коли LinuxCNC перебуває у стані «машина увімкнена», буде викликано функцію self.on_state_on.
    Коли LinuxCNC перебуває у стані «машина вимкнена», буде викликано функцію self.on_state_off.

  • Вони викликали б функції, які виглядають так:

    def on_state_on(self, status_object):
        print('LinuxCNC machine is on')
    def on_state_off(self):
        print('LinuxCNC machine is off')

2. Info

Info — це бібліотека для збору та фільтрації даних з INI-файлу.

2.1. Доступні дані та значення за замовчуванням

LINUXCNC_IS_RUNNING
LINUXCNC_VERSION
INIPATH
INI = linuxcnc.ini(INIPATH)
MDI_HISTORY_PATH = '~/.axis_mdi_history'
QTVCP_LOG_HISTORY_PATH = '~/qtvcp.log'
MACHINE_LOG_HISTORY_PATH = '~/.machine_log_history'
PREFERENCE_PATH = '~/.Preferences'
SUB_PATH = None
SUB_PATH_LIST = []
self.MACRO_PATH = None
MACRO_PATH_LIST = []
INI_MACROS = self.INI.findall("DISPLAY", "MACRO")

IMAGE_PATH = IMAGEDIR
LIB_PATH = os.path.join(HOME, "share","qtvcp")

PROGRAM_FILTERS = None
PARAMETER_FILE = None
MACHINE_IS_LATHE = False
MACHINE_IS_METRIC = False
MACHINE_UNIT_CONVERSION = 1
MACHINE_UNIT_CONVERSION_9 = [1]*9
TRAJ_COORDINATES =
JOINT_COUNT = int(self.INI.find("KINS","JOINTS")or 0)
AVAILABLE_AXES = ['X','Y','Z']
AVAILABLE_JOINTS = [0,1,2]
GET_NAME_FROM_JOINT = {0:'X',1:'Y',2:'Z'}
GET_JOG_FROM_NAME = {'X':0,'Y':1,'Z':2}
NO_HOME_REQUIRED = False
HOME_ALL_FLAG
JOINT_TYPE = self.INI.find(section, "TYPE") or "LINEAR"
JOINT_SEQUENCE_LIST
JOINT_SYNC_LIST

JOG_INCREMENTS = None
ANGULAR_INCREMENTS = None
GRID_INCREMENTS

DEFAULT_LINEAR_JOG_VEL = 15 одиниць за хвилину
MIN_LINEAR_JOG_VEL = 60 одиниць за хвилину
MAX_LINEAR_JOG_VEL = 300 одиниць за хвилину

DEFAULT_ANGULAR_JOG_VEL =
MIN_ANGULAR_JOG_VEL =
MAX_ANGULAR_JOG_VEL =

MAX_FEED_OVERRIDE =
MAX_TRAJ_VELOCITY =

AVAILABLE_SPINDLES = int(self.INI.find("TRAJ", "SPINDLES") or 1)
DEFAULT_SPINDLE_0_SPEED = 200
MAX_SPINDLE_0_SPEED = 2500
MAX_SPINDLE_0_OVERRIDE = 100
MIN_SPINDLE_0_OVERRIDE = 50

MAX_FEED_OVERRIDE = 1.5
MAX_TRAJ_VELOCITY

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

USRMESS_BOLDTEXT = self.INI.findall("DISPLAY", "MESSAGE_BOLDTEXT")
USRMESS_TEXT = self.INI.findall("DISPLAY", "MESSAGE_TEXT")
USRMESS_TYPE = self.INI.findall("DISPLAY", "MESSAGE_TYPE")
USRMESS_PINNAME = self.INI.findall("DISPLAY", "MESSAGE_PINNAME")
USRMESS_DETAILS = self.INI.findall("DISPLAY", "MESSAGE_DETAILS")
USRMESS_ICON = self.INI.findall("DISPLAY", "MESSAGE_ICON")
ZIPPED_USRMESS =

self.GLADEVCP = (self.INI.find("DISPLAY", "GLADEVCP")) or None

2.3. Інформація про вбудовану програму

TAB_NAMES = (self.INI.findall("DISPLAY", "EMBED_TAB_NAME")) or None
TAB_LOCATION = (self.INI.findall("DISPLAY", "EMBED_TAB_LOCATION")) or []
TAB_CMD = (self.INI.findall("DISPLAY", "EMBED_TAB_COMMAND")) or None
ZIPPED_TABS =

MDI_COMMAND_LIST =      (heading: [MDI_COMMAND_LIST], title: MDI_COMMAND")
TOOL_FILE_PATH =        (heading: [EMCIO], title:TOOL_TABLE)
POSTGUI_HALFILE_PATH =  (heading: [HAL], title: POSTGUI_HALFILE)

2.4. Помічники

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

get_error_safe_setting(_self_, _heading_, _detail_, default=_None_)
convert_metric_to_machine(_data_)
convert_imperial_to_machine(_data_)
convert_9_metric_to_machine(_data_)
convert_9_imperial_to_machine(_data_)
convert_units(_data_)
convert_units_9(_data_)
get_filter_program(_fname_)
get_qt_filter_extensions()

Отримати розширення фільтрів у форматі Qt.

2.5. Застосування

  • Імпорт модуля Info
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    з qtvcp.core імпортувати інформацію
  • Створення екземпляра модуля Info.
    Додайте цей код Python до розділу створення екземпляра:

    ###########################################
    # **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
    ###########################################
    
    INFO = Info()
  • Доступ до даних INFO Використовуйте цей загальний синтаксис:

    home_state = INFO.NO_HOME_REQUIRED
    if INFO.MACHINE_IS_METRIC is True:
        print('Metric based')

3. Action

Бібліотека Action використовується для керування контролером руху LinuxCNC.

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

3.1. Помічники

Є деякі допоміжні функції, які здебільшого використовуються для підтримки цієї бібліотеки:

get_jog_info (_num_)
jnum_check(_num_)
ensure_mode(_modes_)
open_filter_program(_filename_, _filter_)

Відкрийте програму фільтрації G-коду.

3.2. Застосування

  • Імпорт модуля Action
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    Дія імпорту з qtvcp.core
  • Створення екземпляра модуля Action
    Додайте цей код Python до розділу створення екземпляра:

    ###########################################
    # **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
    ###########################################
    
    ACTION = Action()
  • Доступ до команд ACTION
    Використовуйте загальний синтаксис, наприклад:

    ACTION.SET_ESTOP_STATE(state)
    ACTION.SET_MACHINE_STATE(state)
    
    ACTION.SET_MACHINE_HOMING(joint)
    ACTION.SET_MACHINE_UNHOMED(joint)
    
    ACTION.SET_LIMITS_OVERRIDE()
    
    ACTION.SET_MDI_MODE()
    ACTION.SET_MANUAL_MODE()
    ACTION.SET_AUTO_MODE()
    
    ACTION.SET_LIMITS_OVERRIDE()
    
    ACTION.CALL_MDI(code)
    ACTION.CALL_MDI_WAIT(code)
    ACTION.CALL_INI_MDI(number)
    
    ACTION.CALL_OWORD()
    
    ACTION.OPEN_PROGRAM(filename)
    ACTION.SAVE_PROGRAM(text_source, fname):
    
    ACTION.SET_AXIS_ORIGIN(axis,value)
    ACTION.SET_TOOL_OFFSET(axis,value,fixture = False)
    
    ACTION.RUN()
    ACTION.ABORT()
    ACTION.PAUSE()          # Перемикає паузу/відновлення
    ACTION.PAUSE_MACHINE()
    ACTION.RESUME()
    
    ACTION.SET_MAX_VELOCITY_RATE(rate)
    ACTION.SET_RAPID_RATE(rate)
    ACTION.SET_FEED_RATE(rate)
    ACTION.SET_SPINDLE_RATE(rate)
    
    ACTION.SET_JOG_RATE(rate)
    ACTION.SET_JOG_INCR(incr)
    ACTION.SET_JOG_RATE_ANGULAR(rate)
    ACTION.SET_JOG_INCR_ANGULAR(incr, text)
    
    ACTION.SET_SPINDLE_ROTATION(direction = 1, rpm = 100, number = 0)
    ACTION.SET_SPINDLE_FASTER(number = 0)
    ACTION.SET_SPINDLE_SLOWER(number = 0)
    ACTION.SET_SPINDLE_STOP(number = 0)
    
    ACTION.SET_USER_SYSTEM(система)
    
    ACTION.ZERO_G92_OFFSET()
    ACTION.ZERO_ROTATIONAL_OFFSET()
    ACTION.ZERO_G5X_OFFSET(num)
    
    ACTION.RECORD_CURRENT_MODE()
    ACTION.RESTORE_RECORDED_MODE()
    
    ACTION.SET_SELECTED_AXIS(номер суглоба)
    
    ACTION.DO_JOG(jointnum, direction)
    ACTION.JOG(jointnum, direction, rate, distance=0)
    
    ACTION.TOGGLE_FLOOD()
    ACTION.SET_FLOOD_ON()
    ACTION.SET_FLOOD_OFF()
    
    ACTION.TOGGLE_MIST()
    ACTION.SET_MIST_ON()
    ACTION.SET_MIST_OFF()
    
    ACTION.RELOAD_TOOLTABLE()
    ACTION.UPDATE_VAR_FILE()
    
    ACTION.TOGGLE_OPTIONAL_STOP()
    ACTION.SET_OPTIONAL_STOP_ON()
    ACTION.SET_OPTIONAL_STOP_OFF()
    
    ACTION.TOGGLE_BLOCK_DELETE()
    ACTION.SET_BLOCK_DELETE_ON()
    ACTION.SET_BLOCK_DELETE_OFF()
    
    ACTION.RELOAD_DISPLAY()
    ACTION.SET_GRAPHICS_VIEW(view)
    
    ACTION.UPDATE_MACHINE_LOG(text, option=None):
    
    ACTION.CALL_DIALOG(команда):
    
    ACTION.HIDE_POINTER(стан):
    
    ACTION.PLAY_SOUND(path):
    ACTION.PLAY_ERROR():
    ACTION.PLAY_DONE():
    ACTION.PLAY_READY():
    ACTION.PLAY_ATTENTION():
    ACTION.PLAY_LOGIN():
    ACTION.PLAY_LOGOUT():
    ACTION.SPEAK(speech):
    
    ACTION.BEEP():
    ACTION.BEEP_RING():
    ACTION.BEEP_START():
    
    ACTION.SET_DISPLAY_MESSAGE(string)
    ACTION.SET_ERROR_MESSAGE(string)
    
    ACTION.TOUCHPLATE_TOUCHOFF(search_vel, probe_vel, max_probe,
           z_offset, retract_distance, z_safe_travel, rtn_method=None, error_rtn = None)

4. Калал

Бібліотека для взаємодії компонентів/систем HAL.

4.1. Атрибути

Ось функції, які можна викликати для об’єкта Qhal:

setUpdateRate(cyclerate)

Встановити частоту циклу в мс

newPin(назва, константа типу виводу, константа напрямку виводу)

повертає новий об’єкт QPin

getPinObject(name)

повертає існуючий іменований об’єкт QPin

getValue(name)

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

setPin(name,value)

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

setSignal(name,value)

встановлює значення іменованого сигналу, використовуйте повну назву component.pin.

makeUniqueName(name)

повертає унікальний рядок назви виводу HAL, додаючи -x (число) до заданого рядка назви виводу

exit()

знищує компонент

4.2. Константи

Ось доступні константи:

  • HAL_BIT

  • HAL_FLOAT

  • HAL_S32

  • HAL_U32

  • HAL_IN

  • HAL_OUT

  • HAL_IO

  • HAL_RO

  • HAL_RW

4.3. Посилання

Доступні посилання на об’єкти:

  • comp об’єкт-компонент

  • hal об’єкт бібліотеки hal

5. QPin

Клас-обгортка навколо пінів HAL

5.1. Сигнали

Існує 3 сигнали Qt, до яких можна підключити вивід QPin:

  • value_changed викличе іменовану функцію з аргументом поточного значення (амортизований)

  • pinValueChanged викличе іменовану функцію з аргументами об’єкта pin та поточним значенням

  • isDrivenChanged викличе іменовану функцію з аргументами об’єкта pin та поточного стану, коли штифт (не)з’єднаний з ведучим штифтом

5.2. Атрибути

Ось функції, які можна викликати для об’єкта QPin:

  • <Pin object>.get() повертає поточне значення об’єкта pin

  • <Pin object>.set(X) встановлює значення об’єкта pin на значення X

  • <Pin object>.text() повертає рядок назви піна

5.3. Посилання

Доступні посилання на об’єкти:

  • hal об’єкт бібліотеки hal

5.4. Приклад

Додати функцію, яка викликається при зміні стану виводу
з qtvcp.core імпорт Qhal
QHAL = Qhal()

##########################################
# Спеціальні функції, що викликаються з QtVCP
##########################################

# на цьому етапі:
# екземпляри віджетів створено.
# піни HAL зібрано, але HAL ще не готовий
def initialized__(self):
    self.pin_button_in = QHAL.newpin('cycle-start-in',QHAL.HAL_BIT, QHAL.HAL_IN)
    self.pin_button_in.pinValuechanged.connect(self.buttonChanged)
    self.pin_button_in.isDrivenChanged.connect(lambda p,s: self.buttonDriven(p,s))

def buttonChanged(self, pinObject, value):
    print('Pin name:{} changed value to {}'.format(pinObject.text(), value))

def buttonDriven(self, pinObject, state):
    message = 'not driven by an output pin'
    if state:
        message = 'is driven by an output pin'
    print('Pin name:{} is {}'.format(pinObject.text(), message))

6. Tool

Ця бібліотека обробляє зміни файлу зміщення інструменту.

Warning
LinuxCNC погано обробляє маніпуляції файлу інструменту сторонніми особами.

6.1. Помічники

GET_TOOL_INFO(_toolnumber_)

Це поверне список інформації про номер запитуваного інструменту у форматі Python.

GET_TOOL_ARRAY()

Це повертає один список Python зі списками інформації про інструменти.

Це необроблений список, сформований з файлу системних інструментів.

ADD_TOOL(_newtool_ = [_-99, 0,'0','0','0','0','0','0','0','0','0','0','0','0', 0,'New Tool'_])

Це поверне кортеж із двох списків Python зі списків інформації про інструменти Python:

  • [0] буде інформацією про реальні інструменти

  • [1] буде інформація про знос інструментів (номери інструментів будуть понад 10000; знос інструментів у стилі Fanuc)

За замовчуванням додає порожній запис інструмента з номером інструмента -99.
Ви можете попередньо завантажити масив newtool інформацією про інструмент.

DELETE_TOOLS(_toolnumber_)

Видалити пронумерований інструмент.

SAVE_TOOLFILE(_toolarray_)

Це розбере toolarray та збереже його у файлі інструменту, зазначеному у INI-файлі як шлях інструменту.

Цей масив інструментів має містити всю доступну інформацію про інструменти..

Очікується, що цей масив використовуватиме необроблений масив інструментів LinuxCNC, тобто він не містить записів про знос інструменту.

Якщо сталася помилка, повернеться значення True.

CONVERT_TO_WEAR_TYPE(_toolarray_)

Ця функція перетворює масив необроблених інструментів LinuxCNC на масив інструментів QtVCP.

Масив інструментів QtVCP містить записи для зносу інструментів по осях X та Z.

LinuxCNC підтримує знос інструменту, додаючи інформацію про знос інструменту до записів інструментів вище 10000.

Note
Це також потрібно написати код перепризначення, щоб додати зміщення зносу під час зміни інструменту.
CONVERT_TO_STANDARD_TYPE(_toolarray_)

Ця функція перетворює масив інструментів QtVCP на необроблений масив інструментів LinuxCNC.

Масив QtVCP містить записи для зносу інструментів по осях X та Z.

LinuxCNC підтримує знос інструменту, додаючи інформацію про знос інструменту до записів інструментів вище 10000.

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

7. Path

Path Модуль надає посилання на шляхи до важливих файлів.

7.1. Шляхи, на які посилаються

PATH.PREFS_FILENAME

Шлях до файлу налаштувань.

PATH.WORKINGDIR

Каталог, з якого було запущено QtVCP.

PATH.IS_SCREEN

Це екран чи VCP?

PATH.CONFIGPATH

Запущено папку конфігурації.

PATH.RIPCONFIGDIR

Папка конфігурації запуску на місці для екранів QtVCP.

PATH.BASEDIR

Базова папка для LinuxCNC.

PATH.BASENAME

Ім’я файлу Qt Designer (без закінчення).

PATH.IMAGEDIR

Папка образів QtVCP.

PATH.SCREENDIR

Вбудована папка Screen у QtVCP.

PATH.PANELDIR

Вбудована папка VCP QtVCP.

PATH.HANDLER

Шлях до файлу обробника.

PATH.HANDLERDIR

Директорія, де було знайдено файл обробника Python.

PATH.XML

Шлях до файлу інтерфейсу користувача QtVCP.

PATH.HANDLERDIR

Каталог, де було знайдено файл інтерфейсу користувача.

PATH.QSS

Шлях до файлу QtVCP QSS.

PATH.PYDIR

Бібліотека Python для LinuxCNC.

PATH.LIBDIR

Папка бібліотеки QtVCP.

PATH.WIDGET

Папка віджетів QtVCP.

PATH.PLUGIN

Папка плагіна віджета QtVCP.

PATH.VISMACHDIR

Директорія, де знаходяться попередньо зібрані файли Vismach.

Наразі не використовується:

PATH.LOCALEDIR

Папка перекладу локалізації.

PATH.DOMAIN

Домен перекладу.

7.2. Помічники

Є деякі допоміжні функції:

file_list = PATH.find_vismach_files()
directory_list = PATH.find_screen_dirs()
directory_list = PATH.find_panel_dirs()

7.3. Застосування

  • Імпорт модуля Path
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    from qtvcp.core import Path
  • Створення екземпляра модуля Path
    Додайте цей код Python до розділу створення екземпляра:

    ###########################################
    # **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
    ###########################################
    
    PATH = Path()

8. VCPWindow

Модуль VCPWindow надає посилання на MainWindow та віджети.

Зазвичай це використовується для бібліотеки (наприклад, бібліотека панелей інструментів використовує її), оскільки віджети отримують посилання на MainWindow з функції _hal_init().

8.1. Застосування

  • Імпорт модуля VCPWindow
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    from qtvcp.qt_makegui import VCPWindow
  • Створення екземпляра модуля VCPWindow
    Додайте цей код Python до розділу створення екземпляра:

    ###########################################
    # **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
    ###########################################
    
    WIDGETS = VCPWindow()

9. Aux_program_loader

Модуль Aux_program_loader дозволяє легко завантажувати допоміжні програми, які часто використовує LinuxCNC.

9.1. Помічники

load_halmeter()

Halmeter використовується для відображення даних одного виводу HAL.
Завантажте halmeter за допомогою:

AUX_PRGM.load_halmeter()
load_ladder()

Завантаження програми PLC ClassicLadder:

AUX_PRGM.load_ladder()
load_status()

Завантаження програми status LinuxCNC:

AUX_PRGM.load_status()
load_halshow()

Завантажте HALshow, налаштуйте програму відображення:

AUX_PRGM.load_halshow()
load_halscope()

Завантаження програми HALscope:

AUX_PRGM.load_halscope()
load_tooledit()

Завантажте програму Tooledit:

AUX_PRGM.load_tooledit(<TOOLEFILE_PATH>)
load_calibration()

Завантажити програму Калібрування:

AUX_PRGM.load_calibration()
keyboard_onboard()

Завантажити вбудовану/Matchbox клавіатуру

AUX_PRGM.keyboard_onboard(<ARGS>)

9.2. Застосування

  • Імпорт модуля Aux_program_loader
    Додайте цей код Python до розділу імпорту:

############################
# **** РОЗДІЛ ІМПОРТ **** #
############################

from qtvcp.lib.aux_program_loader import Aux_program_loader
  • Створення екземпляра модуля Aux_program_loader
    Додайте цей код Python до розділу створення екземпляра:

###########################################
# **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
###########################################

AUX_PRGM = Aux_program_loader()

10. Keylookup

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

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

10.1. Застосування

Імпорт модуля Keylookup

Щоб імпортувати ці модулі, додайте цей код Python до розділу імпорту:

############################
# **** РОЗДІЛ ІМПОРТ **** #
############################

from qtvcp.lib.keybindings import Keylookup
Створення екземпляра модуля Keylookup

Щоб створити екземпляр модуля Keylookup* для використання, додайте цей код Python до розділу створення екземплярів:

###########################################
# **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
###########################################

KEYBIND = Keylookup()
Note
Додати прив’язки клавіш
Для виклику функції Keylookup потрібен код у функції processed_key_event.
Більшість файлів обробників вже містять цей код.

У файлі обробника, у розділі ініціалізованої функції, використовуйте цей загальний синтаксис для створення комбінацій клавіш:

KEYBIND.add_call("DEFINED_KEY","FUNCTION TO CALL", USER DATA)

Тут ми додаємо комбінацію клавіш для F10, F11 та F12:

##########################################
# Спеціальні функції, що викликаються з QtVCP
##########################################

# на цьому етапі:
# екземпляри віджетів створено.
# піни HAL зібрано, але HAL ще не готовий
def initialized__(self):
    KEYBIND.add_call('Key_F10','on_keycall_F10',None)
    KEYBIND.add_call('Key_F11','on_keycall_override',10)
    KEYBIND.add_call('Key_F12','on_keycall_override',20)

А потім нам потрібно додати функції, які викликаються.
У файлі обробника, в розділі KEY BINDING CALLS, додайте це:

#####################
# ПРИВ’ЯЗКА КЛАВІШ ВИКЛИКІВ #
#####################

def on_keycall_F12(self,event,state,shift,cntrl,value):
    if state:
        print('F12 pressed')

def on_keycall_override(self,event,state,shift,cntrl,value):
    if state:
        print('value = {}'.format(value))

10.2. Ключові визначення

Ось список розпізнаних ключових слів. Використовуйте цитований текст.
Літерні ключі використовують «Key_» з додаванням верхньої або нижньої літери.
Наприклад, «Key_a» та «Key_A».

keys = {
    Qt.Key_Escape: "Key_Escape",
    Qt.Key_Tab: "Key_Tab",
    Qt.Key_Backtab: "Key_Backtab",
    Qt.Key_Backspace: "Key_Backspace",
    Qt.Key_Return: "Key_Return",
    Qt.Key_Enter: "Key_Enter",
    Qt.Key_Insert: "Key_Insert",
    Qt.Key_Delete: "Key_Delete",
    Qt.Key_Pause: "Key_Pause",
    Qt.Key_Print: "Key_Print",
    Qt.Key_SysReq: "Key_SysReq",
    Qt.Key_Clear: "Key_Clear",
    Qt.Key_Home: "Key_Home",
    Qt.Key_End: "Key_End",
    Qt.Key_Left: "Key_Left",
    Qt.Key_Up: "Key_Up",
    Qt.Key_Right: "Key_Right",
    Qt.Key_Down: "Key_Down",
    Qt.Key_PageUp: "Key_PageUp",
    Qt.Key_PageDown: "Key_PageDown",
    Qt.Key_Shift: "Key_Shift",
    Qt.Key_Control: "Key_Control",
    Qt.Key_Meta: "Key_Meta",
    # Qt.Key_Alt: "Key_Alt",
    Qt.Key_AltGr: "Key_AltGr",
    Qt.Key_CapsLock: "Key_CapsLock",
    Qt.Key_NumLock: "Key_NumLock",
    Qt.Key_ScrollLock: "Key_ScrollLock",
    Qt.Key_F1: "Key_F1",
    Qt.Key_F2: "Key_F2",
    Qt.Key_F3: "Key_F3",
    Qt.Key_F4: "Key_F4",
    Qt.Key_F5: "Key_F5",
    Qt.Key_F6: "Key_F6",
    Qt.Key_F7: "Key_F7",
    Qt.Key_F8: "Key_F8",
    Qt.Key_F9: "Key_F9",
    Qt.Key_F10: "Key_F10",
    Qt.Key_F11: "Key_F11",
    Qt.Key_F12: "Key_F12",
    Qt.Key_F13: "Key_F13",
    Qt.Key_F14: "Key_F14",
    Qt.Key_F15: "Key_F15",
    Qt.Key_F16: "Key_F16",
    Qt.Key_F17: "Key_F17",
    Qt.Key_F18: "Key_F18",
    Qt.Key_F19: "Key_F19",
    Qt.Key_F20: "Key_F20",
    Qt.Key_F21: "Key_F21",
    Qt.Key_F22: "Key_F22",
    Qt.Key_F23: "Key_F23",
    Qt.Key_F24: "Key_F24",
    Qt.Key_F25: "Key_F25",
    Qt.Key_F26: "Key_F26",
    Qt.Key_F27: "Key_F27",
    Qt.Key_F28: "Key_F28",
    Qt.Key_F29: "Key_F29",
    Qt.Key_F30: "Key_F30",
    Qt.Key_F31: "Key_F31",
    Qt.Key_F32: "Key_F32",
    Qt.Key_F33: "Key_F33",
    Qt.Key_F34: "Key_F34",
    Qt.Key_F35: "Key_F35",
    Qt.Key_Super_L: "Key_Super_L",
    Qt.Key_Super_R: "Key_Super_R",
    Qt.Key_Menu: "Key_Menu",
    Qt.Key_Hyper_L: "Key_HYPER_L",
    Qt.Key_Hyper_R: "Key_Hyper_R",
    Qt.Key_Help: "Key_Help",
    Qt.Key_Direction_L: "Key_Direction_L",
    Qt.Key_Direction_R: "Key_Direction_R",
    Qt.Key_Space: "Key_Space",
    Qt.Key_Any: "Key_Any",
    Qt.Key_Exclam: "Key_Exclam",
    Qt.Key_QuoteDbl: "Key_QuoteDdl",
    Qt.Key_NumberSign: "Key_NumberSign",
    Qt.Key_Dollar: "Key_Dollar",
    Qt.Key_Percent: "Key_Percent",
    Qt.Key_Ampersand: "Key_Ampersand",
    Qt.Key_Apostrophe: "Key_Apostrophe",
    Qt.Key_ParenLeft: "Key_ParenLeft",
    Qt.Key_ParenRight: "Key_ParenRight",
    Qt.Key_Asterisk: "Key_Asterisk",
    Qt.Key_Plus: "Key_Plus",
    Qt.Key_Comma: "Key_Comma",
    Qt.Key_Minus: "Key_Minus",
    Qt.Key_Period: "Key_Period",
    Qt.Key_Slash: "Key_Slash",
    Qt.Key_0: "Key_0",
    Qt.Key_1: "Key_1",
    Qt.Key_2: "Key_2",
    Qt.Key_3: "Key_3",
    Qt.Key_4: "Key_4",
    Qt.Key_5: "Key_5",
    Qt.Key_6: "Key_6",
    Qt.Key_7: "Key_7",
    Qt.Key_8: "Key_8",
    Qt.Key_9: "Key_9",
    Qt.Key_Colon: "Key_Colon",
    Qt.Key_Semicolon: "Key_Semicolon",
    Qt.Key_Less: "Key_Less",
    Qt.Key_Equal: "Key_Equal",
    Qt.Key_Greater: "Key_Greater",
    Qt.Key_Question: "Key_Question",
    Qt.Key_At: "Key_At",
    Qt.Key_BracketLeft: "Key_BracketLeft",
    Qt.Key_Backslash: "Key_Backslash",
    Qt.Key_BracketRight: "Key_BracketRight",
    Qt.Key_AsciiCircum: "Key_AsciiCircum",
    Qt.Key_Underscore: "Key_Underscore",
    Qt.Key_QuoteLeft: "Key_QuoteLeft",
    Qt.Key_BraceLeft: "Key_BraceLeft",
    Qt.Key_Bar: "Key_Bar",
    Qt.Key_BraceRight: "Key_BraceRight",
    Qt.Key_AsciiTilde: "Key_AsciiTilde",

}

11. Messages

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

Ці повідомлення:

  • визначено у файлі INI під заголовком [DISPLAY], та

  • керується контактами HAL.

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

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

BOLDTEXT

Зазвичай це титул.

ТЕКСТ

Текст під заголовком, і зазвичай довший.

ДЕТАЛІ

Текст прихований, якщо на нього не натиснути.

PINNAME

Базова назва виводу(ів) HAL.

ТИП

Визначає, чи це (може мати опції діалогового вікна та стану разом): статус – відображається в _рядку стану* та діалоговому вікні сповіщень.
Не потребує втручання користувача.

  • nonedialog – спеціально не показує діалогове вікно.
    okdialog - вимагає від користувача натискання кнопки «ОК» для закриття діалогового вікна.
    Повідомлення «ОК» мають два контакти HAL:

    • Один контакт HAL для запуску діалогового вікна та

    • один, щоб означити, що він очікує відповіді. yesnodialog - вимагає від користувача натискання кнопок «так» або «ні» для закриття діалогового вікна.
      Повідомлення «Так/Ні» мають три контакти HAL:

    • Один для відображення діалогу,

    • Один для очікування, і

    • один за відповідь. okcanceldialog - вимагає від користувача вибору "ОК" або "Скасувати"
      Повідомлення "ОК/Скасувати" мають _три контакти HAL
      :

    • Один для відображення діалогу,

    • Один для очікування, і

    • один за відповідь.

  • closepromptdialog - вимагає від користувача вибору

За замовчуванням повідомлення STATUS для focus_overlay та звук сповіщень надсилатимуться, коли з’явиться діалогове вікно.
Це дозволяє додавати затемнення/розмиття екрана для focus та звуки до сповіщень.

11.2. Піни HAL

Назви контактів HAL використовуватимуть такі шаблони:

<SCREEN BASENAME>.<PINNAME>

виклик PIN-коду s32

<SCREEN BASENAME>.<PINNAME>-waiting

Вихідний біт «Очікування відповіді користувача»

<SCREEN BASENAME>.<PINNAME>-response

Вихідний біт «Відповідь користувача»

<SCREEN BASENAME>.<PINNAME>-response-s32

Вивід «Відповідь користувача», контакт s32

11.3. Приклади

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

  • Спливаюче повідомлення в рядку стану та на робочому столі:

    MESSAGE_BOLDTEXT = NONE
    MESSAGE_TEXT = This is a statusbar test
    MESSAGE_DETAILS = STATUS DETAILS
    MESSAGE_TYPE = status
    MESSAGE_PINNAME = statustest
  • Спливаюче діалогове вікно з питанням «Так/Ні»:

    MESSAGE_BOLDTEXT = NONE
    MESSAGE_TEXT = This is a yes no dialog test
    MESSAGE_DETAILS = Y/N DETAILS
    MESSAGE_TYPE = yesnodialog
    MESSAGE_PINNAME = yndialogtest
  • Спливаюче діалогове вікно із запитом на відповідь «ОК» + рядок стану та сповіщення на робочому столі:

    MESSAGE_BOLDTEXT = Це короткий текст.
    MESSAGE_TEXT = Це довгий текст обох типів тесту. Він може бути довшим за текст у рядку стану.
    MESSAGE_DETAILS = ДЕТАЛЬНІШЕ ПРО ОБИДВА ТИПИ
    MESSAGE_TYPE = стан okdialog
    MESSAGE_PINNAME = bothtest

Віджет ScreenOptions може автоматично налаштувати систему повідомлень.

12. багатоповідомлення

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

Ці повідомлення:

  • визначено у файлі INI під заголовком [DISPLAY], та

  • керується одним виводом HAL s32 на кожен визначений ідентифікатор.

  • Кожне повідомлення викликається відповідним номером на виводі s32.

Використовуйте цей стиль повідомлень користувача, наприклад, коли VFD надсилає повідомлення про помилки, закодовані у вигляді чисел.
Він використовує загальні виклики/відповіді/очікування HAL-контактів для всіх (за іменем ID) діалогових вікон з декількома повідомленнями. Імена HAL-контактів використовують такі шаблони:

<SCREEN BASENAME>.<ID NAME>

виклик PIN-коду s32

<SCREEN BASENAME>.<ID NAME>-waiting

Вихідний біт «Очікування відповіді користувача»

<SCREEN BASENAME>.<ID NAME>-response

Вихідний біт «Відповідь користувача»

<SCREEN BASENAME>.<ID NAME>-response-s32

Вивід «Відповідь користувача», контакт s32

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

TITLE

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

ТЕКСТ

Текст під заголовком, і зазвичай довший.

ДЕТАЛІ

Текст прихований, якщо на нього не натиснути.

ТИП

Визначає тип повідомлення, яке бачить користувач (може мати опції діалогового вікна та стану разом): статус – відображається в _рядку стану* та діалоговому вікні сповіщень.
Не потребує втручання користувача.

  • nonedialog – спеціально не показує діалогове вікно.
    okdialog - вимагаючи від користувача натискання кнопки «ОК» для закриття діалогового вікна.
    Повідомлення «ОК» використовують два контакти HAL:

    • Один контакт HAL для запуску діалогового вікна та

    • один, щоб означати, що він очікує відповіді. yesnodialog - вимагає від користувача натискання кнопок «так» або «ні» для закриття діалогового вікна.
      Повідомлення «так/ні» використовують три контакти HAL:

    • Один для відображення діалогу,

    • Один для очікування, і

    • один за відповідь.

За замовчуванням повідомлення STATUS для focus_overlay та звук сповіщень надсилатимуться, коли з’явиться діалогове вікно.
Це дозволяє додавати затемнення/розмиття екрана для focus та звуки до сповіщень.

12.2. Приклади

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

[DISPLAY]
MULTIMESSAGE_ID = VFD

MULTIMESSAGE_VFD_NUMBER = 1
MULTIMESSAGE_VFD_TYPE = okdialog status
MULTIMESSAGE_VFD_TITLE = VFD Error: 1
MULTIMESSAGE_VFD_TEXT = This is the longer text FOR MESSAGE NUMBER 1
MULTIMESSAGE_VFD_DETAILS = DETAILS for VFD error 1
MULTIMESSAGE_VFD_ICON = WARNING'

MULTIMESSAGE_VFD_NUMBER = 2
MULTIMESSAGE_VFD_TYPE = nonedialog status
MULTIMESSAGE_VFD_TITLE = VFD Error: 2
MULTIMESSAGE_VFD_TEXT = This is the longer text FOR MESSAGE NUMBER 2
MULTIMESSAGE_VFD_DETAILS = DETAILS for VFD error 2
MULTIMESSAGE_VFD_ICON = INFO'

13. Notify

Notify Модуль використовується для надсилання повідомлень, інтегрованих у робочий стіл.

Він використовує бібліотеку pynotify.

Ubuntu/Mint не дотримується стандарту, тому ви не можете встановити, як довго повідомлення буде відображатися.
Я пропоную виправити це за допомогою пакета notify-osd, доступного за адресою цей PPA (ПРИПИНЕНО через перехід Ubuntu на Gnome).

Notify зберігає список усіх повідомлень про тривогу з моменту запуску у self.alarmpage.
Якщо ви натиснете 'Показати всі повідомлення' у спливаючому вікні сповіщення, воно виведе їх на термінал.

Віджет ScreenOptions може автоматично налаштувати систему сповіщень.

Зазвичай для надсилання сповіщень використовуються повідомлення STATUS.

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

Ви можете встановити:

title

Текст заголовка сповіщення.

message

Текст вмісту сповіщення.

icon

Піктограма сповіщення.

timeout

Як довго повідомлення залишається активним.

14. Preferences

Preferences Модуль дозволяє завантажувати та постійно зберігати дані про налаштування на носії інформації.

Віджет ScreenOptions може автоматично налаштувати систему налаштувань.

QtVCP спочатку шукає віджет ScreenOptions і, якщо його знаходить, викликає _pref_init().
Це створює об’єкт налаштувань і повертає його до QtVCP, щоб передати всім віджетам і додати до атрибутів об’єкта вікна.
У цьому випадку об’єкт налаштувань буде доступний з методу initialized_ файлу обробника як self.w.PREFS_.

Також усі віджети можуть мати доступ до певного файлу налаштувань під час ініціалізації.

Віджет ScreenOptions може автоматично налаштувати файл налаштувань.

15. Player

Цей модуль дозволяє відтворювати звуки за допомогою Gstreamer, beep та Espeak.

Це може:

  • play sound/music files using Gstreamer (неблокуючий),

  • відтворювати звуки за допомогою бібліотеки beep (наразі блокується під час звукового сигналу),

  • вимовляти слова, використовуючи бібліотеку espeak (без блокування під час мовлення).

Існують звуки сповіщень за замовчуванням, що використовують звуки за замовчуванням Mint або FreeDesktop.

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

STATUS містить _повідомлення для керування модулем Player.

Віджет ScreenOptions може автоматично налаштувати аудіосистему.

15.1. Звуки

Сповіщення

На вибір є сповіщення за замовчуванням:

  • ERROR

  • READY

  • ATTENTION

  • RING

  • DONE

  • LOGIN

  • LOGOUT

Звукові сигнали

Лунає три звукові сигнали:

  • BEEP_RING

  • BEEP_START

  • BEEP

15.2. Застосування

  • Імпорт модуля Player
    Додайте цей код Python до розділу імпорту:

    ############################
    # **** РОЗДІЛ ІМПОРТ **** #
    ############################
    
    from qtvcp.lib.audio_player import Player
  • Створення екземпляра модуля Player
    Додайте цей код Python до вашого екземпляра розділу:

    ###########################################
    # **** РОЗДІЛ «МІСЦЕВІ БІБЛІОТЕКИ» **** #
    ###########################################
    
    SOUND = Player()
    SOUND._register_messages()

    Функція _register_messages() підключає аудіоплеєр до бібліотеки STATUS, щоб звуки можна було відтворювати за допомогою системи повідомлень STATUS.

15.3. Приклад

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

STATUS.emit('play-alert','LOGOUT')
STATUS.emit('play-alert','BEEP')
STATUS.emit('play-alert','SPEAK This is a test screen for Q t V C P')
STATUS.emit('play-sound', 'PATH TO SOUND')

16. Віртуальна клавіатура

Ця бібліотека дозволяє вам використовувати повідомлення STATUS для запуску віртуальної клавіатури.

Він використовує бібліотеки Onboard або Matchbox для клавіатури.

17. Дії панелі інструментів

Ця бібліотека надає готові підменю та дії для меню та кнопок панелі інструментів.

Кнопки інструментів, меню та меню панелі інструментів:

  • побудовано в Qt Designer та

  • призначені дії/підменю у файлі обробника.

17.1. Дії

estop
power
load
reload
gcode_properties
run
pause
abort
block_delete
optional_stop
touchoffworkplace
touchofffixture
runfromline
load_calibration
load_halmeter
load_halshow
load_status
load_halscope
about
zoom_in
zoom_out
view_x
view_y
view_y2
view_z
view_z2
view_p
view_clear
show_offsets
quit
system_shutdown
tooloffsetdialog
originoffsetdialog
calculatordialog
alphamode
inhibit_selection
show_dimensions

Вмикає/вимикає відображення розмірів.

17.2. Підменю

recent_submenu
home_submenu
unhome_submenu
zero_systems_submenu
grid_size_submenu

Меню для налаштування розміру графічної сітки

17.3. Застосування

Ось типовий код, який потрібно додати до відповідних розділів файлу handler:

############################
# **** РОЗДІЛ ІМПОРТ **** #
############################

from qtvcp.lib.toolbar_actions import ToolBarActions

###########################################
# **** розділ створення екземплярів бібліотек **** #
###########################################

TOOLBAR = ToolBarActions()

17.4. Приклади

  • Призначення дій інструментів кнопкам панелі інструментів

    ##########################################
    # Спеціальні функції, що викликаються з QtVCP
    ##########################################
    
    # На цьому етапі:
    # * екземпляри віджетів створено,
    # * піни HAL зібрано, але HAL ще не готовий.
    def initialized__(self):
        TOOLBAR.configure_submenu(self.w.menuHoming, 'home_submenu')
        TOOLBAR.configure_action(self.w.actionEstop, 'estop')
        TOOLBAR.configure_action(self.w.actionQuit, 'quit', lambda d:self.w.close())
        TOOLBAR.configure_action(self.w.actionEdit, 'edit', self.edit)
        # Add a custom function
        TOOLBAR.configure_action(self.w.actionMyFunction, 'my_Function', self.my_function)
  • Додати функцію власної панелі інструментів:

    #####################
    # ЗАГАЛЬНІ ФУНКЦІЇ #
    #####################
    
    def my_function(self, widget, state):
        print('My function State = ()'.format(state))

18. Бібліотека машинної графіки Qt Vismach

Qt_vismach — це набір функцій Python, які можна використовувати для створення та анімації моделей машин.

Vismach:

  • відображає модель у 3D-вікні перегляду

  • анімує частини моделі, коли значення пов’язаних з ними контактів HAL змінюються.

Це версія бібліотеки на основі Qt, також доступна версія для tkinter у LinuxCNC.

Версія Qt дозволяє вбудовувати симуляцію в інші екрани.

18.1. Вбудовані зразки

У QtVCP включено зразки панелей для:

  • 3-осьовий фрезерний верстат XYZ,

  • 5-осьовий портальний фрезерний верстат,

  • 3-осьовий фрезерний верстат з віссю/шпинделем А, та

  • масштабувати млин.

Більшість цих зразків, якщо їх завантажити після запущеної конфігурації LinuxCNC (включаючи екрани, що не базуються на QtVCP), реагуватимуть на рух верстата.
Деякі вимагають підключення контактів HAL для руху.

З терміналу (виберіть один):

qtvcp vismach_mill_xyz
qtvcp vismach_scara
qtvcp vismach_millturn
qtvcp vismach_5axis_gantry

18.2. Бібліотека примітивів

Надає основні структурні елементи змодельованої машини.

Колекція

Колекція — це об’єкт окремих деталей машини.

Тут міститься ієрархічний список примітивних фігур або STL-об’єктів, до яких можна застосовувати операції.

Перекласти

Цей об’єкт виконає обчислення перетворення OpenGL для об’єкта Collection.

Переклад стосується переміщення об’єкта по прямій в інше положення на екрані.

Масштаб

Цей об’єкт виконуватиме функцію масштабування OpenGL для об’єкта колекції.

HalTranslate

Цей об’єкт виконає обчислення перетворення OpenGL для об’єкта Collection, зі зміщенням на значення виводу HAL.

Переклад означає переміщення об’єкта по прямій лінії в інше положення на екрані.

Ви можете:

  • зчитати пін-код з компонента, що належить об’єкту Vismach, або

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

Повернути

Цей об’єкт виконає обчислення обертання OpenGL для об’єкта Collection.

HalRotate

Цей об’єкт виконає розрахунок обертання OpenGL для об’єкта Collection, зі зміщенням на значення виводу HAL.

Ви можете:

  • зчитати пін-код з компонента, що належить об’єкту vismach, або

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

HalToolCylinder

Цей об’єкт створить об’єкт CylinderZ, який змінюватиме розмір та довжину на основі завантаженого виміру інструменту (з таблиці інструментів)

Він зчитує HAL-піни halui.tool.diameter та motion.tooloffset.z.

Приклад із зразка mill_xyz:

toolshape = CylinderZ(0)
toolshape = Color([1, .5, .5, .5], [toolshape])
tool = Collection([
    Translate([HalTranslate([tooltip], None, "motion.tooloffset.z", 0, 0, -MODEL_SCALING)], 0, 0, 0),
    HalToolCylinder(toolshape)
])
Трек

Переміщувати та обертати об’єкт, щоб він вказував з однієї системи координат capture() в іншу.

Базовий об’єкт для зберігання координат примітивних фігур.

CylinderX, CylinderY, CylinderZ

Побудуйте циліндр на осі X, Y або Z, вказавши координати кінцевої точки (X, Y або Z) та радіуса.

Сфера

Побудуйте сферу з координат центру та радіуса.

TriangleXY, TriangleXZ, TriangleYZ

Побудуйте трикутник у задана площині, вказавши координати Z кутів для кожної сторони.

ArcX

Побудуйте дугу, вказавши

Коробка

Побудуйте блок, заданий 6 координатами вершин.

BoxCentered

Побудуйте прямокутник з центром у початку координат, вказавши ширину по X та Y_, а також висоту по Z_.

BoxCenteredXY

Побудуйте прямокутник з центром у X та Y, що починається від Z=0, вказавши ширину в X та Y, та простягаючись вгору або вниз до заданої висоти в Z.

Захоплення

Захопити поточну матрицю перетворення колекції.

Note
Це трансформується з поточної системи координат до системи області перегляду, а НЕ до світової системи.
Хаб

Heads Up Display малює напівпрозоре текстове поле.

Використання:

  • HUD.strs для речей, які потрібно постійно оновлювати,

  • HUD.show("stuff") для одноразових речей, таких як повідомлення про помилки.

Колір

Застосовує колір до частин колекції.

AsciiSTL, AsciiOBJ

Завантажує файл даних STL або OBJ як частину Vismach.

18.3. Застосування

Імпорт симуляції

Ось як можна імпортувати симуляцію XYZ_mill у файл панелі або обробника екрана QtVCP.

############################
# **** РОЗДІЛ ІМПОРТ **** #
############################

import mill_xyz as MILL
Створення екземпляра та використання віджета симуляції

Створіть екземпляр віджета симуляції та додайте його до основного макета екрана:

##########################################
# Спеціальні функції, що викликаються з QtVCP
##########################################

# На цьому етапі:
# * екземпляри віджетів створено,
# * піни HAL зібрано, але HAL ще не готовий.
def initialized__(self):
    machine = MILL.Window()
    self.w.mainLayout.addWidget(machine)

18.4. Більше інформації

Більше інформації про те, як створити власну симуляцію машини, див. у розділі Qt Vismach.