-# coding=utf-8\r
-from __future__ import absolute_import\r
-\r
-import math\r
-\r
-from util import meshLoader\r
-from util import util3d\r
-from util import profile\r
-from util.resources import getPathForMesh\r
-\r
-try:\r
- import OpenGL\r
-\r
- OpenGL.ERROR_CHECKING = False\r
- from OpenGL.GLU import *\r
- from OpenGL.GL import *\r
-\r
- hasOpenGLlibs = True\r
-except:\r
- print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"\r
- hasOpenGLlibs = False\r
-\r
-def InitGL(window, view3D, zoom):\r
- # set viewing projection\r
- glMatrixMode(GL_MODELVIEW)\r
- glLoadIdentity()\r
- size = window.GetSize()\r
- glViewport(0, 0, size.GetWidth(), size.GetHeight())\r
-\r
- glLightfv(GL_LIGHT0, GL_POSITION, [0.2, 0.2, 1.0, 0.0])\r
- glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
-\r
- glEnable(GL_RESCALE_NORMAL)\r
- glEnable(GL_LIGHTING)\r
- glEnable(GL_LIGHT0)\r
- glEnable(GL_DEPTH_TEST)\r
- glEnable(GL_CULL_FACE)\r
- glDisable(GL_BLEND)\r
-\r
- glClearColor(1.0, 1.0, 1.0, 1.0)\r
- glClearStencil(0)\r
- glClearDepth(1.0)\r
-\r
- glMatrixMode(GL_PROJECTION)\r
- glLoadIdentity()\r
- aspect = float(size.GetWidth()) / float(size.GetHeight())\r
- if view3D:\r
- gluPerspective(45.0, aspect, 1.0, 1000.0)\r
- else:\r
- glOrtho(-aspect * (zoom), aspect * (zoom), -1.0 * (zoom), 1.0 * (zoom), -1000.0, 1000.0)\r
-\r
- glMatrixMode(GL_MODELVIEW)\r
- glLoadIdentity()\r
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)\r
-\r
-platformMesh = None\r
-\r
-def DrawMachine(machineSize):\r
- if profile.getPreference('machine_type') == 'ultimaker':\r
- glPushMatrix()\r
- glEnable(GL_LIGHTING)\r
- glTranslate(100, 200, -5)\r
- glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 0.8, 0.8])\r
- glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5, 0.5, 0.5])\r
- glEnable(GL_BLEND)\r
- glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)\r
-\r
- global platformMesh\r
- if platformMesh == None:\r
- platformMesh = meshLoader.loadMesh(getPathForMesh('ultimaker_platform.stl'))\r
- platformMesh.setRotateMirror(0, False, False, False, False, False)\r
-\r
- DrawMesh(platformMesh)\r
- glPopMatrix()\r
-\r
- glDisable(GL_LIGHTING)\r
- if False:\r
- glColor3f(0.7, 0.7, 0.7)\r
- glLineWidth(2)\r
- glBegin(GL_LINES)\r
- for i in xrange(0, int(machineSize.x), 10):\r
- glVertex3f(i, 0, 0)\r
- glVertex3f(i, machineSize.y, 0)\r
- for i in xrange(0, int(machineSize.y), 10):\r
- glVertex3f(0, i, 0)\r
- glVertex3f(machineSize.x, i, 0)\r
- glEnd()\r
-\r
- glEnable(GL_LINE_SMOOTH)\r
- glEnable(GL_BLEND)\r
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)\r
- glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);\r
-\r
- glColor3f(0.0, 0.0, 0.0)\r
- glLineWidth(4)\r
- glBegin(GL_LINE_LOOP)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(machineSize.x, 0, 0)\r
- glVertex3f(machineSize.x, machineSize.y, 0)\r
- glVertex3f(0, machineSize.y, 0)\r
- glEnd()\r
-\r
- glLineWidth(2)\r
- glBegin(GL_LINE_LOOP)\r
- glVertex3f(0, 0, machineSize.z)\r
- glVertex3f(machineSize.x, 0, machineSize.z)\r
- glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
- glVertex3f(0, machineSize.y, machineSize.z)\r
- glEnd()\r
- glBegin(GL_LINES)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(0, 0, machineSize.z)\r
- glVertex3f(machineSize.x, 0, 0)\r
- glVertex3f(machineSize.x, 0, machineSize.z)\r
- glVertex3f(machineSize.x, machineSize.y, 0)\r
- glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
- glVertex3f(0, machineSize.y, 0)\r
- glVertex3f(0, machineSize.y, machineSize.z)\r
- glEnd()\r
- else:\r
- glDisable(GL_CULL_FACE)\r
- glEnable(GL_BLEND)\r
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)\r
- glColor4ub(5, 171, 231, 127)\r
- glBegin(GL_QUADS)\r
- for x in xrange(0, int(machineSize.x), 20):\r
- for y in xrange(0, int(machineSize.y), 20):\r
- glVertex3f(x, y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
- glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
- for x in xrange(10, int(machineSize.x), 20):\r
- for y in xrange(10, int(machineSize.y), 20):\r
- glVertex3f(x, y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
- glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
- glEnd()\r
- glColor4ub(5 * 8 / 10, 171 * 8 / 10, 231 * 8 / 10, 128)\r
- glBegin(GL_QUADS)\r
- for x in xrange(10, int(machineSize.x), 20):\r
- for y in xrange(0, int(machineSize.y), 20):\r
- glVertex3f(x, y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
- glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
- for x in xrange(0, int(machineSize.x), 20):\r
- for y in xrange(10, int(machineSize.y), 20):\r
- glVertex3f(x, y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), y, -0.01)\r
- glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)\r
- glVertex3f(x, min(y + 10, machineSize.y), -0.01)\r
- glEnd()\r
- glEnable(GL_CULL_FACE)\r
-\r
- glColor4ub(5, 171, 231, 64)\r
- glBegin(GL_QUADS)\r
- glVertex3f(0, 0, machineSize.z)\r
- glVertex3f(0, machineSize.y, machineSize.z)\r
- glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
- glVertex3f(machineSize.x, 0, machineSize.z)\r
- glEnd()\r
-\r
- glColor4ub(5, 171, 231, 96)\r
- glBegin(GL_QUADS)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(0, 0, machineSize.z)\r
- glVertex3f(machineSize.x, 0, machineSize.z)\r
- glVertex3f(machineSize.x, 0, 0)\r
-\r
- glVertex3f(0, machineSize.y, machineSize.z)\r
- glVertex3f(0, machineSize.y, 0)\r
- glVertex3f(machineSize.x, machineSize.y, 0)\r
- glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
- glEnd()\r
-\r
- glColor4ub(5, 171, 231, 128)\r
- glBegin(GL_QUADS)\r
- glVertex3f(0, 0, machineSize.z)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(0, machineSize.y, 0)\r
- glVertex3f(0, machineSize.y, machineSize.z)\r
-\r
- glVertex3f(machineSize.x, 0, 0)\r
- glVertex3f(machineSize.x, 0, machineSize.z)\r
- glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
- glVertex3f(machineSize.x, machineSize.y, 0)\r
- glEnd()\r
-\r
- glDisable(GL_BLEND)\r
-\r
- glPushMatrix()\r
- glTranslate(5, 5, 2)\r
- glLineWidth(2)\r
- glColor3f(0.5, 0, 0)\r
- glBegin(GL_LINES)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(20, 0, 0)\r
- glEnd()\r
- glColor3f(0, 0.5, 0)\r
- glBegin(GL_LINES)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(0, 20, 0)\r
- glEnd()\r
- glColor3f(0, 0, 0.5)\r
- glBegin(GL_LINES)\r
- glVertex3f(0, 0, 0)\r
- glVertex3f(0, 0, 20)\r
- glEnd()\r
-\r
- glDisable(GL_DEPTH_TEST)\r
- #X\r
- glColor3f(1, 0, 0)\r
- glPushMatrix()\r
- glTranslate(23, 0, 0)\r
- noZ = ResetMatrixRotationAndScale()\r
- glBegin(GL_LINES)\r
- glVertex3f(-0.8, 1, 0)\r
- glVertex3f(0.8, -1, 0)\r
- glVertex3f(0.8, 1, 0)\r
- glVertex3f(-0.8, -1, 0)\r
- glEnd()\r
- glPopMatrix()\r
-\r
- #Y\r
- glColor3f(0, 1, 0)\r
- glPushMatrix()\r
- glTranslate(0, 23, 0)\r
- ResetMatrixRotationAndScale()\r
- glBegin(GL_LINES)\r
- glVertex3f(-0.8, 1, 0)\r
- glVertex3f(0.0, 0, 0)\r
- glVertex3f(0.8, 1, 0)\r
- glVertex3f(-0.8, -1, 0)\r
- glEnd()\r
- glPopMatrix()\r
-\r
- #Z\r
- if not noZ:\r
- glColor3f(0, 0, 1)\r
- glPushMatrix()\r
- glTranslate(0, 0, 23)\r
- ResetMatrixRotationAndScale()\r
- glBegin(GL_LINES)\r
- glVertex3f(-0.8, 1, 0)\r
- glVertex3f(0.8, 1, 0)\r
- glVertex3f(0.8, 1, 0)\r
- glVertex3f(-0.8, -1, 0)\r
- glVertex3f(-0.8, -1, 0)\r
- glVertex3f(0.8, -1, 0)\r
- glEnd()\r
- glPopMatrix()\r
-\r
- glPopMatrix()\r
- glEnable(GL_DEPTH_TEST)\r
-\r
-\r
-def ResetMatrixRotationAndScale():\r
- matrix = glGetFloatv(GL_MODELVIEW_MATRIX)\r
- noZ = False\r
- if matrix[3][2] > 0:\r
- return False\r
- scale2D = matrix[0][0]\r
- matrix[0][0] = 1.0\r
- matrix[1][0] = 0.0\r
- matrix[2][0] = 0.0\r
- matrix[0][1] = 0.0\r
- matrix[1][1] = 1.0\r
- matrix[2][1] = 0.0\r
- matrix[0][2] = 0.0\r
- matrix[1][2] = 0.0\r
- matrix[2][2] = 1.0\r
-\r
- if matrix[3][2] != 0.0:\r
- matrix[3][0] = matrix[3][0] / (-matrix[3][2] / 100)\r
- matrix[3][1] = matrix[3][1] / (-matrix[3][2] / 100)\r
- matrix[3][2] = -100\r
- else:\r
- matrix[0][0] = scale2D\r
- matrix[1][1] = scale2D\r
- matrix[2][2] = scale2D\r
- matrix[3][2] = -100\r
- noZ = True\r
-\r
- glLoadMatrixf(matrix)\r
- return noZ\r
-\r
-\r
-def DrawBox(vMin, vMax):\r
- glBegin(GL_LINE_LOOP)\r
- glVertex3f(vMin[0], vMin[1], vMin[2])\r
- glVertex3f(vMax[0], vMin[1], vMin[2])\r
- glVertex3f(vMax[0], vMax[1], vMin[2])\r
- glVertex3f(vMin[0], vMax[1], vMin[2])\r
- glEnd()\r
-\r
- glBegin(GL_LINE_LOOP)\r
- glVertex3f(vMin[0], vMin[1], vMax[2])\r
- glVertex3f(vMax[0], vMin[1], vMax[2])\r
- glVertex3f(vMax[0], vMax[1], vMax[2])\r
- glVertex3f(vMin[0], vMax[1], vMax[2])\r
- glEnd()\r
- glBegin(GL_LINES)\r
- glVertex3f(vMin[0], vMin[1], vMin[2])\r
- glVertex3f(vMin[0], vMin[1], vMax[2])\r
- glVertex3f(vMax[0], vMin[1], vMin[2])\r
- glVertex3f(vMax[0], vMin[1], vMax[2])\r
- glVertex3f(vMax[0], vMax[1], vMin[2])\r
- glVertex3f(vMax[0], vMax[1], vMax[2])\r
- glVertex3f(vMin[0], vMax[1], vMin[2])\r
- glVertex3f(vMin[0], vMax[1], vMax[2])\r
- glEnd()\r
-\r
-\r
-def DrawMeshOutline(mesh):\r
- glEnable(GL_CULL_FACE)\r
- glEnableClientState(GL_VERTEX_ARRAY);\r
- glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)\r
-\r
- glCullFace(GL_FRONT)\r
- glLineWidth(3)\r
- glPolygonMode(GL_BACK, GL_LINE)\r
- glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount)\r
- glPolygonMode(GL_BACK, GL_FILL)\r
- glCullFace(GL_BACK)\r
-\r
- glDisableClientState(GL_VERTEX_ARRAY)\r
-\r
-\r
-def DrawMesh(mesh):\r
- glEnable(GL_CULL_FACE)\r
- glEnableClientState(GL_VERTEX_ARRAY);\r
- glEnableClientState(GL_NORMAL_ARRAY);\r
- glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)\r
- glNormalPointer(GL_FLOAT, 0, mesh.normal)\r
-\r
- #Odd, drawing in batchs is a LOT faster then drawing it all at once.\r
- batchSize = 999 #Warning, batchSize needs to be dividable by 3\r
- extraStartPos = int(mesh.vertexCount / batchSize) * batchSize\r
- extraCount = mesh.vertexCount - extraStartPos\r
-\r
- glCullFace(GL_BACK)\r
- for i in xrange(0, int(mesh.vertexCount / batchSize)):\r
- glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)\r
- glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)\r
-\r
- glCullFace(GL_FRONT)\r
- glNormalPointer(GL_FLOAT, 0, mesh.invNormal)\r
- for i in xrange(0, int(mesh.vertexCount / batchSize)):\r
- glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)\r
- extraStartPos = int(mesh.vertexCount / batchSize) * batchSize\r
- extraCount = mesh.vertexCount - extraStartPos\r
- glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)\r
- glCullFace(GL_BACK)\r
-\r
- glDisableClientState(GL_VERTEX_ARRAY)\r
- glDisableClientState(GL_NORMAL_ARRAY);\r
-\r
-\r
-def DrawMeshSteep(mesh, angle):\r
- cosAngle = math.sin(angle / 180.0 * math.pi)\r
- glDisable(GL_LIGHTING)\r
- glDepthFunc(GL_EQUAL)\r
- for i in xrange(0, int(mesh.vertexCount), 3):\r
- if mesh.normal[i][2] < -0.999999:\r
- if mesh.vertexes[i + 0][2] > 0.01:\r
- glColor3f(0.5, 0, 0)\r
- glBegin(GL_TRIANGLES)\r
- glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
- glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
- glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
- glEnd()\r
- elif mesh.normal[i][2] < -cosAngle:\r
- glColor3f(-mesh.normal[i][2], 0, 0)\r
- glBegin(GL_TRIANGLES)\r
- glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
- glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
- glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
- glEnd()\r
- elif mesh.normal[i][2] > 0.999999:\r
- if mesh.vertexes[i + 0][2] > 0.01:\r
- glColor3f(0.5, 0, 0)\r
- glBegin(GL_TRIANGLES)\r
- glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
- glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
- glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
- glEnd()\r
- elif mesh.normal[i][2] > cosAngle:\r
- glColor3f(mesh.normal[i][2], 0, 0)\r
- glBegin(GL_TRIANGLES)\r
- glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])\r
- glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])\r
- glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])\r
- glEnd()\r
- glDepthFunc(GL_LESS)\r
-\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
- moveColor = [0, 0, 1]\r
- retractColor = [1, 0, 0.5]\r
- supportColor = [0, 1, 1]\r
- extrudeColor = [1, 0, 0]\r
- innerWallColor = [0, 1, 0]\r
- skirtColor = [0, 0.5, 0.5]\r
- prevPathWasRetract = False\r
-\r
- glDisable(GL_CULL_FACE)\r
- for path in layer:\r
- if path.type == 'move':\r
- if prevPathWasRetract:\r
- c = retractColor\r
- else:\r
- c = moveColor\r
- zOffset = 0.01\r
- if path.type == 'extrude':\r
- if path.pathType == 'FILL':\r
- c = fillColorCycle[fillCycle]\r
- fillCycle = (fillCycle + 1) % len(fillColorCycle)\r
- elif path.pathType == 'WALL-INNER':\r
- c = innerWallColor\r
- zOffset = 0.02\r
- elif path.pathType == 'SUPPORT':\r
- c = supportColor\r
- elif path.pathType == 'SKIRT':\r
- c = skirtColor\r
- else:\r
- c = extrudeColor\r
- if path.type == 'retract':\r
- c = [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 * v1.extrudeAmountMultiply\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
- glColor3fv(c)\r
- glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)\r
- glVertex3f(vv1.x, vv1.y, vv1.z - zOffset)\r
- glVertex3f(vv3.x, vv3.y, vv3.z - zOffset)\r
- glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)\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
- glColor3fv(c)\r
- glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)\r
- glVertex3f(vv4.x, vv4.y, vv4.z - zOffset)\r
- glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z - zOffset)\r
- glVertex3f(v0.x, v0.y, v0.z - zOffset)\r
-\r
- glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)\r
- glVertex3f(vv5.x, vv5.y, vv5.z - zOffset)\r
- glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z - zOffset)\r
- glVertex3f(v0.x, v0.y, v0.z - zOffset)\r
- glEnd()\r
-\r
- prevNormal = normal\r
- prevVv1 = vv1\r
- prevVv3 = vv3\r
- else:\r
- glBegin(GL_LINE_STRIP)\r
- glColor3fv(c)\r
- for v in path.list:\r
- glVertex3f(v.x, v.y, v.z)\r
- glEnd()\r
- if not path.type == 'move':\r
- prevPathWasRetract = False\r
- if path.type == 'retract' and path.list[0].almostEqual(path.list[-1]):\r
- prevPathWasRetract = True\r
- glEnable(GL_CULL_FACE)\r
+# coding=utf-8
+from __future__ import absolute_import
+
+import math
+
+from util import meshLoader
+from util import util3d
+from util import profile
+from util.resources import getPathForMesh
+
+try:
+ import OpenGL
+
+ OpenGL.ERROR_CHECKING = False
+ from OpenGL.GLU import *
+ from OpenGL.GL import *
+
+ hasOpenGLlibs = True
+except:
+ print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"
+ hasOpenGLlibs = False
+
+def InitGL(window, view3D, zoom):
+ # set viewing projection
+ glMatrixMode(GL_MODELVIEW)
+ glLoadIdentity()
+ size = window.GetSize()
+ glViewport(0, 0, size.GetWidth(), size.GetHeight())
+
+ glLightfv(GL_LIGHT0, GL_POSITION, [0.2, 0.2, 1.0, 0.0])
+ glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])
+
+ glEnable(GL_RESCALE_NORMAL)
+ glEnable(GL_LIGHTING)
+ glEnable(GL_LIGHT0)
+ glEnable(GL_DEPTH_TEST)
+ glEnable(GL_CULL_FACE)
+ glDisable(GL_BLEND)
+
+ glClearColor(1.0, 1.0, 1.0, 1.0)
+ glClearStencil(0)
+ glClearDepth(1.0)
+
+ glMatrixMode(GL_PROJECTION)
+ glLoadIdentity()
+ aspect = float(size.GetWidth()) / float(size.GetHeight())
+ if view3D:
+ gluPerspective(45.0, aspect, 1.0, 1000.0)
+ else:
+ glOrtho(-aspect * (zoom), aspect * (zoom), -1.0 * (zoom), 1.0 * (zoom), -1000.0, 1000.0)
+
+ glMatrixMode(GL_MODELVIEW)
+ glLoadIdentity()
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
+
+platformMesh = None
+
+def DrawMachine(machineSize):
+ if profile.getPreference('machine_type') == 'ultimaker':
+ glPushMatrix()
+ glEnable(GL_LIGHTING)
+ glTranslate(100, 200, -5)
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 0.8, 0.8])
+ glLightfv(GL_LIGHT0, GL_AMBIENT, [0.5, 0.5, 0.5])
+ glEnable(GL_BLEND)
+ glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR)
+
+ global platformMesh
+ if platformMesh == None:
+ platformMesh = meshLoader.loadMesh(getPathForMesh('ultimaker_platform.stl'))
+ platformMesh.setRotateMirror(0, False, False, False, False, False)
+
+ DrawMesh(platformMesh)
+ glPopMatrix()
+
+ glDisable(GL_LIGHTING)
+ if False:
+ glColor3f(0.7, 0.7, 0.7)
+ glLineWidth(2)
+ glBegin(GL_LINES)
+ for i in xrange(0, int(machineSize.x), 10):
+ glVertex3f(i, 0, 0)
+ glVertex3f(i, machineSize.y, 0)
+ for i in xrange(0, int(machineSize.y), 10):
+ glVertex3f(0, i, 0)
+ glVertex3f(machineSize.x, i, 0)
+ glEnd()
+
+ glEnable(GL_LINE_SMOOTH)
+ glEnable(GL_BLEND)
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
+ glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
+
+ glColor3f(0.0, 0.0, 0.0)
+ glLineWidth(4)
+ glBegin(GL_LINE_LOOP)
+ glVertex3f(0, 0, 0)
+ glVertex3f(machineSize.x, 0, 0)
+ glVertex3f(machineSize.x, machineSize.y, 0)
+ glVertex3f(0, machineSize.y, 0)
+ glEnd()
+
+ glLineWidth(2)
+ glBegin(GL_LINE_LOOP)
+ glVertex3f(0, 0, machineSize.z)
+ glVertex3f(machineSize.x, 0, machineSize.z)
+ glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+ glVertex3f(0, machineSize.y, machineSize.z)
+ glEnd()
+ glBegin(GL_LINES)
+ glVertex3f(0, 0, 0)
+ glVertex3f(0, 0, machineSize.z)
+ glVertex3f(machineSize.x, 0, 0)
+ glVertex3f(machineSize.x, 0, machineSize.z)
+ glVertex3f(machineSize.x, machineSize.y, 0)
+ glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+ glVertex3f(0, machineSize.y, 0)
+ glVertex3f(0, machineSize.y, machineSize.z)
+ glEnd()
+ else:
+ glDisable(GL_CULL_FACE)
+ glEnable(GL_BLEND)
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
+ glColor4ub(5, 171, 231, 127)
+ glBegin(GL_QUADS)
+ for x in xrange(0, int(machineSize.x), 20):
+ for y in xrange(0, int(machineSize.y), 20):
+ glVertex3f(x, y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+ glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+ for x in xrange(10, int(machineSize.x), 20):
+ for y in xrange(10, int(machineSize.y), 20):
+ glVertex3f(x, y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+ glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+ glEnd()
+ glColor4ub(5 * 8 / 10, 171 * 8 / 10, 231 * 8 / 10, 128)
+ glBegin(GL_QUADS)
+ for x in xrange(10, int(machineSize.x), 20):
+ for y in xrange(0, int(machineSize.y), 20):
+ glVertex3f(x, y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+ glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+ for x in xrange(0, int(machineSize.x), 20):
+ for y in xrange(10, int(machineSize.y), 20):
+ glVertex3f(x, y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), y, -0.01)
+ glVertex3f(min(x + 10, machineSize.x), min(y + 10, machineSize.y), -0.01)
+ glVertex3f(x, min(y + 10, machineSize.y), -0.01)
+ glEnd()
+ glEnable(GL_CULL_FACE)
+
+ glColor4ub(5, 171, 231, 64)
+ glBegin(GL_QUADS)
+ glVertex3f(0, 0, machineSize.z)
+ glVertex3f(0, machineSize.y, machineSize.z)
+ glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+ glVertex3f(machineSize.x, 0, machineSize.z)
+ glEnd()
+
+ glColor4ub(5, 171, 231, 96)
+ glBegin(GL_QUADS)
+ glVertex3f(0, 0, 0)
+ glVertex3f(0, 0, machineSize.z)
+ glVertex3f(machineSize.x, 0, machineSize.z)
+ glVertex3f(machineSize.x, 0, 0)
+
+ glVertex3f(0, machineSize.y, machineSize.z)
+ glVertex3f(0, machineSize.y, 0)
+ glVertex3f(machineSize.x, machineSize.y, 0)
+ glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+ glEnd()
+
+ glColor4ub(5, 171, 231, 128)
+ glBegin(GL_QUADS)
+ glVertex3f(0, 0, machineSize.z)
+ glVertex3f(0, 0, 0)
+ glVertex3f(0, machineSize.y, 0)
+ glVertex3f(0, machineSize.y, machineSize.z)
+
+ glVertex3f(machineSize.x, 0, 0)
+ glVertex3f(machineSize.x, 0, machineSize.z)
+ glVertex3f(machineSize.x, machineSize.y, machineSize.z)
+ glVertex3f(machineSize.x, machineSize.y, 0)
+ glEnd()
+
+ glDisable(GL_BLEND)
+
+ glPushMatrix()
+ glTranslate(5, 5, 2)
+ glLineWidth(2)
+ glColor3f(0.5, 0, 0)
+ glBegin(GL_LINES)
+ glVertex3f(0, 0, 0)
+ glVertex3f(20, 0, 0)
+ glEnd()
+ glColor3f(0, 0.5, 0)
+ glBegin(GL_LINES)
+ glVertex3f(0, 0, 0)
+ glVertex3f(0, 20, 0)
+ glEnd()
+ glColor3f(0, 0, 0.5)
+ glBegin(GL_LINES)
+ glVertex3f(0, 0, 0)
+ glVertex3f(0, 0, 20)
+ glEnd()
+
+ glDisable(GL_DEPTH_TEST)
+ #X
+ glColor3f(1, 0, 0)
+ glPushMatrix()
+ glTranslate(23, 0, 0)
+ noZ = ResetMatrixRotationAndScale()
+ glBegin(GL_LINES)
+ glVertex3f(-0.8, 1, 0)
+ glVertex3f(0.8, -1, 0)
+ glVertex3f(0.8, 1, 0)
+ glVertex3f(-0.8, -1, 0)
+ glEnd()
+ glPopMatrix()
+
+ #Y
+ glColor3f(0, 1, 0)
+ glPushMatrix()
+ glTranslate(0, 23, 0)
+ ResetMatrixRotationAndScale()
+ glBegin(GL_LINES)
+ glVertex3f(-0.8, 1, 0)
+ glVertex3f(0.0, 0, 0)
+ glVertex3f(0.8, 1, 0)
+ glVertex3f(-0.8, -1, 0)
+ glEnd()
+ glPopMatrix()
+
+ #Z
+ if not noZ:
+ glColor3f(0, 0, 1)
+ glPushMatrix()
+ glTranslate(0, 0, 23)
+ ResetMatrixRotationAndScale()
+ glBegin(GL_LINES)
+ glVertex3f(-0.8, 1, 0)
+ glVertex3f(0.8, 1, 0)
+ glVertex3f(0.8, 1, 0)
+ glVertex3f(-0.8, -1, 0)
+ glVertex3f(-0.8, -1, 0)
+ glVertex3f(0.8, -1, 0)
+ glEnd()
+ glPopMatrix()
+
+ glPopMatrix()
+ glEnable(GL_DEPTH_TEST)
+
+
+def ResetMatrixRotationAndScale():
+ matrix = glGetFloatv(GL_MODELVIEW_MATRIX)
+ noZ = False
+ if matrix[3][2] > 0:
+ return False
+ scale2D = matrix[0][0]
+ matrix[0][0] = 1.0
+ matrix[1][0] = 0.0
+ matrix[2][0] = 0.0
+ matrix[0][1] = 0.0
+ matrix[1][1] = 1.0
+ matrix[2][1] = 0.0
+ matrix[0][2] = 0.0
+ matrix[1][2] = 0.0
+ matrix[2][2] = 1.0
+
+ if matrix[3][2] != 0.0:
+ matrix[3][0] = matrix[3][0] / (-matrix[3][2] / 100)
+ matrix[3][1] = matrix[3][1] / (-matrix[3][2] / 100)
+ matrix[3][2] = -100
+ else:
+ matrix[0][0] = scale2D
+ matrix[1][1] = scale2D
+ matrix[2][2] = scale2D
+ matrix[3][2] = -100
+ noZ = True
+
+ glLoadMatrixf(matrix)
+ return noZ
+
+
+def DrawBox(vMin, vMax):
+ glBegin(GL_LINE_LOOP)
+ glVertex3f(vMin[0], vMin[1], vMin[2])
+ glVertex3f(vMax[0], vMin[1], vMin[2])
+ glVertex3f(vMax[0], vMax[1], vMin[2])
+ glVertex3f(vMin[0], vMax[1], vMin[2])
+ glEnd()
+
+ glBegin(GL_LINE_LOOP)
+ glVertex3f(vMin[0], vMin[1], vMax[2])
+ glVertex3f(vMax[0], vMin[1], vMax[2])
+ glVertex3f(vMax[0], vMax[1], vMax[2])
+ glVertex3f(vMin[0], vMax[1], vMax[2])
+ glEnd()
+ glBegin(GL_LINES)
+ glVertex3f(vMin[0], vMin[1], vMin[2])
+ glVertex3f(vMin[0], vMin[1], vMax[2])
+ glVertex3f(vMax[0], vMin[1], vMin[2])
+ glVertex3f(vMax[0], vMin[1], vMax[2])
+ glVertex3f(vMax[0], vMax[1], vMin[2])
+ glVertex3f(vMax[0], vMax[1], vMax[2])
+ glVertex3f(vMin[0], vMax[1], vMin[2])
+ glVertex3f(vMin[0], vMax[1], vMax[2])
+ glEnd()
+
+
+def DrawMeshOutline(mesh):
+ glEnable(GL_CULL_FACE)
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
+
+ glCullFace(GL_FRONT)
+ glLineWidth(3)
+ glPolygonMode(GL_BACK, GL_LINE)
+ glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount)
+ glPolygonMode(GL_BACK, GL_FILL)
+ glCullFace(GL_BACK)
+
+ glDisableClientState(GL_VERTEX_ARRAY)
+
+
+def DrawMesh(mesh):
+ glEnable(GL_CULL_FACE)
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, mesh.vertexes)
+ glNormalPointer(GL_FLOAT, 0, mesh.normal)
+
+ #Odd, drawing in batchs is a LOT faster then drawing it all at once.
+ batchSize = 999 #Warning, batchSize needs to be dividable by 3
+ extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
+ extraCount = mesh.vertexCount - extraStartPos
+
+ glCullFace(GL_BACK)
+ for i in xrange(0, int(mesh.vertexCount / batchSize)):
+ glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)
+ glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
+
+ glCullFace(GL_FRONT)
+ glNormalPointer(GL_FLOAT, 0, mesh.invNormal)
+ for i in xrange(0, int(mesh.vertexCount / batchSize)):
+ glDrawArrays(GL_TRIANGLES, i * batchSize, batchSize)
+ extraStartPos = int(mesh.vertexCount / batchSize) * batchSize
+ extraCount = mesh.vertexCount - extraStartPos
+ glDrawArrays(GL_TRIANGLES, extraStartPos, extraCount)
+ glCullFace(GL_BACK)
+
+ glDisableClientState(GL_VERTEX_ARRAY)
+ glDisableClientState(GL_NORMAL_ARRAY);
+
+
+def DrawMeshSteep(mesh, angle):
+ cosAngle = math.sin(angle / 180.0 * math.pi)
+ glDisable(GL_LIGHTING)
+ glDepthFunc(GL_EQUAL)
+ for i in xrange(0, int(mesh.vertexCount), 3):
+ if mesh.normal[i][2] < -0.999999:
+ if mesh.vertexes[i + 0][2] > 0.01:
+ glColor3f(0.5, 0, 0)
+ glBegin(GL_TRIANGLES)
+ glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+ glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+ glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+ glEnd()
+ elif mesh.normal[i][2] < -cosAngle:
+ glColor3f(-mesh.normal[i][2], 0, 0)
+ glBegin(GL_TRIANGLES)
+ glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+ glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+ glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+ glEnd()
+ elif mesh.normal[i][2] > 0.999999:
+ if mesh.vertexes[i + 0][2] > 0.01:
+ glColor3f(0.5, 0, 0)
+ glBegin(GL_TRIANGLES)
+ glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+ glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+ glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+ glEnd()
+ elif mesh.normal[i][2] > cosAngle:
+ glColor3f(mesh.normal[i][2], 0, 0)
+ glBegin(GL_TRIANGLES)
+ glVertex3f(mesh.vertexes[i + 0][0], mesh.vertexes[i + 0][1], mesh.vertexes[i + 0][2])
+ glVertex3f(mesh.vertexes[i + 2][0], mesh.vertexes[i + 2][1], mesh.vertexes[i + 2][2])
+ glVertex3f(mesh.vertexes[i + 1][0], mesh.vertexes[i + 1][1], mesh.vertexes[i + 1][2])
+ glEnd()
+ glDepthFunc(GL_LESS)
+
+
+def DrawGCodeLayer(layer):
+ filamentRadius = profile.getProfileSettingFloat('filament_diameter') / 2
+ filamentArea = math.pi * filamentRadius * filamentRadius
+ lineWidth = profile.getProfileSettingFloat('nozzle_size') / 2 / 10
+
+ fillCycle = 0
+ fillColorCycle = [[0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5]]
+ moveColor = [0, 0, 1]
+ retractColor = [1, 0, 0.5]
+ supportColor = [0, 1, 1]
+ extrudeColor = [1, 0, 0]
+ innerWallColor = [0, 1, 0]
+ skirtColor = [0, 0.5, 0.5]
+ prevPathWasRetract = False
+
+ glDisable(GL_CULL_FACE)
+ for path in layer:
+ if path.type == 'move':
+ if prevPathWasRetract:
+ c = retractColor
+ else:
+ c = moveColor
+ zOffset = 0.01
+ if path.type == 'extrude':
+ if path.pathType == 'FILL':
+ c = fillColorCycle[fillCycle]
+ fillCycle = (fillCycle + 1) % len(fillColorCycle)
+ elif path.pathType == 'WALL-INNER':
+ c = innerWallColor
+ zOffset = 0.02
+ elif path.pathType == 'SUPPORT':
+ c = supportColor
+ elif path.pathType == 'SKIRT':
+ c = skirtColor
+ else:
+ c = extrudeColor
+ if path.type == 'retract':
+ c = [0, 1, 1]
+ if path.type == 'extrude':
+ drawLength = 0.0
+ prevNormal = None
+ 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 path.layerThickness > 0:
+ extrusionMMperDist = (v1.e - v0.e) / dist
+ lineWidth = extrusionMMperDist * filamentArea / path.layerThickness / 2 * v1.extrudeAmountMultiply
+
+ drawLength += (v0 - v1).vsize()
+ normal = (v0 - v1).cross(util3d.Vector3(0, 0, 1))
+ normal.normalize()
+
+ vv2 = v0 + normal * lineWidth
+ vv3 = v1 + normal * lineWidth
+ vv0 = v0 - normal * lineWidth
+ vv1 = v1 - normal * lineWidth
+
+ glBegin(GL_QUADS)
+ glColor3fv(c)
+ glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
+ glVertex3f(vv1.x, vv1.y, vv1.z - zOffset)
+ glVertex3f(vv3.x, vv3.y, vv3.z - zOffset)
+ glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
+ glEnd()
+ if prevNormal != None:
+ n = (normal + prevNormal)
+ n.normalize()
+ vv4 = v0 + n * lineWidth
+ vv5 = v0 - n * lineWidth
+ glBegin(GL_QUADS)
+ glColor3fv(c)
+ glVertex3f(vv2.x, vv2.y, vv2.z - zOffset)
+ glVertex3f(vv4.x, vv4.y, vv4.z - zOffset)
+ glVertex3f(prevVv3.x, prevVv3.y, prevVv3.z - zOffset)
+ glVertex3f(v0.x, v0.y, v0.z - zOffset)
+
+ glVertex3f(vv0.x, vv0.y, vv0.z - zOffset)
+ glVertex3f(vv5.x, vv5.y, vv5.z - zOffset)
+ glVertex3f(prevVv1.x, prevVv1.y, prevVv1.z - zOffset)
+ glVertex3f(v0.x, v0.y, v0.z - zOffset)
+ glEnd()
+
+ prevNormal = normal
+ prevVv1 = vv1
+ prevVv3 = vv3
+ else:
+ glBegin(GL_LINE_STRIP)
+ glColor3fv(c)
+ for v in path.list:
+ glVertex3f(v.x, v.y, v.z)
+ glEnd()
+ if not path.type == 'move':
+ prevPathWasRetract = False
+ if path.type == 'retract' and path.list[0].almostEqual(path.list[-1]):
+ prevPathWasRetract = True
+ glEnable(GL_CULL_FACE)