+import math\r
+\r
+from util import util3d\r
+from util import profile\r
\r
try:\r
import OpenGL\r
glVertex3f(v3.x, v3.y, v3.z)\r
glVertex3f(v2.x, v2.y, v2.z)\r
glEnd()\r
+\r
+def DrawGCodeLayer(layer):\r
+ filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2\r
+ filamentArea = math.pi * filamentRadius * filamentRadius\r
+ lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10\r
+ \r
+ fillCycle = 0\r
+ fillColorCycle = [[0.5,0.5,0.0],[0.0,0.5,0.5],[0.5,0.0,0.5]]\r
+ \r
+ glDisable(GL_CULL_FACE)\r
+ for path in layer:\r
+ if path.type == 'move':\r
+ glColor3f(0,0,1)\r
+ if path.type == 'extrude':\r
+ if path.pathType == 'FILL':\r
+ glColor3fv(fillColorCycle[fillCycle])\r
+ fillCycle = (fillCycle + 1) % len(fillColorCycle)\r
+ elif path.pathType == 'WALL-INNER':\r
+ glColor3fv([0,1,0])\r
+ elif path.pathType == 'SUPPORT':\r
+ glColor3fv([0,1,1])\r
+ elif path.pathType == 'SKIRT':\r
+ glColor3fv([0,0.5,0.5])\r
+ else:\r
+ glColor3fv([1,0,0])\r
+ if path.type == 'retract':\r
+ glColor3fv([0,1,1])\r
+ if path.type == 'extrude':\r
+ drawLength = 0.0\r
+ prevNormal = None\r
+ for i in xrange(0, len(path.list)-1):\r
+ v0 = path.list[i]\r
+ v1 = path.list[i+1]\r
+\r
+ # Calculate line width from ePerDistance (needs layer thickness and filament diameter)\r
+ dist = (v0 - v1).vsize()\r
+ if dist > 0 and path.layerThickness > 0:\r
+ extrusionMMperDist = (v1.e - v0.e) / dist\r
+ lineWidth = extrusionMMperDist * filamentArea / path.layerThickness / 2\r
+\r
+ drawLength += (v0 - v1).vsize()\r
+ normal = (v0 - v1).cross(util3d.Vector3(0,0,1))\r
+ normal.normalize()\r
+\r
+ vv2 = v0 + normal * lineWidth\r
+ vv3 = v1 + normal * lineWidth\r
+ vv0 = v0 - normal * lineWidth\r
+ vv1 = v1 - normal * lineWidth\r
+\r
+ glBegin(GL_QUADS)\r
+ glVertex3f(vv0.x, vv0.y, vv0.z - 0.01)\r
+ glVertex3f(vv1.x, vv1.y, vv1.z - 0.01)\r
+ glVertex3f(vv3.x, vv3.y, vv3.z - 0.01)\r
+ glVertex3f(vv2.x, vv2.y, vv2.z - 0.01)\r
+ glEnd()\r
+ if prevNormal != None:\r
+ n = (normal + prevNormal)\r
+ n.normalize()\r
+ vv4 = v0 + n * lineWidth\r
+ vv5 = v0 - n * lineWidth\r
+ glBegin(GL_QUADS)\r
+ glVertex3f(vv2.x, vv2.y, vv2.z)\r
+ glVertex3f(vv4.x, vv4.y, vv4.z)\r
+ glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z)\r
+ glVertex3f(v0.x, v0.y, v0.z)\r
+ \r
+ glVertex3f(vv0.x, vv0.y, vv0.z)\r
+ glVertex3f(vv5.x, vv5.y, vv5.z)\r
+ glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z)\r
+ glVertex3f(v0.x, v0.y, v0.z)\r
+ glEnd()\r
+ \r
+ prevNormal = normal\r
+ prevVv1 = vv1\r
+ prevVv3 = vv3\r
+ \r
+ #for v in path.list:\r
+ # glBegin(GL_TRIANGLE_FAN)\r
+ # glVertex3f(v.x, v.y, v.z - 0.001)\r
+ # for i in xrange(0, 16+1):\r
+ # 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)\r
+ # glEnd()\r
+ else:\r
+ glBegin(GL_LINE_STRIP)\r
+ for v in path.list:\r
+ glVertex3f(v.x, v.y, v.z)\r
+ glEnd()\r
+ glEnable(GL_CULL_FACE)\r
self.gcodeDisplayList = glGenLists(len(self.parent.gcode.layerList));\r
self.gcodeDisplayListCount = len(self.parent.gcode.layerList)\r
self.parent.gcodeDirty = False\r
- prevLayerZ = 0.0\r
- curLayerZ = 0.0\r
- \r
- layerThickness = 0.0\r
- filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2\r
- filamentArea = math.pi * filamentRadius * filamentRadius\r
- lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10\r
\r
curLayerNum = 0\r
for layer in self.parent.gcode.layerList:\r
glNewList(self.gcodeDisplayList + curLayerNum, GL_COMPILE)\r
- glDisable(GL_CULL_FACE)\r
- curLayerZ = layer[0].list[1].z\r
- layerThickness = curLayerZ - prevLayerZ\r
- prevLayerZ = layer[-1].list[-1].z\r
- for path in layer:\r
- if path.type == 'move':\r
- glColor3f(0,0,1)\r
- if path.type == 'extrude':\r
- if path.pathType == 'FILL':\r
- glColor3f(0.5,0.5,0)\r
- elif path.pathType == 'WALL-INNER':\r
- glColor3f(0,1,0)\r
- elif path.pathType == 'SUPPORT':\r
- glColor3f(0,1,1)\r
- elif path.pathType == 'SKIRT':\r
- glColor3f(0,0.5,0.5)\r
- else:\r
- glColor3f(1,0,0)\r
- if path.type == 'retract':\r
- glColor3f(0,1,1)\r
- if path.type == 'extrude':\r
- for i in xrange(0, len(path.list)-1):\r
- v0 = path.list[i]\r
- v1 = path.list[i+1]\r
-\r
- # Calculate line width from ePerDistance (needs layer thickness and filament diameter)\r
- dist = (v0 - v1).vsize()\r
- if dist > 0 and layerThickness > 0:\r
- extrusionMMperDist = (v1.e - v0.e) / dist\r
- lineWidth = extrusionMMperDist * filamentArea / layerThickness / 2\r
-\r
- normal = (v0 - v1).cross(util3d.Vector3(0,0,1))\r
- normal.normalize()\r
- v2 = v0 + normal * lineWidth\r
- v3 = v1 + normal * lineWidth\r
- v0 = v0 - normal * lineWidth\r
- v1 = v1 - normal * lineWidth\r
-\r
- glBegin(GL_QUADS)\r
- if path.pathType == 'FILL': #Remove depth buffer fighting on infill/wall overlap\r
- glVertex3f(v0.x, v0.y, v0.z - 0.02)\r
- glVertex3f(v1.x, v1.y, v1.z - 0.02)\r
- glVertex3f(v3.x, v3.y, v3.z - 0.02)\r
- glVertex3f(v2.x, v2.y, v2.z - 0.02)\r
- else:\r
- glVertex3f(v0.x, v0.y, v0.z - 0.01)\r
- glVertex3f(v1.x, v1.y, v1.z - 0.01)\r
- glVertex3f(v3.x, v3.y, v3.z - 0.01)\r
- glVertex3f(v2.x, v2.y, v2.z - 0.01)\r
- glEnd()\r
- \r
- #for v in path['list']:\r
- # glBegin(GL_TRIANGLE_FAN)\r
- # glVertex3f(v.x, v.y, v.z - 0.001)\r
- # for i in xrange(0, 16+1):\r
- # if path['pathType'] == 'FILL': #Remove depth buffer fighting on infill/wall overlap\r
- # 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)\r
- # else:\r
- # 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)\r
- # glEnd()\r
- else:\r
- glBegin(GL_LINE_STRIP)\r
- for v in path.list:\r
- glVertex3f(v.x, v.y, v.z)\r
- glEnd()\r
- curLayerNum += 1\r
- glEnable(GL_CULL_FACE)\r
+ opengl.DrawGCodeLayer(layer)\r
glEndList()\r
+ curLayerNum += 1\r
\r
if self.parent.gcode != None and (self.viewMode == "GCode" or self.viewMode == "Mixed"):\r
glEnable(GL_COLOR_MATERIAL)\r
from util import profile
class gcodePath(object):
- def __init__(self, newType, pathType, startPoint):
+ def __init__(self, newType, pathType, layerThickness, startPoint):
self.type = newType
self.pathType = pathType
+ self.layerThickness = layerThickness
self.list = [startPoint]
class gcode(object):
scale = 1.0
posAbs = True
feedRate = 3600
+ layerThickness = 0.1
pathType = 'CUSTOM';
startCodeDone = False
currentLayer = []
- currentPath = gcodePath('move', pathType, pos.copy())
+ currentPath = gcodePath('move', pathType, layerThickness, pos.copy())
currentPath.list[0].e = totalExtrusion
currentLayer.append(currentPath)
for line in gcodeFile:
pathType = 'WALL-INNER'
elif comment == 'skirt':
pathType = 'SKIRT'
+ if comment.startswith('LAYER:'):
+ self.layerList.append(currentLayer)
+ currentLayer = []
if pathType != "CUSTOM":
startCodeDone = True
line = line[0:line.find(';')]
else:
pos.z += z * scale
#Check if we have a new layer.
- if oldPos.z < pos.z and startCodeDone and len(currentLayer) > 0:
- self.layerList.append(currentLayer)
- currentLayer = []
+ if oldPos.z != pos.z:
+ layerThickness = abs(oldPos.z - pos.z)
if f is not None:
feedRate = f
if x is not None or y is not None or z is not None:
if totalExtrusion > maxExtrusion:
maxExtrusion = totalExtrusion
if currentPath.type != moveType or currentPath.pathType != pathType:
- currentPath = gcodePath(moveType, pathType, currentPath.list[-1])
+ currentPath = gcodePath(moveType, pathType, layerThickness, currentPath.list[-1])
currentLayer.append(currentPath)
newPos = pos.copy()
newPos.e = totalExtrusion