#!/usr/bin/env python import os import sys import gtk, gobject import linuxcnc import time class App(gtk.Window): def __init__(self, halcomp, builder, useropts): super(App, self).__init__() self.builder = builder self.filename = 'sim.var' if not os.path.exists(self.filename): self.filename = os.path.join(sys.path[0], self.filename) self.filename2 = 'paramname.txt' if not os.path.exists(self.filename2): self.filename2 = os.path.join(sys.path[0], self.filename2) try: self.status = linuxcnc.stat() # create a connection to the status channel self.status.poll() # get current values self.cmd = linuxcnc.command() except linuxcnc.error, detail: print "error", detail sys.exit(1) self.templist=[] self.templistfinal=[] # Get gui objects self.edit = self.builder.get_object('edit') self.statuslbl = self.builder.get_object('statuslbl') self.treeview1 = self.builder.get_object('treeview1') self.vbox1 = self.builder.get_object('vbox1') self.vbox2 = self.builder.get_object('vbox2') self.window1 = self.builder.get_object('window1') self.edit.connect("toggled", self.on_edit_toggled) self.liststore = self.builder.get_object('liststore') self.combo = self.builder.get_object('combobox1') self.renderer1 = self.builder.get_object('renderer1') self.renderer2 = self.builder.get_object('renderer2') self.renderer3 = self.builder.get_object('renderer3') self.renderer1.connect('edited', self.on_renderer1_edited) self.renderer2.connect('edited', self.on_renderer2_edited) self.statuslbl.set_text("") self.prevtime = time.time() gobject.timeout_add(500, self.periodic_check) self.editing_mode = False for i in range(0, 1001): self.liststore.append(["", 0, 0]) self.treeview1.set_enable_search(True) self.read_files() # Connect all signals. self.builder.connect_signals(self) # Show the main window. self.window1.show_all() self.window1.connect("destroy", gtk.main_quit) self.status.poll() on = self.status.task_state > linuxcnc.STATE_OFF idle = self.status.interp_state == linuxcnc.INTERP_IDLE if on and idle: self.edit.set_sensitive(True) if not self.editing_mode: self.statuslbl.set_text("Press edit to edit the parameters") else: self.edit.set_sensitive(False) if not on: self.statuslbl.set_text("Cant edit. Machine is not on") else: self.statuslbl.set_text("Cant edit. Interpreter is not Idle") if not self.editing_mode: self.read_files() def on_renderer1_edited(self, cell, path, new_text): temppath = self.liststore.get_iter_from_string(path) self.liststore.set_value(temppath, 0, new_text) self.templist.append(path) return def on_renderer2_edited(self, cell, path, new_text): temppath = self.liststore.get_iter_from_string(path) self.liststore.set_value(temppath, 1, float(new_text)) self.templist.append(path) return def periodic_check(self): self.status.poll() on = self.status.task_state > linuxcnc.STATE_OFF idle = self.status.interp_state == linuxcnc.INTERP_IDLE if on and idle: self.edit.set_sensitive(True) if (self.prevtime + 4) < time.time(): if not self.editing_mode: self.statuslbl.set_text("Press edit to edit the parameters") self.prevtime = time.time() else: self.edit.set_sensitive(False) if not on: self.statuslbl.set_text("Cant edit. Machine is not on") else: self.statuslbl.set_text("Cant edit. Interpreter is not Idle") if not self.editing_mode: self.read_files() return True def read_files(self): if not os.path.exists(self.filename): self.statuslbl.set_text("sim.var file not found") return if not os.path.exists(self.filename2): self.statuslbl.set_text("paramname.txt file not found") return kapa = 0 logfile = open(self.filename, "r").readlines() logfile2 = open(self.filename2, "r").readlines() for line in logfile: temp = line.split() param = int(temp[0]) data = float(temp[1]) if param >= 100 and param <= 1100: self.liststore[kapa][2] = param self.liststore[kapa][1] = data kapa += 1 kapa = 0 for line in logfile2: temp2 = line.strip() self.liststore[kapa][0] = temp2 kapa += 1 def on_edit_toggled(self,widget): if widget.get_active(): self.renderer1.set_property("editable", True) self.renderer2.set_property("editable", True) self.renderer1.set_property("background-gdk", gtk.gdk.Color("lightblue")) self.renderer2.set_property("background-gdk", gtk.gdk.Color("lightblue")) self.read_files() del self.templist[:] del self.templistfinal[:] self.editing_mode = True self.statuslbl.set_text("Edit mode. Press edit again to save changes") else: self.templistfinal = list(set(self.templist)) if self.ok_for_mdi(): self.cmd.mode(linuxcnc.MODE_MDI) self.cmd.wait_complete() for i in range(len(self.templistfinal)): self.cmd.mdi("#%s=%s" % (self.liststore[self.templistfinal[i]][2], self.liststore[self.templistfinal[i]][1])) self.cmd.mode(linuxcnc.MODE_MANUAL) self.cmd.wait_complete() self.cmd.mode(linuxcnc.MODE_MDI) self.cmd.wait_complete() logfile = open(self.filename2, "r+") for i in range(0, 1001): logfile.write(self.liststore[i][0] + "\n") logfile.close() self.statuslbl.set_text("Parameters SAVED") self.prevtime = time.time() else: self.statuslbl.set_text("Parameters NOT saved. Cant switch to MDI mode. Either estop active or machine not on or not homed or interpreter not idle") self.prevtime = time.time() self.renderer1.set_property("editable", False) self.renderer2.set_property("editable", False) self.renderer1.set_property("background-gdk", gtk.gdk.Color("white")) self.renderer2.set_property("background-gdk", gtk.gdk.Color("white")) self.read_files() self.editing_mode = False return def on_combobox1_changed(self,widget): sel = self.combo.get_active() if sel == 0: self.treeview1.set_search_column(0) if sel == 1: self.treeview1.set_search_column(1) if sel == 2: self.treeview1.set_search_column(2) return def ok_for_mdi(self): self.status.poll() return not self.status.estop and self.status.enabled and self.status.homed and (self.status.interp_state == linuxcnc.INTERP_IDLE) def get_handlers(halcomp, builder, useropts): return[App(halcomp, builder, useropts)] def main(): gladefile = 'parameters.glade' gladefile = os.path.join(sys.path[0], gladefile) builder = gtk.Builder() builder.add_from_file(gladefile) app = App(None, builder, None) win = gtk.Window() win.add(app) gtk.main() if __name__ == '__main__': mainret = main() sys.exit(mainret)