chiark / gitweb /
Add print time and filament usage estimates.
authordaid303 <daid303@gmail.com>
Thu, 25 Apr 2013 13:05:03 +0000 (15:05 +0200)
committerdaid303 <daid303@gmail.com>
Thu, 25 Apr 2013 13:05:03 +0000 (15:05 +0200)
Cura/gui/printWindow.py
Cura/gui/sceneView.py
Cura/gui/util/opengl.py
Cura/gui/util/openglGui.py
Cura/util/mesh.py
Cura/util/sliceEngine.py

index 1d7f315eed0f82c79eae03b2d350eec53ec5fdec..1c6e8ffdeba6c34121fe1c8551da1ee6903fd8a8 100644 (file)
@@ -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))
index be6cf6dff0de81754466f7536b552d0c3bfa11c6..0d6cb3e737e8e8cf71e9cc748e81c275ce3902cb 100644 (file)
@@ -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):
index a3ed6bd2d3479394132a033fa94e9ec5e0bb1c2f..87845124cdc3b6fa65ce2d3c04be22460dfcfee9 100644 (file)
@@ -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)
index 8855b06f7600a79ae129baf125601a64e0ae48f3..e94c83aff7d9791949205fffdcbf8b03b561b551 100644 (file)
@@ -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):
index f6d83c7a726d822270cee5879fb86344dcc6df26..919e202a01430121ddcee3f139bb4c030e173152 100644 (file)
@@ -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)
index 10d697fda88ccbad16fa763e6b68960d6479ea44..d6bdec7b2b84bf6749ab8722356ef3f3c65c23d3 100644 (file)
@@ -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