chiark / gitweb /
Show GCode loading progress.
authordaid <daid303@gmail.com>
Wed, 29 Jan 2014 08:10:16 +0000 (09:10 +0100)
committerdaid <daid303@gmail.com>
Wed, 29 Jan 2014 08:10:16 +0000 (09:10 +0100)
Cura/gui/util/engineResultView.py
Cura/util/gcodeInterpreter.py
Cura/util/sliceEngine.py

index 0c55d2c02f1b712790701f7c7a8023fbb828fb0f..8786afc9faca899d7863f7af51ca84ece61dbd32 100644 (file)
@@ -18,6 +18,7 @@ class engineResultView(object):
                self._parent = parent
                self._result = None
                self._enabled = False
+               self._gcodeLoadProgress = 0
                self._layerVBOs = []
                self._layer20VBOs = []
 
@@ -43,6 +44,14 @@ class engineResultView(object):
                self._enabled = enabled
                self.layerSelect.setHidden(not enabled)
 
+       def _gcodeLoadCallback(self, result, progress):
+               if result != self._result:
+                       #Abort loading from this thread.
+                       return True
+               self._gcodeLoadProgress = progress
+               self._parent._queueRefresh()
+               return False
+
        def OnDraw(self):
                if not self._enabled:
                        return
@@ -50,6 +59,10 @@ class engineResultView(object):
                result = self._result
                if result is not None and result._polygons is not None:
                        self.layerSelect.setRange(1, len(result._polygons))
+               if result is not None:
+                       gcodeLayers = result.getGCodeLayers(self._gcodeLoadCallback)
+               else:
+                       gcodeLayers = None
 
                glPushMatrix()
                glEnable(GL_BLEND)
@@ -74,7 +87,6 @@ class engineResultView(object):
                        ('outline',     None,        [0,0,0,1])
                ]
                n = layerNr - 1
-               gcodeLayers = result.getGCodeLayers()
                generatedVBO = False
                while n >= 0:
                        if layerNr - n > 30 and n % 20 == 0:
@@ -83,8 +95,8 @@ class engineResultView(object):
                                        self._layer20VBOs.append({})
                                if result is not None and result._polygons is not None and n + 20 < len(result._polygons):
                                        layerVBOs = self._layer20VBOs[idx]
-                                       for typeName, _, color in lineTypeList:
-                                               if typeName in result._polygons[n + 19]:
+                                       for typeName, typeNameGCode, color in lineTypeList:
+                                               if (typeName in result._polygons[n + 19]) or (typeName == 'skirt' and typeName in result._polygons[n]):
                                                        if typeName not in layerVBOs:
                                                                if generatedVBO:
                                                                        continue
@@ -104,7 +116,7 @@ class engineResultView(object):
                                        self._layerVBOs.append({})
                                layerVBOs = self._layerVBOs[n]
                                if gcodeLayers is not None and layerNr - 10 < n < (len(gcodeLayers) - 1):
-                                       for _, typeName, color in lineTypeList:
+                                       for typeNamePolygons, typeName, color in lineTypeList:
                                                if typeName is None:
                                                        continue
                                                if 'GCODE-' + typeName not in layerVBOs:
@@ -119,7 +131,7 @@ class engineResultView(object):
                                                layerVBOs['GCODE-MOVE'].render()
                                elif result is not None and result._polygons is not None and n < len(result._polygons):
                                        polygons = result._polygons[n]
-                                       for typeName, _, color in lineTypeList:
+                                       for typeName, typeNameGCode, color in lineTypeList:
                                                if typeName in polygons:
                                                        if typeName not in layerVBOs:
                                                                layerVBOs[typeName] = self._polygonsToVBO_lines(polygons[typeName])
@@ -130,6 +142,14 @@ class engineResultView(object):
                if generatedVBO:
                        self._parent._queueRefresh()
 
+               if gcodeLayers is not None and self._gcodeLoadProgress != 0.0 and self._gcodeLoadProgress != 1.0:
+                       glPushMatrix()
+                       glLoadIdentity()
+                       glTranslate(0,-0.8,-2)
+                       glColor4ub(60,60,60,255)
+                       opengl.glDrawStringCenter(_("Loading toolpath for visualization (%d%%)") % (self._gcodeLoadProgress * 100))
+                       glPopMatrix()
+
        def _polygonsToVBO_lines(self, polygons):
                verts = numpy.zeros((0, 3), numpy.float32)
                indices = numpy.zeros((0), numpy.uint32)
index 1a9ee094916fa39adc62674f2a6dd331025b0816..b86078cb41b82a5b28f0201326f79b703a25daec 100644 (file)
@@ -37,8 +37,9 @@ class gcode(object):
                elif type(data) is list:
                        self._load(data)
                else:
-                       self._fileSize = len(data.getvalue())
-                       self._load(StringIO.StringIO(data.getvalue()))
+                       data = data.getvalue()
+                       self._fileSize = len(data)
+                       self._load(StringIO.StringIO(data))
 
        def calculateWeight(self):
                #Calculates the weight of the filament in kg
index 8356e8ed73287eb9346eba5a224ed2bdb2041d2d..2909963761cf2270f148aa72fd183552bf3b53d4 100644 (file)
@@ -101,12 +101,13 @@ class EngineResult(object):
        def isFinished(self):
                return self._finished
 
-       def getGCodeLayers(self):
+       def getGCodeLayers(self, loadCallback):
                if not self._finished:
                        return None
                if self._gcodeInterpreter.layerList is None and self._gcodeLoadThread is None:
                        self._gcodeInterpreter.progressCallback = self._gcodeInterpreterCallback
                        self._gcodeLoadThread = threading.Thread(target=lambda : self._gcodeInterpreter.load(self._gcodeData))
+                       self._gcodeLoadCallback = loadCallback
                        self._gcodeLoadThread.daemon = True
                        self._gcodeLoadThread.start()
                return self._gcodeInterpreter.layerList
@@ -114,7 +115,7 @@ class EngineResult(object):
        def _gcodeInterpreterCallback(self, progress):
                if len(self._gcodeInterpreter.layerList) % 5 == 0:
                        time.sleep(0.1)
-               return False
+               return self._gcodeLoadCallback(self, progress)
 
        def submitInfoOnline(self):
                if profile.getPreference('submit_slice_information') != 'True':