chiark / gitweb /
Added my own STL loader, no longer using the one from Skeinforge. This one is 3 to...
authordaid <daid303@gmail.com>
Wed, 28 Mar 2012 14:53:08 +0000 (16:53 +0200)
committerdaid <daid303@gmail.com>
Wed, 28 Mar 2012 14:53:08 +0000 (16:53 +0200)
Cura/gui/__init__.py
Cura/gui/preview3d.py
Cura/util/__init__.py
Cura/util/gcodeInterpreter.py
Cura/util/stl.py [new file with mode: 0644]

index 163803379e672a3c9fe203ecc23ca94b415260c9..4870325b1f21917eda2d8e53954b3d9ed88c59e1 100644 (file)
@@ -1,7 +1,3 @@
-"""
-This page is in the table of contents.
-This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module.
-"""
 import os
 import sys
 
index 7f06f3e47b1214ae8a39d47f588420ea16e623ea..311d49a17cdb2a83a5a663ed0454565a6e442438 100644 (file)
@@ -19,11 +19,9 @@ except:
 \r
 from util import profile\r
 from util import gcodeInterpreter\r
+from util import stl\r
 from util import util3d\r
 \r
-from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret\r
-from fabmetheus_utilities.vector3 import Vector3\r
-\r
 class previewPanel(wx.Panel):\r
        def __init__(self, parent):\r
                wx.Panel.__init__(self, parent,-1)\r
@@ -38,8 +36,8 @@ class previewPanel(wx.Panel):
                self.modelFilename = None\r
                self.loadingProgressAmount = 0\r
                self.loadThread = None\r
-               self.machineSize = Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height')))\r
-               self.machineCenter = Vector3(0, 0, 0)\r
+               self.machineSize = util3d.Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height')))\r
+               self.machineCenter = util3d.Vector3(0, 0, 0)\r
                \r
                self.toolbar = wx.ToolBar( self, -1 )\r
                self.toolbar.SetToolBitmapSize( ( 21, 21 ) )\r
@@ -215,7 +213,8 @@ class previewPanel(wx.Panel):
        def doFileLoadThread(self):\r
                if os.path.isfile(self.modelFilename) and self.modelFileTime != os.stat(self.modelFilename).st_mtime:\r
                        self.modelFileTime = os.stat(self.modelFilename).st_mtime\r
-                       triangleMesh = fabmetheus_interpret.getCarving(self.modelFilename)\r
+                       triangleMesh = stl.stlModel()\r
+                       triangleMesh.load(self.modelFilename)\r
                        triangleMesh.origonalVertexes = list(triangleMesh.vertexes)\r
                        for i in xrange(0, len(triangleMesh.origonalVertexes)):\r
                                triangleMesh.origonalVertexes[i] = triangleMesh.origonalVertexes[i].copy()\r
@@ -297,9 +296,9 @@ class previewPanel(wx.Panel):
                        self.triangleMesh.vertexes[i].z = self.triangleMesh.origonalVertexes[i].z * scaleZ\r
 \r
                for face in self.triangleMesh.faces:\r
-                       v1 = self.triangleMesh.vertexes[face.vertexIndexes[0]]\r
-                       v2 = self.triangleMesh.vertexes[face.vertexIndexes[1]]\r
-                       v3 = self.triangleMesh.vertexes[face.vertexIndexes[2]]\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
@@ -309,8 +308,8 @@ class previewPanel(wx.Panel):
                if self.triangleMesh == None:\r
                        return\r
                minZ = self.triangleMesh.getMinimumZ()\r
-               min = self.triangleMesh.getCarveCornerMinimum()\r
-               max = self.triangleMesh.getCarveCornerMaximum()\r
+               min = self.triangleMesh.getMinimum()\r
+               max = self.triangleMesh.getMaximum()\r
                for v in self.triangleMesh.vertexes:\r
                        v.z -= minZ\r
                        v.x -= min.x + (max.x - min.x) / 2\r
@@ -525,7 +524,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                self.parent.modelDirty = False\r
                                multiX = int(profile.getProfileSetting('model_multiply_x'))\r
                                multiY = int(profile.getProfileSetting('model_multiply_y'))\r
-                               modelSize = self.parent.triangleMesh.getCarveCornerMaximum() - self.parent.triangleMesh.getCarveCornerMinimum()\r
+                               modelSize = self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum()\r
                                glNewList(self.modelDisplayList, GL_COMPILE)\r
                                glPushMatrix()\r
                                glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0)\r
@@ -535,9 +534,9 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                                                        glPushMatrix()\r
                                                        glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0)\r
                                                        glBegin(GL_TRIANGLES)\r
-                                                       v1 = self.parent.triangleMesh.vertexes[face.vertexIndexes[0]]\r
-                                                       v2 = self.parent.triangleMesh.vertexes[face.vertexIndexes[1]]\r
-                                                       v3 = self.parent.triangleMesh.vertexes[face.vertexIndexes[2]]\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
@@ -664,7 +663,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
                        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.getCarveCornerMaximum().z / 2)\r
+                               glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2)\r
                else:\r
                        glTranslate(self.offsetX, self.offsetY, 0)\r
 \r
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4870325b1f21917eda2d8e53954b3d9ed88c59e1 100644 (file)
@@ -0,0 +1,9 @@
+import os
+import sys
+
+numberOfLevelsDeepInPackageHierarchy = 1
+packageFilePath = os.path.abspath(__file__)
+for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ):
+       packageFilePath = os.path.dirname( packageFilePath )
+if packageFilePath not in sys.path:
+       sys.path.insert( 0, packageFilePath )
index ca2117cfcfb301aad8fdc838c58751baa2405e40..71e26f0c65f030f5c698fc893ac15a12e9e3f2e9 100644 (file)
@@ -3,7 +3,6 @@ import __init__
 
 import sys
 import math
-import threading
 import re
 import os
 
diff --git a/Cura/util/stl.py b/Cura/util/stl.py
new file mode 100644 (file)
index 0000000..05e759e
--- /dev/null
@@ -0,0 +1,87 @@
+from __future__ import absolute_import
+import __init__
+
+import sys
+import math
+import re
+import os
+import struct
+
+from util import util3d
+
+class stlFace():
+       def __init__(self, v0, v1, v2):
+               self.v = [v0, v1, v2]
+
+class stlModel():
+       def __init__(self):
+               self.faces = []
+               self.vertexes = []
+
+       def load(self, filename):
+               f = open(filename, "rb")
+               if f.read(6).lower() == "solid ":
+                       self._loadAscii(f)
+                       if len(self.faces) < 1:
+                               f.seek(6, os.SEEK_SET)
+                               self._loadBinary(f)
+               else:
+                       self._loadBinary(f)
+               f.close()
+       
+       def _loadAscii(self, f):
+               cnt = 0
+               for line in f:
+                       if 'vertex' in line:
+                               data = line.split()
+                               if cnt == 0:
+                                       v0 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
+                                       cnt = 1
+                               elif cnt == 1:
+                                       v1 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
+                                       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)
+                                       cnt = 0
+
+       def _loadBinary(self, f):
+               #Skip the header
+               f.read(80-6)
+               faceCount = struct.unpack('<I', f.read(4))[0]
+               for idx in xrange(0, faceCount):
+                       data = struct.unpack("<ffffffffffffH", f.read(50))
+                       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 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
+               return self.min.z
+       
+       def getMaximum(self):
+               return self.max
+       def getMinimum(self):
+               return self.min
+
+if __name__ == '__main__':
+       for filename in sys.argv[1:]:
+               stlModel().load(filename)
+