diff --git a/blupload.py b/blupload.py deleted file mode 100644 index 0c9a47b..0000000 --- a/blupload.py +++ /dev/null @@ -1,41 +0,0 @@ -import printcore,time,sys,os - -def dosify(name): - return os.path.split(name)[1].split(".")[0][:8]+".g" - -def blupload(printer,filename,path): - printer.send_now("M28 "+dosify(filename)) - printer.startprint([i.replace("\n","") for i in open(path)]) - try: - sys.stdout.write("Progress: 00.0%") - sys.stdout.flush() - while(printer.printing): - time.sleep(1) - sys.stdout.write("\b\b\b\b%02.1f%%" % (100*float(printer.queueindex)/len(printer.mainqueue),) ) - sys.stdout.flush() - printer.send_now("M29 "+dosify(filename)) - print "Done uploading, disconnecting with a 5 second timeout in case the printer has something important to say." - printer.disconnect() - time.sleep(5) - print "Upload complete. Goodbye!" - - except: - print "Abort, disconnecting with a 5 second timeout in case the printer has something important to say." - printer.disconnect() - -if __name__ == '__main__': - #print "Usage: python blupload.py filename.gcode" - filename="../prusamendel/sellsx_export.gcode" - tfilename=filename - if len(sys.argv)>1: - filename=sys.argv[1] - tfilename=os.path.basename(sys.argv[1]) - print "Uploading: "+filename," as "+dosify(tfilename) - p=printcore.printcore('/dev/ttyUSB0',115200) - p.loud=False - time.sleep(2) - blupload(p,tfilename,filename) - - else: - print "Usage: python blupload.py filename.gcode" - diff --git a/pronsole.py b/pronsole.py index 78e274b..fd3be45 100755 --- a/pronsole.py +++ b/pronsole.py @@ -147,9 +147,9 @@ class Settings: self.port = "" self.baudrate = 115200 self.temperature_pla = 185 - self.temperature_abs = 230.0 - self.bedtemp_pla = 60.0 - self.bedtemp_abs = 110.0 + self.temperature_abs = 230 + self.bedtemp_pla = 60 + self.bedtemp_abs = 110 self.xy_feedrate = 3000 self.z_feedrate = 200 self.e_feedrate = 300 diff --git a/pronterface.py b/pronterface.py index 3ac803f..4487a0f 100755 --- a/pronterface.py +++ b/pronterface.py @@ -117,6 +117,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.starttime=0 self.curlayer=0 self.cur_button=None + self.hsetpoint=0.0 + self.bsetpoint=0.0 def startcb(self): self.starttime=time.time() @@ -184,14 +186,29 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.p.online: self.p.send_now("M104 S"+l) print _("Setting hotend temperature to "),f,_(" degrees Celsius.") - self.htemp.SetValue(l) - self.set("last_temperature",str(f)) + self.hsetpoint=f + #self.tgauge.SetTarget(int(f)) + if f>0: + self.htemp.SetValue(l) + self.set("last_temperature",str(f)) + self.settoff.SetBackgroundColour("") + self.settoff.SetForegroundColour("") + self.settbtn.SetBackgroundColour("#FFAA66") + self.settbtn.SetForegroundColour("#660000") + self.htemp.SetBackgroundColour("#FFDABB") + else: + self.settoff.SetBackgroundColour("#0044CC") + self.settoff.SetForegroundColour("white") + self.settbtn.SetBackgroundColour("") + self.settbtn.SetForegroundColour("") + self.htemp.SetBackgroundColour("white") + self.htemp.Refresh() else: print _("Printer is not online.") else: print _("You cannot set negative temperatures. To turn the hotend off entirely, set its temperature to 0.") - except: - print _("You must enter a temperature.") + except Exception,x: + print _("You must enter a temperature. (%s)" % (repr(x),)) def do_bedtemp(self,l=""): try: @@ -205,8 +222,22 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if self.p.online: self.p.send_now("M140 S"+l) print _("Setting bed temperature to "),f,_(" degrees Celsius.") - self.btemp.SetValue(l) - self.set("last_bed_temperature",str(f)) + self.bsetpoint=f + if f>0: + self.btemp.SetValue(l) + self.set("last_bed_temperature",str(f)) + self.setboff.SetBackgroundColour("") + self.setboff.SetForegroundColour("") + self.setbbtn.SetBackgroundColour("#FFAA66") + self.setbbtn.SetForegroundColour("#660000") + self.btemp.SetBackgroundColour("#FFDABB") + else: + self.setboff.SetBackgroundColour("#0044CC") + self.setboff.SetForegroundColour("white") + self.setbbtn.SetBackgroundColour("") + self.setbbtn.SetForegroundColour("") + self.btemp.SetBackgroundColour("white") + self.btemp.Refresh() else: print _("Printer is not online.") else: @@ -409,6 +440,14 @@ class PronterWindow(wx.Frame,pronsole.pronsole): uts.Add(self.resetbtn) self.minibtn=wx.Button(self.panel,-1,_("Mini mode"),pos=(690,0)) self.minibtn.Bind(wx.EVT_BUTTON,self.toggleview) + #self.tgauge=TempGauge(self.panel,size=(300,24)) + #def scroll_setpoint(e): + # if e.GetWheelRotation()>0: + # self.do_settemp(str(self.hsetpoint+1)) + # elif e.GetWheelRotation()<0: + # self.do_settemp(str(max(0,self.hsetpoint-1))) + #self.tgauge.Bind(wx.EVT_MOUSEWHEEL,scroll_setpoint) + uts.Add((10,-1)) self.monitorbox=wx.CheckBox(self.panel,-1,"",pos=(450,37)) uts.Add((15,-1)) @@ -418,6 +457,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): uts.Add((15,-1),flag=wx.EXPAND) uts.Add(self.minibtn) + #uts.Add(self.tgauge) #SECOND ROW ubs=self.upperbottomsizer=wx.BoxSizer(wx.HORIZONTAL) @@ -489,31 +529,50 @@ class PronterWindow(wx.Frame,pronsole.pronsole): lls.Add(wx.StaticText(self.panel,-1,_("Heater:"),pos=(0,343)),pos=(3,0),span=(1,1),flag=wx.ALIGN_CENTER) htemp_choices=[self.temps[i]+" ("+i+")" for i in sorted(self.temps.keys(),key=lambda x:self.temps[x])] + self.settoff=wx.Button(self.panel,-1,_("Off"),size=(36,-1),pos=(45,335)) + self.settoff.Bind(wx.EVT_BUTTON,lambda e:self.do_settemp("off")) + self.printerControls.append(self.settoff) + lls.Add(self.settoff,pos=(3,1),span=(1,1)) + if self.settings.last_temperature not in map(float,self.temps.values()): htemp_choices = [str(self.settings.last_temperature)] + htemp_choices self.htemp=wx.ComboBox(self.panel, -1, - choices=htemp_choices,style=wx.CB_DROPDOWN, size=(90,25),pos=(45,337)) + choices=htemp_choices,style=wx.CB_DROPDOWN, size=(80,25),pos=(45,337)) + self.htemp.Bind(wx.EVT_COMBOBOX,self.htemp_change) - - lls.Add(self.htemp,pos=(3,1),span=(1,3)) - self.settbtn=wx.Button(self.panel,-1,_("Set"),size=(38,-1),pos=(135,335)) + lls.Add(self.htemp,pos=(3,2),span=(1,2)) + self.settbtn=wx.Button(self.panel,-1,_("Set"),size=(36,-1),pos=(125,335)) self.settbtn.Bind(wx.EVT_BUTTON,self.do_settemp) self.printerControls.append(self.settbtn) lls.Add(self.settbtn,pos=(3,4),span=(1,1)) + lls.Add(wx.StaticText(self.panel,-1,_("Bed:"),pos=(0,343)),pos=(4,0),span=(1,1),flag=wx.ALIGN_CENTER) btemp_choices=[self.bedtemps[i]+" ("+i+")" for i in sorted(self.bedtemps.keys(),key=lambda x:self.temps[x])] + + self.setboff=wx.Button(self.panel,-1,_("Off"),size=(36,-1),pos=(135,335)) + self.setboff.Bind(wx.EVT_BUTTON,lambda e:self.do_bedtemp("off")) + self.printerControls.append(self.setboff) + lls.Add(self.setboff,pos=(4,1),span=(1,1)) + if self.settings.last_bed_temperature not in map(float,self.bedtemps.values()): btemp_choices = [str(self.settings.last_bed_temperature)] + btemp_choices self.btemp=wx.ComboBox(self.panel, -1, - choices=btemp_choices,style=wx.CB_DROPDOWN, size=(90,25),pos=(45,367)) + choices=btemp_choices,style=wx.CB_DROPDOWN, size=(80,25),pos=(135,367)) + self.btemp.Bind(wx.EVT_COMBOBOX,self.btemp_change) + lls.Add(self.btemp,pos=(4,2),span=(1,2)) + + self.setbbtn=wx.Button(self.panel,-1,_("Set"),size=(38,-1),pos=(135,365)) + self.setbbtn.Bind(wx.EVT_BUTTON,self.do_bedtemp) + self.printerControls.append(self.setbbtn) + lls.Add(self.setbbtn,pos=(4,4),span=(1,2)) + self.btemp.SetValue(str(self.settings.last_bed_temperature)) self.htemp.SetValue(str(self.settings.last_temperature)) - - + ## added for an error where only the bed would get (pla) or (abs). #This ensures, if last temp is a default pla or abs, it will be marked so. # if it is not, then a (user) remark is added. This denotes a manual entry - + for i in btemp_choices: if i.split()[0] == str(self.settings.last_bed_temperature).split('.')[0] or i.split()[0] == str(self.settings.last_bed_temperature): self.btemp.SetValue(i) @@ -526,12 +585,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if( '(' not in self.htemp.Value): self.htemp.SetValue(self.htemp.Value + ' (user)') - - lls.Add(self.btemp,pos=(4,1),span=(1,3)) - self.setbbtn=wx.Button(self.panel,-1,_("Set"),size=(38,-1),pos=(135,365)) - self.setbbtn.Bind(wx.EVT_BUTTON,self.do_bedtemp) - self.printerControls.append(self.setbbtn) - lls.Add(self.setbbtn,pos=(4,4),span=(1,2)) + #lls.Add(self.btemp,pos=(4,1),span=(1,3)) + #lls.Add(self.setbbtn,pos=(4,4),span=(1,2)) self.tempdisp=wx.StaticText(self.panel,-1,"") lls.Add(self.tempdisp,pos=(4,6),span=(1,3)) @@ -593,6 +648,16 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #uts.Layout() self.cbuttons_reload() + def htemp_change(self,event): + if self.hsetpoint > 0: + self.do_settemp("") + wx.CallAfter(self.htemp.SetInsertionPoint,0) + + def btemp_change(self,event): + if self.bsetpoint > 0: + self.do_bedtemp("") + wx.CallAfter(self.btemp.SetInsertionPoint,0) + def showwin(self,event): if(self.f is not None): self.gwindow.Show() @@ -642,28 +707,39 @@ class PronterWindow(wx.Frame,pronsole.pronsole): #sizer.Remove(button) button.Destroy() self.custombuttonbuttons=[] + newbuttonbuttonindex = len(self.custombuttons) + while newbuttonbuttonindex>0 and self.custombuttons[newbuttonbuttonindex-1] is None: + newbuttonbuttonindex -= 1 while len(self.custombuttons) < 13: self.custombuttons.append(None) for i in xrange(len(self.custombuttons)): btndef = self.custombuttons[i] try: b=wx.Button(self.panel,-1,btndef[0]) + b.SetToolTip(wx.ToolTip(_("Execute command: ")+btndef[1])) if len(btndef)>2: b.SetBackgroundColour(btndef[2]) rr,gg,bb=b.GetBackgroundColour().Get() if 0.3*rr+0.59*gg+0.11*bb < 60: b.SetForegroundColour("#ffffff") except: - b=wx.StaticText(self.panel,-1,"",size=(72,20),style=wx.ALIGN_CENTRE+wx.ST_NO_AUTORESIZE) #+wx.SIMPLE_BORDER - #b.Freeze() - b.Disable() + if i == newbuttonbuttonindex: + self.newbuttonbutton=b=wx.Button(self.panel,-1,"+",size=(19,18)) + #b.SetFont(wx.Font(12,wx.FONTFAMILY_SWISS,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD)) + b.SetForegroundColour("#4444ff") + b.SetToolTip(wx.ToolTip(_("click to add new custom button"))) + b.Bind(wx.EVT_BUTTON,self.cbutton_edit) + else: + b=wx.StaticText(self.panel,-1,"",size=(72,22),style=wx.ALIGN_CENTRE+wx.ST_NO_AUTORESIZE) #+wx.SIMPLE_BORDER + #b.Freeze() + b.Disable() b.custombutton=i b.properties=btndef if btndef is not None: b.Bind(wx.EVT_BUTTON,self.procbutton) b.Bind(wx.EVT_MOUSE_EVENTS,self.editbutton) - else: - b.Bind(wx.EVT_BUTTON,lambda e:e.Skip()) + #else: + # b.Bind(wx.EVT_BUTTON,lambda e:e.Skip()) self.custombuttonbuttons.append(b) if i<4: ubs.Add(b) @@ -761,7 +837,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole): self.cbutton_save(n,None) #while len(self.custombuttons) and self.custombuttons[-1] is None: # del self.custombuttons[-1] - self.cbuttons_reload() + wx.CallAfter(self.cbuttons_reload) def cbutton_order(self,e,button,dir): n = button.custombutton @@ -815,7 +891,14 @@ class PronterWindow(wx.Frame,pronsole.pronsole): return if not hasattr(self,"dragging"): # init dragging of the custom button - if hasattr(obj,"custombutton"): + if hasattr(obj,"custombutton") and obj.properties is not None: + self.newbuttonbutton.SetLabel("") + self.newbuttonbutton.SetFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL)) + self.newbuttonbutton.SetForegroundColour("black") + self.newbuttonbutton.SetSize(obj.GetSize()) + if self.upperbottomsizer.GetItem(self.newbuttonbutton) is not None: + self.upperbottomsizer.SetItemMinSize(self.newbuttonbutton,obj.GetSize()) + self.topsizer.Layout() self.dragging = wx.Button(self.panel,-1,obj.GetLabel()) self.dragging.SetBackgroundColour(obj.GetBackgroundColour()) self.dragging.SetForegroundColour(obj.GetForegroundColour()) @@ -998,6 +1081,10 @@ class PronterWindow(wx.Frame,pronsole.pronsole): pass string+=(self.tempreport.replace("\r","").replace("T",_("Hotend")).replace("B",_("Bed")).replace("\n","").replace("ok ",""))+" " wx.CallAfter(self.tempdisp.SetLabel,self.tempreport.strip().replace("ok ","")) + #try: + # self.tgauge.SetValue(int(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) + #except: + # pass if self.sdprinting: string+= _(" SD printing:%04.2f %%") % (self.percentdone,) if self.p.printing: @@ -1035,6 +1122,10 @@ class PronterWindow(wx.Frame,pronsole.pronsole): if "T:" in l: self.tempreport=l wx.CallAfter(self.tempdisp.SetLabel,self.tempreport.strip().replace("ok ","")) + #try: + # self.tgauge.SetValue(int(filter(lambda x:x.startswith("T:"),self.tempreport.split())[0].split(":")[1])) + #except: + # pass tstring=l.rstrip() #print tstring if(tstring!="ok"): @@ -1497,6 +1588,89 @@ class ButtonEdit(wx.Dialog): if self.name.GetValue()=="": self.name.SetValue(macro) +class TempGauge(wx.Panel): + def __init__(self,parent,size=(200,22)): + wx.Panel.__init__(self,parent,-1,size=size) + self.Bind(wx.EVT_PAINT,self.paint) + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + self.width,self.height=size + self.value=0 + self.setpoint=0 + self.recalc() + def recalc(self): + self.max=max(int(self.setpoint*1.05),240) + self.scale=float(self.width-2)/float(self.max) + self.ypt=int(self.scale*max(self.setpoint,40)) + def SetValue(self,value): + self.value=value + wx.CallAfter(self.Refresh) + def SetTarget(self,value): + self.setpoint=value + self.recalc() + wx.CallAfter(self.Refresh) + def paint(self,ev): + x0,y0,x1,y1,xE,yE = 1,1,self.ypt+1,1,self.width+1-2,20 + dc=wx.PaintDC(self) + dc.SetBackground(wx.Brush((255,255,255))) + dc.Clear() + cold,medium,hot = wx.Colour(0,167,223),wx.Colour(239,233,119),wx.Colour(210,50.100) + gauge1,gauge2 = wx.Colour(255,255,210),wx.Colour(234,82,0) + shadow1,shadow2 = wx.Colour(110,110,110),wx.Colour(255,255,255) + gc = wx.GraphicsContext.Create(dc) + # draw shadow first + # corners + gc.SetBrush(gc.CreateRadialGradientBrush(xE-7,9,xE-7,9,8,shadow1,shadow2)) + gc.DrawRectangle(xE-7,1,8,8) + gc.SetBrush(gc.CreateRadialGradientBrush(xE-7,17,xE-7,17,8,shadow1,shadow2)) + gc.DrawRectangle(xE-7,17,8,8) + gc.SetBrush(gc.CreateRadialGradientBrush(x0+6,17,x0+6,17,8,shadow1,shadow2)) + gc.DrawRectangle(0,17,x0+6,8) + # edges + gc.SetBrush(gc.CreateLinearGradientBrush(xE-13,0,xE-6,0,shadow1,shadow2)) + gc.DrawRectangle(xE-6,9,10,8) + gc.SetBrush(gc.CreateLinearGradientBrush(x0,yE-2,x0,yE+5,shadow1,shadow2)) + gc.DrawRectangle(x0+6,yE-2,xE-12,7) + # draw gauge background + gc.SetBrush(gc.CreateLinearGradientBrush(x0,y0,x1+1,y1,cold,medium)) + gc.DrawRoundedRectangle(x0,y0,x1+4,yE,6) + gc.SetBrush(gc.CreateLinearGradientBrush(x1-2,y1,xE,y1,medium,hot)) + gc.DrawRoundedRectangle(x1-2,y1,xE-x1,yE,6) + # draw gauge + gc.SetBrush(gc.CreateLinearGradientBrush(x0,y0+3,x0,y0+15,gauge1,gauge2)) + #gc.SetBrush(gc.CreateLinearGradientBrush(0,3,0,15,wx.Colour(255,255,255),wx.Colour(255,90,32))) + width=12 + w1=y0+9-width/2 + w2=w1+width + value=x0+max(10,min(self.width+1-2,int(self.value*self.scale))) + val_path = gc.CreatePath() + val_path.MoveToPoint(x0,w1) + val_path.AddLineToPoint(value,w1) + val_path.AddLineToPoint(value+2,w1+width/4) + val_path.AddLineToPoint(value+2,w2-width/4) + val_path.AddLineToPoint(value,w2) + #val_path.AddLineToPoint(value-4,10) + val_path.AddLineToPoint(x0,w2) + gc.DrawPath(val_path) + # draw setpoint markers + setpoint=x0+max(10,int(self.setpoint*self.scale)) + gc.SetBrush(gc.CreateBrush(wx.Brush(wx.Colour(0,0,0)))) + setp_path = gc.CreatePath() + setp_path.MoveToPoint(setpoint-4,y0) + setp_path.AddLineToPoint(setpoint+4,y0) + setp_path.AddLineToPoint(setpoint,y0+5) + setp_path.MoveToPoint(setpoint-4,yE) + setp_path.AddLineToPoint(setpoint+4,yE) + setp_path.AddLineToPoint(setpoint,yE-5) + gc.DrawPath(setp_path) + # draw readout + text=u"T\u00B0 %u/%u"%(self.value,self.setpoint) + #gc.SetFont(gc.CreateFont(wx.Font(12,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) + #gc.DrawText(text,29,-2) + gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD),wx.WHITE)) + gc.DrawText(text,x0+31,y0+1) + gc.SetFont(gc.CreateFont(wx.Font(10,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_BOLD))) + gc.DrawText(text,x0+30,y0+0) + if __name__ == '__main__': app = wx.App(False) main = PronterWindow()