Страница 11 из 12
Re: gscreen
Добавлено: 30 авг 2012, 20:37
psha
gladevcp не понимает параметров после .ui файла, так gladevcp args file.ui и gladevcp file.ui args дадут разные результаты
Да, еще, вы не хотите кнопки дёргать по именам, а не по "положению", которое может измениться если вставятся какие-нибудь паддинги?
Re: gscreen
Добавлено: 30 авг 2012, 21:37
Nick
Положение нужно только для двух рядов кнопок.
Да, есть проблема, если в Hbox пустое место, оно заполняется всеми кнопками, но это будет сразу видно на экране.
Просто нам необходимо, чтобы нажатие на хардварную кнопку вызывало именно то, что над ней нарисовано.
Остальные кнопки надо по именам вызывать.
Re: gscreen
Добавлено: 30 авг 2012, 22:22
nkp
так и не заработал у меня колькулятор:
Re: gscreen
Добавлено: 30 авг 2012, 22:40
Nick
А что он должен считать?
Re: gscreen
Добавлено: 30 авг 2012, 22:47
nkp
так в том и вопрос
только по коду и догадки
а почему не работает ?????
и мне еще интересно как само окно калькулятора формируется? ведь в glade только рамка под него .....
Re: gscreen
Добавлено: 30 авг 2012, 22:55
Nick
А какие там названия кнопок и функции?
Re: gscreen
Добавлено: 30 авг 2012, 22:59
nkp
Nick писал(а):А какие там названия кнопок и функции?
это обычный калькулятор
или ты про что?
Re: gscreen
Добавлено: 30 авг 2012, 23:35
Nick
Ну я имею в виду в glade как кнопки называются, чтобы их можно было в коде найти?
Re: gscreen
Добавлено: 30 авг 2012, 23:48
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
Re: gscreen
Добавлено: 31 авг 2012, 10:22
nkp
вот сейчас писал в соседней теме о gremlin и возник вопрос :
некоторое количество кнопок надо выделить под внутренние задачи самого окна
но даже при наличии 56 кнопок в myscreen.glade выделять в каждом режиме под графику - я думаю это слишком
в оригинале есть как бы подрежимы
но там проще - gscreen вообще писался (со слов автора) для тачскрина
а у нас переключение режимов галетником
Lexxa, как ты видишь это ?
и в целом , мне кажеться надо последовательно определиться в содержимым экрана для каждого режима
тут без твоего опыта не обойтись...
вот исходная : 6 режимов
1) edit
2) AUTO
3) MDI
4) безразмерные перемещения
5) инкрементальные перемещения
6) от маховичка
и есть myscreen.glade
вот и начать с первого режима - какие кнопки и другое содержимое .Просто - пусть в виде картинки
думаю это основа алгоритма работы интерфейса
Re: gscreen
Добавлено: 31 авг 2012, 12:20
Nick
nkp писал(а):вот и начать с первого режима - какие кнопки и другое содержимое .Просто - пусть в виде картинки
+500 Это очень надо, причем достаточно срочно, завтра уезжаю, надо до завтра все на ноут слить.
Re: gscreen
Добавлено: 01 сен 2012, 01:14
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
Re: gscreen
Добавлено: 01 сен 2012, 20:31
nkp
Re: gscreen
Добавлено: 02 сен 2012, 21:34
nkp
Вот что то в gscreen файлы через ngcgui не грузится
то есть
Код: Выделить всё
o<sfer> call [30][20][10][1][0][8][400]
m2
не проходят
ну и в примитиве mygui та же история
чет не пойму.....
Вот здесь вкладка ngcgui видна
в принципе emc должно быть все равно -какой там экран
(axis те же файлы кушает на ура..)
Re: gscreen
Добавлено: 03 сен 2012, 19:10
Nick
Скорее всего ngcgui правит загруженный код, и возможно ему нужен какой-то хендл.
Re: gscreen
Добавлено: 05 сен 2012, 19:30
nkp
С gscren в отношении ngcgui разобрался- все отрисовывается
а вот в mygui не загружается - буду разбираться дальше
gremlin в glade выбирается и все сигналы активируются по дефолту
(простой G-код ,не о-коды, ведь загружается и отрисовка есть.....)
Re: gscreen
Добавлено: 13 янв 2013, 19:49
nkp
не могу разобраться - как работает обновление данных в Gscreen
(в частности координат - для своего DRO)
вот по порядку:
код всего скрипта
Код: Выделить всё
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:
а он содержит данные:
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
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
и они обновляются
вот вопрос- как ????????????????
Re: gscreen
Добавлено: 14 янв 2013, 15:20
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]
Или вопрос был не в этом?
Re: gscreen
Добавлено: 14 янв 2013, 19:00
nkp
Nick писал(а):Или вопрос был не в этом?
как раз в этом
я хочу разобраться где это происходит
self.data["%s_abs"% letter] переменная модуля emc_interface.py
а self.data скрипта Gscreen.py - это ссылка на класс Date скрипта Gscreen.py
как они связаны???????
Re: gscreen
Добавлено: 14 янв 2013, 19:13
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 я так понимаю тут не при чем.