chiark / gitweb /
Only have 1 load thread at a time, else we run into strange bugs
authordaid <daid303@gmail.com>
Thu, 22 Mar 2012 15:04:53 +0000 (16:04 +0100)
committerdaid <daid303@gmail.com>
Thu, 22 Mar 2012 15:04:53 +0000 (16:04 +0100)
SkeinPyPy/newui/gcodeInterpreter.py
SkeinPyPy/newui/preview3d.py

index d4fc68f3fe796ba0920336dfd84d4925a4cac777..cd10cdfa793c5aeea066046436369876f9cbb40e 100644 (file)
@@ -10,9 +10,15 @@ import os
 from newui import util3d
 
 class gcode():
-       def __init__(self, filename):
+       def __init__(self):
                self.regMatch = {}
+               self.layerCount = 0
+               self.pathList = []
+               self.extrusionAmount = 0
+               self.totalMoveTimeMinute = 0
+               self.progressCallback = None
        
+       def load(self, filename):
                fileSize = os.stat(filename).st_size
                filePos = 0
                gcodeFile = open(filename, 'r')
@@ -34,7 +40,8 @@ class gcode():
                for line in gcodeFile:
                        if filePos != gcodeFile.tell():
                                filePos = gcodeFile.tell()
-                               #print float(filePos) / float(fileSize)
+                               if self.progressCallback != None:
+                                       self.progressCallback(float(filePos) / float(fileSize))
                        if line.startswith(';TYPE:'):
                                pathType = line[6:].strip()
                                if pathType != "CUSTOM":
@@ -185,5 +192,5 @@ class gcode():
 
 if __name__ == '__main__':
        for filename in sys.argv[1:]:
-               gcode(filename)
+               gcode().load(filename)
 
index 7d0c1b1dba5f594bfbfc1e8cf00cecb7844e48fd..5607f9c129958c6e78b92fcbe999bb7791ed5084 100644 (file)
@@ -36,6 +36,8 @@ class previewPanel(wx.Panel):
                self.triangleMesh = None\r
                self.gcode = None\r
                self.modelFilename = None\r
+               self.loadingProgressAmount = 0\r
+               self.loadThread = None\r
                self.machineSize = Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height')))\r
                self.machineCenter = Vector3(0, 0, 0)\r
                \r
@@ -192,15 +194,19 @@ class previewPanel(wx.Panel):
                self.gcodeFilename = filename[: filename.rfind('.')] + "_export.gcode"\r
                self.logFilename = filename[: filename.rfind('.')] + "_export.log"\r
                #Do the STL file loading in a background thread so we don't block the UI.\r
-               threading.Thread(target=self.doFileLoad).start()\r
+               if self.loadThread != None and self.loadThread.isAlive():\r
+                       self.loadThread.join()\r
+               self.loadThread = threading.Thread(target=self.doFileLoadThread)\r
+               self.loadThread.daemon = True\r
+               self.loadThread.start()\r
        \r
        def loadReModelFile(self, filename):\r
                #Only load this again if the filename matches the file we have already loaded (for auto loading GCode after slicing)\r
                if self.modelFilename != filename:\r
                        return\r
-               threading.Thread(target=self.doFileLoad).start()\r
+               self.loadModelFile(filename)\r
        \r
-       def doFileLoad(self):\r
+       def doFileLoadThread(self):\r
                if os.path.isfile(self.modelFilename) and self.modelFileTime != os.stat(self.modelFilename).st_mtime:\r
                        self.modelFileTime = os.stat(self.modelFilename).st_mtime\r
                        triangleMesh = fabmetheus_interpret.getCarving(self.modelFilename)\r
@@ -217,7 +223,10 @@ class previewPanel(wx.Panel):
                \r
                if os.path.isfile(self.gcodeFilename) and self.gcodeFileTime != os.stat(self.gcodeFilename).st_mtime:\r
                        self.gcodeFileTime = os.stat(self.gcodeFilename).st_mtime\r
-                       gcode = gcodeInterpreter.gcode(self.gcodeFilename)\r
+                       gcode = gcodeInterpreter.gcode()\r
+                       gcode.progressCallback = self.loadProgress\r
+                       gcode.load(self.gcodeFilename)\r
+                       self.loadingProgressAmount = 0\r
                        self.gcodeDirty = False\r
                        self.errorList = []\r
                        self.gcode = gcode\r
@@ -238,6 +247,10 @@ class previewPanel(wx.Panel):
                        self.errorList = errorList\r
                        wx.CallAfter(self.glCanvas.Refresh)\r
        \r
+       def loadProgress(self, progress):\r
+               self.loadingProgressAmount = progress\r
+               wx.CallAfter(self.glCanvas.Refresh)\r
+       \r
        def updateToolbar(self):\r
                self.layerSpin.Show(self.gcode != None)\r
                if self.gcode != None:\r
@@ -480,15 +493,16 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                                                glVertex3f(v3.x, v3.y, v3.z - 0.01)\r
                                                                glVertex3f(v2.x, v2.y, v2.z - 0.01)\r
                                                        glEnd()\r
-                                               for v in path['list']:\r
-                                                       glBegin(GL_TRIANGLE_FAN)\r
-                                                       glVertex3f(v.x, v.y, v.z - 0.001)\r
-                                                       for i in xrange(0, 16+1):\r
-                                                               if path['pathType'] == 'FILL':  #Remove depth buffer fighting on infill/wall overlap\r
-                                                                       glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02)\r
-                                                               else:\r
-                                                                       glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01)\r
-                                                       glEnd()\r
+                                               \r
+                                               #for v in path['list']:\r
+                                               #       glBegin(GL_TRIANGLE_FAN)\r
+                                               #       glVertex3f(v.x, v.y, v.z - 0.001)\r
+                                               #       for i in xrange(0, 16+1):\r
+                                               #               if path['pathType'] == 'FILL':  #Remove depth buffer fighting on infill/wall overlap\r
+                                               #                       glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02)\r
+                                               #               else:\r
+                                               #                       glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01)\r
+                                               #       glEnd()\r
                                        else:\r
                                                glBegin(GL_LINE_STRIP)\r
                                                for v in path['list']:\r
@@ -601,6 +615,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                        glVertex3f(err[0].x, err[0].y, err[0].z)\r
                                        glVertex3f(err[1].x, err[1].y, err[1].z)\r
                                glEnd()\r
+               \r
                glFlush()\r
 \r
        def InitGL(self):\r