1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#!/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
if (h.change_button):
h.changed = True
app.update()
app.tk.call("set", "::tkPriv(button)", -1)
stop_polling_hal_in_background()
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("change_button", 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
|