chiark / gitweb /
Abstract the 3D model related functions into a seperate class, and remove some duplic...
authorDaid <daid303@gmail.com>
Fri, 18 May 2012 08:10:51 +0000 (10:10 +0200)
committerDaid <daid303@gmail.com>
Fri, 18 May 2012 08:10:51 +0000 (10:10 +0200)
Cura/gui/preview3d.py
Cura/gui/projectPlanner.py
Cura/util/mesh.py [new file with mode: 0644]
Cura/util/stl.py

index 50133cfb7223c1f537ceeb0d0d402cd68a75e50f..8a1f74095189d8611eaaaf57f79a20776739146d 100644 (file)
@@ -287,48 +287,20 @@ class previewPanel(wx.Panel):
                self.glCanvas.Refresh()\r
        \r
        def updateModelTransform(self, f=0):\r
-               rotate = profile.getProfileSettingFloat('model_rotate_base') / 180.0 * math.pi\r
-               scaleX = 1.0\r
-               scaleY = 1.0\r
-               scaleZ = 1.0\r
-               if profile.getProfileSetting('flip_x') == 'True':\r
-                       scaleX = -scaleX\r
-               if profile.getProfileSetting('flip_y') == 'True':\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
                if len(self.objectList) < 1 or self.objectList[0].mesh == None:\r
                        return\r
+               \r
+               rotate = profile.getProfileSettingFloat('model_rotate_base')\r
+               mirrorX = profile.getProfileSetting('flip_x') == 'True'\r
+               mirrorY = profile.getProfileSetting('flip_y') == 'True'\r
+               mirrorZ = profile.getProfileSetting('flip_z') == 'True'\r
+               swapXZ = profile.getProfileSetting('swap_xz') == 'True'\r
+               swapYZ = profile.getProfileSetting('swap_yz') == 'True'\r
 \r
                for obj in self.objectList:\r
                        if obj.mesh == None:\r
                                continue\r
-               \r
-                       for i in xrange(0, len(obj.mesh.origonalVertexes)):\r
-                               x = obj.mesh.origonalVertexes[i].x\r
-                               y = obj.mesh.origonalVertexes[i].y\r
-                               z = obj.mesh.origonalVertexes[i].z\r
-                               if swapXZ:\r
-                                       x, z = z, x\r
-                               if swapYZ:\r
-                                       y, z = z, y\r
-                               obj.mesh.vertexes[i].x = x * mat00 + y * mat01\r
-                               obj.mesh.vertexes[i].y = x * mat10 + y * mat11\r
-                               obj.mesh.vertexes[i].z = z * scaleZ\r
-\r
-                       for face in obj.mesh.faces:\r
-                               v1 = face.v[0]\r
-                               v2 = face.v[1]\r
-                               v3 = face.v[2]\r
-                               face.normal = (v2 - v1).cross(v3 - v1)\r
-                               face.normal.normalize()\r
+                       obj.mesh.setRotateMirror(rotate, mirrorX, mirrorY, mirrorZ, swapXZ, swapYZ)\r
                \r
                minV = self.objectList[0].mesh.getMinimum()\r
                maxV = self.objectList[0].mesh.getMaximum()\r
index f2dec95b59e944d61c79178c2790300eddb6ba09..9322eef990c396416d77af487c75ea46fb566822 100644 (file)
@@ -90,50 +90,7 @@ class ProjectObject(stl.stlModel):
                return True\r
 \r
        def updateModelTransform(self):\r
-               rotate = self.rotate / 180.0 * math.pi\r
-               scaleX = 1.0\r
-               scaleY = 1.0\r
-               scaleZ = 1.0\r
-               if self.flipX:\r
-                       scaleX = -scaleX\r
-               if self.flipY:\r
-                       scaleY = -scaleY\r
-               if self.flipZ:\r
-                       scaleZ = -scaleZ\r
-               swapXZ = self.swapXZ\r
-               swapYZ = self.swapYZ\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.origonalVertexes)):\r
-                       x = self.origonalVertexes[i].x\r
-                       y = self.origonalVertexes[i].y\r
-                       z = self.origonalVertexes[i].z\r
-                       if swapXZ:\r
-                               x, z = z, x\r
-                       if swapYZ:\r
-                               y, z = z, y\r
-                       self.vertexes[i].x = x * mat00 + y * mat01\r
-                       self.vertexes[i].y = x * mat10 + y * mat11\r
-                       self.vertexes[i].z = z * scaleZ\r
-\r
-               for face in self.faces:\r
-                       v1 = face.v[0]\r
-                       v2 = face.v[1]\r
-                       v3 = face.v[2]\r
-                       face.normal = (v2 - v1).cross(v3 - v1)\r
-                       face.normal.normalize()\r
-\r
-               minZ = self.getMinimumZ()\r
-               minV = self.getMinimum()\r
-               maxV = self.getMaximum()\r
-               for v in self.vertexes:\r
-                       v.z -= minZ\r
-                       v.x -= minV.x + (maxV.x - minV.x) / 2\r
-                       v.y -= minV.y + (maxV.y - minV.y) / 2\r
-               self.getMinimumZ()\r
+               self.setRotateMirror(self.rotate, self.flipX, self.flipY, self.flipZ, self.swapXZ, self.swapYZ)\r
                self.modelDirty = True\r
        \r
        def clone(self):\r
diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py
new file mode 100644 (file)
index 0000000..63c105d
--- /dev/null
@@ -0,0 +1,101 @@
+from __future__ import absolute_import
+import __init__
+
+import sys
+import math
+import re
+import os
+import struct
+
+from util import util3d
+
+class meshFace(object):
+       def __init__(self, v0, v1, v2):
+               self.v = [v0, v1, v2]
+
+class mesh(object):
+       def __init__(self):
+               self.faces = []
+               self.vertexes = []
+
+       def addFace(self, v0, v1, v2):
+               self.faces.append(meshFace(v0, v1, v2))
+               self.vertexes.append(v0)
+               self.vertexes.append(v1)
+               self.vertexes.append(v2)
+
+       def _createOrigonalVertexCopy(self):
+               self.origonalVertexes = list(self.vertexes)
+               for i in xrange(0, len(self.origonalVertexes)):
+                       self.origonalVertexes[i] = self.origonalVertexes[i].copy()
+               self.getMinimumZ()
+
+       def getMinimumZ(self):
+               minv = self.vertexes[0].copy()
+               maxv = self.vertexes[0].copy()
+               for v in self.vertexes:
+                       minv.x = min(minv.x, v.x)
+                       minv.y = min(minv.y, v.y)
+                       minv.z = min(minv.z, v.z)
+                       maxv.x = max(maxv.x, v.x)
+                       maxv.y = max(maxv.y, v.y)
+                       maxv.z = max(maxv.z, v.z)
+               self.min = minv
+               self.max = maxv
+               self.size = maxv - minv
+               return self.min.z
+       
+       def getMaximum(self):
+               return self.max
+       def getMinimum(self):
+               return self.min
+       def getSize(self):
+               return self.size
+
+       def setRotateMirror(self, rotate, mirrorX, mirrorY, mirrorZ, swapXZ, swapYZ):
+               rotate = rotate / 180.0 * math.pi
+               scaleX = 1.0
+               scaleY = 1.0
+               scaleZ = 1.0
+               if mirrorX:
+                       scaleX = -scaleX
+               if mirrorY:
+                       scaleY = -scaleY
+               if mirrorZ:
+                       scaleZ = -scaleZ
+               mat00 = math.cos(rotate) * scaleX
+               mat01 =-math.sin(rotate) * scaleY
+               mat10 = math.sin(rotate) * scaleX
+               mat11 = math.cos(rotate) * scaleY
+               
+               for i in xrange(0, len(self.origonalVertexes)):
+                       x = self.origonalVertexes[i].x
+                       y = self.origonalVertexes[i].y
+                       z = self.origonalVertexes[i].z
+                       if swapXZ:
+                               x, z = z, x
+                       if swapYZ:
+                               y, z = z, y
+                       self.vertexes[i].x = x * mat00 + y * mat01
+                       self.vertexes[i].y = x * mat10 + y * mat11
+                       self.vertexes[i].z = z * scaleZ
+
+               for face in self.faces:
+                       v1 = face.v[0]
+                       v2 = face.v[1]
+                       v3 = face.v[2]
+                       face.normal = (v2 - v1).cross(v3 - v1)
+                       face.normal.normalize()
+
+               minZ = self.getMinimumZ()
+               minV = self.getMinimum()
+               maxV = self.getMaximum()
+               for v in self.vertexes:
+                       v.z -= minZ
+                       v.x -= minV.x + (maxV.x - minV.x) / 2
+                       v.y -= minV.y + (maxV.y - minV.y) / 2
+               self.getMinimumZ()
+
+if __name__ == '__main__':
+       for filename in sys.argv[1:]:
+               stlModel().load(filename)
index bf7558b4974d0945ba81abffb59f20e3124279a1..8ba47a3d000439cd36bf2107d45fa820f5e7f788 100644 (file)
@@ -8,15 +8,11 @@ import os
 import struct
 
 from util import util3d
+from util import mesh
 
-class stlFace(object):
-       def __init__(self, v0, v1, v2):
-               self.v = [v0, v1, v2]
-
-class stlModel(object):
+class stlModel(mesh.mesh):
        def __init__(self):
-               self.faces = []
-               self.vertexes = []
+               super(stlModel, self).__init__()
 
        def load(self, filename):
                f = open(filename, "rb")
@@ -44,10 +40,7 @@ class stlModel(object):
                                        cnt = 2
                                elif cnt == 2:
                                        v2 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
-                                       self.faces.append(stlFace(v0, v1, v2))
-                                       self.vertexes.append(v0)
-                                       self.vertexes.append(v1)
-                                       self.vertexes.append(v2)
+                                       self.addFace(v0, v1, v2)
                                        cnt = 0
 
        def _loadBinary(self, f):
@@ -59,38 +52,7 @@ class stlModel(object):
                        v0 = util3d.Vector3(data[3], data[4], data[5])
                        v1 = util3d.Vector3(data[6], data[7], data[8])
                        v2 = util3d.Vector3(data[9], data[10], data[11])
-                       self.faces.append(stlFace(v0, v1, v2))
-                       self.vertexes.append(v0)
-                       self.vertexes.append(v1)
-                       self.vertexes.append(v2)
-
-       def _createOrigonalVertexCopy(self):
-               self.origonalVertexes = list(self.vertexes)
-               for i in xrange(0, len(self.origonalVertexes)):
-                       self.origonalVertexes[i] = self.origonalVertexes[i].copy()
-               self.getMinimumZ()
-
-       def getMinimumZ(self):
-               minv = self.vertexes[0].copy()
-               maxv = self.vertexes[0].copy()
-               for v in self.vertexes:
-                       minv.x = min(minv.x, v.x)
-                       minv.y = min(minv.y, v.y)
-                       minv.z = min(minv.z, v.z)
-                       maxv.x = max(maxv.x, v.x)
-                       maxv.y = max(maxv.y, v.y)
-                       maxv.z = max(maxv.z, v.z)
-               self.min = minv
-               self.max = maxv
-               self.size = maxv - minv
-               return self.min.z
-       
-       def getMaximum(self):
-               return self.max
-       def getMinimum(self):
-               return self.min
-       def getSize(self):
-               return self.size
+                       self.addFace(v0, v1, v2)
 
 if __name__ == '__main__':
        for filename in sys.argv[1:]: