From: daid Date: Wed, 29 Jan 2014 08:10:16 +0000 (+0100) Subject: Show GCode loading progress. X-Git-Tag: 14.02-RC1~49 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=12a49ba692f0282409ece1ac57407538451fe322;p=cura.git Show GCode loading progress. --- diff --git a/Cura/gui/util/engineResultView.py b/Cura/gui/util/engineResultView.py index 0c55d2c0..8786afc9 100644 --- a/Cura/gui/util/engineResultView.py +++ b/Cura/gui/util/engineResultView.py @@ -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) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 1a9ee094..b86078cb 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -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 diff --git a/Cura/util/sliceEngine.py b/Cura/util/sliceEngine.py index 8356e8ed..29099637 100644 --- a/Cura/util/sliceEngine.py +++ b/Cura/util/sliceEngine.py @@ -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':