From: daid303 Date: Thu, 25 Apr 2013 13:05:03 +0000 (+0200) Subject: Add print time and filament usage estimates. X-Git-Tag: 13.05~49 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=4380fd31d65760a698bbc924b4e1b1ff5d075c11;p=cura.git Add print time and filament usage estimates. --- diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index 1d7f315e..1c6e8ffd 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -406,8 +406,7 @@ class printWindow(wx.Frame): cost = self.gcode.calculateCost() if cost is not None: status += "Filament cost: %s\n" % (cost) - status += "Estimated print time: %02d:%02d\n" % ( - int(self.gcode.totalMoveTimeMinute / 60), int(self.gcode.totalMoveTimeMinute % 60)) + #status += "Estimated print time: %02d:%02d\n" % (int(self.gcode.totalMoveTimeMinute / 60), int(self.gcode.totalMoveTimeMinute % 60)) if self.machineCom is None or not self.machineCom.isPrinting(): self.progress.SetValue(0) if self.gcodeList is not None: @@ -420,7 +419,7 @@ class printWindow(wx.Frame): if self.currentZ > 0: status += 'Height: %0.1f\n' % (self.currentZ) status += 'Print time: %02d:%02d\n' % (int(printTime / 60), int(printTime % 60)) - if printTimeLeft == None: + if printTimeLeft is None: status += 'Print time left: Unknown\n' else: status += 'Print time left: %02d:%02d\n' % (int(printTimeLeft / 60), int(printTimeLeft % 60)) diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index be6cf6df..0d6cb3e7 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -327,12 +327,15 @@ class SceneView(openglGui.glGuiPanel): if self._focusObj is None: return self._scene.remove(self._focusObj) - for obj in self._focusObj.split(): + for obj in self._focusObj.split(self._splitCallback): self._scene.add(obj) self._scene.centerAll() self._selectObject(None) self.sceneUpdated() + def _splitCallback(self, progress): + print progress + def OnMergeObjects(self, e): if self._selectedObj is None or self._focusObj is None or self._selectedObj == self._focusObj: return @@ -354,7 +357,10 @@ class SceneView(openglGui.glGuiPanel): def _updateSliceProgress(self, progressValue, ready): self.printButton.setDisabled(not ready) - self.printButton.setProgressBar(progressValue) + if progressValue >= 0.0: + self.printButton.setProgressBar(progressValue) + else: + self.printButton.setProgressBar(None) if self._gcode is not None: self._gcode = None for layerVBOlist in self._gcodeVBOs: @@ -362,14 +368,19 @@ class SceneView(openglGui.glGuiPanel): self.glReleaseList.append(vbo) self._gcodeVBOs = [] if ready: - print self._slicer.getFilamentAmount() - print self._slicer.getPrintTime() - print self._slicer.getFilamentCost() + self.printButton.setProgressBar(None) + cost = self._slicer.getFilamentCost() + if cost is not None: + self.printButton.setBottomText('%s\n%s\n%s' % (self._slicer.getPrintTime(), self._slicer.getFilamentAmount(), cost)) + else: + self.printButton.setBottomText('%s\n%s' % (self._slicer.getPrintTime(), self._slicer.getFilamentAmount())) self._gcode = gcodeInterpreter.gcode() self._gcode.progressCallback = self._gcodeLoadCallback self._thread = threading.Thread(target=self._loadGCode) self._thread.daemon = True self._thread.start() + else: + self.printButton.setBottomText('') self.QueueRefresh() def _loadGCode(self): diff --git a/Cura/gui/util/opengl.py b/Cura/gui/util/opengl.py index a3ed6bd2..87845124 100644 --- a/Cura/gui/util/opengl.py +++ b/Cura/gui/util/opengl.py @@ -274,8 +274,16 @@ def glGetStringSize(s): def glDrawStringLeft(s): glRasterPos2f(0, 0) + n = 1 for c in s: - glutBitmapCharacter(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c)) + if c == '\n': + glPushMatrix() + glTranslate(0, 18 * n, 0) + n += 1 + glRasterPos2f(0, 0) + glPopMatrix() + else: + glutBitmapCharacter(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c)) def glDrawStringRight(s): glRasterPos2f(0, 0) diff --git a/Cura/gui/util/openglGui.py b/Cura/gui/util/openglGui.py index 8855b06f..e94c83af 100644 --- a/Cura/gui/util/openglGui.py +++ b/Cura/gui/util/openglGui.py @@ -390,7 +390,8 @@ class glButton(glGuiControl): self._hidden = False self._disabled = False self._showExpandArrow = False - self._progressBar = 0.0 + self._progressBar = None + self._altTooltip = '' def setSelected(self, value): self._selected = value @@ -407,6 +408,9 @@ class glButton(glGuiControl): def setProgressBar(self, value): self._progressBar = value + def setBottomText(self, value): + self._altTooltip = value + def getSelected(self): return self._selected @@ -466,11 +470,29 @@ class glButton(glGuiControl): glColor4ub(255,255,255,255) opengl.glDrawStringCenter(self._tooltip) glPopMatrix() - if 0.0 < self._progressBar < 1.0: + if self._progressBar is not None: glColor4ub(255,255,255,192) - glPushMatrix() opengl.glDrawTexturedQuad(pos[0]-bs/2, pos[1]+bs/2, bs, bs / 4, 0) opengl.glDrawTexturedQuad(pos[0]-bs/2, pos[1]+bs/2, bs * self._progressBar, bs / 4, 0) + elif len(self._altTooltip) > 0: + glPushMatrix() + glTranslatef(pos[0], pos[1], 0) + glTranslatef(0.6*bs*scale, 0, 0) + + glPushMatrix() + glColor4ub(60,60,60,255) + glTranslatef(-1, -1, 0) + opengl.glDrawStringLeft(self._altTooltip) + glTranslatef(0, 2, 0) + opengl.glDrawStringLeft(self._altTooltip) + glTranslatef(2, 0, 0) + opengl.glDrawStringLeft(self._altTooltip) + glTranslatef(0, -2, 0) + opengl.glDrawStringLeft(self._altTooltip) + glPopMatrix() + + glColor4ub(255,255,255,255) + opengl.glDrawStringLeft(self._altTooltip) glPopMatrix() def _checkHit(self, x, y): diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index f6d83c7a..919e202a 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -192,10 +192,10 @@ class printableObject(object): if scale > 0: self.applyMatrix(numpy.matrix([[scale,0,0],[0,scale,0],[0,0,scale]], numpy.float64)) - def split(self): + def split(self, callback): ret = [] for oriMesh in self._meshList: - for m in oriMesh.split(): + for m in oriMesh.split(callback): obj = printableObject() obj._meshList.append(m) obj._postProcessAfterLoad() @@ -247,7 +247,7 @@ class mesh(object): def _vertexHash(self, idx): v = self.vertexes[idx] - return int(v[0] * 100) | int(v[1] * 100) << 8 | int(v[2] * 100) << 16 + return int(v[0] * 100) | int(v[1] * 100) << 10 | int(v[2] * 100) << 20 def _idxFromHash(self, map, idx): vHash = self._vertexHash(idx) @@ -255,12 +255,13 @@ class mesh(object): if numpy.linalg.norm(self.vertexes[i] - self.vertexes[idx]) < 0.001: return i - def split(self): + def split(self, callback): vertexMap = {} vertexToFace = [] for idx in xrange(0, self.vertexCount): - print idx, self.vertexCount + if (idx % 100) == 0: + callback(idx * 100 / self.vertexCount) vHash = self._vertexHash(idx) if vHash not in vertexMap: vertexMap[vHash] = [] @@ -269,7 +270,8 @@ class mesh(object): faceList = [] for idx in xrange(0, self.vertexCount, 3): - print idx, self.vertexCount + if (idx % 100) == 0: + callback(idx * 100 / self.vertexCount) f = [self._idxFromHash(vertexMap, idx), self._idxFromHash(vertexMap, idx+1), self._idxFromHash(vertexMap, idx+2)] vertexToFace[f[0]].append(idx / 3) vertexToFace[f[1]].append(idx / 3) diff --git a/Cura/util/sliceEngine.py b/Cura/util/sliceEngine.py index 10d697fd..d6bdec7b 100644 --- a/Cura/util/sliceEngine.py +++ b/Cura/util/sliceEngine.py @@ -85,11 +85,11 @@ class Slicer(object): return '%02d:%02d' % (int(self._printTimeSeconds / 60 / 60), int(self._printTimeSeconds / 60) % 60) def getFilamentAmount(self): - return '%0.2fm' % (float(self._filamentMM) / 1000.0) + return '%0.2fm %0.0fgram' % (float(self._filamentMM) / 1000.0, self.getFilamentWeight() * 1000.0) def runSlicer(self, scene): self.abortSlicer() - self._callback(0.0, False) + self._callback(-1.0, False) commandList = [getEngineFilename(), '-vv'] for k, v in self._engineSettings().iteritems(): @@ -180,7 +180,7 @@ class Slicer(object): if returnCode == 0: self._callback(1.0, True) else: - self._callback(0.0, False) + self._callback(-1.0, False) except: pass self._process = None