Вывод сообщений оператору (запросов)
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Вывод сообщений оператору (запросов)
Обнаружил, что стандартный способ вывода сообщений (MSG,...) довольно-таки неудобный. Есть ли возможность выводить запросы в виде всплывающего окна (примерно так, как сделан запрос смены инструмента)?
Чудес не бывает. Бывают фокусы.
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Посмотри это
может не совсем то - но все же...
может не совсем то - но все же...
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Спасибо, очень похоже.nkp писал(а):Посмотри это
может не совсем то - но все же...
Для начала попробую сделать по образу и подобию hal_manualtoolchange
В связи с этим вопрос: как в LCNC сделана русификация. У меня сообщения, в том числе запрос на смену инструмента выводятся по русски. Это хорошо
Код: Выделить всё
#!/usr/bin/env python
import sys, os
import gettext
BASE = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), ".."))
gettext.install("linuxcnc", localedir=os.path.join(BASE, "share", "locale"), unicode=True)
import linuxcnc, hal
_after = None
def hal_in_background():
global _after
_after = None
if not h.change:
app.tk.call("set", "::tkPriv(button)", -1)
return
_after = app.after(100, hal_in_background)
def poll_hal_in_background():
global _after
_after = app.after(100, hal_in_background)
def stop_polling_hal_in_background():
global _after
if _after: app.after_cancel(_after)
_after = None
def do_change(n):
if n:
message = _("Insert tool %d and click continue when ready") % n
else:
message = _("Remove the tool and click continue when ready")
app.wm_withdraw()
app.update()
poll_hal_in_background()
try:
r = app.tk.call("nf_dialog", ".tool_change",
_("Tool change"), message, "info", 0, _("Continue"))
finally:
stop_polling_hal_in_background()
if isinstance(r, str): r = int(r)
if r == 0:
h.changed = True
app.update()
h = hal.component("hal_manualtoolchange")
h.newpin("number", hal.HAL_S32, hal.HAL_IN)
h.newpin("change", hal.HAL_BIT, hal.HAL_IN)
h.newpin("changed", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
import Tkinter, nf, rs274.options
app = Tkinter.Tk(className="AxisToolChanger")
app.wm_geometry("-60-60")
app.wm_title(_("AXIS Manual Toolchanger"))
rs274.options.install(app)
nf.start(app); nf.makecommand(app, "_", _)
app.wm_protocol("WM_DELETE_WINDOW", app.wm_withdraw)
lab = Tkinter.Message(app, aspect=500, text = _("\
This window is part of the AXIS manual toolchanger. It is safe to close \
or iconify this window, or it will close automatically after a few seconds."))
lab.pack()
def withdraw():
app.wm_withdraw()
app.bind("<Expose>", lambda event: app.wm_withdraw())
app.after(10 * 1000, withdraw)
try:
while 1:
change = h.change
if change and not h.changed:
do_change(h.number)
elif not change:
h.changed = False
app.after(100)
app.update()
except KeyboardInterrupt:
passЧудес не бывает. Бывают фокусы.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Понятноnkp писал(а):переводится с помощью gettext...
Чудес не бывает. Бывают фокусы.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
А ты хочешь просто остановиться до нажатия на Ок? Или что-то серьезнее? Какая общая задача?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Просто остановиться. Скажем, сообщение в конце обработки детали: "Смените заготовку". И две кнопки "Пуск" и "Стоп". По второй - выход из программы обработки.
Чудес не бывает. Бывают фокусы.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
А
(MSG, для продолжения нажмите Старт)
M0
чем не нравится?
(MSG, для продолжения нажмите Старт)
M0
чем не нравится?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Тем, что лезут из правого нижнего угла вверх, накапливаясь и постепенно загораживая панель, и при этом сами не закрываются.Nick писал(а):А
(MSG, для продолжения нажмите Старт)
M0
чем не нравится?
Некультурненько (с)
Чудес не бывает. Бывают фокусы.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Эт да... не очень...
есть такая программка - zenity. Она красивые диалоги рисует.
Можно вот так сделать:
Это все в файл M200 + права на выполнение и потом
M200
M0
Правда если мимо кликнешь, он вниз упадет...
есть такая программка - zenity. Она красивые диалоги рисует.
Можно вот так сделать:
Код: Выделить всё
#!/bin/sh
if zenity --question --text="Продолжить?" --ok-label="Ага" --cancel-label="Не стоит"; then
halcmd setp halui.program.resume 1
sleep 0.1
halcmd setp halui.program.resume 0
else
halcmd setp halui.program.stop 1
sleep 0.1
halcmd setp halui.program.stop 0
fiM200
M0
Правда если мимо кликнешь, он вниз упадет...
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Да я как бы уже с питоном воюю, и вроде даже что-то получается.
За основу взял hal_manualtoolchange и допиливаю под свои нужды
За основу взял hal_manualtoolchange и допиливаю под свои нужды
Чудес не бывает. Бывают фокусы.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Прикольно, а где код? 
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Вывод сообщений оператору (запросов)
Да он еще сырой, аж вода течет
- это мой первый опыт в питоне.
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os
import gettext
BASE = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), ".."))
gettext.install("linuxcnc", localedir=os.path.join(BASE, "share", "locale"), unicode=True)
import linuxcnc, hal
_after = None
def hal_in_background():
global _after
_after = None
if not h.change:
app.tk.call("set", "::tkPriv(button)", -1)
return
_after = app.after(100, hal_in_background)
def poll_hal_in_background():
global _after
_after = app.after(100, hal_in_background)
def stop_polling_hal_in_background():
global _after
if _after: app.after_cancel(_after)
_after = None
s = linuxcnc.stat()
c = linuxcnc.command()
def ok_for_mdi():
s.poll()
return not s.estop and s.enabled and s.homed and (s.interp_state == linuxcnc.INTERP_IDLE)
if ok_for_mdi():
c.mode(linuxcnc.MODE_MDI)
c.wait_complete() # wait until mode switch executed
c.mdi("G0 X10 Y20 Z30")
def ask_sensor():
message = "Установите датчик под инструментом"
app.wm_withdraw()
app.update()
poll_hal_in_background()
try:
r = app.tk.call("nf_dialog", ".offset_measure",
"Замер высоты", message, "info", 0, "Готово", "Отмена")
finally:
stop_polling_hal_in_background()
if isinstance(r, str): r = int(r)
if r == 0:
if ok_for_mdi():
c.mode(linuxcnc.MODE_MDI)
c.wait_complete() # wait until mode switch executed
c.mdi("G49 G40 G10 L2 P1 Z0 G91")
c.wait_complete()
c.mdi("G38.3 Z-25 F200")
c.wait_complete(1)
if s.probe_tripped:
c.mdi("G38.4 Z3 F30")
c.wait_complete(1)
c.mdi("G10 L20 P1 Z43.23")
c.wait_complete(1)
c.mdi("G00 Z20")
c.wait_complete(1)
c.mdi("G90")
c.wait_complete()
h.tested = True
app.update()
h = hal.component("hal_manualsensoroffset")
#h.newpin("number", hal.HAL_S32, hal.HAL_IN)
h.newpin("test", hal.HAL_BIT, hal.HAL_IN)
h.newpin("tested", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
import Tkinter, nf, rs274.options
app = Tkinter.Tk(className="tlsoffset")
app.wm_geometry("-60-60")
app.wm_title("Настройка смещения по датчику")
rs274.options.install(app)
nf.start(app); nf.makecommand(app, "_", _)
#app.wm_protocol("WM_DELETE_WINDOW", app.wm_withdraw)
#lab = Tkinter.Message(app, aspect=500, text = _("\
#This window is part of the AXIS manual toolchanger. It is safe to close \
#or iconify this window, or it will close automatically after a few seconds."))
#lab.pack()
def withdraw():
app.wm_withdraw()
app.bind("<Expose>", lambda event: app.wm_withdraw())
#app.after(10 * 1000, withdraw)
try:
while 1:
test = h.test
if test and not h.tested:
ask_sensor()
elif not test:
h.tested = False
# app.after(100)
# app.update()
except KeyboardInterrupt:
passЧудес не бывает. Бывают фокусы.
