chiark / gitweb /
Make the printer interface a bit more user friendly.
authordaid <daid303@gmail.com>
Mon, 2 Apr 2012 16:56:44 +0000 (18:56 +0200)
committerdaid <daid303@gmail.com>
Mon, 2 Apr 2012 16:56:44 +0000 (18:56 +0200)
Cura/gui/printWindow.py
Cura/util/gcodeInterpreter.py

index 1b19a4c76a9ac06247e36784623df13b7db2a11e..9881f82a2a151bbe191a2bb4e1872cb039076ad7 100644 (file)
@@ -5,6 +5,7 @@ import wx, threading
 \r
 from gui import machineCom\r
 from gui import icon\r
+from util import gcodeInterpreter\r
 \r
 printWindowHandle = None\r
 \r
@@ -21,6 +22,7 @@ class printWindow(wx.Frame):
        def __init__(self):\r
                super(printWindow, self).__init__(None, -1, title='Printing')\r
                self.machineCom = None\r
+               self.machineConnected = False\r
                self.thread = None\r
                self.gcodeList = None\r
                self.printIdx = None\r
@@ -37,8 +39,8 @@ class printWindow(wx.Frame):
                \r
                sb = wx.StaticBox(self.panel, label="Statistics")\r
                boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)\r
-               boxsizer.Add(wx.StaticText(self.panel, -1, "Filament: #.##m #.##g"), flag=wx.LEFT, border=5)\r
-               boxsizer.Add(wx.StaticText(self.panel, -1, "Print time: ##:##"), flag=wx.LEFT, border=5)\r
+               self.statsText = wx.StaticText(self.panel, -1, "Filament: #.##m #.##g\nPrint time: ##:##")\r
+               boxsizer.Add(self.statsText, flag=wx.LEFT, border=5)\r
                \r
                self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND)\r
                \r
@@ -46,11 +48,12 @@ class printWindow(wx.Frame):
                self.loadButton = wx.Button(self.panel, -1, 'Load GCode')\r
                self.printButton = wx.Button(self.panel, -1, 'Print GCode')\r
                self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
+               self.progress = wx.Gauge(self.panel, -1)\r
                self.sizer.Add(self.connectButton, pos=(0,1))\r
                self.sizer.Add(self.loadButton, pos=(1,1))\r
                self.sizer.Add(self.printButton, pos=(2,1))\r
                self.sizer.Add(self.cancelButton, pos=(3,1))\r
-               self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
+               self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(0)\r
                \r
@@ -63,6 +66,24 @@ class printWindow(wx.Frame):
                self.Layout()\r
                self.Fit()\r
                self.Centre()\r
+               \r
+               self.UpdateButtonStates()\r
+               self.UpdateProgress()\r
+       \r
+       def UpdateButtonStates(self):\r
+               self.connectButton.Enable(not self.machineConnected)\r
+               self.loadButton.Enable(self.printIdx == None)\r
+               self.printButton.Enable(self.machineConnected and self.gcodeList != None and self.printIdx == None)\r
+               self.cancelButton.Enable(self.printIdx != None)\r
+       \r
+       def UpdateProgress(self):\r
+               status = ""\r
+               if self.printIdx == None:\r
+                       self.progress.SetValue(0)\r
+               else:\r
+                       self.progress.SetValue(self.printIdx)\r
+                       status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList))\r
+               self.statsText.SetLabel(status)\r
        \r
        def OnConnect(self, e):\r
                if self.machineCom != None:\r
@@ -71,12 +92,13 @@ class printWindow(wx.Frame):
                self.machineCom = machineCom.MachineCom()\r
                self.thread = threading.Thread(target=self.PrinterMonitor)\r
                self.thread.start()\r
+               self.UpdateButtonStates()\r
        \r
        def OnLoad(self, e):\r
                pass\r
        \r
        def OnPrint(self, e):\r
-               if self.machineCom == None:\r
+               if not self.machineConnected:\r
                        return\r
                if self.gcodeList == None:\r
                        return\r
@@ -85,9 +107,11 @@ class printWindow(wx.Frame):
                self.printIdx = 1\r
                self.sendLine(0)\r
                self.sendCnt = self.bufferLineCount\r
+               self.UpdateButtonStates()\r
        \r
        def OnCancel(self, e):\r
-               pass\r
+               self.printIdx = None\r
+               self.UpdateButtonStates()\r
        \r
        def OnClose(self, e):\r
                global printWindowHandle\r
@@ -105,8 +129,15 @@ class printWindow(wx.Frame):
                        line = line.strip()\r
                        if len(line) > 0:\r
                                gcodeList.append(line)\r
+               gcode = gcodeInterpreter.gcode()\r
+               gcode.loadList(gcodeList)\r
+               print gcode.extrusionAmount\r
+               print gcode.totalMoveTimeMinute\r
                print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
+               self.progress.SetRange(len(gcodeList))\r
                self.gcodeList = gcodeList\r
+               self.UpdateButtonStates()\r
+               self.UpdateProgress()\r
 \r
        def sendLine(self, lineNr):\r
                if lineNr >= len(self.gcodeList):\r
@@ -119,11 +150,17 @@ class printWindow(wx.Frame):
                while True:\r
                        line = self.machineCom.readline()\r
                        if line == None:\r
+                               self.machineConnected = False\r
+                               wx.CallAfter(self.UpdateButtonState)\r
                                return\r
-                       while self.sendCnt > 0:\r
-                               self.sendLine(self.printIdx)\r
-                               self.printIdx += 1\r
-                               self.sendCnt -= 1\r
+                       if self.machineConnected:\r
+                               while self.sendCnt > 0:\r
+                                       self.sendLine(self.printIdx)\r
+                                       self.printIdx += 1\r
+                                       self.sendCnt -= 1\r
+                       elif line.startswith("start"):\r
+                               self.machineConnected = True\r
+                               wx.CallAfter(self.UpdateButtonState)\r
                        if self.printIdx != None:\r
                                if line.startswith("ok"):\r
                                        if skipCount > 0:\r
@@ -131,6 +168,7 @@ class printWindow(wx.Frame):
                                        else:\r
                                                self.sendLine(self.printIdx)\r
                                                self.printIdx += 1\r
+                                               wx.CallAfter(self.UpdateProgress)\r
                                elif "resend" in line.lower() or "rs" in line:\r
                                        try:\r
                                                lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1])\r
@@ -138,3 +176,4 @@ class printWindow(wx.Frame):
                                                if "rs" in line:\r
                                                        lineNr=int(line.split()[1])\r
                                        self.printIdx = lineNr\r
+\r
index 347eabede623698ff5abe452629f232682c462a8..06ebd5ac6d795fc4e708ab1a171070c65dea8105 100644 (file)
@@ -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