--- /dev/null
+\r
+try:\r
+ import OpenGL\r
+ OpenGL.ERROR_CHECKING = False\r
+ from OpenGL.GLU import *\r
+ from OpenGL.GL import *\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, [1.0, 1.0, 1.0, 0.0])\r
+\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(0.0, 0.0, 0.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(90.0, aspect, 1.0, 1000.0)\r
+ else:\r
+ glOrtho(-aspect, aspect, -1, 1, -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
+def DrawMachine(machineSize):\r
+ glColor3f(1,1,1)\r
+ glLineWidth(4)\r
+ glDisable(GL_LIGHTING)\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
+ 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
+ glLineWidth(1)\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
+\r
+def DrawSTL(mesh):\r
+ for face in mesh.faces:\r
+ glBegin(GL_TRIANGLES)\r
+ v1 = face.v[0]\r
+ v2 = face.v[1]\r
+ v3 = face.v[2]\r
+ glNormal3f(face.normal.x, face.normal.y, face.normal.z)\r
+ glVertex3f(v1.x, v1.y, v1.z)\r
+ glVertex3f(v2.x, v2.y, v2.z)\r
+ glVertex3f(v3.x, v3.y, v3.z)\r
+ glNormal3f(-face.normal.x, -face.normal.y, -face.normal.z)\r
+ glVertex3f(v1.x, v1.y, v1.z)\r
+ glVertex3f(v3.x, v3.y, v3.z)\r
+ glVertex3f(v2.x, v2.y, v2.z)\r
+ glEnd()\r
print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"\r
hasOpenGLlibs = False\r
\r
+from gui import opengl\r
+\r
from util import profile\r
from util import gcodeInterpreter\r
from util import stl\r
self.flipZ.SetValue(profile.getProfileSetting('flip_z') == 'True')\r
self.toolbar2.AddControl(self.flipZ)\r
self.Bind(wx.EVT_CHECKBOX, self.OnFlipZClick, self.flipZ)\r
+\r
+ self.swapXZ = wx.CheckBox(self.toolbar2, -1, "XZ")\r
+ self.swapXZ.SetValue(profile.getProfileSetting('swap_xz') == 'True')\r
+ self.toolbar2.AddControl(self.swapXZ)\r
+ self.Bind(wx.EVT_CHECKBOX, self.OnSwapXZClick, self.swapXZ)\r
+\r
+ self.swapYZ = wx.CheckBox(self.toolbar2, -1, "YZ")\r
+ self.swapYZ.SetValue(profile.getProfileSetting('swap_yz') == 'True')\r
+ self.toolbar2.AddControl(self.swapYZ)\r
+ self.Bind(wx.EVT_CHECKBOX, self.OnSwapYZClick, self.swapYZ)\r
\r
self.toolbar2.InsertSeparator(self.toolbar2.GetToolsCount())\r
self.toolbar2.AddControl(wx.StaticText(self.toolbar2, -1, 'Scale'))\r
profile.putProfileSetting('flip_z', str(self.flipZ.GetValue()))\r
self.updateModelTransform()\r
\r
+ def OnSwapXZClick(self, e):\r
+ profile.putProfileSetting('swap_xz', str(self.swapXZ.GetValue()))\r
+ self.updateModelTransform()\r
+\r
+ def OnSwapYZClick(self, e):\r
+ profile.putProfileSetting('swap_yz', str(self.swapYZ.GetValue()))\r
+ self.updateModelTransform()\r
+\r
def OnMulXAddClick(self, e):\r
profile.putProfileSetting('model_multiply_x', str(max(1, int(profile.getProfileSetting('model_multiply_x'))+1)))\r
self.updateModelTransform()\r
scaleY = -scaleY\r
if profile.getProfileSetting('flip_z') == 'True':\r
scaleZ = -scaleZ\r
+ swapXZ = profile.getProfileSetting('swap_xz') == 'True'\r
+ swapYZ = profile.getProfileSetting('swap_yz') == 'True'\r
mat00 = math.cos(rotate) * scaleX\r
mat01 =-math.sin(rotate) * scaleY\r
mat10 = math.sin(rotate) * scaleX\r
mat11 = math.cos(rotate) * scaleY\r
\r
for i in xrange(0, len(self.triangleMesh.origonalVertexes)):\r
- self.triangleMesh.vertexes[i].x = self.triangleMesh.origonalVertexes[i].x * mat00 + self.triangleMesh.origonalVertexes[i].y * mat01\r
- self.triangleMesh.vertexes[i].y = self.triangleMesh.origonalVertexes[i].x * mat10 + self.triangleMesh.origonalVertexes[i].y * mat11\r
- self.triangleMesh.vertexes[i].z = self.triangleMesh.origonalVertexes[i].z * scaleZ\r
+ x = self.triangleMesh.origonalVertexes[i].x\r
+ y = self.triangleMesh.origonalVertexes[i].y\r
+ z = self.triangleMesh.origonalVertexes[i].z\r
+ if swapXZ:\r
+ x, z = z, x\r
+ if swapYZ:\r
+ y, z = z, y\r
+ self.triangleMesh.vertexes[i].x = x * mat00 + y * mat01\r
+ self.triangleMesh.vertexes[i].y = x * mat10 + y * mat11\r
+ self.triangleMesh.vertexes[i].z = z * scaleZ\r
\r
for face in self.triangleMesh.faces:\r
v1 = face.v[0]\r
dc.DrawText("No PyOpenGL installation found.\nNo preview window available.", 10, 10)\r
return\r
self.SetCurrent(self.context)\r
- self.InitGL()\r
+ opengl.InitGL(self, self.view3D, self.zoom)\r
+ if self.view3D:\r
+ glTranslate(0,0,-self.zoom)\r
+ glRotate(-self.pitch, 1,0,0)\r
+ glRotate(self.yaw, 0,0,1)\r
+ if self.parent.triangleMesh != None:\r
+ glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2)\r
+ else:\r
+ glScale(1.0/self.zoom, 1.0/self.zoom, 1.0)\r
+ glTranslate(self.offsetX, self.offsetY, 0.0)\r
+ glTranslate(-self.parent.machineCenter.x, -self.parent.machineCenter.y, 0)\r
+\r
self.OnDraw()\r
self.SwapBuffers()\r
\r
def OnDraw(self):\r
machineSize = self.parent.machineSize\r
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)\r
- \r
- glTranslate(-self.parent.machineCenter.x, -self.parent.machineCenter.y, 0)\r
- \r
- glColor3f(1,1,1)\r
- glLineWidth(4)\r
- glDisable(GL_LIGHTING)\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
- 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
- glLineWidth(1)\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
+ opengl.DrawMachine(machineSize)\r
\r
if self.parent.gcode != None:\r
if self.gcodeDisplayList == None:\r
glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0)\r
for mx in xrange(0, multiX):\r
for my in xrange(0, multiY):\r
- for face in self.parent.triangleMesh.faces:\r
- glPushMatrix()\r
- glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0)\r
- glBegin(GL_TRIANGLES)\r
- v1 = face.v[0]\r
- v2 = face.v[1]\r
- v3 = face.v[2]\r
- glNormal3f(face.normal.x, face.normal.y, face.normal.z)\r
- glVertex3f(v1.x, v1.y, v1.z)\r
- glVertex3f(v2.x, v2.y, v2.z)\r
- glVertex3f(v3.x, v3.y, v3.z)\r
- glNormal3f(-face.normal.x, -face.normal.y, -face.normal.z)\r
- glVertex3f(v1.x, v1.y, v1.z)\r
- glVertex3f(v3.x, v3.y, v3.z)\r
- glVertex3f(v2.x, v2.y, v2.z)\r
- glEnd()\r
- glPopMatrix()\r
+ glPushMatrix()\r
+ glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0)\r
+ opengl.DrawSTL(self.parent.triangleMesh)\r
+ glPopMatrix()\r
glPopMatrix()\r
glEndList()\r
+ \r
if self.viewMode == "Model - Transparent" or self.viewMode == "Mixed":\r
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.5, 0.4, 0.3, 1.0])\r
+ glLightfv(GL_LIGHT0, GL_AMBIENT, [0.1, 0.1, 0.1, 0.0])\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_STENCIL_TEST);\r
glEnable(GL_DEPTH_TEST)\r
elif self.viewMode == "Model - Normal":\r
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, [1.0, 0.8, 0.6, 1.0])\r
+ glLightfv(GL_LIGHT0, GL_AMBIENT, [0.2, 0.2, 0.2, 0.0])\r
glEnable(GL_LIGHTING)\r
glCallList(self.modelDisplayList)\r
\r
glEnd()\r
\r
glFlush()\r
-\r
- def InitGL(self):\r
- # set viewing projection\r
- glMatrixMode(GL_MODELVIEW)\r
- glLoadIdentity()\r
- size = self.GetSize()\r
- glViewport(0,0, size.GetWidth(), size.GetHeight())\r
- \r
- if self.viewMode == "Model - Transparent" or self.viewMode == "Mixed":\r
- glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.5, 0.4, 0.3, 1.0])\r
- glLightfv(GL_LIGHT0, GL_AMBIENT, [0.1, 0.1, 0.1, 0.0])\r
- else:\r
- glLightfv(GL_LIGHT0, GL_DIFFUSE, [1.0, 0.8, 0.6, 1.0])\r
- glLightfv(GL_LIGHT0, GL_AMBIENT, [0.2, 0.2, 0.2, 0.0])\r
- glLightfv(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
-\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(0.0, 0.0, 0.0, 1.0)\r
- glClearStencil(0)\r
- glClearDepth(1.0)\r
-\r
- glMatrixMode(GL_PROJECTION)\r
- glLoadIdentity()\r
- aspect = float(self.GetSize().GetWidth()) / float(self.GetSize().GetHeight())\r
- if self.view3D:\r
- gluPerspective(90.0, aspect, 1.0, 1000.0)\r
- else:\r
- glOrtho(-self.zoom * aspect, self.zoom * aspect, -self.zoom, self.zoom, -1000.0, 1000.0)\r
-\r
- glMatrixMode(GL_MODELVIEW)\r
- glLoadIdentity()\r
- if self.view3D:\r
- glTranslate(0,0,-self.zoom)\r
- glRotate(-self.pitch, 1,0,0)\r
- glRotate(self.yaw, 0,0,1)\r
- if self.parent.triangleMesh != None:\r
- glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2)\r
- else:\r
- glTranslate(self.offsetX, self.offsetY, 0)\r
-\r