diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 311d49a..4aa6792 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -259,7 +259,7 @@ class previewPanel(wx.Panel): def updateToolbar(self): self.layerSpin.Show(self.gcode != None) if self.gcode != None: - self.layerSpin.SetRange(1, self.gcode.layerCount) + self.layerSpin.SetRange(1, len(self.gcode.layerList)) self.toolbar.Realize() def OnViewChange(self, e): @@ -442,77 +442,73 @@ class PreviewGLCanvas(glcanvas.GLCanvas): lineWidth = float(profile.getProfileSetting('nozzle_size')) / 2 curLayerNum = 0 - for path in self.parent.gcode.pathList: - if path.layerNr != curLayerNum: - prevLayerZ = curLayerZ - curLayerZ = path.list[1].z - curLayerNum = path.layerNr - layerThickness = curLayerZ - prevLayerZ - - c = 1.0 - if path.layerNr != self.parent.layerSpin.GetValue(): - if path.layerNr < self.parent.layerSpin.GetValue(): - c = 0.9 - (self.parent.layerSpin.GetValue() - path.layerNr) * 0.1 - if c < 0.4: - c = 0.4 - else: - break - if path.type == 'move': - glColor3f(0,0,c) - if path.type == 'extrude': - if path.pathType == 'FILL': - glColor3f(c/2,c/2,0) - elif path.pathType == 'WALL-INNER': - glColor3f(0,c,0) - else: - glColor3f(c,0,0) - if path.type == 'retract': - glColor3f(0,c,c) - if c > 0.4 and path.type == 'extrude': - for i in xrange(0, len(path.list)-1): - v0 = path.list[i] - v1 = path.list[i+1] - - # Calculate line width from ePerDistance (needs layer thickness and filament diameter) - dist = (v0 - v1).vsize() - if dist > 0 and layerThickness > 0: - extrusionMMperDist = (v1.e - v0.e) / (v0 - v1).vsize() - lineWidth = extrusionMMperDist * filamentArea / layerThickness / 2 - - normal = (v0 - v1).cross(util3d.Vector3(0,0,1)) - normal.normalize() - v2 = v0 + normal * lineWidth - v3 = v1 + normal * lineWidth - v0 = v0 - normal * lineWidth - v1 = v1 - normal * lineWidth - - glBegin(GL_QUADS) - if path.pathType == 'FILL': #Remove depth buffer fighting on infill/wall overlap - glVertex3f(v0.x, v0.y, v0.z - 0.02) - glVertex3f(v1.x, v1.y, v1.z - 0.02) - glVertex3f(v3.x, v3.y, v3.z - 0.02) - glVertex3f(v2.x, v2.y, v2.z - 0.02) + for layer in self.parent.gcode.layerList: + for path in layer: + c = 1.0 + if curLayerNum != self.parent.layerSpin.GetValue(): + if curLayerNum < self.parent.layerSpin.GetValue(): + c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1 + if c < 0.4: + c = 0.4 else: - glVertex3f(v0.x, v0.y, v0.z - 0.01) - glVertex3f(v1.x, v1.y, v1.z - 0.01) - glVertex3f(v3.x, v3.y, v3.z - 0.01) - glVertex3f(v2.x, v2.y, v2.z - 0.01) - glEnd() + break + if path.type == 'move': + glColor3f(0,0,c) + if path.type == 'extrude': + if path.pathType == 'FILL': + glColor3f(c/2,c/2,0) + elif path.pathType == 'WALL-INNER': + glColor3f(0,c,0) + else: + glColor3f(c,0,0) + if path.type == 'retract': + glColor3f(0,c,c) + if c > 0.4 and path.type == 'extrude': + for i in xrange(0, len(path.list)-1): + v0 = path.list[i] + v1 = path.list[i+1] + + # Calculate line width from ePerDistance (needs layer thickness and filament diameter) + dist = (v0 - v1).vsize() + if dist > 0 and layerThickness > 0: + extrusionMMperDist = (v1.e - v0.e) / (v0 - v1).vsize() + lineWidth = extrusionMMperDist * filamentArea / layerThickness / 2 + + normal = (v0 - v1).cross(util3d.Vector3(0,0,1)) + normal.normalize() + v2 = v0 + normal * lineWidth + v3 = v1 + normal * lineWidth + v0 = v0 - normal * lineWidth + v1 = v1 - normal * lineWidth + + glBegin(GL_QUADS) + if path.pathType == 'FILL': #Remove depth buffer fighting on infill/wall overlap + glVertex3f(v0.x, v0.y, v0.z - 0.02) + glVertex3f(v1.x, v1.y, v1.z - 0.02) + glVertex3f(v3.x, v3.y, v3.z - 0.02) + glVertex3f(v2.x, v2.y, v2.z - 0.02) + else: + glVertex3f(v0.x, v0.y, v0.z - 0.01) + glVertex3f(v1.x, v1.y, v1.z - 0.01) + glVertex3f(v3.x, v3.y, v3.z - 0.01) + glVertex3f(v2.x, v2.y, v2.z - 0.01) + glEnd() - #for v in path['list']: - # glBegin(GL_TRIANGLE_FAN) - # glVertex3f(v.x, v.y, v.z - 0.001) - # for i in xrange(0, 16+1): - # if path['pathType'] == 'FILL': #Remove depth buffer fighting on infill/wall overlap - # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02) - # else: - # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01) - # glEnd() - else: - glBegin(GL_LINE_STRIP) - for v in path.list: - glVertex3f(v.x, v.y, v.z) - glEnd() + #for v in path['list']: + # glBegin(GL_TRIANGLE_FAN) + # glVertex3f(v.x, v.y, v.z - 0.001) + # for i in xrange(0, 16+1): + # if path['pathType'] == 'FILL': #Remove depth buffer fighting on infill/wall overlap + # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.02) + # else: + # glVertex3f(v.x + math.cos(math.pi*2/16*i) * lineWidth, v.y + math.sin(math.pi*2/16*i) * lineWidth, v.z - 0.01) + # glEnd() + else: + glBegin(GL_LINE_STRIP) + for v in path.list: + glVertex3f(v.x, v.y, v.z) + glEnd() + curLayerNum += 1 glEndList() if self.viewMode == "GCode" or self.viewMode == "Mixed": glCallList(self.gcodeDisplayList) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index 71e26f0..347eabe 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -9,17 +9,15 @@ import os from util import util3d class gcodePath(): - def __init__(self, newType, pathType, layerNr, startPoint): + def __init__(self, newType, pathType, startPoint): self.type = newType self.pathType = pathType self.list = [startPoint] - self.layerNr = layerNr class gcode(): def __init__(self): self.regMatch = {} - self.layerCount = 0 - self.pathList = [] + self.layerList = [] self.extrusionAmount = 0 self.totalMoveTimeMinute = 0 self.progressCallback = None @@ -34,21 +32,22 @@ class gcode(): totalExtrusion = 0.0 maxExtrusion = 0.0 totalMoveTimeMinute = 0.0 - pathList = [] scale = 1.0 posAbs = True feedRate = 3600 pathType = 'CUSTOM'; - layerNr = 0; #Note layer 0 will be the start code. startCodeDone = False - currentPath = gcodePath('move', pathType, layerNr, pos.copy()) + currentLayer = [] + currentPath = gcodePath('move', pathType, pos.copy()) currentPath.list[0].e = totalExtrusion - pathList.append(currentPath) + currentLayer.append(currentPath) for line in gcodeFile: if filePos != gcodeFile.tell(): filePos = gcodeFile.tell() if self.progressCallback != None: self.progressCallback(float(filePos) / float(fileSize)) + + #Parse Cura_SF comments if line.startswith(';TYPE:'): pathType = line[6:].strip() if pathType != "CUSTOM": @@ -91,8 +90,10 @@ class gcode(): pos.z = z * scale else: pos.z += z * scale + #Check if we have a new layer. if oldPos.z != pos.z and startCodeDone: - layerNr += 1 + self.layerList.append(currentLayer) + currentLayer = [] if f is not None: feedRate = f if x is not None or y is not None or z is not None: @@ -116,8 +117,8 @@ class gcode(): if totalExtrusion > maxExtrusion: maxExtrusion = totalExtrusion if currentPath.type != moveType or currentPath.pathType != pathType: - currentPath = gcodePath(moveType, pathType, layerNr, currentPath.list[-1]) - pathList.append(currentPath) + currentPath = gcodePath(moveType, pathType, currentPath.list[-1]) + currentLayer.append(currentPath) newPos = pos.copy() newPos.e = totalExtrusion currentPath.list.append(newPos) @@ -183,8 +184,7 @@ class gcode(): else: print "Unknown M code:" + str(M) gcodeFile.close() - self.layerCount = layerNr - self.pathList = pathList + self.layerList.append(currentLayer) self.extrusionAmount = maxExtrusion self.totalMoveTimeMinute = totalMoveTimeMinute print "Extruded a total of: %d mm of filament" % (self.extrusionAmount)