\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
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
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
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
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
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
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
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
--- /dev/null
+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)
+