Вывод сообщений оператору (запросов)

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.

Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 03 май 2013, 19:04

Обнаружил, что стандартный способ вывода сообщений (MSG,...) довольно-таки неудобный. Есть ли возможность выводить запросы в виде всплывающего окна (примерно так, как сделан запрос смены инструмента)?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение nkp » 03 май 2013, 19:07

Посмотри это
может не совсем то - но все же...
nkp
Мастер
 
Сообщения: 7279
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1196
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 04 май 2013, 09:44

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


Отсюда вопрос: где берутся русские сообщения? :thinking:
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение nkp » 04 май 2013, 10:23

переводится с помощью gettext...
исходники файла с переводом...
то есть переводимую строку представляем в виде: _("Insert tool %d and click continue when ready")
а в файл .po пишем перевод...
думаю что так - но на практике не приходилось пользовать ;)
nkp
Мастер
 
Сообщения: 7279
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1196
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 04 май 2013, 11:04

nkp писал(а):переводится с помощью gettext...
Понятно :)
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Nick » 05 май 2013, 21:45

А ты хочешь просто остановиться до нажатия на Ок? Или что-то серьезнее? Какая общая задача?
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1338
Заслуга: Developer
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 06 май 2013, 04:23

Просто остановиться. Скажем, сообщение в конце обработки детали: "Смените заготовку". И две кнопки "Пуск" и "Стоп". По второй - выход из программы обработки.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Nick » 07 май 2013, 11:18

А
(MSG, для продолжения нажмите Старт)
M0

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

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 07 май 2013, 12:08

Nick писал(а):А
(MSG, для продолжения нажмите Старт)
M0

чем не нравится?

Тем, что лезут из правого нижнего угла вверх, накапливаясь и постепенно загораживая панель, и при этом сами не закрываются.
Некультурненько (с)
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Nick » 07 май 2013, 13:02

Эт да... не очень...

есть такая программка - 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
fi


Это все в файл M200 + права на выполнение и потом
M200
M0
Правда если мимо кликнешь, он вниз упадет...
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1338
Заслуга: Developer
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 07 май 2013, 13:07

Да я как бы уже с питоном воюю, и вроде даже что-то получается.
За основу взял hal_manualtoolchange и допиливаю под свои нужды :)
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 07 май 2013, 13:42

Вот как-то так
Вывод сообщений оператору (запросов) Снимок-1.png
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Nick » 08 май 2013, 15:31

Прикольно, а где код? :)
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1338
Заслуга: Developer
Медальки:

Re: Вывод сообщений оператору (запросов)

Сообщение Сергей Саныч » 08 май 2013, 16:23

Да он еще сырой, аж вода течет :) - это мой первый опыт в питоне.
Код: Выделить всёРазвернуть
#!/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
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 7742
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2380
Медальки:


Вернуться в LinuxCNC

Кто сейчас на конференции

Зарегистрированные пользователи: Bing [Bot], evgenymcp, Google [Bot], megagad, Udjin, Vitalii, Yandex [bot]

Поделиться

Reputation System ©'