chiark / gitweb /
Split up some OpenGL stuff from preview3d. Added swapXZ and swapYZ for rotating on...
authorDaid <daid303@gmail.com>
Thu, 5 Apr 2012 20:35:52 +0000 (22:35 +0200)
committerDaid <daid303@gmail.com>
Thu, 5 Apr 2012 20:35:52 +0000 (22:35 +0200)
Cura/cura_sf/fabmetheus_utilities/settings.py
Cura/cura_sf/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py
Cura/gui/opengl.py [new file with mode: 0644]
Cura/gui/preview3d.py

index 61cc77f388cd95e4195fc56a144d3bf4e4ada8a3..fb19b972faaf5fcd3f5ddc7689e04b18e0cd8b6f 100644 (file)
@@ -101,6 +101,8 @@ def getProfileInformation():
                        'FlipX': storedSetting("flip_x"),
                        'FlipY': storedSetting("flip_y"),
                        'FlipZ': storedSetting("flip_z"),
+                       'SwapXZ': storedSetting("swap_xz"),
+                       'SwapYZ': storedSetting("swap_yz"),
                        'Scale': storedSetting("model_scale"),
                        'Rotate': storedSetting("model_rotate_base"),
                },'scale': {
index af138a998cc453f745548ff838010d2bac7b1c20..ae949b3daacc020e76f2c9dc102b5927e79bf73d 100644 (file)
@@ -183,6 +183,8 @@ class CarveRepository:
                self.flipX = settings.BooleanSetting().getFromValue('FlipX', self, False)
                self.flipY = settings.BooleanSetting().getFromValue('FlipY', self, False)
                self.flipZ = settings.BooleanSetting().getFromValue('FlipZ', self, False)
+               self.swapXZ = settings.BooleanSetting().getFromValue('SwapXZ', self, False)
+               self.swapYZ = settings.BooleanSetting().getFromValue('SwapYZ', self, False)
                self.scale = settings.FloatSpin().getFromValue( 0.1, 'Scale', self, 10.0, 1.0 )
                self.rotate = settings.FloatSpin().getFromValue( -180.0, 'Rotate', self, 180.0, 0.0 )
 
@@ -210,6 +212,8 @@ class CarveSkein:
                        scaleY = -scaleY
                if repository.flipZ.value == True:
                        scaleZ = -scaleZ
+               swapXZ = repository.swapXZ.value
+               swapYZ = repository.swapYZ.value
                mat00 = math.cos(rotate) * scaleX
                mat01 =-math.sin(rotate) * scaleY
                mat10 = math.sin(rotate) * scaleX
@@ -226,10 +230,17 @@ class CarveSkein:
                        #v.y += self.machineCenter.y
                
                for i in xrange(0, len(carving.vertexes)):
+                       x = carving.vertexes[i].x
+                       y = carving.vertexes[i].y
+                       z = carving.vertexes[i].z
+                       if swapXZ:
+                               x, z = z, x
+                       if swapYZ:
+                               y, z = z, y
                        carving.vertexes[i] = Vector3(
-                               carving.vertexes[i].x * mat00 + carving.vertexes[i].y * mat01,
-                               carving.vertexes[i].x * mat10 + carving.vertexes[i].y * mat11,
-                               carving.vertexes[i].z * scaleZ)
+                               x * mat00 + y * mat01,
+                               x * mat10 + y * mat11,
+                               z * scaleZ)
 
                layerHeight = repository.layerHeight.value
                edgeWidth = repository.edgeWidth.value
diff --git a/Cura/gui/opengl.py b/Cura/gui/opengl.py
new file mode 100644 (file)
index 0000000..583b141
--- /dev/null
@@ -0,0 +1,94 @@
+\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
index 3d36bcdc97df66962ebc81824b6c0844e9156fb8..b081f86dbf8bc14a7cd30bc4ae4f438037814306 100644 (file)
@@ -17,6 +17,8 @@ except:
        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
@@ -75,6 +77,16 @@ class previewPanel(wx.Panel):
                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
@@ -126,6 +138,14 @@ class previewPanel(wx.Panel):
                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
@@ -285,15 +305,24 @@ class previewPanel(wx.Panel):
                        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
@@ -381,51 +410,24 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                        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
@@ -533,26 +535,16 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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
@@ -609,6 +601,8 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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
@@ -625,48 +619,3 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                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