gscreen

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
psha
Опытный
Сообщения: 147
Зарегистрирован: 28 фев 2011, 11:11
Репутация: 1
Контактная информация:

Re: gscreen

Сообщение psha »

gladevcp не понимает параметров после .ui файла, так gladevcp args file.ui и gladevcp file.ui args дадут разные результаты
Да, еще, вы не хотите кнопки дёргать по именам, а не по "положению", которое может измениться если вставятся какие-нибудь паддинги?
root, доделай конвертацию! :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

Положение нужно только для двух рядов кнопок.
Да, есть проблема, если в Hbox пустое место, оно заполняется всеми кнопками, но это будет сразу видно на экране.
Просто нам необходимо, чтобы нажатие на хардварную кнопку вызывало именно то, что над ней нарисовано.

Остальные кнопки надо по именам вызывать.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

так и не заработал у меня колькулятор:
Выделение(025).png (2174 просмотра) <a class='original' href='./download/file.php?id=7805&mode=view' target=_blank>Загрузить оригинал (90.35 КБ)</a>
Последний раз редактировалось nkp 30 авг 2012, 23:14, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

А что он должен считать?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

так в том и вопрос
только по коду и догадки
а почему не работает ?????
и мне еще интересно как само окно калькулятора формируется? ведь в glade только рамка под него .....
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

А какие там названия кнопок и функции?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

Nick писал(а):А какие там названия кнопок и функции?
это обычный калькулятор
или ты про что?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

Ну я имею в виду в glade как кнопки называются, чтобы их можно было в коде найти?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

кнопок нет
ты или вводишь число в правом верхнем углу в Spin box
либо даблклик на нем вызывает калькулятор
вводимое число в переменной raw:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

    def get_qualified_input(self,switch = None):
        # If the calculator is displayed use it for input instead of spinbox
        if self.widgets.dialog_entry.get_property("visible"):
            raw = self.widgets.calc_entry.get_value()
        else:
            raw = self.widgets.data_input.get_value()
        print "RAW input:",raw
        if switch == _SPINDLE_INPUT:
            return raw
        elif switch == _PERCENT_INPUT:
            return round(raw,2)
        else:
            if self.data.dro_units != self.data.machine_units:
                print "conversion needed"
                if self.data.dro_units == _MM:
                    raw = raw / 25.4
                else:
                    raw = raw * 25.4
                print "converted to:",raw
            else:
                print "no conversion"
            if switch == "x" and self.data.diameter_mode:
                print "convert from diameter"
                raw = raw / 2.0
        print "Qualified input:",raw
        return raw
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

вот сейчас писал в соседней теме о gremlin и возник вопрос :
некоторое количество кнопок надо выделить под внутренние задачи самого окна
но даже при наличии 56 кнопок в myscreen.glade выделять в каждом режиме под графику - я думаю это слишком
в оригинале есть как бы подрежимы
но там проще - gscreen вообще писался (со слов автора) для тачскрина
а у нас переключение режимов галетником
Lexxa, как ты видишь это ?
и в целом , мне кажеться надо последовательно определиться в содержимым экрана для каждого режима
тут без твоего опыта не обойтись...
вот исходная : 6 режимов
1) edit
2) AUTO
3) MDI
4) безразмерные перемещения
5) инкрементальные перемещения
6) от маховичка
и есть myscreen.glade
вот и начать с первого режима - какие кнопки и другое содержимое .Просто - пусть в виде картинки
думаю это основа алгоритма работы интерфейса
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

nkp писал(а):вот и начать с первого режима - какие кнопки и другое содержимое .Просто - пусть в виде картинки
+500 Это очень надо, причем достаточно срочно, завтра уезжаю, надо до завтра все на ноут слить.
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: gscreen

Сообщение Lexxa »

nkp, я в теме по gscreen пытался обозначить ф-ции, кажись на второй странице.
nkp писал(а):как ты видишь это ?
естественно положительно.
т.е. в каждом режиме надо выделить существенные кнопки, которые не будут подменяться в подрежимах.
Разумеется свободные места под софтовые кнопки останутся
Например.
1) Auto
Hard CycleStart
Hard FeedStop
Hard Abort
Soft Coolant OnOff
Soft Lube OnOff
Soft Mist OnOff
Soft "/"
Soft "M01"
Soft View
sub soft "плоскость XY"
sub soft "плоскость XZ"
sub sotf "плоскость ZX"
sub soft "Горизонтальное вращение"
sub soft "Вертикальное вращение"
sub soft "Увеличить масштаб"
sub soft "Уменьшить масштаб"
sub soft "Закрыть просмотр"
sub soft "G-код - Скрыть гремлина - ничего не скрывать"
Soft "Очистить гремлина"
Soft "стрелка вверх" (дублируется с клавиатурой)
Soft "Стрелка вниз" (дублируется с клавиатурой)
Soft "Исполнить с выбранного кадра"
Soft NCGUI
sub soft ...
Soft "Открыть программу"
2) Edit
Все hard сделать неактивными (через ладдер)
Soft "открыть"
Soft "сохранить"
Soft "Сохранить как"
Soft "Протестировать в гремлине"
Soft Вставить "/" в начало строки
Soft Вставить "М01" в конец строки
хз что там еще нужно

3) безразмерные
Hard CycleStart
Hard FeedStop
Hard Abort
Hard "+"
Hard "quick"
Hard "-"
Soft Coolant OnOff
Soft Lube OnOff
Soft Mist OnOff
Soft "Set offset"
sub soft "G5x up"
sub soft "G5x down"
sub soft "Table Tool"
sub soft "input"
sub soft "save"
sub soft "cancel"
sub soft "exit to main"
soft NCGUI (?)

4) Инкрементальные перемещения
Hard CycleStart
Hard FeedStop
Hard Abort
Hard "+"
Hard "quick"
Hard "-"
Soft Coolant OnOff
Soft Lube OnOff
Soft Mist OnOff
Soft "Set offset"
sub soft "G5x up"
sub soft "G5x down"
sub soft "Table Tool"
sub soft "input"
sub soft "save"
sub soft "cancel"
sub soft "exit to main"
soft NCGUI (?)
Soft "Set Inc" (лучше, если это hard (энкодер например))
sub soft "0.01"
sub soft "0.05"
sub soft "0.1"
sub soft "1"
sub soft "5"
sub soft "10"

5) Перемещения от маховичка
Hard CycleStart
Hard FeedStop
Hard Abort
Hard "+"
Hard "quick"
Hard "-"
Soft Coolant OnOff
Soft Lube OnOff
Soft Mist OnOff
Soft "Set offset"
sub soft "G5x up"
sub soft "G5x down"
sub soft "Table Tool"
sub soft "input"
sub soft "save"
sub soft "cancel"
sub soft "exit to main"
soft NCGUI (?)
soft x1
soft x10
Soft x100

6) MDI
:bender:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

Вот что то в gscreen файлы через ngcgui не грузится
то есть

Код: Выделить всё

 o<sfer> call [30][20][10][1][0][8][400]
m2
не проходят
ну и в примитиве mygui та же история
чет не пойму.....
Вот здесь вкладка ngcgui видна
в принципе emc должно быть все равно -какой там экран
(axis те же файлы кушает на ура..)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

Скорее всего ngcgui правит загруженный код, и возможно ему нужен какой-то хендл.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

С gscren в отношении ngcgui разобрался- все отрисовывается
а вот в mygui не загружается - буду разбираться дальше
gremlin в glade выбирается и все сигналы активируются по дефолту
(простой G-код ,не о-коды, ведь загружается и отрисовка есть.....)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

не могу разобраться - как работает обновление данных в Gscreen
(в частности координат - для своего DRO)
вот по порядку:
код всего скрипта
gscreen.txt
(77.83 КБ) 985 скачиваний

Код: Выделить всё

 gobject.timeout_add(50, self.periodic_status)
здесь задается период обновления функции (self.periodic_status) - 50
функция self.periodic_status:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

    def periodic_status(self):
        self.emc.mask()
        print self.data.z_dtg 
        self.emcstat = linuxcnc.stat()
        self.emcerror = linuxcnc.error_channel()
        self.emcstat.poll()
        self.data.task_mode = self.emcstat.task_mode 
        self.status.periodic()
        self.data.system = self.status.get_current_system()
        #print self.status.data.x_abs
        #self.radiobutton_mask = 0
        e = self.emcerror.poll()
        if e:
            kind, text = e
            if kind in (linuxcnc.NML_ERROR, linuxcnc.OPERATOR_ERROR):
                self.notify("Error Message",text,ALERT_ICON,3)
            else:
                self.notify("Error Message",text,INFO_ICON,3)
        self.emc.unmask()
        #self.hal.periodic(self.tab == 1) # MDI tab?
        self.update_position()
        return True
содержит self.emcstat.poll() - обновляет все статданные (модуль Linuxcnc)
self.status.periodic() - вычисляет текущие значения координат(модуль emc_interface.py)
и еще многое другое:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

        def periodic(self):
            self.emcstat.poll()
            am = self.emcstat.axis_mask
            lathe = not (self.emcstat.axis_mask & 2)
            dtg = self.emcstat.dtg

            if self.actual:
                p = self.emcstat.actual_position
            else:
                p = self.emcstat.position

            x = p[0] - self.emcstat.g5x_offset[0] - self.emcstat.tool_offset[0]
            y = p[1] - self.emcstat.g5x_offset[1] - self.emcstat.tool_offset[1]
            z = p[2] - self.emcstat.g5x_offset[2] - self.emcstat.tool_offset[2]
            a = p[3] - self.emcstat.g5x_offset[3] - self.emcstat.tool_offset[3]
            b = p[4] - self.emcstat.g5x_offset[4] - self.emcstat.tool_offset[4]
            c = p[5] - self.emcstat.g5x_offset[5] - self.emcstat.tool_offset[5]
            u = p[6] - self.emcstat.g5x_offset[6] - self.emcstat.tool_offset[6]
            v = p[7] - self.emcstat.g5x_offset[7] - self.emcstat.tool_offset[7]
            w = p[8] - self.emcstat.g5x_offset[8] - self.emcstat.tool_offset[8]

            if self.emcstat.rotation_xy != 0:
                t = math.radians(-self.emcstat.rotation_xy)
                xr = x * math.cos(t) - y * math.sin(t)
                yr = x * math.sin(t) + y * math.cos(t)
                x = xr
                y = yr

            x -= self.emcstat.g92_offset[0] 
            y -= self.emcstat.g92_offset[1] 
            z -= self.emcstat.g92_offset[2] 
            a -= self.emcstat.g92_offset[3] 
            b -= self.emcstat.g92_offset[4] 
            c -= self.emcstat.g92_offset[5] 
            u -= self.emcstat.g92_offset[6] 
            v -= self.emcstat.g92_offset[7] 
            w -= self.emcstat.g92_offset[8] 

            relp = [x, y, z, a, b, c, u, v, w]

            if self.mm != self.machine_units_mm:
                p = self.convert_units(p)
                relp = self.convert_units(relp)
                dtg = self.convert_units(dtg)
            for count,letter in enumerate(self.data.axis_list):
                if not count == len(self.data.axis_list):
                    self.data["%s_is_homed"% letter] = self.emcstat.homed[count]
                    self.data["%s_abs"% letter] = p[count]
                    self.data["%s_rel"% letter] = relp[count]
                    self.data["%s_dtg"% letter] = dtg[count]
            # active G codes
            temp = []; active_codes = []
            for i in sorted(self.emcstat.gcodes[1:]):
                if i == -1: continue
                if i % 10 == 0:
                        temp.append("%d" % (i/10))
                else:
                        temp.append("%d.%d" % (i/10, i%10))
            for i in (temp):
                active_codes.append("G"+i)
            self.data.active_gcodes = active_codes
            temp = []; active_codes = []
            for i in sorted(self.emcstat.mcodes[1:]):
                if i == -1: continue
                temp.append("%d" % i)
            for i in (temp):
                active_codes.append("M"+i)
            self.data.active_mcodes = active_codes
            feed_str = "%.1f" % self.emcstat.settings[1]
            if feed_str.endswith(".0"): feed_str = feed_str[:-2]
            self.data.active_feed_command = feed_str
            self.data.active_spindle_command = "%.0f" % self.emcstat.settings[2]

            # estop status
            self.data.estopped = self.emcstat.task_state == self.emc.STATE_ESTOP
            # spindle
            self.data.spindle_dir = self.emcstat.spindle_direction
            self.data.spindle_speed = abs(self.emcstat.spindle_speed)
            self.data.spindle_override = self.emcstat.spindlerate
            # other
            self.data.tool_in_spindle = self.emcstat.tool_in_spindle
            self.data.flood = self.emcstat.flood
            self.data.mist = self.emcstat.mist
            self.data.machine_on = self.emcstat.task_state == self.emc.STATE_ON
            self.data.or_limits = self.emcstat.axis[0]['override_limits']
            self.data.feed_hold = self.emcstat.feed_hold_enabled
            self.data.feed_override = self.emcstat.feedrate
            self.data.velocity_override = self.emcstat.max_velocity / self.data._maxvelocity
            self.data.file = self.emcstat.file
            #self.data.file_lines =  len(self.listing.program)
            self.data.line =  self.emcstat.current_line
            self.data.id =  self.emcstat.id
            self.data.dtg = self.emcstat.distance_to_go
            self.data.velocity = (self.emcstat.current_vel * 60.0)
            self.data.delay = self.emcstat.delay_left
            if self.emcstat.pocket_prepped == -1:
                self.data.preppedtool = None
            else:
                self.data.preppedtool = self.emcstat.tool_table[self.emcstat.pocket_prepped].id
и функцию update_position - в которой и перерисовываются лейблы в DRO с координатами и dtg:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

# обновление координат (DRO)
    def update_position(self,*args):
        # DRO 
        for i in ("x","y","z","a","s"):
            if i == "s":
                self.widgets.s_display.set_value(abs(self.halcomp["spindle-readout.in"]))
                self.widgets.s_display.set_target_value(abs(self.data.spindle_speed))
                self.widgets.s_display2.set_value(abs(self.data.spindle_speed))
            else:
                
                for j in range (0,3):
                    current = self.data.display_order[j]
                    attr = pango.AttrList()
                    if current == _ABS:
                        color = self.data.abs_color
                        data = self.data["%s_abs"%i]
                        #text = "%+ 10.4f"% self.data["%s_abs"%i]
                        label = "ABS"
                    elif current == _REL:
                        color = self.data.rel_color
                        data = self.data["%s_rel"%i]
                        #text = "%+ 10.4f"% self.data["%s_rel"%i]
                        label= "REL"
                    elif current == _DTG:
                        color = self.data.dtg_color
                        data = self.data["%s_dtg"%i]
                        #text = "%+ 10.4f"% self.data["%s_dtg"%i]
                        label = "DTG"
                    if j == 2:
                        if self.data.highlight_major:
                            hlcolor = self.data.highlight_color
                            bg_color = pango.AttrBackground(hlcolor[0],hlcolor[1],hlcolor[2], 0, -1)
                            attr.insert(bg_color)
                        size = pango.AttrSize(30000, 0, -1)
                        attr.insert(size)
                        weight = pango.AttrWeight(600, 0, -1)
                        attr.insert(weight)
                    fg_color = pango.AttrForeground(color[0],color[1],color[2], 0, 11)
                    attr.insert(fg_color)
                    self.widgets["%s_display_%d"%(i,j)].set_attributes(attr)
                    h = " "
                    if current == _ABS and self.data["%s_is_homed"% i]: h = "*"
                    if self.data.diameter_mode and i == 'x': data = data * 2.0
                    if self.data.dro_units == _MM:
                        text = "%s% 10.3f"% (h,data)
                    else:
                        text = "%s% 9.4f"% (h,data)
                    self.widgets["%s_display_%d"%(i,j)].set_text(text)
                    self.widgets["%s_display_%d"%(i,j)].set_alignment(0,.5)
                    self.widgets["%s_display_%d_label"%(i,j)].set_alignment(1,.5)
                    self.widgets["%s_display_%d_label"%(i,j)].set_text(label)
то есть раз в цикл вызывается данная функция и в ней строка:

Код: Выделить всё

data = self.data["%s_abs"%i]
отсылает нас к классу Data:

Код: Выделить всё

self.data = Data()
а он содержит данные:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

class Data:
    def __init__(self):
        self.use_screen2 = False
        self.theme_name = "Follow System Theme"
        self.abs_textcolor = ""
        self.rel_textcolor = ""
        self.dtg_textcolor = ""
        self.err_textcolor = ""
        self.window_geometry = ""
        self.window_max = ""
        self.axis_list = ("x","y","z","a","s")
        self.active_axis_buttons = [(None,None)] # axis letter,axis number
        self.abs_color = (0, 65535, 0)
        self.rel_color = (65535, 0, 0)
        self.dtg_color = (0, 0, 65535)
        self.highlight_color = (65535,65535,65535)
        self.highlight_major = False
        self.display_order = (_REL,_DTG, _ABS)
        self.mode_order = (_MAN,_MDI,_AUTO)
        self.plot_view = ("P","X","Y","Z","Z2")
        self.task_mode = 0
        self.active_gcodes = []
        self.active_mcodes = []
        self.x_abs = 0.0
        self.x_rel = 1.0
        self.x_dtg = -2.0
        self.y_abs = 0.0
        self.y_rel = 100.0
        self.y_dtg = 2.0
        self.z_abs = 0.0
        self.z_rel = 1.0
        self.z_dtg = 21.0
        self.a_abs = 0.0
        self.a_rel = 1.0
        self.a_dtg = 2.0
        self.x_is_homed = 0
        self.y_is_homed = 0
        self.z_is_homed = 0
        self.a_is_homed = 0
        self.spindle_request_rpm = 0
        self.spindle_dir = 0
        self.spindle_speed = 0
        self.active_spindle_command = "" # spindle command setting
        self.active_feed_command = "" # feed command setting
        self.system = 1
        self.estopped = True
        self.dro_units = _IMPERIAL
        self.machine_units = _IMPERIAL
        self.tool_in_spindle = 0
        self.flood = False
        self.mist = False
        self.machine_on = False
        self.or_limits = False
        self.op_stop = False
        self.block_del = False
        self.jog_rate = 15
        self.jog_rate_inc = 1
        self.jog_rate_max = 60
        self.current_jogincr_index = 0
        self.feed_override = 1.0
        self.feed_override_inc = .05
        self.feed_override_max = 2.0
        self.spindle_override = 1.0
        self.spindle_override_inc = .05
        self.spindle_override_max = 1.2
        self.spindle_override_min = .50
        self.maxvelocity = 1
        self.velocity_override = 1.0
        self.velocity_override_inc = .05
        self.edit_mode = False
        self.full_graphics = False
        self.graphic_move_inc = 20
        self.file = ""
        self.file_lines = 0
        self.line = 0
        self.id = 0
        self.dtg = 0.0
        self.velocity = 0.0
        self.delay = 0.0
        self.preppedtool = None
        self.lathe_mode = False
        self.diameter_mode = True
и они обновляются
вот вопрос- как ????????????????
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

Вот есть такая строчка в self.status.periodic():
self.data["%s_abs"% letter] = p[count]
Я так понимаю она и обновляет Data.
Точнее даже строчки:

Код: Выделить всё

           for count,letter in enumerate(self.data.axis_list):
                if not count == len(self.data.axis_list):
                    self.data["%s_is_homed"% letter] = self.emcstat.homed[count]
                    self.data["%s_abs"% letter] = p[count]
                    self.data["%s_rel"% letter] = relp[count]
                    self.data["%s_dtg"% letter] = dtg[count]
Или вопрос был не в этом?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: gscreen

Сообщение nkp »

Nick писал(а):Или вопрос был не в этом?
как раз в этом
я хочу разобраться где это происходит
self.data["%s_abs"% letter] переменная модуля emc_interface.py
а self.data скрипта Gscreen.py - это ссылка на класс Date скрипта Gscreen.py
как они связаны???????
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: gscreen

Сообщение Nick »

self.data["%s_abs"% letter] = p[count]

self.data - это - self.data = Data()

self.data["%s_abs"% letter] это один из
self.x_abs
self.y_abs
self.z_abs того же Data().
А emc_interface.py я так понимаю тут не при чем.
Ответить

Вернуться в «LinuxCNC»