chiark / gitweb /
Some fixes to the preview window OpenGL code. Needed after last changes in GCode...
authorDaid <daid303@gmail.com>
Thu, 3 May 2012 18:09:46 +0000 (20:09 +0200)
committerDaid <daid303@gmail.com>
Thu, 3 May 2012 18:09:46 +0000 (20:09 +0200)
However, also changes the view height depending on the selected layer now.

Cura/gui/gcodeTextArea.py
Cura/gui/opengl.py
Cura/gui/preview3d.py

index 6cb108a17658f8df7b893fe60b18323321b3497b..3c0233253640ad4f8efe1147aabf31003c991d93 100644 (file)
@@ -14,7 +14,7 @@ class GcodeTextArea(wx.stc.StyledTextCtrl):
                fontName = wx.Font(wx.SystemSettings.GetFont(wx.SYS_ANSI_VAR_FONT).GetPointSize(), wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL).GetFaceName()
                self.SetStyleBits(5)
                self.StyleSetSpec(0, "face:%s,size:%d" % (fontName, fontSize))
-               self.StyleSetSpec(1, "fore:#008000,face:%s,size:%d" % (fontName, fontSize))
+               self.StyleSetSpec(1, "fore:#006000,face:%s,size:%d" % (fontName, fontSize))
                self.IndicatorSetStyle(0, wx.stc.STC_INDIC_TT)
                self.IndicatorSetForeground(0, "#0000FF")
                self.IndicatorSetStyle(1, wx.stc.STC_INDIC_SQUIGGLE)
index f7331aadebe7f4014fc6ae8c9d4aaef60ed71b08..92ffcdea219f78d93dda69c959b14dcca3117c4b 100644 (file)
@@ -17,7 +17,9 @@ def InitGL(window, view3D, zoom):
        glViewport(0,0, size.GetWidth(), size.GetHeight())\r
        \r
        glLightfv(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
+       glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
 \r
+       glEnable(GL_NORMALIZE)\r
        glEnable(GL_LIGHTING)\r
        glEnable(GL_LIGHT0)\r
        glEnable(GL_DEPTH_TEST)\r
@@ -198,6 +200,7 @@ def DrawBox(vMin, vMax):
        glEnd()\r
 \r
 def DrawSTL(mesh):\r
+       glEnable(GL_CULL_FACE)\r
        for face in mesh.faces:\r
                glBegin(GL_TRIANGLES)\r
                v1 = face.v[0]\r
index a2949c911884c2b719f2c286063ff3b04d266f3a..84eb7266142acc0a8c4920f6fd07096c32f2de57 100644 (file)
@@ -38,6 +38,7 @@ class previewPanel(wx.Panel):
                \r
                self.glCanvas = PreviewGLCanvas(self)\r
                self.objectList = []\r
+               self.errorList = []\r
                self.gcode = None\r
                self.objectsMinV = None\r
                self.objectsMaxV = None\r
@@ -230,7 +231,6 @@ class previewPanel(wx.Panel):
                                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
@@ -269,7 +269,7 @@ class previewPanel(wx.Panel):
                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
@@ -421,8 +421,12 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                        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
@@ -435,118 +439,121 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                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
@@ -559,17 +566,15 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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
@@ -624,17 +629,17 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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