MyGUI

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

Re: MyGUI

Сообщение Nick »

nkp писал(а):но ты прав - зачем занимать "драгоценные"/ IO , когда енкодеры пустуют...
Так вроде там и пины останутся и энкодер будет. Т.е. не нужен энкодер, его просто игнорируем. Если использовать эти пины не как энкодер, то энкодер будет шагать в разные стороны. Т.е. он пинов не добавляет, но и не уменьшает. имхо :)
nkp писал(а):мне кажеться в емс нет прямых инструментов ,чтоб сделать по второму способу
А почему ты не хочешь с аналоговым входом и резистором?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Nick писал(а):А почему ты не хочешь с аналоговым входом и резистором?
я и хочу и делаю так :)
про отсутствие средств - имел в виду обойтись только хал
а пробую примерно так:

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

self.halcomp.newpin("feed", hal.HAL_FLOAT, hal.HAL_IN)
self.c = linuxcnc.command()
self.feedrate=self.c.feedrate(self.halcomp["feed"])
в хал :

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

net feed_an  hm2_5i25.0.7i77.0.0.analogin0  mygui.feed
только если self.c.feedrate прописать в инициализацию - то получаем ошибку,
а вот привязав к функции home_all работает нормально...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

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

Re: MyGUI

Сообщение nkp »

нет ли в хал готового компонента - чтоб отслеживать изменения
float сигнала и выдавать на выходе bit ???
Набросал подобное что то:

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

#!/usr/bin/python
import hal , time

h = hal.component("feed_change")
h.newpin("feed_change", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("feed_change_sig", hal.HAL_BIT, hal.HAL_OUT)
h.ready()

h["feed_change_sig"] = 0
try:
    while 1:
              a=h["feed_change"]
	time.sleep(0.1)
	if h["feed_change"] != a :
		h["feed_change_sig"] = 1
	else:
		h["feed_change_sig"] = 0
except KeyboardInterrupt:
    raise SystemExit
то есть от изменения "feed_change" (FLOAT),на который заведен analogin0 (наш резистор) срабатывает "feed_change_sig" (BIT) и запускает в скрипте функцию обновления
значения feed:

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

self.feedrate=self.c.feedrate(self.halcomp["feed_change"])
как то громоздко все получается...
как проще это сделать??
зы
или сразу функцию обновления в компоненте прописать??

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

#!/usr/bin/python
import hal , time , linuxcnc

h = hal.component("feed_change")
h.newpin("feed_change", hal.HAL_FLOAT, hal.HAL_IN)
h.ready()
c = linuxcnc.command()
try:
    while 1:
        a=h["feed_change"]
	time.sleep(0.1)
	if h["feed_change"] != a :
		feedrate=c.feedrate(h["feed_change"])
except KeyboardInterrupt:
    raise SystemExit
если так еще будет работать (не проверял)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Не забыть маштабировать в хал сигнал для c.feedrate от 0 до 1.2 (или лучше в ини поставить 1.5)
Еще можно попробовать "загрубить" регулятор (софтово) :
разбить шкалу на 30 - 60 (?) делений - думаю так точнее будет и без плаванья
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

Чего-то я не понял, ты что именно хочешь менять, и чем тебе feed-override не нравится???
nkp писал(а):нет ли в хал готового компонента - чтоб отслеживать изменения float сигнала и выдавать на выходе bit ???
Тебе какое изменение надо отследить? Растущий фронт, или тупо любое изменение?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Nick писал(а): что именно хочешь менять, и чем тебе feed-override не нравится???
прямо талант у меня - все усложнять :) (куда бы его применить?)

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

loadrt conv_float_s32
conv-float-s32.0 servo-thread

net conv conv-float-s32.0.in hm2_5i25.0.7i77.0.0.analogin0
net feed-override  halui.feed-override.value  conv-float-s32.0.out 
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

Кстати, можешь попробовать еще вот на этот пин завести, и без conv:
halui.feed-override.scale float in
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: MyGUI

Сообщение Lexxa »

это не должно работать
nkp писал(а):loadrt conv_float_s32
conv-float-s32.0 servo-thread

net conv conv-float-s32.0.in hm2_5i25.0.7i77.0.0.analogin0
net feed-override  halui.feed-override.value  conv-float-s32.0.out
поскольку
halui.feed-override.count-enable (bit, in) (default: TRUE) When TRUE, modify feed override when counts changes.
halui.feed-override.counts (s32, in) counts X scale = feed override percentage
halui.feed-override.decrease (bit, in) pin for decreasing the FO (-=scale)
halui.feed-override.direct-value (bit, in)pin to enable direct value feed override input
halui.feed-override.increase (bit, in) pin for increasing the FO (+=scale)
halui.feed-override.scale (float, in) pin for setting the scale on changing the FO
halui.feed-override.value (float, out) current Feed Override value
Поэтому исходя из формулы [counts X scale = feed override percentage] надо либо counts halui.feed-override.counts энкодером крутить и ставить halui.feed-override.scale = const (хотя ничего не мешает его тоже крутить),
либо наоборот, а для пущей красоты еще и ограничить его сверху и снизу.
В итоге:

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

loadrt limit1
addf limit1.0 servo-thread
setp limit1.0.min 0
setp limit1.0.max 12
net feed-override-in hm2_5i25.0.7i77.0.0.analogin0 => limit1.0.in
#feed override percentage = counts X scale
setp halui.feed-override.counts 10
net feed-override-lim limit1.0.out => halui.feed-override.scale
можно кстати даже скорость нарастания ограничить, но мне кажется это лишним.
:bender:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Lexxa писал(а):это не должно работать
nkp писал(а):loadrt conv_float_s32...
этот кусок работает - не вижу причин для обратного
поскольку
halui.feed-override.count-enable (bit, in) (default: TRUE) When TRUE, modify feed override when counts changes.
halui.feed-override.counts (s32, in) counts X scale = feed override percentage
halui.feed-override.decrease (bit, in) pin for decreasing the FO (-=scale)
halui.feed-override.direct-value (bit, in)pin to enable direct value feed override input
halui.feed-override.increase (bit, in) pin for increasing the FO (+=scale)
halui.feed-override.scale (float, in) pin for setting the scale on changing the FO
halui.feed-override.value (float, out) current Feed Override value
Поэтому исходя из формулы [counts X scale = feed override percentage] надо либо counts halui.feed-override.counts энкодером крутить и ставить halui.feed-override.scale = const (хотя ничего не мешает его тоже крутить),
+1
либо наоборот, а для пущей красоты еще и ограничить его сверху и снизу.
В итоге:

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

loadrt limit1
addf limit1.0 servo-thread
setp limit1.0.min 0
setp limit1.0.max 12
net feed-override-in hm2_5i25.0.7i77.0.0.analogin0 => limit1.0.in
#feed override percentage = counts X scale
setp halui.feed-override.counts 10
net feed-override-lim limit1.0.out => halui.feed-override.scale
можно кстати даже скорость нарастания ограничить, но мне кажется это лишним.
halui.feed-override уже сам ограничевает сигнал от 0 до 1.2 (остаётся только маштабировать)
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: MyGUI

Сообщение Lexxa »

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

Re: MyGUI

Сообщение Nick »

nkp писал(а):halui.feed-override.value (float, out) current Feed Override value
Да, и правда, надо не value использовать, а counts, при этом, если у нас не энкодер, то можно на него прямое значение подавать, для этого есть пин direct-value:
halui.feed-override.counts (s32, in) counts X scale = feed override percentage
halui.feed-override.direct-value (bit, in)pin to enable direct value feed override input
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

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

Re: MyGUI

Сообщение nkp »

к вопросу загрузки gui с последней обрабатываемой программой(g-code) ###

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

import ConfigParser
*********
********
	def program_open(self,widget):
		cfgfile = open('/home/nkp/.mygui_preferences','w')
		self.s.poll()
		open_p = self.s.file
		print 'open_p' ,open_p 
		self.config.set("DEFAULT","open_program_df",open_p )
		self.config.write(cfgfile)
		cfgfile.close()
***************
***********
	def __init__(self):
**************
*************
		self.config = ConfigParser.ConfigParser()
		self.config.read("/home/nkp/.mygui_preferences")
		self.prog_open_default = self.config.get("DEFAULT","open_program_df" )
		print 'self.prog_open_default',self.prog_open_default
		self.c.mode(linuxcnc.MODE_AUTO)
		self.c.program_open(self.prog_open_default)
		self.c.wait_complete()
для упрощения создаем файл /home/nkp/.mygui_preferences
прописываем в нем примерно:

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

[DEFAULT]
open_program_df = /home/nkp/linuxcnc/nc_files/1_re_lathe.ngc
пока привязал функцию program_open к закрытию емс ,но
пока закрываю софтово - все работает
а вот будет ли срабатывать при выключении по кнопке Power - не знаю(как там все происходит)...
то есть сработает ли:

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

	def on_window1_destroy(self, widget, data=None):
		print "quit++"	
		gtk.main_quit()
		self.program_open(self)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: MyGUI

Сообщение Serg »

Как-нибудь вот так:

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

import signal
import sys
...
def signal_handler(signal, frame):
        # тут сохраняем файлы и делаем прочую лабуду для нормального завершения проги
        sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
... перехватываем остальные сигналы
Думаю достаточно будет перехватить сигналы: SIGHUP, SIGINT, SIGQUIT, SIGUSR1, SIGUSR2, SIGTERM.
Это только идея, за синтаксис не уверен - я питон пока не разумею. :wik:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

nkp писал(а):а вот будет ли срабатывать при выключении по кнопке Power - не знаю(как там все происходит)...то есть сработает ли:
Так может лучше сохранять последний открытый файл в момент его открытия, а не в момент закрытия LinuxCNC? Тогда все вопросы снимутся ;). Кстати, под это бы опцию дополнительную сделать...
О, кстати, можно вообще что-нибудь хитрое придумать, чтобы при открытии файла в папке с конфигом создавалась на него символическая ссылка last_opened.ngc, потом просто в ini можно будет указывать /home/nkp/linuxcnc/.../last_opened.ngc. Или ты это и имел в виду?

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

Re: MyGUI

Сообщение nkp »

Nick писал(а):сохранять последний открытый файл в момент его открытия, а не в момент закрытия
да - так в сначала и сделал...
но потом функцию открытия файла использовал из готового модуля hal_filechooser.py
вот сейчас думаю именно в этот модуль внести изменения - чтоб при загрузке там отрабатывала наша функция записи в .mygui_preferences
------
не знаю как в работе удобно(наверно каждому по своему)
но имхо нужны только 2 "режима" :
1.загрузка емс без программы(хотя тоже сомнительно что в этом возникнет необходимость)
2.загрузка емс с последней обр. программой
опционно устанавливать режим п.2 тоже не имеет большого смысла - так как если тебе сегодня не нужна при старте вчерашняя программа -
то значит нужна другая,и чтоб ее загрузить - все равно проделываем те же телодвижения ,что в случае пустого экрана,что в случае
загруженой "вчерашней" проги
мне кажется не стоит что то делать - чтоб оператору потом приходилось лезть в ини (или любые другие) конфиги
--------------
а вообще .mygui_preferences я думаю еще пригодится для сохранения и других настроек юзера
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: MyGUI

Сообщение Lexxa »

вот еще картинки софткеев с hh
Вложения
bmx.tar.gz
(178.72 КБ) 1151 скачивание
:bender:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

к mygui планирую прикрутить мастера
тут пробовал разные концепции
сперва начал было делать на отдельных вкладках notebook
понял - что и скрипт будет раздут и xml тоже непомерно велик (ну если для фрезерного)
решил делать каждый отдельно
Выделение(009).jpg (3123 просмотра) <a class='original' href='./download/file.php?id=10422&sid=e593714f47ec36da1c7f962dddfca2d3&mode=view' target=_blank>Загрузить оригинал (106.13 КБ)</a>
(это "черновик" для обкатки кода)
а вот по нему (коду) как раз и вопрос!!
схему работы мастера я уже описывал:
из работающего емс открываем мастер
он отрабатывает - закрывается - выводит в стандартный вывод О-код - его загружает должен бы загрузить емс - но
делает это как то частично.
Для завершения всегда нужно жать кнопку "Перезагрузить"
все зарыто вот здесь:

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

#!/usr/bin/env python
# vim: sts=4 sw=4 et
# GladeVcp FileChooser related widgets
#
# Copyright (c) 2010  Pavel Shramov <shramov@mexmat.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

import os, sys, time, select, re
import tempfile, atexit, shutil

import gtk, gobject

from hal_widgets import _HalWidgetBase
import linuxcnc
from hal_glib import GStat

_ = lambda x: x

from hal_actions import _EMC_ActionBase, _EMC_Action

progress_re = re.compile("^FILTER_PROGRESS=(\\d*)$")
class FilterProgram:
    def __init__(self, program_filter, infilename, outfilename, callback=None):
        import subprocess
        outfile = open(outfilename, "w")
        infilename_q = infilename.replace("'", "'\\''")
        env = dict(os.environ)
        env['AXIS_PROGRESS_BAR'] = '1'
        p = subprocess.Popen(["sh", "-c", "%s '%s'" % (program_filter, infilename_q)],
                              stdin=subprocess.PIPE,
                              stdout=outfile,
                              stderr=subprocess.PIPE,
                              env=env)
        p.stdin.close()  # No input for you
        self.p = p
        self.stderr_text = []
        self.program_filter = program_filter
        self.callback = callback
        gobject.timeout_add(100, self.update)
        #progress = Progress(1, 100)
        #progress.set_text(_("Filtering..."))

    def update(self):
        if self.p.poll() is not None:
            self.finish()
            return False

        r,w,x = select.select([self.p.stderr], [], [], 0)
        if not r:
            return True
        stderr_line = self.p.stderr.readline()
        m = progress_re.match(stderr_line)
        if m:
            pass #progress.update(int(m.group(1)), 1)
        else:
            self.stderr_text.append(stderr_line)
            sys.stderr.write(stderr_line)
        return True

    def finish(self):
        # .. might be something left on stderr
        for line in self.p.stderr:
            m = progress_re.match(line)
            if not m:
                self.stderr_text.append(line)
                sys.stderr.write(line)
        r = self.p.returncode
        if r:
            self.error(r, "".join(self.stderr_text))
        if self.callback:
            self.callback(r)

    def error(self, exitcode, stderr):
        dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
                _("The program %(program)r exited with code %(code)d.  "
                "Any error messages it produced are shown below:")
                    % {'program': self.program_filter, 'code': exitcode})
        dialog.format_secondary_text(stderr)
        dialog.run()
        dialog.destroy()

class _EMC_FileChooser(_EMC_ActionBase):
    def _hal_init(self):
        _EMC_ActionBase._hal_init(self)
        self.ini = None
        self.tmp = None
        self.load_filters()

    def mktemp(self):
        if self.tmp:
            return
        self.tmp = tempfile.mkdtemp(prefix='emcflt-', suffix='.d')
        atexit.register(lambda: shutil.rmtree(self.tmp))

    def load_file(self, filename):
        flt = self.get_filter_program(filename)
        if not flt:
            return self._load_file(filename)

        if not self.tmp:
            self.mktemp()

        tmp = os.path.join(self.tmp, os.path.basename(filename))
        flt = FilterProgram(flt, filename, tmp, lambda r: r or self._load_file(tmp))

    def _load_file(self, filename):
        if filename:
            self.linuxcnc.mode(linuxcnc.MODE_AUTO)
            old = self.gstat.stat.file
            self.linuxcnc.program_open(filename)
            if old == filename:
                self.gstat.emit('file-loaded', filename)

    def load_filters(self, inifile=None):
        inifile = inifile or os.environ.get('INI_FILE_NAME', '/dev/null')
        self.ini = linuxcnc.ini(inifile)

        self._load_filters(self.ini)

    def get_filter_program(self, filename):
        ext = os.path.splitext(filename)[1]
        if ext:
            return self.ini.find("FILTER", ext[1:])
        else:
            return None

    def _load_filters(self, inifile):
        def _e2p(n, el):
            #print "New filter %s: %s" % (n, el)
            p = gtk.FileFilter()
            p.set_name(n)
            map(lambda s: p.add_pattern('*' + s), el)
            #print p
            return p
        all_extensions = [".ngc"]
        extensions = inifile.findall("FILTER", "PROGRAM_EXTENSION")
        extensions = [e.split(None, 1) for e in extensions]
        extensions = tuple([(v, tuple(k.split(","))) for k, v in extensions])
        map(lambda t: all_extensions.extend(t[1]), extensions)
        self.add_filter(_e2p("All machinable files", all_extensions))
        self.add_filter(_e2p("rs274ngc files", ['.ngc']))
        for n,e in extensions:
            self.add_filter(_e2p(n, e))
        self.add_filter(_e2p("All files", ['']))

class EMC_FileChooserDialog(gtk.FileChooserDialog, _EMC_FileChooser):
    __gtype_name__ = 'EMC_FileChooserDialog'
    def __init__(self, *a, **kw):
        gtk.FileChooserDialog.__init__(self, *a, **kw)
        _EMC_FileChooser._hal_init(self)
        self.connect('response', self.on_response)

    def on_response(self, w, response):
        pass
        #print ">>>", w, response

class EMC_FileChooserButton(gtk.FileChooserButton, _EMC_FileChooser):
    __gtype_name__ = 'EMC_FileChooserButton'
    def __init__(self, *a, **kw):
        gtk.FileChooserButton.__init__(self, gtk.FileChooserDialog())

        self.connect('file-set', self.on_file_set)

    def on_file_set(self, w):
        self.load_file(w.get_filename())

class EMC_Action_Open(_EMC_Action, _EMC_FileChooser):
    __gtype_name__ = 'EMC_Action_Open'
    fixed_file = gobject.property(type=str, default='', nick='Fixed file name')

    def _hal_init(self):
        _EMC_FileChooser._hal_init(self)
        _EMC_Action._hal_init(self)
        self.currentfolder = os.path.expanduser("~/linuxcnc/nc_files")

    def _load_filters(self, ini): pass

    def on_activate(self, w):
        if self.fixed_file:
            self.load_file(self.fixed_file)
            return
        dialog = EMC_FileChooserDialog(title="Open File",action=gtk.FILE_CHOOSER_ACTION_OPEN, 
                buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
        dialog.set_current_folder(self.currentfolder)
        dialog.show()
        r = dialog.run()
        fn = dialog.get_filename()
        dialog.hide()
        if r == gtk.RESPONSE_OK:
            dialog.load_file(fn)
            self.currentfolder = os.path.dirname(fn)
        dialog.destroy()

class EMC_Action_Reload(_EMC_Action, _EMC_FileChooser):
    __gtype_name__ = 'EMC_Action_Reload'
    def _hal_init(self):
        _EMC_Action._hal_init(self)

    def on_activate(self, w):
        self._load_file(self.gstat.stat.file)
вот перезагрузка файла:

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

class EMC_Action_Reload(_EMC_Action, _EMC_FileChooser):
    __gtype_name__ = 'EMC_Action_Reload'
    def _hal_init(self):
        _EMC_Action._hal_init(self)

    def on_activate(self, w):
        self._load_file(self.gstat.stat.file)
но в ней всего лишь вызывается self._load_file то есть функция загрузки выбранного файла
но вот первый раз она не отрабатывает до конца
а "второй" - отрабатывает
никак её не побеДю ;)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

хмм... а чем тебе не нравится подход ngcgui?
Может просто его доделать, например, добавит дерево применения фильтров. Расширить возможности по манипулированию различными параметрами, последовательностью. Чтобы было как на видео, только разве что без визуализации:
Также можно сделать авто апдейт превью раз в n секунд, чтобы все было еще более интерактивным.
https://www.youtube.com/watch?v=s4FDbbrq6Qw

Главное сделать базу для разработки мастеров, с простым и открытым интерфейсом.

по вопросу: :)
Т.е. нажимаешь открыть и первый раз не работает, а при повторном нажатии работает?
Как ты вызываешь загрузку?
Ответить

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