\r
self.glCanvas = PreviewGLCanvas(self)\r
self.objectList = []\r
+ self.errorList = []\r
self.gcode = None\r
self.objectsMinV = None\r
self.objectsMaxV = None\r
mesh = stl.stlModel()\r
mesh.load(obj.filename)\r
obj.dirty = False\r
- obj.errorList = []\r
obj.mesh = mesh\r
self.updateModelTransform()\r
wx.CallAfter(self.updateToolbar)\r
self.mixedViewButton.Show(self.gcode != None)\r
self.layerSpin.Show(self.glCanvas.viewMode == "GCode" or self.glCanvas.viewMode == "Mixed")\r
if self.gcode != None:\r
- self.layerSpin.SetRange(1, len(self.gcode.layerList))\r
+ self.layerSpin.SetRange(1, len(self.gcode.layerList) - 1)\r
self.toolbar.Realize()\r
\r
def OnViewChange(self):\r
glTranslate(0,0,-self.zoom)\r
glRotate(-self.pitch, 1,0,0)\r
glRotate(self.yaw, 0,0,1)\r
- if self.parent.objectsMaxV != None:\r
- glTranslate(0,0,-self.parent.objectsMaxV.z * profile.getProfileSettingFloat('model_scale') / 2)\r
+ if self.viewMode == "GCode" or self.viewMode == "Mixed":\r
+ if self.parent.gcode != None:\r
+ glTranslate(0,0,-self.parent.gcode.layerList[self.parent.layerSpin.GetValue()][0].list[-1].z)\r
+ else:\r
+ if self.parent.objectsMaxV != None:\r
+ glTranslate(0,0,-self.parent.objectsMaxV.z * profile.getProfileSettingFloat('model_scale') / 2)\r
else:\r
glScale(1.0/self.zoom, 1.0/self.zoom, 1.0)\r
glTranslate(self.offsetX, self.offsetY, 0.0)\r
machineSize = self.parent.machineSize\r
opengl.DrawMachine(machineSize)\r
\r
- if self.parent.gcode != None:\r
- if self.parent.gcodeDirty:\r
- if self.gcodeDisplayListCount < len(self.parent.gcode.layerList) or self.gcodeDisplayList == None:\r
- if self.gcodeDisplayList != None:\r
- glDeleteLists(self.gcodeDisplayList, self.gcodeDisplayListCount)\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
- c = 1.0\r
- #if curLayerNum != self.parent.layerSpin.GetValue():\r
- # if curLayerNum < self.parent.layerSpin.GetValue():\r
- # c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1\r
- # if c < 0.4:\r
- # c = 0.4\r
- # else:\r
- # break\r
- if path.type == 'move':\r
- glColor3f(0,0,c)\r
- if path.type == 'extrude':\r
- if path.pathType == 'FILL':\r
- glColor3f(c/2,c/2,0)\r
- elif path.pathType == 'WALL-INNER':\r
- glColor3f(0,c,0)\r
- elif path.pathType == 'SUPPORT':\r
- glColor3f(0,c,c)\r
- elif path.pathType == 'SKIRT':\r
- glColor3f(0,c/2,c/2)\r
- else:\r
- glColor3f(c,0,0)\r
- if path.type == 'retract':\r
+ if self.parent.gcode != None and self.parent.gcodeDirty:\r
+ if self.gcodeDisplayListCount < len(self.parent.gcode.layerList) or self.gcodeDisplayList == None:\r
+ if self.gcodeDisplayList != None:\r
+ glDeleteLists(self.gcodeDisplayList, self.gcodeDisplayListCount)\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
+ c = 1.0\r
+ #if curLayerNum != self.parent.layerSpin.GetValue():\r
+ # if curLayerNum < self.parent.layerSpin.GetValue():\r
+ # c = 0.9 - (self.parent.layerSpin.GetValue() - curLayerNum) * 0.1\r
+ # if c < 0.4:\r
+ # c = 0.4\r
+ # else:\r
+ # break\r
+ if path.type == 'move':\r
+ glColor3f(0,0,c)\r
+ if path.type == 'extrude':\r
+ if path.pathType == 'FILL':\r
+ glColor3f(c/2,c/2,0)\r
+ elif path.pathType == 'WALL-INNER':\r
+ glColor3f(0,c,0)\r
+ elif path.pathType == 'SUPPORT':\r
glColor3f(0,c,c)\r
- if c > 0.4 and 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
+ elif path.pathType == 'SKIRT':\r
+ glColor3f(0,c/2,c/2)\r
else:\r
- glBegin(GL_LINE_STRIP)\r
- for v in path.list:\r
- glVertex3f(v.x, v.y, v.z)\r
+ glColor3f(c,0,0)\r
+ if path.type == 'retract':\r
+ glColor3f(0,c,c)\r
+ if c > 0.4 and 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
- curLayerNum += 1\r
- glEnable(GL_CULL_FACE)\r
- glEndList()\r
- if self.viewMode == "GCode" or self.viewMode == "Mixed":\r
- glEnable(GL_COLOR_MATERIAL)\r
- glEnable(GL_LIGHTING)\r
- glLightfv(GL_LIGHT0, GL_DIFFUSE, [0,0,0,0])\r
- for i in xrange(0, self.parent.layerSpin.GetValue() + 1):\r
- c = 1.0\r
- if i < self.parent.layerSpin.GetValue():\r
- c = 0.9 - (self.parent.layerSpin.GetValue() - i) * 0.1\r
- if c < 0.4:\r
- c = (0.4 + c) / 2\r
- if c < 0.1:\r
- c = 0.1\r
- glLightfv(GL_LIGHT0, GL_AMBIENT, [c,c,c,c])\r
- glCallList(self.gcodeDisplayList + i)\r
- glDisable(GL_COLOR_MATERIAL)\r
- glDisable(GL_LIGHTING)\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
+ glEndList()\r
\r
+ if self.parent.gcode != None and (self.viewMode == "GCode" or self.viewMode == "Mixed"):\r
+ glEnable(GL_COLOR_MATERIAL)\r
+ glEnable(GL_LIGHTING)\r
+ for i in xrange(0, self.parent.layerSpin.GetValue() + 1):\r
+ c = 1.0\r
+ if i < self.parent.layerSpin.GetValue():\r
+ c = 0.9 - (self.parent.layerSpin.GetValue() - i) * 0.1\r
+ if c < 0.4:\r
+ c = (0.4 + c) / 2\r
+ if c < 0.1:\r
+ c = 0.1\r
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, [0,0,0,0])\r
+ glLightfv(GL_LIGHT0, GL_AMBIENT, [c,c,c,c])\r
+ glCallList(self.gcodeDisplayList + i)\r
+ glDisable(GL_LIGHTING)\r
+ glDisable(GL_COLOR_MATERIAL)\r
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [0.2, 0.2, 0.2, 1.0]);\r
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.8, 0.8, 0.8, 1.0]);\r
+\r
+ glColor3f(1.0,1.0,1.0)\r
glTranslate(self.parent.machineCenter.x, self.parent.machineCenter.y, 0)\r
for obj in self.parent.objectList:\r
if obj.mesh == None:\r
opengl.DrawSTL(obj.mesh)\r
glEndList()\r
\r
- glEnable(GL_NORMALIZE)\r
if self.viewMode == "Transparent" or self.viewMode == "Mixed":\r
glLightfv(GL_LIGHT0, GL_DIFFUSE, map(lambda x: x / 2, self.objColor[self.parent.objectList.index(obj)]))\r
glLightfv(GL_LIGHT0, GL_AMBIENT, map(lambda x: x / 10, self.objColor[self.parent.objectList.index(obj)]))\r
#If we want transparent, then first render a solid black model to remove the printer size lines.\r
if self.viewMode != "Mixed":\r
glDisable(GL_BLEND)\r
- glDisable(GL_LIGHTING)\r
- glColor3f(0,0,0)\r
+ glColor3f(0.0,0.0,0.0)\r
self.drawModel(obj)\r
- glColor3f(1,1,1)\r
+ glColor3f(1.0,1.0,1.0)\r
#After the black model is rendered, render the model again but now with lighting and no depth testing.\r
glDisable(GL_DEPTH_TEST)\r
glEnable(GL_LIGHTING)\r
glEnable(GL_LIGHTING)\r
self.drawModel(obj)\r
\r
- if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray":\r
- glDisable(GL_LIGHTING)\r
- glDisable(GL_DEPTH_TEST)\r
- glDisable(GL_BLEND)\r
- glColor3f(1,0,0)\r
- #glBegin(GL_LINES)\r
- #for err in self.parent.errorList:\r
- # glVertex3f(err[0].x, err[0].y, err[0].z)\r
- # glVertex3f(err[1].x, err[1].y, err[1].z)\r
- #glEnd()\r
- glEnable(GL_DEPTH_TEST)\r
+ if self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray":\r
+ glDisable(GL_LIGHTING)\r
+ glDisable(GL_DEPTH_TEST)\r
+ glDisable(GL_BLEND)\r
+ glColor3f(1,0,0)\r
+ glBegin(GL_LINES)\r
+ for err in self.parent.errorList:\r
+ glVertex3f(err[0].x, err[0].y, err[0].z)\r
+ glVertex3f(err[1].x, err[1].y, err[1].z)\r
+ glEnd()\r
+ glEnable(GL_DEPTH_TEST)\r
glFlush()\r
\r
def drawModel(self, obj):\r