diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index 0705b1b..4cb1d18 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -84,7 +84,6 @@ class mesh(object): removeDict = {} tree = util3d.AABBTree() off = numpy.array([0.0001,0.0001,0.0001]) - newVertexList = [] for idx in xrange(0, self.vertexCount): v = self.vertexes[idx] e = util3d.AABB(v-off, v+off) @@ -92,67 +91,71 @@ class mesh(object): if len(q) < 1: e.idx = idx tree.insert(e) - newVertexList.append(v) else: removeDict[idx] = q[0].idx print "%f: " % (time.time() - t0), "Marked %d duplicate vertexes for removal." % (len(removeDict)) + + faceList = [] + for idx in xrange(0, self.vertexCount, 3): + f = [idx, idx + 1, idx + 2] + if removeDict.has_key(f[0]): + f[0] = removeDict[f[0]] + if removeDict.has_key(f[1]): + f[1] = removeDict[f[1]] + if removeDict.has_key(f[2]): + f[2] = removeDict[f[2]] + faceList.append(f) - #Make facelists so we can quickly remove all the vertexes. + print "%f: " % (time.time() - t0), "Building face lists after vertex removal." vertexFaceList = [] for idx in xrange(0, self.vertexCount): vertexFaceList.append([]) - for f in self.faces: - f.v[0].faceList.append(f) - f.v[1].faceList.append(f) - f.v[2].faceList.append(f) - - self.vertexes = newVertexList - for v1 in removeDict.iterkeys(): - v0 = removeDict[v1] - for f in v1.faceList: - if f.v[0] == v1: - f.v[0] = v0 - if f.v[1] == v1: - f.v[1] = v0 - if f.v[2] == v1: - f.v[2] = v0 - print "%f: " % (time.time() - t0), "Building face lists after vertex removal." - for v in self.vertexes: - v.faceList = [] - for f in self.faces: - f.v[0].faceList.append(f) - f.v[1].faceList.append(f) - f.v[2].faceList.append(f) + for idx in xrange(0, len(faceList)): + f = faceList[idx] + vertexFaceList[f[0]].append(idx) + vertexFaceList[f[1]].append(idx) + vertexFaceList[f[2]].append(idx) print "%f: " % (time.time() - t0), "Building parts." + self._vertexFaceList = vertexFaceList + self._faceList = faceList partList = [] doneSet = set() - for f in self.faces: - if not f in doneSet: - partList.append(self._createPartFromFacewalk(f, doneSet)) + for idx in xrange(0, len(faceList)): + if not idx in doneSet: + partList.append(self._createPartFromFacewalk(idx, doneSet)) print "%f: " % (time.time() - t0), "Split into %d parts" % (len(partList)) + self._vertexFaceList = None + self._faceList = None return partList - def _createPartFromFacewalk(self, startFace, doneSet): + def _createPartFromFacewalk(self, startFaceIdx, doneSet): m = mesh() - todoList = [startFace] - doneSet.add(startFace) + m._prepareVertexCount(self.vertexCount) + todoList = [startFaceIdx] + doneSet.add(startFaceIdx) while len(todoList) > 0: - f = todoList.pop() - m._partAddFacewalk(f, doneSet, todoList) + faceIdx = todoList.pop() + self._partAddFacewalk(m, faceIdx, doneSet, todoList) return m - def _partAddFacewalk(self, f, doneSet, todoList): - self.addFace(f.v[0], f.v[1], f.v[2]) - for f1 in f.v[0].faceList: + def _partAddFacewalk(self, part, faceIdx, doneSet, todoList): + f = self._faceList[faceIdx] + v0 = self.vertexes[f[0]] + v1 = self.vertexes[f[0]] + v2 = self.vertexes[f[0]] + part.addVertex(v0[0], v0[1], v0[2]) + part.addVertex(v1[0], v1[1], v1[2]) + part.addVertex(v2[0], v2[1], v2[2]) + for f1 in self._vertexFaceList[f[0]]: if f1 not in doneSet: todoList.append(f1) doneSet.add(f1) - for f1 in f.v[1].faceList: + for f1 in self._vertexFaceList[f[1]]: if f1 not in doneSet: todoList.append(f1) doneSet.add(f1) - for f1 in f.v[2].faceList: + for f1 in self._vertexFaceList[f[2]]: if f1 not in doneSet: todoList.append(f1) doneSet.add(f1) diff --git a/Cura/util/stl.py b/Cura/util/stl.py index 9689c03..1ae17fa 100644 --- a/Cura/util/stl.py +++ b/Cura/util/stl.py @@ -66,6 +66,6 @@ if __name__ == '__main__': m = stlModel().load(filename) print("Loaded %d faces" % (m.vertexCount / 3)) parts = m.splitToParts() -# for p in parts: -# saveAsSTL(p, "export_%i.stl" % parts.index(p)) + for p in parts: + saveAsSTL(p, "export_%i.stl" % parts.index(p)) diff --git a/Cura/util/util3d.py b/Cura/util/util3d.py index 92043ab..423d4f2 100644 --- a/Cura/util/util3d.py +++ b/Cura/util/util3d.py @@ -82,9 +82,7 @@ class AABB(object): def __init__(self, vMin, vMax): self.vMin = vMin self.vMax = vMax - - def getPerimeter(self): - return (self.vMax[0] - self.vMax[0]) + (self.vMax[1] - self.vMax[1]) + (self.vMax[2] - self.vMax[2]) + self.perimeter = numpy.sum(self.vMax - self.vMin) def combine(self, aabb): return AABB(numpy.minimum(self.vMin, aabb.vMin), numpy.maximum(self.vMax, aabb.vMax)) @@ -125,25 +123,25 @@ class AABBTree(object): child1 = node.child1 child2 = node.child2 - area = node.aabb.getPerimeter() + area = node.aabb.perimeter combinedAABB = node.aabb.combine(aabb) - combinedArea = combinedAABB.getPerimeter() + combinedArea = combinedAABB.perimeter cost = 2.0 * combinedArea inheritanceCost = 2.0 * (combinedArea - area) if child1.isLeaf(): - cost1 = aabb.combine(child1.aabb).getPerimeter() + inheritanceCost + cost1 = aabb.combine(child1.aabb).perimeter + inheritanceCost else: - oldArea = child1.aabb.getPerimeter() - newArea = aabb.combine(child1.aabb).getPerimeter() + oldArea = child1.aabb.perimeter + newArea = aabb.combine(child1.aabb).perimeter cost1 = (newArea - oldArea) + inheritanceCost if child2.isLeaf(): - cost2 = aabb.combine(child1.aabb).getPerimeter() + inheritanceCost + cost2 = aabb.combine(child1.aabb).perimeter + inheritanceCost else: - oldArea = child2.aabb.getPerimeter() - newArea = aabb.combine(child2.aabb).getPerimeter() + oldArea = child2.aabb.perimeter + newArea = aabb.combine(child2.aabb).perimeter cost2 = (newArea - oldArea) + inheritanceCost if cost < cost1 and cost < cost2: @@ -230,8 +228,8 @@ class AABBTree(object): A.aabb = B.aabb.combine(G.aabb) C.aabb = A.aabb.combine(F.aabb) - A.height = 1 + Math.max(B.height, G.height) - C.height = 1 + Math.max(A.height, F.height) + A.height = 1 + max(B.height, G.height) + C.height = 1 + max(A.height, F.height) else: C.child2 = G A.child2 = F @@ -309,9 +307,9 @@ class AABBTree(object): if __name__ == '__main__': tree = AABBTree() - tree.insert(AABB(numpy.array([0,0,0]), numpy.array([0,0,0]))) - tree.insert(AABB(numpy.array([1,1,1]), numpy.array([1,1,1]))) - tree.insert(AABB(numpy.array([0.5,0.5,0.5]), numpy.array([0.5,0.5,0.5]))) + tree.insert(AABB(Vector3(0,0,0), Vector3(0,0,0))) + tree.insert(AABB(Vector3(1,1,1), Vector3(1,1,1))) + tree.insert(AABB(Vector3(0.5,0.5,0.5), Vector3(0.5,0.5,0.5))) print(tree) - print(tree.query(AABB(numpy.array([0,0,0]), numpy.array([0,0,0])))) + print(tree.query(AABB(Vector3(0,0,0), Vector3(0,0,0))))