From: daid Date: Wed, 28 Mar 2012 14:53:08 +0000 (+0200) Subject: Added my own STL loader, no longer using the one from Skeinforge. This one is 3 to... X-Git-Tag: RC1~16^2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0834aec2d2161c54805e89e5e085ba7941d5e5ac;p=cura.git Added my own STL loader, no longer using the one from Skeinforge. This one is 3 to 4 times faster. --- diff --git a/Cura/gui/__init__.py b/Cura/gui/__init__.py index 16380337..4870325b 100644 --- a/Cura/gui/__init__.py +++ b/Cura/gui/__init__.py @@ -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 diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index 7f06f3e4..311d49a1 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -19,11 +19,9 @@ except: from util import profile from util import gcodeInterpreter +from util import stl from util import util3d -from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret -from fabmetheus_utilities.vector3 import Vector3 - class previewPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent,-1) @@ -38,8 +36,8 @@ class previewPanel(wx.Panel): self.modelFilename = None self.loadingProgressAmount = 0 self.loadThread = None - self.machineSize = Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height'))) - self.machineCenter = Vector3(0, 0, 0) + self.machineSize = util3d.Vector3(float(profile.getPreference('machine_width')), float(profile.getPreference('machine_depth')), float(profile.getPreference('machine_height'))) + self.machineCenter = util3d.Vector3(0, 0, 0) self.toolbar = wx.ToolBar( self, -1 ) self.toolbar.SetToolBitmapSize( ( 21, 21 ) ) @@ -215,7 +213,8 @@ class previewPanel(wx.Panel): def doFileLoadThread(self): if os.path.isfile(self.modelFilename) and self.modelFileTime != os.stat(self.modelFilename).st_mtime: self.modelFileTime = os.stat(self.modelFilename).st_mtime - triangleMesh = fabmetheus_interpret.getCarving(self.modelFilename) + triangleMesh = stl.stlModel() + triangleMesh.load(self.modelFilename) triangleMesh.origonalVertexes = list(triangleMesh.vertexes) for i in xrange(0, len(triangleMesh.origonalVertexes)): triangleMesh.origonalVertexes[i] = triangleMesh.origonalVertexes[i].copy() @@ -297,9 +296,9 @@ class previewPanel(wx.Panel): self.triangleMesh.vertexes[i].z = self.triangleMesh.origonalVertexes[i].z * scaleZ for face in self.triangleMesh.faces: - v1 = self.triangleMesh.vertexes[face.vertexIndexes[0]] - v2 = self.triangleMesh.vertexes[face.vertexIndexes[1]] - v3 = self.triangleMesh.vertexes[face.vertexIndexes[2]] + v1 = face.v[0] + v2 = face.v[1] + v3 = face.v[2] face.normal = (v2 - v1).cross(v3 - v1) face.normal.normalize() @@ -309,8 +308,8 @@ class previewPanel(wx.Panel): if self.triangleMesh == None: return minZ = self.triangleMesh.getMinimumZ() - min = self.triangleMesh.getCarveCornerMinimum() - max = self.triangleMesh.getCarveCornerMaximum() + min = self.triangleMesh.getMinimum() + max = self.triangleMesh.getMaximum() for v in self.triangleMesh.vertexes: v.z -= minZ v.x -= min.x + (max.x - min.x) / 2 @@ -525,7 +524,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): self.parent.modelDirty = False multiX = int(profile.getProfileSetting('model_multiply_x')) multiY = int(profile.getProfileSetting('model_multiply_y')) - modelSize = self.parent.triangleMesh.getCarveCornerMaximum() - self.parent.triangleMesh.getCarveCornerMinimum() + modelSize = self.parent.triangleMesh.getMaximum() - self.parent.triangleMesh.getMinimum() glNewList(self.modelDisplayList, GL_COMPILE) glPushMatrix() glTranslate(-(modelSize.x+10)*(multiX-1)/2,-(modelSize.y+10)*(multiY-1)/2, 0) @@ -535,9 +534,9 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glPushMatrix() glTranslate((modelSize.x+10)*mx,(modelSize.y+10)*my, 0) glBegin(GL_TRIANGLES) - v1 = self.parent.triangleMesh.vertexes[face.vertexIndexes[0]] - v2 = self.parent.triangleMesh.vertexes[face.vertexIndexes[1]] - v3 = self.parent.triangleMesh.vertexes[face.vertexIndexes[2]] + v1 = face.v[0] + v2 = face.v[1] + v3 = face.v[2] glNormal3f(face.normal.x, face.normal.y, face.normal.z) glVertex3f(v1.x, v1.y, v1.z) glVertex3f(v2.x, v2.y, v2.z) @@ -664,7 +663,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glRotate(-self.pitch, 1,0,0) glRotate(self.yaw, 0,0,1) if self.parent.triangleMesh != None: - glTranslate(0,0,-self.parent.triangleMesh.getCarveCornerMaximum().z / 2) + glTranslate(0,0,-self.parent.triangleMesh.getMaximum().z / 2) else: glTranslate(self.offsetX, self.offsetY, 0) diff --git a/Cura/util/__init__.py b/Cura/util/__init__.py index e69de29b..4870325b 100644 --- a/Cura/util/__init__.py +++ b/Cura/util/__init__.py @@ -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 ) diff --git a/Cura/util/gcodeInterpreter.py b/Cura/util/gcodeInterpreter.py index ca2117cf..71e26f0c 100644 --- a/Cura/util/gcodeInterpreter.py +++ b/Cura/util/gcodeInterpreter.py @@ -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 index 00000000..05e759ea --- /dev/null +++ b/Cura/util/stl.py @@ -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('