chiark / gitweb /
Fixed a typo. Changed the GCode rendering so it gives quick results first, and then...
authordaid303 <daid303@gmail.com>
Mon, 4 Mar 2013 10:50:28 +0000 (11:50 +0100)
committerdaid303 <daid303@gmail.com>
Mon, 4 Mar 2013 10:50:28 +0000 (11:50 +0100)
Cura/gui/preview3d.py
Cura/gui/projectPlanner.py
Cura/gui/util/opengl.py
Cura/gui/util/openglGui.py
Cura/util/gcodeInterpreter.py
Cura/util/mesh.py

index a4774c32f77b939d041a9725945687beec25c2a8..2b588f87d049faeb6a411b0b37f80b84e0f7748d 100644 (file)
@@ -495,14 +495,14 @@ class previewPanel(wx.Panel):
 
                minV = self.objectList[0].mesh.getMinimum()
                maxV = self.objectList[0].mesh.getMaximum()
-               objectsBoundaryCircleSize = self.objectList[0].mesh.bounderyCircleSize
+               objectsBoundaryCircleSize = self.objectList[0].mesh.boundaryCircleSize
                for obj in self.objectList:
                        if obj.mesh is None:
                                continue
 
                        minV = numpy.minimum(minV, obj.mesh.getMinimum())
                        maxV = numpy.maximum(maxV, obj.mesh.getMaximum())
-                       objectsBoundaryCircleSize = max(objectsBoundaryCircleSize, obj.mesh.bounderyCircleSize)
+                       objectsBoundaryCircleSize = max(objectsBoundaryCircleSize, obj.mesh.boundaryCircleSize)
 
                self.objectsMaxV = maxV
                self.objectsMinV = minV
@@ -538,9 +538,10 @@ class PreviewGLCanvas(openglGui.glGuiPanel):
                self.zoom = 300
                self.viewTarget = [parent.machineCenter.x, parent.machineCenter.y, 0.0]
                self.view3D = True
-               self.gcodeDisplayList = None
-               self.gcodeDisplayListMade = None
-               self.gcodeDisplayListCount = 0
+               self.gcodeDisplayList = []
+               self.gcodeQuickDisplayList = []
+               self.gcodeDisplayListMade = 0
+               self.gcodeQuickDisplayListMade = 0
                self.objColor = [[1.0, 0.8, 0.6, 1.0], [0.2, 1.0, 0.1, 1.0], [1.0, 0.2, 0.1, 1.0], [0.1, 0.2, 1.0, 1.0]]
                self.oldX = 0
                self.oldY = 0
@@ -641,8 +642,9 @@ class PreviewGLCanvas(openglGui.glGuiPanel):
                        glRotate(self.yaw, 0,0,1)
 
                        if self.viewMode == "GCode" or self.viewMode == "Mixed":
-                               if self.parent.gcode is not None and len(self.parent.gcode.layerList) > self.parent.layerSelect.getValue() and len(self.parent.gcode.layerList[self.parent.layerSelect.getValue()]) > 0:
-                                       self.viewTarget[2] = self.parent.gcode.layerList[self.parent.layerSelect.getValue()][0].list[-1].z
+                               n = self.parent.layerSelect.getValue()
+                               if self.parent.gcode is not None and -1 < n < len(self.parent.gcode.layerList) and len(self.parent.gcode.layerList[n]) > 0:
+                                       self.viewTarget[2] = self.parent.gcode.layerList[n][0].list[-1].z
                        else:
                                if self.parent.objectsMaxV is not None:
                                        self.viewTarget = self.getObjectCenterPos()
@@ -659,19 +661,24 @@ class PreviewGLCanvas(openglGui.glGuiPanel):
 
                if self.parent.gcode is not None and (self.viewMode == "GCode" or self.viewMode == "Mixed"):
                        if self.parent.gcodeDirty:
-                               if self.gcodeDisplayListCount < len(self.parent.gcode.layerList) or self.gcodeDisplayList is None:
-                                       if self.gcodeDisplayList is not None:
-                                               glDeleteLists(self.gcodeDisplayList, self.gcodeDisplayListCount)
-                                       self.gcodeDisplayList = glGenLists(len(self.parent.gcode.layerList))
-                                       self.gcodeDisplayListCount = len(self.parent.gcode.layerList)
                                self.parent.gcodeDirty = False
                                self.gcodeDisplayListMade = 0
+                               self.gcodeQuickDisplayListMade = 0
 
                        if self.gcodeDisplayListMade < len(self.parent.gcode.layerList):
                                gcodeGenStartTime = time.time()
+                               while time.time() - gcodeGenStartTime < 0.1 and self.gcodeQuickDisplayListMade < len(self.parent.gcode.layerList):
+                                       if len(self.gcodeQuickDisplayList) == self.gcodeQuickDisplayListMade:
+                                               self.gcodeQuickDisplayList.append(glGenLists(1))
+                                       glNewList(self.gcodeQuickDisplayList[self.gcodeQuickDisplayListMade], GL_COMPILE)
+                                       opengl.DrawGCodeLayer(self.parent.gcode.layerList[self.gcodeQuickDisplayListMade], True)
+                                       glEndList()
+                                       self.gcodeQuickDisplayListMade += 1
                                while time.time() - gcodeGenStartTime < 0.1 and self.gcodeDisplayListMade < len(self.parent.gcode.layerList):
-                                       glNewList(self.gcodeDisplayList + self.gcodeDisplayListMade, GL_COMPILE)
-                                       opengl.DrawGCodeLayer(self.parent.gcode.layerList[self.gcodeDisplayListMade])
+                                       if len(self.gcodeDisplayList) == self.gcodeDisplayListMade:
+                                               self.gcodeDisplayList.append(glGenLists(1))
+                                       glNewList(self.gcodeDisplayList[self.gcodeDisplayListMade], GL_COMPILE)
+                                       opengl.DrawGCodeLayer(self.parent.gcode.layerList[self.gcodeDisplayListMade], False)
                                        glEndList()
                                        self.gcodeDisplayListMade += 1
                                wx.CallAfter(self.Refresh)
@@ -709,7 +716,7 @@ class PreviewGLCanvas(openglGui.glGuiPanel):
                                glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)
                        glEnable(GL_COLOR_MATERIAL)
                        glEnable(GL_LIGHTING)
-                       drawUpToLayer = min(self.gcodeDisplayListMade, self.parent.layerSelect.getValue() + 1)
+                       drawUpToLayer = min(self.gcodeQuickDisplayListMade, self.parent.layerSelect.getValue() + 1)
                        starttime = time.time()
                        for i in xrange(drawUpToLayer - 1, -1, -1):
                                c = 1.0
@@ -721,9 +728,10 @@ class PreviewGLCanvas(openglGui.glGuiPanel):
                                                c = 0.1
                                glLightfv(GL_LIGHT0, GL_DIFFUSE, [0,0,0,0])
                                glLightfv(GL_LIGHT0, GL_AMBIENT, [c,c,c,c])
-                               glCallList(self.gcodeDisplayList + i)
-                               if time.time() - starttime > 0.1:
-                                       break
+                               if self.gcodeDisplayListMade > i and drawUpToLayer - i < 15:
+                                       glCallList(self.gcodeDisplayList[i])
+                               else:
+                                       glCallList(self.gcodeQuickDisplayList[i])
 
                        glDisable(GL_LIGHTING)
                        glDisable(GL_COLOR_MATERIAL)
index 2d2f77267a2d0ecea0df1749b82148b87555e2ab..91211eeee8300a869b7047fbe61254928b5cb97c 100644 (file)
@@ -74,7 +74,7 @@ class ProjectObject(object):
        def getSize(self):
                return self.mesh.getSize()
        def getBoundaryCircle(self):
-               return self.mesh.bounderyCircleSize
+               return self.mesh.boundaryCircleSize
        
        def clone(self):
                p = ProjectObject(self.parent, self.filename)
index 17621e18139c8a2975df2e68face9dca5a5ca29b..b01eb2cf0245b3da044b736571687404084d5b20 100644 (file)
@@ -393,7 +393,7 @@ def DrawMeshSteep(mesh, matrix, angle):
        glDepthFunc(GL_LESS)
 
 
-def DrawGCodeLayer(layer):
+def DrawGCodeLayer(layer, drawQuick = True):
        filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2
        filamentArea = math.pi * filamentRadius * filamentRadius
        lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10
@@ -415,11 +415,15 @@ def DrawGCodeLayer(layer):
                                c = retractColor
                        else:
                                c = moveColor
+                       if drawQuick:
+                               continue
                zOffset = 0.01
                if path.type == 'extrude':
                        if path.pathType == 'FILL':
                                c = fillColorCycle[fillCycle]
                                fillCycle = (fillCycle + 1) % len(fillColorCycle)
+                               if drawQuick:
+                                       continue
                        elif path.pathType == 'WALL-INNER':
                                c = innerWallColor
                                zOffset = 0.02
@@ -431,7 +435,7 @@ def DrawGCodeLayer(layer):
                                c = extrudeColor
                if path.type == 'retract':
                        c = retractColor
-               if path.type == 'extrude':
+               if path.type == 'extrude' and not drawQuick:
                        drawLength = 0.0
                        prevNormal = None
                        for i in xrange(0, len(path.list) - 1):
index 97df430e32f9591bdf11295a2cd8581b4c45e0c9..023e794d22d4246116abcf5e3c6cc43553f3821f 100644 (file)
@@ -796,6 +796,8 @@ class glSlider(glGuiControl):
                return self._value
 
        def setRange(self, minValue, maxValue):
+               if maxValue < minValue:
+                       maxValue = minValue
                self._minValue = minValue
                self._maxValue = maxValue
                self._value = max(minValue, self._value)
@@ -851,7 +853,8 @@ class glSlider(glGuiControl):
                        opengl.glDrawStringLeft(str(self._value))
                        glPopMatrix()
                glColor4ub(255,255,255,240)
-               glTranslate(0.0,-scrollLength*((self._value-self._minValue)/(self._maxValue-self._minValue)),0)
+               if self._maxValue - self._minValue != 0:
+                       glTranslate(0.0,-scrollLength*((self._value-self._minValue)/(self._maxValue-self._minValue)),0)
                glBegin(GL_QUADS)
                glVertex2f( w/2,-w/2)
                glVertex2f(-w/2,-w/2)
index 32c762a46181e612d8a78a34100578302e8cd9c6..6c815d3b459000020840ee7e4282e63eb17311cc 100644 (file)
@@ -51,7 +51,6 @@ class gcode(object):
                return None
        
        def _load(self, gcodeFile):
-               filePos = 0
                pos = util3d.Vector3()
                posOffset = util3d.Vector3()
                currentE = 0.0
@@ -94,12 +93,10 @@ class gcode(object):
                                if comment.startswith('LAYER:'):
                                        self.layerList.append(currentLayer)
                                        if self.progressCallback is not None:
-                                               if filePos != gcodeFile.tell():
-                                                       filePos = gcodeFile.tell()
-                                                       if self.progressCallback(float(filePos) / float(self._fileSize)):
-                                                               #Abort the loading, we can safely return as the results here will be discarded
-                                                               gcodeFile.close()
-                                                               return
+                                               if self.progressCallback(float(gcodeFile.tell()) / float(self._fileSize)):
+                                                       #Abort the loading, we can safely return as the results here will be discarded
+                                                       gcodeFile.close()
+                                                       return
                                        currentLayer = []
                                if pathType != "CUSTOM":
                                        startCodeDone = True
@@ -262,6 +259,8 @@ class gcode(object):
                                        else:
                                                print "Unknown M code:" + str(M)
                self.layerList.append(currentLayer)
+               if self.progressCallback is not None:
+                       self.progressCallback(float(gcodeFile.tell()) / float(self._fileSize))
                self.extrusionAmount = maxExtrusion
                self.totalMoveTimeMinute = totalMoveTimeMinute
                #print "Extruded a total of: %d mm of filament" % (self.extrusionAmount)
index ad1a768bd2de71056277a8857d5c440eef181bd4..76b8369ee240529c827683d2ca0c3f03a37ec8d2 100644 (file)
@@ -37,9 +37,9 @@ class mesh(object):
                self.transformedMax = transformedVertexes.max(0)
                self.transformedSize = self.transformedMax - self.transformedMin
 
-               #Calculate the boundery circle
+               #Calculate the boundary circle
                center = self.transformedMin + self.transformedSize / 2.0
-               self.bounderyCircleSize = round(math.sqrt(numpy.max(((transformedVertexes[::,0] - center[0]) * (transformedVertexes[::,0] - center[0])) + ((transformedVertexes[::,1] - center[1]) * (transformedVertexes[::,1] - center[1])) + ((transformedVertexes[::,2] - center[2]) * (transformedVertexes[::,2] - center[2])))), 3)
+               self.boundaryCircleSize = round(math.sqrt(numpy.max(((transformedVertexes[::,0] - center[0]) * (transformedVertexes[::,0] - center[0])) + ((transformedVertexes[::,1] - center[1]) * (transformedVertexes[::,1] - center[1])) + ((transformedVertexes[::,2] - center[2]) * (transformedVertexes[::,2] - center[2])))), 3)
 
        def getMaximum(self):
                return self.transformedMax