chiark / gitweb /
Add realtime speed controls to printer interface.
authordaid <daid303@gmail.com>
Tue, 26 Jun 2012 13:42:56 +0000 (15:42 +0200)
committerdaid <daid303@gmail.com>
Tue, 26 Jun 2012 13:42:56 +0000 (15:42 +0200)
Cura/gui/printWindow.py
Cura/util/machineCom.py

index 5ecfcddd260fb0d531035fc5fb0460c2fb9508b5..9290367755df9b63f0a22218fa501b674286cf1c 100644 (file)
@@ -85,6 +85,10 @@ class printWindow(wx.Frame):
                self.bedTemp = None\r
                self.bufferLineCount = 4\r
                self.sendCnt = 0\r
+               self.feedrateRatioOuterWall = 1.0\r
+               self.feedrateRatioInnerWall = 1.0\r
+               self.feedrateRatioFill = 1.0\r
+               self.feedrateRatioSupport = 1.0\r
 \r
                #self.SetIcon(icon.getMainIcon())\r
                \r
@@ -107,28 +111,35 @@ class printWindow(wx.Frame):
                self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
                self.progress = wx.Gauge(self.panel, -1)\r
                \r
-               h = self.connectButton.GetSize().GetHeight()\r
-               self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
-               self.temperatureSelect.SetRange(0, 400)\r
-               self.bedTemperatureLabel = wx.StaticText(self.panel, -1, "BedTemp:")\r
-               self.bedTemperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
-               self.bedTemperatureSelect.SetRange(0, 400)\r
-               self.bedTemperatureLabel.Show(False)\r
-               self.bedTemperatureSelect.Show(False)\r
-               \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(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
+\r
+               nb = wx.Notebook(self.panel)\r
+               self.sizer.Add(nb, pos=(0,3), span=(6,4))\r
                \r
-               self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))\r
-               self.sizer.Add(self.temperatureSelect, pos=(0,4))\r
-               self.sizer.Add(self.bedTemperatureLabel, pos=(0,5))\r
-               self.sizer.Add(self.bedTemperatureSelect, pos=(0,6))\r
+               self.temperaturePanel = wx.Panel(nb)\r
+               sizer = wx.GridBagSizer(2, 2)\r
+               self.temperaturePanel.SetSizer(sizer)\r
+\r
+               self.temperatureSelect = wx.SpinCtrl(self.temperaturePanel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.temperatureSelect.SetRange(0, 400)\r
+               self.bedTemperatureLabel = wx.StaticText(self.temperaturePanel, -1, "BedTemp:")\r
+               self.bedTemperatureSelect = wx.SpinCtrl(self.temperaturePanel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.bedTemperatureSelect.SetRange(0, 400)\r
+               self.bedTemperatureLabel.Show(False)\r
+               self.bedTemperatureSelect.Show(False)\r
                \r
-               self.directControlPanel = wx.Panel(self.panel)\r
-               self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4))\r
+               sizer.Add(wx.StaticText(self.temperaturePanel, -1, "Temp:"), pos=(0,0))\r
+               sizer.Add(self.temperatureSelect, pos=(0,1))\r
+               sizer.Add(self.bedTemperatureLabel, pos=(1,0))\r
+               sizer.Add(self.bedTemperatureSelect, pos=(1,1))\r
+\r
+               nb.AddPage(self.temperaturePanel, 'Temp')\r
+\r
+               self.directControlPanel = wx.Panel(nb)\r
                \r
                sizer = wx.GridBagSizer(2, 2)\r
                self.directControlPanel.SetSizer(sizer)\r
@@ -160,6 +171,36 @@ class printWindow(wx.Frame):
                sizer.Add(PrintCommandButton(self, 'G1 Z-1 F200', 'print-move-z-1.png'), pos=(5,7))\r
                sizer.Add(PrintCommandButton(self, 'G1 Z-10 F200', 'print-move-z-10.png'), pos=(6,7))\r
 \r
+               nb.AddPage(self.directControlPanel, 'Jog')\r
+\r
+               self.speedPanel = wx.Panel(nb)\r
+               sizer = wx.GridBagSizer(2, 2)\r
+               self.speedPanel.SetSizer(sizer)\r
+\r
+               self.outerWallSpeedSelect = wx.SpinCtrl(self.speedPanel, -1, '100', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.outerWallSpeedSelect.SetRange(5, 1000)\r
+               self.innerWallSpeedSelect = wx.SpinCtrl(self.speedPanel, -1, '100', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.innerWallSpeedSelect.SetRange(5, 1000)\r
+               self.fillSpeedSelect = wx.SpinCtrl(self.speedPanel, -1, '100', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.fillSpeedSelect.SetRange(5, 1000)\r
+               self.supportSpeedSelect = wx.SpinCtrl(self.speedPanel, -1, '100', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.supportSpeedSelect.SetRange(5, 1000)\r
+               \r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "Outer wall:"), pos=(0,0))\r
+               sizer.Add(self.outerWallSpeedSelect, pos=(0,1))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(0,2))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "Inner wall:"), pos=(1,0))\r
+               sizer.Add(self.innerWallSpeedSelect, pos=(1,1))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(1,2))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "Fill:"), pos=(2,0))\r
+               sizer.Add(self.fillSpeedSelect, pos=(2,1))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(2,2))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "Support:"), pos=(3,0))\r
+               sizer.Add(self.supportSpeedSelect, pos=(3,1))\r
+               sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(3,2))\r
+\r
+               nb.AddPage(self.speedPanel, 'Speed')\r
+\r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(0)\r
                \r
@@ -171,11 +212,16 @@ class printWindow(wx.Frame):
                \r
                self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)\r
                self.Bind(wx.EVT_SPINCTRL, self.OnBedTempChange, self.bedTemperatureSelect)\r
+\r
+               self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.outerWallSpeedSelect)\r
+               self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.innerWallSpeedSelect)\r
+               self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.fillSpeedSelect)\r
+               self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.supportSpeedSelect)\r
                \r
                self.Layout()\r
                self.Fit()\r
                self.Centre()\r
-               \r
+\r
                self.UpdateButtonStates()\r
                self.UpdateProgress()\r
        \r
@@ -208,6 +254,7 @@ class printWindow(wx.Frame):
                        status += 'Bed Temp: %d\n' % (self.bedTemp)\r
                        self.bedTemperatureLabel.Show(True)\r
                        self.bedTemperatureSelect.Show(True)\r
+                       self.temperaturePanel.Layout()\r
                self.statsText.SetLabel(status.strip())\r
                self.Layout()\r
        \r
@@ -253,24 +300,36 @@ class printWindow(wx.Frame):
 \r
        def OnBedTempChange(self, e):\r
                self.sendCommand("M140 S%d" % (self.bedTemperatureSelect.GetValue()))\r
+       \r
+       def OnSpeedChange(self, e):\r
+               self.feedrateRatioOuterWall = self.outerWallSpeedSelect.GetValue() / 100.0\r
+               self.feedrateRatioInnerWall = self.innerWallSpeedSelect.GetValue() / 100.0\r
+               self.feedrateRatioFill = self.fillSpeedSelect.GetValue() / 100.0\r
+               self.feedrateRatioSupport = self.supportSpeedSelect.GetValue() / 100.0\r
 \r
        def LoadGCodeFile(self, filename):\r
                if self.printIdx != None:\r
                        return\r
                #Send an initial M110 to reset the line counter to zero.\r
+               lineType = 'CUSTOM'\r
                gcodeList = ["M110"]\r
+               typeList = [lineType]\r
                for line in open(filename, 'r'):\r
+                       if line.startswith(';TYPE:'):\r
+                               lineType = line[6:].strip()\r
                        if ';' in line:\r
                                line = line[0:line.find(';')]\r
                        line = line.strip()\r
                        if len(line) > 0:\r
                                gcodeList.append(line)\r
+                               typeList.append(lineType)\r
                gcode = gcodeInterpreter.gcode()\r
                gcode.loadList(gcodeList)\r
                print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
                self.progress.SetRange(len(gcodeList))\r
                self.gcode = gcode\r
                self.gcodeList = gcodeList\r
+               self.typeList = typeList\r
                self.UpdateButtonStates()\r
                self.UpdateProgress()\r
                \r
@@ -284,8 +343,19 @@ class printWindow(wx.Frame):
        def sendLine(self, lineNr):\r
                if lineNr >= len(self.gcodeList):\r
                        return False\r
-               checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr])))\r
-               self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum))\r
+               line = self.gcodeList[lineNr]\r
+               if self.typeList[lineNr] == 'WALL-OUTER':\r
+                       line = re.sub('F([0-9]*)', lambda m: 'F' + str(int(int(m.group(1)) * self.feedrateRatioOuterWall)), line)\r
+               if self.typeList[lineNr] == 'WALL-INNER':\r
+                       print line\r
+                       line = re.sub('F([0-9]*)', lambda m: 'F' + str(int(int(m.group(1)) * self.feedrateRatioInnerWall)), line)\r
+                       print line\r
+               if self.typeList[lineNr] == 'FILL':\r
+                       line = re.sub('F([0-9]*)', lambda m: 'F' + str(int(int(m.group(1)) * self.feedrateRatioFill)), line)\r
+               if self.typeList[lineNr] == 'SUPPORT':\r
+                       line = re.sub('F([0-9]*)', lambda m: 'F' + str(int(int(m.group(1)) * self.feedrateRatioSupport)), line)\r
+               checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, line)))\r
+               self.machineCom.sendCommand("N%d%s*%d" % (lineNr, line, checksum))\r
                return True\r
 \r
        def PrinterMonitor(self):\r
index 66e10d186ef2645f227ad0423ecd7bcd5e1b8136..3ee88c9edf74a52e9db8bf2cab122233e15f3134 100644 (file)
@@ -40,7 +40,7 @@ class VirtualPrinter():
        def write(self, data):
                if self.readList == None:
                        return
-               print "Send: %s" % (data.rstrip())
+               #print "Send: %s" % (data.rstrip())
                if 'M104' in data or 'M109' in data:
                        try:
                                self.targetTemp = float(data[data.find('S')+1:])
@@ -69,8 +69,8 @@ class VirtualPrinter():
                                return ''
                        if self.readList == None:
                                return ''
-               time.sleep(0.001)
-               print "Recv: %s" % (self.readList[0].rstrip())
+               time.sleep(0.01)
+               #print "Recv: %s" % (self.readList[0].rstrip())
                return self.readList.pop(0)
        
        def close(self):