From c738faadf93bd469be91fed1b9c168debacc38d5 Mon Sep 17 00:00:00 2001 From: Ron Schellberg <1888300+rschell@users.noreply.github.com> Date: Sat, 13 Mar 2021 13:00:00 -0700 Subject: [PATCH 1/3] Added new Control frame with a slider for jogging --- bCNC/ControlPage.py | 328 +++++++++++++++++++++++++++++++++++++++++++- bCNC/__main__.py | 1 + bCNC/bCNC.ini | 9 +- 3 files changed, 335 insertions(+), 3 deletions(-) diff --git a/bCNC/ControlPage.py b/bCNC/ControlPage.py index 9f037eb95..eb4dafcdb 100644 --- a/bCNC/ControlPage.py +++ b/bCNC/ControlPage.py @@ -1452,6 +1452,330 @@ def setStep3(self, event=None): if event is not None and not self.acceptKey(): return self.setStep(self.step3, self.step2) +#=============================================================================== +# SliderControlFrame +#=============================================================================== +class sliderControlFrame(CNCRibbon.PageExLabelFrame): + def __init__(self, master, app): + CNCRibbon.PageExLabelFrame.__init__(self, master, "sliderControl", _("sliderControl"), app) + + try: + self.zsteplist = [float(x) for x in Utils.config.get("sliderControl", "zsteplist").split()] + except: + self.zsteplist = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0] + + try: + self.steplist = [float(x) for x in Utils.config.get("sliderControl", "steplist").split()] + except: + self.steplist = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0, 500.0] + + try: + step = float(Utils.config.get("sliderControl", "step")) + except: + step = float(self.steplist[int(len(self.steplist)/2-1)]) + + try: + zstep = Utils.config.get("sliderControl", "zstep") + if zstep == _NOZSTEP: + zstep = float(Utils.config.get("sliderControl", "step")) + else: + zstep = float(zstep) + except: + zstep = float(self.zsteplist[int(len(self.zsteplist)/2-1)]) + + frame = Frame(self()) + frame.pack(side=TOP, fill=X) + + row, col = 0, 0 + Label(frame, text=_("Z")).grid(row=row, column=col) + Label(frame, text=_("z-Jog")).grid(row=row, column=col + 1) + + col += 3 + Label(frame, text=_("Y")).grid(row=row, column=col) + + col += 2 + Label(frame, text=_("xy-Jog")).grid(row=row, column=col + 1, columnspan=2) + + # --- + row += 1 + col = 0 + + width=3 + height=2 + + b = Button(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, + command=self.moveZup, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +Z")) + self.addWidget(b) + + col += 1 + self.zScaleValue = DoubleVar() + self.zScale = Scale(frame, + variable=self.zScaleValue, + resolution=0.001, + from_=math.log10(float(self.zsteplist[0])), + to=math.log10(float(self.zsteplist[-1])), + orient="vertical", + showvalue=0, + command=self.setZValue) + self.zScale.grid(row=row, column=col, rowspan=3, sticky=NS) + self.zScale.set(math.log10(zstep)) + tkExtra.Balloon.set(self.zScale, _("Z jog stepsize")) + self.addWidget(self.zScale) + col += 1 + + b = Button(frame, text=Unicode.UPPER_LEFT_TRIANGLE, + command=self.moveXdownYup, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X +Y")) + self.addWidget(b) + + col += 1 + b = Button(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, + command=self.moveYup, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +Y")) + self.addWidget(b) + + col += 1 + b = Button(frame, text=Unicode.UPPER_RIGHT_TRIANGLE, + command=self.moveXupYup, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X +Y")) + self.addWidget(b) + + col += 3 + self.xyScaleValue = DoubleVar() + self.xyScale = Scale(frame, + variable=self.xyScaleValue, + resolution=0.001, + from_=math.log10(float(self.steplist[0])), + to=math.log10(float(self.steplist[-1])), + orient="vertical", + showvalue=0, + command=self.setXYValue) + self.xyScale.grid(row=row, column=col, rowspan=3, sticky=NS) + self.xyScale.set(math.log10(step)) + tkExtra.Balloon.set(self.xyScale, _("XY jog stepsize")) + self.addWidget(self.xyScale) + + # --- + row += 1 + + col = 2 + b = Button(frame, text=Unicode.BLACK_LEFT_POINTING_TRIANGLE, + command=self.moveXdown, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X")) + self.addWidget(b) + + col += 1 + b = Utils.UserButton(frame, self.app, 0, text=Unicode.LARGE_CIRCLE, + command=self.go2origin, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move to Origin.\nUser configurable button.\nRight click to configure.")) + self.addWidget(b) + + col += 1 + b = Button(frame, text=Unicode.BLACK_RIGHT_POINTING_TRIANGLE, + command=self.moveXup, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X")) + self.addWidget(b) + + # -- + col += 1 + Label(frame, text=_("X"), width=1).grid(row=row, column=col, sticky=W) + + def xceptReturn(event): + frame.focus() + + self.zValue = StringVar() + self.zValue.set(str(10**self.zScaleValue.get())) + self.checkZcommand = self.register(self.checkZentry) + self.zstep = Entry(frame, + textvariable=self.zValue, + validate='key', + validatecommand=(self.checkZcommand, '%P'), + width=5) + self.zstep.grid(row=row, column=0, sticky=W) + self.zstep.bind('',xceptReturn) + self.zstep.bind('',xceptReturn) + self.addWidget(self.zstep) + + self.xyValue = StringVar() + self.xyValue.set(str(10**self.xyScaleValue.get())) + self.checkXYcommand = self.register(self.checkXYentry) + self.step = Entry(frame, + textvariable=self.xyValue, + validate='key', + validatecommand=(self.checkXYcommand, '%P'), + width=5) + self.step.grid(row=row-1, column=col+1, sticky=W) + self.step.bind('',xceptReturn) + self.step.bind('',xceptReturn) + self.addWidget(self.step) + + # --- + row += 1 + col = 0 + + b = Button(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, + command=self.moveZdown, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -Z")) + self.addWidget(b) + + col += 2 + b = Button(frame, text=Unicode.LOWER_LEFT_TRIANGLE, + command=self.moveXdownYdown, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X -Y")) + self.addWidget(b) + + col += 1 + b = Button(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, + command=self.moveYdown, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -Y")) + self.addWidget(b) + + col += 1 + b = Button(frame, text=Unicode.LOWER_RIGHT_TRIANGLE, + command=self.moveXupYdown, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X -Y")) + self.addWidget(b) + + #self.grid_columnconfigure(6,weight=1) + try: +# self.grid_anchor(CENTER) + self.tk.call("grid","anchor",self,CENTER) + except TclError: + pass + + #---------------------------------------------------------------------- + def saveConfig(self): + Utils.setFloat("sliderControl", "step", self.step.get()) + if self.zstep is not self.step: + Utils.setFloat("sliderControl", "zstep", self.zstep.get()) + Utils.setFloat("sliderControl", "steplist", self.steplist) + Utils.setFloat("sliderControl", "zsteplist", self.zsteplist) + + #---------------------------------------------------------------------- + # Slider methods + #---------------------------------------------------------------------- + def setZValue(self, slider): + find_f = 10.0**float(slider) + tval = self.zsteplist[min(range(len(self.zsteplist)), key=lambda i: abs(self.zsteplist[i] - find_f))] + sval = str(tval) + self.zValue.set(sval) + self.zScaleValue.set(math.log10(tval)) + + def setXYValue(self, slider): + find_f = 10.0**float(slider) + tval = self.steplist[min(range(len(self.steplist)), key=lambda i: abs(self.steplist[i] - find_f))] + sval = str(tval) + self.xyValue.set(sval) + self.xyScaleValue.set(math.log10(tval)) + + def checkZentry(self, inStr): + try: + if float(inStr) > 0.0: + self.zScaleValue.set(math.log10(float(inStr))) + except: + return True + return True + + def checkXYentry(self, inStr): + try: + if float(inStr) > 0.0: + self.xyScaleValue.set(math.log10(float(inStr))) + except: + return True + return True + + #---------------------------------------------------------------------- + # Jogging + #---------------------------------------------------------------------- + def getStep(self, axis='x'): + if axis == 'z': + zs = self.zstep.get() + if zs == _NOZSTEP: + return self.step.get() + else: + return zs + else: + return self.step.get() + + def moveXup(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X%s"%(self.step.get())) + + def moveXdown(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X-%s"%(self.step.get())) + + def moveYup(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("Y%s"%(self.step.get())) + + def moveYdown(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("Y-%s"%(self.step.get())) + + def moveXdownYup(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X-%sY%s"%(self.step.get(),self.step.get())) + + def moveXupYup(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X%sY%s"%(self.step.get(),self.step.get())) + + def moveXdownYdown(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X-%sY-%s"%(self.step.get(),self.step.get())) + + def moveXupYdown(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("X%sY-%s"%(self.step.get(),self.step.get())) + + def moveZup(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("Z%s"%(self.getStep('z'))) + + def moveZdown(self, event=None): + if event is not None and not self.acceptKey(): return + self.app.mcontrol.jog("Z-%s"%(self.getStep('z'))) + + def go2origin(self, event=None): + self.sendGCode("G90") + self.sendGCode("G0Z%d"%(CNC.vars['safe'])) + self.sendGCode("G0X0Y0") + self.sendGCode("G0Z0") #=============================================================================== # StateFrame @@ -1905,4 +2229,6 @@ def register(self): wcsvar.set(0) self._register((ConnectionGroup, UserGroup, RunGroup), - (DROFrame, abcDROFrame, ControlFrame, abcControlFrame, StateFrame)) + (DROFrame, abcDROFrame, + ControlFrame, abcControlFrame, sliderControlFrame, + StateFrame)) diff --git a/bCNC/__main__.py b/bCNC/__main__.py index 2d0cbaddc..c0ade1c3d 100755 --- a/bCNC/__main__.py +++ b/bCNC/__main__.py @@ -234,6 +234,7 @@ def __init__(self, master, **kw): self.gstate = Page.frames["State"] self.control = Page.frames["Control"] self.abccontrol=Page.frames["abcControl"] + self.slidercontrol = Page.frames["sliderControl"] self.editor = Page.frames["Editor"].editor self.terminal = Page.frames["Terminal"].terminal self.buffer = Page.frames["Terminal"].buffer diff --git a/bCNC/bCNC.ini b/bCNC/bCNC.ini index f9865c160..25cf6177a 100644 --- a/bCNC/bCNC.ini +++ b/bCNC/bCNC.ini @@ -9,7 +9,7 @@ file.ribbon = File Pendant Options Close file.page = DRO Serial control.ribbon = Connection User Run Close -control.page = DRO abcDRO State Control abcControl +control.page = DRO abcDRO State Control abcControl sliderControl probe.ribbon = Connection Probe probe.page = DRO ProbeCommon @@ -41,7 +41,7 @@ step2 = 1 step3 = 10 swap = 0 steplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 50 100 500 -zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 +zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 50 100 [abcControl] step = 1 @@ -54,6 +54,11 @@ swap = 0 abcsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 90 180 360 asteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 15 90 180 360 +[sliderControl] +step = 10 +zstep = 5 +steplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 50 100 500 +zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 50 100 [Events] onstart = onstop = From 9c696235534e53c4448b448d0896b46db415f1c7 Mon Sep 17 00:00:00 2001 From: Ron Schellberg <1888300+rschell@users.noreply.github.com> Date: Tue, 16 Mar 2021 09:12:29 -0600 Subject: [PATCH 2/3] add continuous jogging frame --- bCNC/ControlPage.py | 273 +++++++++++++++++++++++++++++++++++++- bCNC/__main__.py | 1 + bCNC/bCNC.ini | 6 +- bCNC/controllers/GRBL1.py | 10 +- bCNC/lib/tkExtra.py | 37 ++++++ 5 files changed, 324 insertions(+), 3 deletions(-) diff --git a/bCNC/ControlPage.py b/bCNC/ControlPage.py index eb4dafcdb..f5a49610c 100644 --- a/bCNC/ControlPage.py +++ b/bCNC/ControlPage.py @@ -1777,6 +1777,276 @@ def go2origin(self, event=None): self.sendGCode("G0X0Y0") self.sendGCode("G0Z0") +#=============================================================================== +# continuousControlFrame +#=============================================================================== +class continuousControlFrame(CNCRibbon.PageExLabelFrame): + def __init__(self, master, app): + CNCRibbon.PageExLabelFrame.__init__(self, master, "continuousControl", _("continuousControl"), app) + + try: + jograte = float(Utils.config.get("continuousControl", "jograte")) + except: + jograte = 100.0 + + frame = Frame(self()) + frame.pack(side=TOP, fill=X) + + row, col = 0, 0 + Label(frame, text=_("Z")).grid(row=row, column=col) + + col += 4 + Label(frame, text=_("Y")).grid(row=row, column=col) + + col += 2 + Label(frame, text=_("Jog Rate")).grid(row=row, column=col) + + # --- + row += 1 + col = 0 + + width = 3 + height = 2 + + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, + StartCommand=self.moveZup, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +Z")) + self.addWidget(b) + + col += 3 + + b = tkExtra.TimedButton(frame, text=Unicode.UPPER_LEFT_TRIANGLE, + StartCommand=self.moveXdownYup, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X +Y")) + self.addWidget(b) + + col += 1 + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, + StartCommand=self.moveYup, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +Y")) + self.addWidget(b) + + col += 1 + b = tkExtra.TimedButton(frame, text=Unicode.UPPER_RIGHT_TRIANGLE, + StartCommand=self.moveXupYup, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X +Y")) + self.addWidget(b) + + col += 3 + self.jogScaleValue = DoubleVar() + self.jogScale = Scale(frame, + variable=self.jogScaleValue, + resolution=0.001, + from_= 0.0, + to=math.log10(max(CNC.feedmax_x, CNC.feedmax_y, CNC.feedmax_z)), + orient="vertical", + showvalue=0, + command=self.setjogValue) + self.jogScale.grid(row=row, column=col, rowspan=3, sticky=NS) + self.jogScale.set(math.log10(jograte)) + tkExtra.Balloon.set(self.jogScale, _("jog feed rate")) + self.addWidget(self.jogScale) + + # --- + row += 1 + + # -- + col = 2 + Label(frame, text=_("X"), width=4).grid(row=row, column=col, sticky=E) + + col += 1 + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_LEFT_POINTING_TRIANGLE, + StartCommand=self.moveXdown, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X")) + self.addWidget(b) + + col += 2 + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_RIGHT_POINTING_TRIANGLE, + StartCommand=self.moveXup, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X")) + self.addWidget(b) + + def xceptReturn(event): + frame.focus() + + self.jogValue = StringVar() + self.jogValue.set(str(10**self.jogScaleValue.get())) + self.checkJogcommand = self.register(self.checkJogentry) + self.jograte = Entry(frame, + textvariable=self.jogValue, + validate='key', + validatecommand=(self.checkJogcommand, '%P'), + width=6) + self.jograte.grid(row=row-1, column=col+1, sticky=W) + self.jograte.bind('',xceptReturn) + self.jograte.bind('',xceptReturn) + self.addWidget(self.jograte) + + # --- + row += 1 + col = 0 + + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, + StartCommand=self.moveZdown, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -Z")) + self.addWidget(b) + + col += 3 + b = tkExtra.TimedButton(frame, text=Unicode.LOWER_LEFT_TRIANGLE, + StartCommand=self.moveXdownYdown, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -X -Y")) + self.addWidget(b) + + col += 1 + b = tkExtra.TimedButton(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, + StartCommand=self.moveYdown, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move -Y")) + self.addWidget(b) + + col += 1 + b = tkExtra.TimedButton(frame, text=Unicode.LOWER_RIGHT_TRIANGLE, + StartCommand=self.moveXupYdown, + command=self.jogcancel, + width=width, height=height, + activebackground="LightYellow") + b.grid(row=row, column=col, sticky=EW) + tkExtra.Balloon.set(b, _("Move +X -Y")) + self.addWidget(b) + + #self.grid_columnconfigure(6,weight=1) + try: +# self.grid_anchor(CENTER) + self.tk.call("grid","anchor",self,CENTER) + except TclError: + pass + + #---------------------------------------------------------------------- + def saveConfig(self): + Utils.setFloat("continuousControl", "jograte", self.jograte.get()) + + #---------------------------------------------------------------------- + # Slider methods + #---------------------------------------------------------------------- + def setjogValue(self, slider): + fval = float(slider) + tval = round(10.0**fval,1-int(floor(fval))) + sval = str(tval) + self.jogValue.set(sval) + self.jogScaleValue.set(math.log10(tval)) + + def checkJogentry(self, inStr): + try: + if float(inStr) > 0.0: + self.jogScaleValue.set(math.log10(float(inStr))) + except: + return True + return True + + #---------------------------------------------------------------------- + # Jogging + #---------------------------------------------------------------------- + def jogcancel(self, event=None): + self.app.mcontrol.cjogcancel() + + def moveXup(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = -CNC.vars['mx'] - 0.1 + self.app.mcontrol.cjog("X{:.3f}".format(safeX), self.jograte.get()) + + def moveXdown(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 + self.app.mcontrol.cjog("X-{:.3f}".format(safeX), self.jograte.get()) + + def moveYup(self, event=None): + if event is not None and not self.acceptKey(): return + safeY = -CNC.vars['my'] - 0.1 + self.app.mcontrol.cjog("Y{:.3f}".format(safeY), self.jograte.get()) + + def moveYdown(self, event=None): + if event is not None and not self.acceptKey(): return + safeY = CNC.travel_y + CNC.vars['my'] - 0.1 + self.app.mcontrol.cjog("Y-{:.3f}".format(safeY), self.jograte.get()) + + def moveXdownYup(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 + safeY = -CNC.vars['my'] - 0.1 + safeD = min(safeX, safeY) + self.app.mcontrol.cjog("X-{:.3f} Y{:.3f}".format(safeD, safeD), self.jograte.get()) + + def moveXupYup(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = -CNC.vars['mx'] - 0.1 + safeY = -CNC.vars['my'] - 0.1 + safeD = min(safeX, safeY) + self.app.mcontrol.cjog("X{:.3f} Y{:.3f}".format(safeD, safeD), self.jograte.get()) + + def moveXdownYdown(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 + safeY = CNC.travel_y + CNC.vars['my'] - 0.1 + safeD = min(safeX, safeY) + self.app.mcontrol.cjog("X-{:.3f} Y-{:.3f}".format(safeD, safeD), self.jograte.get()) + + def moveXupYdown(self, event=None): + if event is not None and not self.acceptKey(): return + safeX = -CNC.vars['mx'] - 0.1 + safeY = CNC.travel_y + CNC.vars['my'] - 0.1 + safeD = min(safeX, safeY) + self.app.mcontrol.cjog("X{:.3f}Y-{:.3f}".format(safeD, safeD), self.jograte.get()) + + def moveZup(self, event=None): + if event is not None and not self.acceptKey(): return + safeZ = -CNC.vars['mz'] - 0.1 + self.app.mcontrol.cjog("Z{:.3f}".format(safeZ), self.jograte.get()) + + def moveZdown(self, event=None): + if event is not None and not self.acceptKey(): return + safeZ = CNC.vars['wz'] + self.app.mcontrol.cjog("Z-{:.3f}".format(safeZ), self.jograte.get()) + + #---------------------------------------------------------------------- + def keybindings(self): + # keybindings established in tkExtra.TimedButton calls + pass + #=============================================================================== # StateFrame #=============================================================================== @@ -2230,5 +2500,6 @@ def register(self): self._register((ConnectionGroup, UserGroup, RunGroup), (DROFrame, abcDROFrame, - ControlFrame, abcControlFrame, sliderControlFrame, + ControlFrame, abcControlFrame, + sliderControlFrame, continuousControlFrame, StateFrame)) diff --git a/bCNC/__main__.py b/bCNC/__main__.py index c0ade1c3d..fe257ac9e 100755 --- a/bCNC/__main__.py +++ b/bCNC/__main__.py @@ -235,6 +235,7 @@ def __init__(self, master, **kw): self.control = Page.frames["Control"] self.abccontrol=Page.frames["abcControl"] self.slidercontrol = Page.frames["sliderControl"] + self.continuouscontrol = Page.frames["continuousControl"] self.editor = Page.frames["Editor"].editor self.terminal = Page.frames["Terminal"].terminal self.buffer = Page.frames["Terminal"].buffer diff --git a/bCNC/bCNC.ini b/bCNC/bCNC.ini index 25cf6177a..bb0b2a50d 100644 --- a/bCNC/bCNC.ini +++ b/bCNC/bCNC.ini @@ -9,7 +9,7 @@ file.ribbon = File Pendant Options Close file.page = DRO Serial control.ribbon = Connection User Run Close -control.page = DRO abcDRO State Control abcControl sliderControl +control.page = DRO abcDRO State Control abcControl sliderControl continuousControl probe.ribbon = Connection Probe probe.page = DRO ProbeCommon @@ -59,6 +59,10 @@ step = 10 zstep = 5 steplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 50 100 500 zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 50 100 + +[continuousControl] +jograte = 500 + [Events] onstart = onstop = diff --git a/bCNC/controllers/GRBL1.py b/bCNC/controllers/GRBL1.py index f6b439fa3..34c160d0d 100644 --- a/bCNC/controllers/GRBL1.py +++ b/bCNC/controllers/GRBL1.py @@ -8,6 +8,8 @@ import time import Utils +OV_JOG_CANCEL = chr(0x85) + OV_FEED_100 = chr(0x90) # Extended override commands OV_FEED_i10 = chr(0x91) OV_FEED_d10 = chr(0x92) @@ -38,7 +40,13 @@ def __init__(self, master): #print("grbl1 loaded") def jog(self, dir): - self.master.sendGCode("$J=G91 %s F100000"%(dir)) # XXX is F100000 correct? + self.master.sendGCode("$J=G91 %s F100000"%(dir)) + + def cjog(self, dir, feed): + self.master.sendGCode("$J=G91 %s F%d"%(dir, float(feed))) + + def cjogcancel(self): + self.master.serial_write(OV_JOG_CANCEL) def overrideSet(self): CNC.vars["_OvChanged"] = False # Temporary diff --git a/bCNC/lib/tkExtra.py b/bCNC/lib/tkExtra.py index 593802b52..b8e04bbab 100644 --- a/bCNC/lib/tkExtra.py +++ b/bCNC/lib/tkExtra.py @@ -289,6 +289,43 @@ def bindClasses(root): root.bind_class('Text', '<>', _textPaste) +#=============================================================================== +# TimedButton. A Button which has a starting, ending and time dependant action +#=============================================================================== +class TimedButton(Button): + """A tkinter Button whose action can depend on the + duration it was pressed, besides the standard button command, two aditional + commands are allowed: StartCommand and TimedCommand. + """ + def __init__(self, master, StartCommand=None, TimedCommand=None, TimeTrigger=None, **kw): + Button.__init__(self, master, **kw) + self.downCommand = StartCommand + self.timedCommand = TimedCommand + self.trigger = TimeTrigger + self.start, self.end = 0, 0 + self.set_down() + self.set_up() + + def set_down(self): + self.bind('', self.start_time) + + def set_up(self): + self.bind('', self.end_time) + + def start_time(self, e): + self.start = time.time() + self.downCommand() + + def end_time(self, e): + if self.start is not None: # prevents a possible first click to take focus to generate an improbable time + self.end = time.time() + if self.trigger is not None: + if (self.end - self.start) > self.trigger: + self.timedCommand() + else: + self.start = 0 + + #=============================================================================== # LabelEntry. display a label when entry field is empty #=============================================================================== From 9a8b86f499e86b6696cb57370688b49a67523c29 Mon Sep 17 00:00:00 2001 From: calabr Date: Sun, 3 Oct 2021 02:08:03 +0300 Subject: [PATCH 3/3] Revert "Merge pull request #2 from rschell/New_Control_Frames" This reverts commit 81f9bf36b0b9496c1eb4ce890a4ab9759d466b0d, reversing changes made to 2261ed13b71939a8599a7ae84a68d912b5a0722e. --- bCNC/ControlPage.py | 599 +------------------------------------- bCNC/__main__.py | 2 - bCNC/bCNC.ini | 13 +- bCNC/controllers/GRBL1.py | 10 +- bCNC/lib/tkExtra.py | 37 --- 5 files changed, 4 insertions(+), 657 deletions(-) diff --git a/bCNC/ControlPage.py b/bCNC/ControlPage.py index 12edfe500..61149e17d 100644 --- a/bCNC/ControlPage.py +++ b/bCNC/ControlPage.py @@ -1456,600 +1456,6 @@ def setStep3(self, event=None): if event is not None and not self.acceptKey(): return self.setStep(self.step3, self.step2) -#=============================================================================== -# SliderControlFrame -#=============================================================================== -class sliderControlFrame(CNCRibbon.PageExLabelFrame): - def __init__(self, master, app): - CNCRibbon.PageExLabelFrame.__init__(self, master, "sliderControl", _("sliderControl"), app) - - try: - self.zsteplist = [float(x) for x in Utils.config.get("sliderControl", "zsteplist").split()] - except: - self.zsteplist = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0] - - try: - self.steplist = [float(x) for x in Utils.config.get("sliderControl", "steplist").split()] - except: - self.steplist = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0, 10.0, 50.0, 100.0, 500.0] - - try: - step = float(Utils.config.get("sliderControl", "step")) - except: - step = float(self.steplist[int(len(self.steplist)/2-1)]) - - try: - zstep = Utils.config.get("sliderControl", "zstep") - if zstep == _NOZSTEP: - zstep = float(Utils.config.get("sliderControl", "step")) - else: - zstep = float(zstep) - except: - zstep = float(self.zsteplist[int(len(self.zsteplist)/2-1)]) - - frame = Frame(self()) - frame.pack(side=TOP, fill=X) - - row, col = 0, 0 - Label(frame, text=_("Z")).grid(row=row, column=col) - Label(frame, text=_("z-Jog")).grid(row=row, column=col + 1) - - col += 3 - Label(frame, text=_("Y")).grid(row=row, column=col) - - col += 2 - Label(frame, text=_("xy-Jog")).grid(row=row, column=col + 1, columnspan=2) - - # --- - row += 1 - col = 0 - - width=3 - height=2 - - b = Button(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, - command=self.moveZup, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +Z")) - self.addWidget(b) - - col += 1 - self.zScaleValue = DoubleVar() - self.zScale = Scale(frame, - variable=self.zScaleValue, - resolution=0.001, - from_=math.log10(float(self.zsteplist[0])), - to=math.log10(float(self.zsteplist[-1])), - orient="vertical", - showvalue=0, - command=self.setZValue) - self.zScale.grid(row=row, column=col, rowspan=3, sticky=NS) - self.zScale.set(math.log10(zstep)) - tkExtra.Balloon.set(self.zScale, _("Z jog stepsize")) - self.addWidget(self.zScale) - col += 1 - - b = Button(frame, text=Unicode.UPPER_LEFT_TRIANGLE, - command=self.moveXdownYup, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X +Y")) - self.addWidget(b) - - col += 1 - b = Button(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, - command=self.moveYup, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +Y")) - self.addWidget(b) - - col += 1 - b = Button(frame, text=Unicode.UPPER_RIGHT_TRIANGLE, - command=self.moveXupYup, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X +Y")) - self.addWidget(b) - - col += 3 - self.xyScaleValue = DoubleVar() - self.xyScale = Scale(frame, - variable=self.xyScaleValue, - resolution=0.001, - from_=math.log10(float(self.steplist[0])), - to=math.log10(float(self.steplist[-1])), - orient="vertical", - showvalue=0, - command=self.setXYValue) - self.xyScale.grid(row=row, column=col, rowspan=3, sticky=NS) - self.xyScale.set(math.log10(step)) - tkExtra.Balloon.set(self.xyScale, _("XY jog stepsize")) - self.addWidget(self.xyScale) - - # --- - row += 1 - - col = 2 - b = Button(frame, text=Unicode.BLACK_LEFT_POINTING_TRIANGLE, - command=self.moveXdown, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X")) - self.addWidget(b) - - col += 1 - b = Utils.UserButton(frame, self.app, 0, text=Unicode.LARGE_CIRCLE, - command=self.go2origin, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move to Origin.\nUser configurable button.\nRight click to configure.")) - self.addWidget(b) - - col += 1 - b = Button(frame, text=Unicode.BLACK_RIGHT_POINTING_TRIANGLE, - command=self.moveXup, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X")) - self.addWidget(b) - - # -- - col += 1 - Label(frame, text=_("X"), width=1).grid(row=row, column=col, sticky=W) - - def xceptReturn(event): - frame.focus() - - self.zValue = StringVar() - self.zValue.set(str(10**self.zScaleValue.get())) - self.checkZcommand = self.register(self.checkZentry) - self.zstep = Entry(frame, - textvariable=self.zValue, - validate='key', - validatecommand=(self.checkZcommand, '%P'), - width=5) - self.zstep.grid(row=row, column=0, sticky=W) - self.zstep.bind('',xceptReturn) - self.zstep.bind('',xceptReturn) - self.addWidget(self.zstep) - - self.xyValue = StringVar() - self.xyValue.set(str(10**self.xyScaleValue.get())) - self.checkXYcommand = self.register(self.checkXYentry) - self.step = Entry(frame, - textvariable=self.xyValue, - validate='key', - validatecommand=(self.checkXYcommand, '%P'), - width=5) - self.step.grid(row=row-1, column=col+1, sticky=W) - self.step.bind('',xceptReturn) - self.step.bind('',xceptReturn) - self.addWidget(self.step) - - # --- - row += 1 - col = 0 - - b = Button(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, - command=self.moveZdown, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -Z")) - self.addWidget(b) - - col += 2 - b = Button(frame, text=Unicode.LOWER_LEFT_TRIANGLE, - command=self.moveXdownYdown, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X -Y")) - self.addWidget(b) - - col += 1 - b = Button(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, - command=self.moveYdown, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -Y")) - self.addWidget(b) - - col += 1 - b = Button(frame, text=Unicode.LOWER_RIGHT_TRIANGLE, - command=self.moveXupYdown, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X -Y")) - self.addWidget(b) - - #self.grid_columnconfigure(6,weight=1) - try: -# self.grid_anchor(CENTER) - self.tk.call("grid","anchor",self,CENTER) - except TclError: - pass - - #---------------------------------------------------------------------- - def saveConfig(self): - Utils.setFloat("sliderControl", "step", self.step.get()) - if self.zstep is not self.step: - Utils.setFloat("sliderControl", "zstep", self.zstep.get()) - Utils.setFloat("sliderControl", "steplist", self.steplist) - Utils.setFloat("sliderControl", "zsteplist", self.zsteplist) - - #---------------------------------------------------------------------- - # Slider methods - #---------------------------------------------------------------------- - def setZValue(self, slider): - find_f = 10.0**float(slider) - tval = self.zsteplist[min(range(len(self.zsteplist)), key=lambda i: abs(self.zsteplist[i] - find_f))] - sval = str(tval) - self.zValue.set(sval) - self.zScaleValue.set(math.log10(tval)) - - def setXYValue(self, slider): - find_f = 10.0**float(slider) - tval = self.steplist[min(range(len(self.steplist)), key=lambda i: abs(self.steplist[i] - find_f))] - sval = str(tval) - self.xyValue.set(sval) - self.xyScaleValue.set(math.log10(tval)) - - def checkZentry(self, inStr): - try: - if float(inStr) > 0.0: - self.zScaleValue.set(math.log10(float(inStr))) - except: - return True - return True - - def checkXYentry(self, inStr): - try: - if float(inStr) > 0.0: - self.xyScaleValue.set(math.log10(float(inStr))) - except: - return True - return True - - #---------------------------------------------------------------------- - # Jogging - #---------------------------------------------------------------------- - def getStep(self, axis='x'): - if axis == 'z': - zs = self.zstep.get() - if zs == _NOZSTEP: - return self.step.get() - else: - return zs - else: - return self.step.get() - - def moveXup(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X%s"%(self.step.get())) - - def moveXdown(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X-%s"%(self.step.get())) - - def moveYup(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("Y%s"%(self.step.get())) - - def moveYdown(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("Y-%s"%(self.step.get())) - - def moveXdownYup(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X-%sY%s"%(self.step.get(),self.step.get())) - - def moveXupYup(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X%sY%s"%(self.step.get(),self.step.get())) - - def moveXdownYdown(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X-%sY-%s"%(self.step.get(),self.step.get())) - - def moveXupYdown(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("X%sY-%s"%(self.step.get(),self.step.get())) - - def moveZup(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("Z%s"%(self.getStep('z'))) - - def moveZdown(self, event=None): - if event is not None and not self.acceptKey(): return - self.app.mcontrol.jog("Z-%s"%(self.getStep('z'))) - - def go2origin(self, event=None): - self.sendGCode("G90") - self.sendGCode("G0Z%d"%(CNC.vars['safe'])) - self.sendGCode("G0X0Y0") - self.sendGCode("G0Z0") - -#=============================================================================== -# continuousControlFrame -#=============================================================================== -class continuousControlFrame(CNCRibbon.PageExLabelFrame): - def __init__(self, master, app): - CNCRibbon.PageExLabelFrame.__init__(self, master, "continuousControl", _("continuousControl"), app) - - try: - jograte = float(Utils.config.get("continuousControl", "jograte")) - except: - jograte = 100.0 - - frame = Frame(self()) - frame.pack(side=TOP, fill=X) - - row, col = 0, 0 - Label(frame, text=_("Z")).grid(row=row, column=col) - - col += 4 - Label(frame, text=_("Y")).grid(row=row, column=col) - - col += 2 - Label(frame, text=_("Jog Rate")).grid(row=row, column=col) - - # --- - row += 1 - col = 0 - - width = 3 - height = 2 - - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, - StartCommand=self.moveZup, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +Z")) - self.addWidget(b) - - col += 3 - - b = tkExtra.TimedButton(frame, text=Unicode.UPPER_LEFT_TRIANGLE, - StartCommand=self.moveXdownYup, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X +Y")) - self.addWidget(b) - - col += 1 - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_UP_POINTING_TRIANGLE, - StartCommand=self.moveYup, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +Y")) - self.addWidget(b) - - col += 1 - b = tkExtra.TimedButton(frame, text=Unicode.UPPER_RIGHT_TRIANGLE, - StartCommand=self.moveXupYup, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X +Y")) - self.addWidget(b) - - col += 3 - self.jogScaleValue = DoubleVar() - self.jogScale = Scale(frame, - variable=self.jogScaleValue, - resolution=0.001, - from_= 0.0, - to=math.log10(max(CNC.feedmax_x, CNC.feedmax_y, CNC.feedmax_z)), - orient="vertical", - showvalue=0, - command=self.setjogValue) - self.jogScale.grid(row=row, column=col, rowspan=3, sticky=NS) - self.jogScale.set(math.log10(jograte)) - tkExtra.Balloon.set(self.jogScale, _("jog feed rate")) - self.addWidget(self.jogScale) - - # --- - row += 1 - - # -- - col = 2 - Label(frame, text=_("X"), width=4).grid(row=row, column=col, sticky=E) - - col += 1 - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_LEFT_POINTING_TRIANGLE, - StartCommand=self.moveXdown, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X")) - self.addWidget(b) - - col += 2 - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_RIGHT_POINTING_TRIANGLE, - StartCommand=self.moveXup, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X")) - self.addWidget(b) - - def xceptReturn(event): - frame.focus() - - self.jogValue = StringVar() - self.jogValue.set(str(10**self.jogScaleValue.get())) - self.checkJogcommand = self.register(self.checkJogentry) - self.jograte = Entry(frame, - textvariable=self.jogValue, - validate='key', - validatecommand=(self.checkJogcommand, '%P'), - width=6) - self.jograte.grid(row=row-1, column=col+1, sticky=W) - self.jograte.bind('',xceptReturn) - self.jograte.bind('',xceptReturn) - self.addWidget(self.jograte) - - # --- - row += 1 - col = 0 - - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, - StartCommand=self.moveZdown, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -Z")) - self.addWidget(b) - - col += 3 - b = tkExtra.TimedButton(frame, text=Unicode.LOWER_LEFT_TRIANGLE, - StartCommand=self.moveXdownYdown, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -X -Y")) - self.addWidget(b) - - col += 1 - b = tkExtra.TimedButton(frame, text=Unicode.BLACK_DOWN_POINTING_TRIANGLE, - StartCommand=self.moveYdown, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move -Y")) - self.addWidget(b) - - col += 1 - b = tkExtra.TimedButton(frame, text=Unicode.LOWER_RIGHT_TRIANGLE, - StartCommand=self.moveXupYdown, - command=self.jogcancel, - width=width, height=height, - activebackground="LightYellow") - b.grid(row=row, column=col, sticky=EW) - tkExtra.Balloon.set(b, _("Move +X -Y")) - self.addWidget(b) - - #self.grid_columnconfigure(6,weight=1) - try: -# self.grid_anchor(CENTER) - self.tk.call("grid","anchor",self,CENTER) - except TclError: - pass - - #---------------------------------------------------------------------- - def saveConfig(self): - Utils.setFloat("continuousControl", "jograte", self.jograte.get()) - - #---------------------------------------------------------------------- - # Slider methods - #---------------------------------------------------------------------- - def setjogValue(self, slider): - fval = float(slider) - tval = round(10.0**fval,1-int(floor(fval))) - sval = str(tval) - self.jogValue.set(sval) - self.jogScaleValue.set(math.log10(tval)) - - def checkJogentry(self, inStr): - try: - if float(inStr) > 0.0: - self.jogScaleValue.set(math.log10(float(inStr))) - except: - return True - return True - - #---------------------------------------------------------------------- - # Jogging - #---------------------------------------------------------------------- - def jogcancel(self, event=None): - self.app.mcontrol.cjogcancel() - - def moveXup(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = -CNC.vars['mx'] - 0.1 - self.app.mcontrol.cjog("X{:.3f}".format(safeX), self.jograte.get()) - - def moveXdown(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 - self.app.mcontrol.cjog("X-{:.3f}".format(safeX), self.jograte.get()) - - def moveYup(self, event=None): - if event is not None and not self.acceptKey(): return - safeY = -CNC.vars['my'] - 0.1 - self.app.mcontrol.cjog("Y{:.3f}".format(safeY), self.jograte.get()) - - def moveYdown(self, event=None): - if event is not None and not self.acceptKey(): return - safeY = CNC.travel_y + CNC.vars['my'] - 0.1 - self.app.mcontrol.cjog("Y-{:.3f}".format(safeY), self.jograte.get()) - - def moveXdownYup(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 - safeY = -CNC.vars['my'] - 0.1 - safeD = min(safeX, safeY) - self.app.mcontrol.cjog("X-{:.3f} Y{:.3f}".format(safeD, safeD), self.jograte.get()) - - def moveXupYup(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = -CNC.vars['mx'] - 0.1 - safeY = -CNC.vars['my'] - 0.1 - safeD = min(safeX, safeY) - self.app.mcontrol.cjog("X{:.3f} Y{:.3f}".format(safeD, safeD), self.jograte.get()) - - def moveXdownYdown(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = CNC.travel_x + CNC.vars['mx'] - 0.1 - safeY = CNC.travel_y + CNC.vars['my'] - 0.1 - safeD = min(safeX, safeY) - self.app.mcontrol.cjog("X-{:.3f} Y-{:.3f}".format(safeD, safeD), self.jograte.get()) - - def moveXupYdown(self, event=None): - if event is not None and not self.acceptKey(): return - safeX = -CNC.vars['mx'] - 0.1 - safeY = CNC.travel_y + CNC.vars['my'] - 0.1 - safeD = min(safeX, safeY) - self.app.mcontrol.cjog("X{:.3f}Y-{:.3f}".format(safeD, safeD), self.jograte.get()) - - def moveZup(self, event=None): - if event is not None and not self.acceptKey(): return - safeZ = -CNC.vars['mz'] - 0.1 - self.app.mcontrol.cjog("Z{:.3f}".format(safeZ), self.jograte.get()) - - def moveZdown(self, event=None): - if event is not None and not self.acceptKey(): return - safeZ = CNC.vars['wz'] - self.app.mcontrol.cjog("Z-{:.3f}".format(safeZ), self.jograte.get()) - - #---------------------------------------------------------------------- - def keybindings(self): - # keybindings established in tkExtra.TimedButton calls - pass #=============================================================================== # StateFrame @@ -2503,7 +1909,4 @@ def register(self): wcsvar.set(0) self._register((ConnectionGroup, UserGroup, RunGroup), - (DROFrame, abcDROFrame, - ControlFrame, abcControlFrame, - sliderControlFrame, continuousControlFrame, - StateFrame)) + (DROFrame, abcDROFrame, ControlFrame, abcControlFrame, StateFrame)) diff --git a/bCNC/__main__.py b/bCNC/__main__.py index fe257ac9e..2d0cbaddc 100755 --- a/bCNC/__main__.py +++ b/bCNC/__main__.py @@ -234,8 +234,6 @@ def __init__(self, master, **kw): self.gstate = Page.frames["State"] self.control = Page.frames["Control"] self.abccontrol=Page.frames["abcControl"] - self.slidercontrol = Page.frames["sliderControl"] - self.continuouscontrol = Page.frames["continuousControl"] self.editor = Page.frames["Editor"].editor self.terminal = Page.frames["Terminal"].terminal self.buffer = Page.frames["Terminal"].buffer diff --git a/bCNC/bCNC.ini b/bCNC/bCNC.ini index bb0b2a50d..f9865c160 100644 --- a/bCNC/bCNC.ini +++ b/bCNC/bCNC.ini @@ -9,7 +9,7 @@ file.ribbon = File Pendant Options Close file.page = DRO Serial control.ribbon = Connection User Run Close -control.page = DRO abcDRO State Control abcControl sliderControl continuousControl +control.page = DRO abcDRO State Control abcControl probe.ribbon = Connection Probe probe.page = DRO ProbeCommon @@ -41,7 +41,7 @@ step2 = 1 step3 = 10 swap = 0 steplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 50 100 500 -zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 50 100 +zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 [abcControl] step = 1 @@ -54,15 +54,6 @@ swap = 0 abcsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 90 180 360 asteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 15 90 180 360 -[sliderControl] -step = 10 -zstep = 5 -steplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 50 100 500 -zsteplist = 0.001 0.005 0.01 0.05 0.1 0.5 1 5 10 25 50 100 - -[continuousControl] -jograte = 500 - [Events] onstart = onstop = diff --git a/bCNC/controllers/GRBL1.py b/bCNC/controllers/GRBL1.py index 34c160d0d..f6b439fa3 100644 --- a/bCNC/controllers/GRBL1.py +++ b/bCNC/controllers/GRBL1.py @@ -8,8 +8,6 @@ import time import Utils -OV_JOG_CANCEL = chr(0x85) - OV_FEED_100 = chr(0x90) # Extended override commands OV_FEED_i10 = chr(0x91) OV_FEED_d10 = chr(0x92) @@ -40,13 +38,7 @@ def __init__(self, master): #print("grbl1 loaded") def jog(self, dir): - self.master.sendGCode("$J=G91 %s F100000"%(dir)) - - def cjog(self, dir, feed): - self.master.sendGCode("$J=G91 %s F%d"%(dir, float(feed))) - - def cjogcancel(self): - self.master.serial_write(OV_JOG_CANCEL) + self.master.sendGCode("$J=G91 %s F100000"%(dir)) # XXX is F100000 correct? def overrideSet(self): CNC.vars["_OvChanged"] = False # Temporary diff --git a/bCNC/lib/tkExtra.py b/bCNC/lib/tkExtra.py index b8e04bbab..593802b52 100644 --- a/bCNC/lib/tkExtra.py +++ b/bCNC/lib/tkExtra.py @@ -289,43 +289,6 @@ def bindClasses(root): root.bind_class('Text', '<>', _textPaste) -#=============================================================================== -# TimedButton. A Button which has a starting, ending and time dependant action -#=============================================================================== -class TimedButton(Button): - """A tkinter Button whose action can depend on the - duration it was pressed, besides the standard button command, two aditional - commands are allowed: StartCommand and TimedCommand. - """ - def __init__(self, master, StartCommand=None, TimedCommand=None, TimeTrigger=None, **kw): - Button.__init__(self, master, **kw) - self.downCommand = StartCommand - self.timedCommand = TimedCommand - self.trigger = TimeTrigger - self.start, self.end = 0, 0 - self.set_down() - self.set_up() - - def set_down(self): - self.bind('', self.start_time) - - def set_up(self): - self.bind('', self.end_time) - - def start_time(self, e): - self.start = time.time() - self.downCommand() - - def end_time(self, e): - if self.start is not None: # prevents a possible first click to take focus to generate an improbable time - self.end = time.time() - if self.trigger is not None: - if (self.end - self.start) > self.trigger: - self.timedCommand() - else: - self.start = 0 - - #=============================================================================== # LabelEntry. display a label when entry field is empty #===============================================================================