From a8963b1cc1e96e16c2fcec2fc433df98863a41a3 Mon Sep 17 00:00:00 2001 From: daid Date: Mon, 2 Apr 2012 18:56:44 +0200 Subject: [PATCH] Make the printer interface a bit more user friendly. --- Cura/gui/printWindow.py | 57 +++++++++++++++++++++++++++++------ Cura/util/gcodeInterpreter.py | 20 +++++++----- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index 1b19a4c7..9881f82a 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -5,6 +5,7 @@ import wx, threading from gui import machineCom from gui import icon +from util import gcodeInterpreter printWindowHandle = None @@ -21,6 +22,7 @@ class printWindow(wx.Frame): def __init__(self): super(printWindow, self).__init__(None, -1, title='Printing') self.machineCom = None + self.machineConnected = False self.thread = None self.gcodeList = None self.printIdx = None @@ -37,8 +39,8 @@ class printWindow(wx.Frame): sb = wx.StaticBox(self.panel, label="Statistics") boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) - boxsizer.Add(wx.StaticText(self.panel, -1, "Filament: #.##m #.##g"), flag=wx.LEFT, border=5) - boxsizer.Add(wx.StaticText(self.panel, -1, "Print time: ##:##"), flag=wx.LEFT, border=5) + self.statsText = wx.StaticText(self.panel, -1, "Filament: #.##m #.##g\nPrint time: ##:##") + boxsizer.Add(self.statsText, flag=wx.LEFT, border=5) self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND) @@ -46,11 +48,12 @@ class printWindow(wx.Frame): self.loadButton = wx.Button(self.panel, -1, 'Load GCode') self.printButton = wx.Button(self.panel, -1, 'Print GCode') self.cancelButton = wx.Button(self.panel, -1, 'Cancel print') + self.progress = wx.Gauge(self.panel, -1) self.sizer.Add(self.connectButton, pos=(0,1)) self.sizer.Add(self.loadButton, pos=(1,1)) self.sizer.Add(self.printButton, pos=(2,1)) self.sizer.Add(self.cancelButton, pos=(3,1)) - self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND) + self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND) self.sizer.AddGrowableRow(3) self.sizer.AddGrowableCol(0) @@ -63,6 +66,24 @@ class printWindow(wx.Frame): self.Layout() self.Fit() self.Centre() + + self.UpdateButtonStates() + self.UpdateProgress() + + def UpdateButtonStates(self): + self.connectButton.Enable(not self.machineConnected) + self.loadButton.Enable(self.printIdx == None) + self.printButton.Enable(self.machineConnected and self.gcodeList != None and self.printIdx == None) + self.cancelButton.Enable(self.printIdx != None) + + def UpdateProgress(self): + status = "" + if self.printIdx == None: + self.progress.SetValue(0) + else: + self.progress.SetValue(self.printIdx) + status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList)) + self.statsText.SetLabel(status) def OnConnect(self, e): if self.machineCom != None: @@ -71,12 +92,13 @@ class printWindow(wx.Frame): self.machineCom = machineCom.MachineCom() self.thread = threading.Thread(target=self.PrinterMonitor) self.thread.start() + self.UpdateButtonStates() def OnLoad(self, e): pass def OnPrint(self, e): - if self.machineCom == None: + if not self.machineConnected: return if self.gcodeList == None: return @@ -85,9 +107,11 @@ class printWindow(wx.Frame): self.printIdx = 1 self.sendLine(0) self.sendCnt = self.bufferLineCount + self.UpdateButtonStates() def OnCancel(self, e): - pass + self.printIdx = None + self.UpdateButtonStates() def OnClose(self, e): global printWindowHandle @@ -105,8 +129,15 @@ class printWindow(wx.Frame): line = line.strip() if len(line) > 0: gcodeList.append(line) + gcode = gcodeInterpreter.gcode() + gcode.loadList(gcodeList) + print gcode.extrusionAmount + print gcode.totalMoveTimeMinute print "Loaded: %s (%d)" % (filename, len(gcodeList)) + self.progress.SetRange(len(gcodeList)) self.gcodeList = gcodeList + self.UpdateButtonStates() + self.UpdateProgress() def sendLine(self, lineNr): if lineNr >= len(self.gcodeList): @@ -119,11 +150,17 @@ class printWindow(wx.Frame): while True: line = self.machineCom.readline() if line == None: + self.machineConnected = False + wx.CallAfter(self.UpdateButtonState) return - while self.sendCnt > 0: - self.sendLine(self.printIdx) - self.printIdx += 1 - self.sendCnt -= 1 + if self.machineConnected: + while self.sendCnt > 0: + self.sendLine(self.printIdx) + self.printIdx += 1 + self.sendCnt -= 1 + elif line.startswith("start"): + self.machineConnected = True + wx.CallAfter(self.UpdateButtonState) if self.printIdx != None: if line.startswith("ok"): if skipCount > 0: @@ -131,6 +168,7 @@ class printWindow(wx.Frame): else: self.sendLine(self.printIdx) self.printIdx += 1 + wx.CallAfter(self.UpdateProgress) elif "resend" in line.lower() or "rs" in line: try: lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1]) @@ -138,3 +176,4 @@ class printWindow(wx.Frame): if "rs" in line: lineNr=int(line.split()[1]) self.printIdx = lineNr + diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 347eabed..06ebd5ac 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -23,9 +23,16 @@ class gcode(): self.progressCallback = None def load(self, filename): - fileSize = os.stat(filename).st_size - filePos = 0 + self._fileSize = os.stat(filename).st_size gcodeFile = open(filename, 'r') + self._load(gcodeFile) + gcodeFile.close() + + def loadList(self, l): + self._load(l) + + def _load(self, gcodeFile): + filePos = 0 pos = util3d.Vector3() posOffset = util3d.Vector3() currentE = 0.0 @@ -42,10 +49,10 @@ class gcode(): currentPath.list[0].e = totalExtrusion currentLayer.append(currentPath) for line in gcodeFile: - if filePos != gcodeFile.tell(): - filePos = gcodeFile.tell() - if self.progressCallback != None: - self.progressCallback(float(filePos) / float(fileSize)) + if self.progressCallback != None: + if filePos != gcodeFile.tell(): + filePos = gcodeFile.tell() + self.progressCallback(float(filePos) / float(self._fileSize)) #Parse Cura_SF comments if line.startswith(';TYPE:'): @@ -183,7 +190,6 @@ class gcode(): pass else: print "Unknown M code:" + str(M) - gcodeFile.close() self.layerList.append(currentLayer) self.extrusionAmount = maxExtrusion self.totalMoveTimeMinute = totalMoveTimeMinute -- 2.30.2