From: daid303 Date: Mon, 4 Mar 2013 10:50:28 +0000 (+0100) Subject: Fixed a typo. Changed the GCode rendering so it gives quick results first, and then... X-Git-Tag: 13.03~30 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=284586b9cdb2fbd8814ae4c8b128242beab36c9f;p=cura.git Fixed a typo. Changed the GCode rendering so it gives quick results first, and then renders slower with line width and infills. Fixed the GCode view not reaching the max layer when loading the GCode file while showing it. --- diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index a4774c32..2b588f87 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -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) diff --git a/Cura/gui/projectPlanner.py b/Cura/gui/projectPlanner.py index 2d2f7726..91211eee 100644 --- a/Cura/gui/projectPlanner.py +++ b/Cura/gui/projectPlanner.py @@ -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) diff --git a/Cura/gui/util/opengl.py b/Cura/gui/util/opengl.py index 17621e18..b01eb2cf 100644 --- a/Cura/gui/util/opengl.py +++ b/Cura/gui/util/opengl.py @@ -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): diff --git a/Cura/gui/util/openglGui.py b/Cura/gui/util/openglGui.py index 97df430e..023e794d 100644 --- a/Cura/gui/util/openglGui.py +++ b/Cura/gui/util/openglGui.py @@ -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) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 32c762a4..6c815d3b 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -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) diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index ad1a768b..76b8369e 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -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