chiark / gitweb /
Updated gcode interperter and GCode preview. Fixed #77
authordaid <daid303@gmail.com>
Mon, 7 May 2012 11:24:26 +0000 (13:24 +0200)
committerdaid <daid303@gmail.com>
Mon, 7 May 2012 11:24:26 +0000 (13:24 +0200)
Cura/gui/opengl.py
Cura/gui/preview3d.py
Cura/util/gcodeInterpreter.py

index 92ffcdea219f78d93dda69c959b14dcca3117c4b..0507f566c929658c8a8168edfdf0556416ecd02d 100644 (file)
@@ -1,3 +1,7 @@
+import math\r
+\r
+from util import util3d\r
+from util import profile\r
 \r
 try:\r
        import OpenGL\r
@@ -215,3 +219,91 @@ def DrawSTL(mesh):
                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
index 526659366883f0614569d9b1c0ded54692da0762..71a2638b74e36c047acab9f6c004fb9d47e5aafc 100644 (file)
@@ -446,85 +446,13 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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
index 5714972cae3ff0472d63d7739e71e2f722baa842..085861787974d9783d678cb6ec73918e4b56b1dc 100644 (file)
@@ -10,9 +10,10 @@ from util import util3d
 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):
@@ -61,10 +62,11 @@ 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:
@@ -88,6 +90,9 @@ class gcode(object):
                                        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(';')]
@@ -126,9 +131,8 @@ class gcode(object):
                                                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:
@@ -152,7 +156,7 @@ class gcode(object):
                                                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