def __call__(self, outerROI, triangle): #Create an Octree from inner surface minx = min([v.x for v in self.inner_mesh.vertices]) - 0.01 maxx = max([v.x for v in self.inner_mesh.vertices]) + 0.01 miny = min([v.y for v in self.inner_mesh.vertices]) - 0.01 maxy = max([v.y for v in self.inner_mesh.vertices]) + 0.01 minz = min([v.z for v in self.inner_mesh.vertices]) - 0.01 maxz = max([v.z for v in self.inner_mesh.vertices]) + 0.01 points = Octree(((minx, maxx), (miny, maxy), (minz, maxz))) for v in self.inner_mesh.vertices: points.insert((v.x, v.y, v.z), v) #Copy extend to inner surface inner_avoid_edges = [] outer_avoid_edges = [] join_strip = [] for roi in outerROI.rois: for start_outer, end_outer in zip(roi.points, roi.points[1:] + [roi.points[0]]): start_outer_vertex = outerROI.mesh.faces[start_outer[3]].nearest_vertex(*start_outer[:3]) end_outer_vertex = outerROI.mesh.faces[end_outer[3]].nearest_vertex(*end_outer[:3]) start_distance, start_coords, start_inner = points.by_distance_from_point((start_outer_vertex.x, start_outer_vertex.y, start_outer_vertex.z)).next() end_distance, end_coords, end_inner = points.by_distance_from_point((end_outer_vertex.x, end_outer_vertex.y, end_outer_vertex.z)).next() inner_strip = [x.edge for x in self.inner_mesh.get_vertex_path(start_inner, end_inner)] outer_strip = [x.edge for x in self.outer_mesh.get_vertex_path(start_outer_vertex,end_outer_vertex)] inner_avoid_edges = inner_avoid_edges + inner_strip outer_avoid_edges = outer_avoid_edges + outer_strip join_strip = join_strip + [(start_inner, inner_strip, start_outer_vertex, outer_strip)] triangle_distance, triangle_coords, triangle_vertex_inner = points.by_distance_from_point(triangle.vertices[0]).next() start_triangle = triangle_vertex_inner.faces[0] innerMesh = self.inner_mesh.cloneSubVol(start_triangle, inner_avoid_edges) print outer_avoid_edges outerMesh = self.outer_mesh.cloneSubVol(triangle, outer_avoid_edges) newMesh = mesh.Mesh() newMesh.add_mesh(outerMesh) newMesh.add_mesh(innerMesh, invert = True) for current_inner, inner_strip, current_outer, outer_strip in join_strip: inner_list = list_vertices(newMesh, current_inner, inner_strip) outer_list = list_vertices(newMesh, current_outer, outer_strip) while len(inner_list) > 1 or len(outer_list) > 1: if len(outer_list) == 1 or (len(inner_list) > 1 and (inner_list[0] - outer_list[1]).magnitude() > (inner_list[1] - outer_list[0]).magnitude()): newMesh.add_face(inner_list[0], inner_list[1], outer_list[0]) inner_list = inner_list[1:] else: newMesh.add_face(inner_list[0], outer_list[1], outer_list[0]) outer_list = outer_list[1:] for edge in newMesh.edges.values(): if edge.lface is None or edge.rface is None: print edge print newMesh.closed() stlwriter = mesh.fileio.StlWriter(mesh.fileio.STL_FORMAT_BINARY) stlwriter.write(newMesh, "Mould", self.base_file + "mould.stl")
class GeometricTests(TestCase): def setUp(self): self.coords = set((sin(0.1*t), sin(0.2*t), sin(0.3*t)) for t in xrange(50)) self.o = Octree(((-1.0, 1.0),(-1.0, 1.0),(-1.0, 1.0))) self.o.extend((p,None) for p in self.coords) def test_basic(self): self.assertEqual(len(self.o), 50) def test_by_distance_from_point(self): p = (0.123, 0.456, 0.789) l1 = list(self.o.by_distance_from_point(p)) l2 = list(self.o.by_distance_from_point_rev(p)) self.assertEqual(set(c for (_,c,_) in l1), self.coords, "the points in order of distance from p should be the same as the points we put in") for (d,c,v) in l1: self.assertEqual(d, euclidean_point_point(p,c), "the points in order of distance from p should have distance computed correctly") self.assertEqual(l1,list(reversed(l2)), "the points in order of distance reversed should be the reverse of the points in order of distance") for ((d1,_,_),(d2,_,_)) in zip(l1,l1[1:]): self.assertTrue(d1 <= d2, "the points in order of distance from p should have increasing distance from p") self.assertEqual(self.o.nearest_to_point(p), l1[0], "the nearest point to p should be the first in order of distance from p") l3 = list(self.o.near_point(p, 1.3)) self.assertEqual(l3, l1[:len(l3)], "the points near p should be an initial segment of the points in order of distance from p") def test_embiggen(self): b = ((-1.0,1.6),(-1.0,1.6),(-1.0,1.6)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = list(self.o.by_distance_from_point(p)) l2 = list(o2.by_distance_from_point(p)) self.assertEqual(l1, l2, "enlarging the bounds shouldn't have changed the points") def test_restrict(self): b = ((-1.57,0.43),(-0.76,0.83),(-0.37,1.96)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = [(d,c,v) for (d,c,v) in self.o.by_distance_from_point(p) if point_in_box(c,b)] l2 = list(o2.by_distance_from_point(p)) self.assertEqual(l1, l2, "playing around with the bounds should restrict the points") def test_remove_all(self): p = (-0.432, 0.651, 0.791) l = list(self.o.by_distance_from_point(p)) n = len(l) for (i,(_,c,_)) in enumerate(l): self.o.remove(c) self.assertEqual(len(self.o), n-i-1) with self.assertRaises(KeyError): self.o.remove(c)
class GeometricTests(TestCase): def setUp(self): self.coords = set( (sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) for t in xrange(50)) self.o = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o.extend((p, None) for p in self.coords) def test_basic(self): self.assertEqual(len(self.o), 50) def test_by_distance_from_point(self): p = (0.123, 0.456, 0.789) l1 = list(self.o.by_distance_from_point(p)) l2 = list(self.o.by_distance_from_point_rev(p)) self.assertEqual( set(c for (_, c, _) in l1), self.coords, "the points in order of distance from p should be the same as the points we put in" ) for (d, c, v) in l1: self.assertEqual( d, euclidean_point_point(p, c), "the points in order of distance from p should have distance computed correctly" ) self.assertEqual( l1, list(reversed(l2)), "the points in order of distance reversed should be the reverse of the points in order of distance" ) for ((d1, _, _), (d2, _, _)) in zip(l1, l1[1:]): self.assertTrue( d1 <= d2, "the points in order of distance from p should have increasing distance from p" ) self.assertEqual( self.o.nearest_to_point(p), l1[0], "the nearest point to p should be the first in order of distance from p" ) l3 = list(self.o.near_point(p, 1.3)) self.assertEqual( l3, l1[:len(l3)], "the points near p should be an initial segment of the points in order of distance from p" ) def test_embiggen(self): b = ((-1.0, 1.6), (-1.0, 1.6), (-1.0, 1.6)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = list(self.o.by_distance_from_point(p)) l2 = list(o2.by_distance_from_point(p)) self.assertEqual( l1, l2, "enlarging the bounds shouldn't have changed the points") def test_restrict(self): b = ((-1.57, 0.43), (-0.76, 0.83), (-0.37, 1.96)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = [(d, c, v) for (d, c, v) in self.o.by_distance_from_point(p) if point_in_box(c, b)] l2 = list(o2.by_distance_from_point(p)) self.assertEqual( l1, l2, "playing around with the bounds should restrict the points") def test_remove_all(self): p = (-0.432, 0.651, 0.791) l = list(self.o.by_distance_from_point(p)) n = len(l) for (i, (_, c, _)) in enumerate(l): self.o.remove(c) self.assertEqual(len(self.o), n - i - 1) with self.assertRaises(KeyError): self.o.remove(c)
class GeometricTests(TestCase): def setUp(self): self.coords = set( (sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) for t in xrange(50)) self.o = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o.extend((p, True) for p in self.coords) def test_basic(self): self.assertEqual(len(self.o), 50) def test_get(self): for (i, p) in enumerate(self.coords): self.assertTrue(self.o.get(p, False)) self.assertFalse(self.o.get((2.3, 3.4, 4.5), False)) def test_by_distance_from_point(self): p = (0.123, 0.456, 0.789) l1 = list(self.o.by_distance_from_point(p)) l2 = list(self.o.by_distance_from_point_rev(p)) self.assertEqual( set(c for (_, c, _) in l1), self.coords, """the points in order of distance from p should be the same as the points we put in""") for (d, c, v) in l1: self.assertEqual( d, euclidean_point_point(p, c), """the points in order of distance from p should have distance computed correctly""") self.assertEqual( l1, list(reversed(l2)), """the points in order of distance reversed should be the reverse of the points in order of distance""") for ((d1, _, _), (d2, _, _)) in zip(l1, l1[1:]): self.assertTrue( d1 <= d2, """the points in order of distance from p should have increasing distance from p""") self.assertEqual( self.o.nearest_to_point(p), l1[0], """the nearest point to p should be the first in order of distance from p""") l3 = list(self.o.by_distance_from_point(p, 1.3)) self.assertEqual( l3, l1[:len(l3)], """the points near p should be an initial segment of the points in order of distance from p""") def test_embiggen(self): b = ((-1.0, 1.6), (-1.0, 1.6), (-1.0, 1.6)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = list(self.o.by_distance_from_point(p)) l2 = list(o2.by_distance_from_point(p)) self.assertEqual( l1, l2, """enlarging the bounds shouldn't have changed the points""") def test_restrict(self): b = ((-1.57, 0.43), (-0.76, 0.83), (-0.37, 1.96)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = [(d, c, v) for (d, c, v) in self.o.by_distance_from_point(p) if point_in_box(c, b)] l2 = list(o2.by_distance_from_point(p)) self.assertEqual( l1, l2, """playing around with the bounds should restrict the points""") def test_remove_all(self): p = (-0.432, 0.651, 0.791) l = list(self.o.by_distance_from_point(p)) n = len(l) for (i, (_, c, _)) in enumerate(l): self.o.remove(c) self.assertEqual(len(self.o), n - i - 1) with self.assertRaises(KeyError): self.o.remove(c) def test_union(self): p = (0.236, -0.532, -0.117) l = [c for (_, c, _) in self.o.by_distance_from_point(p)] o1 = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) o1.extend((p, True) for p in l[:25]) self.assertEqual(len(o1), 25) o2 = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) o2.extend((p, True) for p in l[25:]) self.assertEqual(len(o2), 25) self.assertEqual(o1.simple_union(o2), self.o) def test_matrix(self): m = ((0.123, 0.143, -0.987), (-0.345, 0.687, -0.431), (0.361, -0.183, 0.781)) o1 = self.o.apply_matrix(m) s = set(matrix_action(m, p) for p in self.coords) self.assertEqual(len(s), len(self.coords)) g1 = o1.by_distance_from_point((0.123, 0.456, 0.789)) s1 = set(c for (_, c, _) in g1) self.assertEqual(s, s1) def test_iter_and_subset(self): l1 = set(t for (t, _) in self.o if sum(t) > 0) l2 = set(t for t in self.coords if sum(t) > 0) l3 = set(t for (t, _) in self.o.subset(lambda t: sum(t) > 0)) self.assertEqual(l1, l2) self.assertEqual(l1, l3) def test_point_within_distance(self): epsilon = 0.1 for t in xrange(150, 200): p = (sin(0.1 * t), sin(0.2 * t), sin(0.3 * t)) try: self.o.by_distance_from_point(p, epsilon).next() f_computed = True except StopIteration: f_computed = False f_real = False for (q, _) in self.o: if euclidean_point_point(p, q) < epsilon: f_real = True break self.assertEqual(f_computed, f_real)
class GeometricTests(TestCase): def setUp(self): self.coords = set((sin(0.1*t), sin(0.2*t), sin(0.3*t)) for t in xrange(50)) self.o = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) self.o.extend((p, True) for p in self.coords) def test_basic(self): self.assertEqual(len(self.o), 50) def test_get(self): for (i, p) in enumerate(self.coords): self.assertTrue(self.o.get(p, False)) self.assertFalse(self.o.get((2.3, 3.4, 4.5), False)) def test_by_distance_from_point(self): p = (0.123, 0.456, 0.789) l1 = list(self.o.by_distance_from_point(p)) l2 = list(self.o.by_distance_from_point_rev(p)) self.assertEqual(set(c for (_, c, _) in l1), self.coords, """the points in order of distance from p should be the same as the points we put in""") for (d, c, v) in l1: self.assertEqual(d, euclidean_point_point(p, c), """the points in order of distance from p should have distance computed correctly""") self.assertEqual(l1, list(reversed(l2)), """the points in order of distance reversed should be the reverse of the points in order of distance""") for ((d1, _, _), (d2, _, _)) in zip(l1, l1[1:]): self.assertTrue(d1 <= d2, """the points in order of distance from p should have increasing distance from p""") self.assertEqual(self.o.nearest_to_point(p), l1[0], """the nearest point to p should be the first in order of distance from p""") l3 = list(self.o.by_distance_from_point(p, 1.3)) self.assertEqual(l3, l1[:len(l3)], """the points near p should be an initial segment of the points in order of distance from p""") def test_embiggen(self): b = ((-1.0, 1.6), (-1.0, 1.6), (-1.0, 1.6)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = list(self.o.by_distance_from_point(p)) l2 = list(o2.by_distance_from_point(p)) self.assertEqual(l1, l2, """enlarging the bounds shouldn't have changed the points""") def test_restrict(self): b = ((-1.57, 0.43), (-0.76, 0.83), (-0.37, 1.96)) o2 = self.o.rebound(b) self.assertEqual(o2.bounds, b) p = (0.653, -0.234, 0.113) l1 = [(d, c, v) for (d, c, v) in self.o.by_distance_from_point(p) if point_in_box(c, b)] l2 = list(o2.by_distance_from_point(p)) self.assertEqual(l1, l2, """playing around with the bounds should restrict the points""") def test_remove_all(self): p = (-0.432, 0.651, 0.791) l = list(self.o.by_distance_from_point(p)) n = len(l) for (i, (_, c, _)) in enumerate(l): self.o.remove(c) self.assertEqual(len(self.o), n-i-1) with self.assertRaises(KeyError): self.o.remove(c) def test_union(self): p = (0.236, -0.532, -0.117) l = [c for (_, c, _) in self.o.by_distance_from_point(p)] o1 = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) o1.extend((p, True) for p in l[:25]) self.assertEqual(len(o1), 25) o2 = Octree(((-1.0, 1.0), (-1.0, 1.0), (-1.0, 1.0))) o2.extend((p, True) for p in l[25:]) self.assertEqual(len(o2), 25) self.assertEqual(o1.simple_union(o2), self.o) def test_matrix(self): m = ((0.123, 0.143, -0.987), (-0.345, 0.687, -0.431), (0.361, -0.183, 0.781)) o1 = self.o.apply_matrix(m) s = set(matrix_action(m, p) for p in self.coords) self.assertEqual(len(s), len(self.coords)) g1 = o1.by_distance_from_point((0.123, 0.456, 0.789)) s1 = set(c for (_, c, _) in g1) self.assertEqual(s, s1) def test_iter_and_subset(self): l1 = set(t for (t, _) in self.o if sum(t) > 0) l2 = set(t for t in self.coords if sum(t) > 0) l3 = set(t for (t, _) in self.o.subset(lambda t: sum(t) > 0)) self.assertEqual(l1, l2) self.assertEqual(l1, l3) def test_point_within_distance(self): epsilon = 0.1 for t in xrange(150, 200): p = (sin(0.1*t), sin(0.2*t), sin(0.3*t)) try: self.o.by_distance_from_point(p, epsilon).next() f_computed = True except StopIteration: f_computed = False f_real = False for (q, _) in self.o: if euclidean_point_point(p, q) < epsilon: f_real = True break self.assertEqual(f_computed, f_real)
def __call__(self, outerROI, triangle): #Create an Octree from inner surface minx = min([v.x for v in self.inner_mesh.vertices]) - 0.01 maxx = max([v.x for v in self.inner_mesh.vertices]) + 0.01 miny = min([v.y for v in self.inner_mesh.vertices]) - 0.01 maxy = max([v.y for v in self.inner_mesh.vertices]) + 0.01 minz = min([v.z for v in self.inner_mesh.vertices]) - 0.01 maxz = max([v.z for v in self.inner_mesh.vertices]) + 0.01 points = Octree(((minx, maxx), (miny, maxy), (minz, maxz))) for v in self.inner_mesh.vertices: points.insert((v.x, v.y, v.z), v) #Copy extend to inner surface inner_avoid_edges = [] outer_avoid_edges = [] join_strip = [] for roi in outerROI.rois: for start_outer, end_outer in zip(roi.points, roi.points[1:] + [roi.points[0]]): start_outer_vertex = outerROI.mesh.faces[ start_outer[3]].nearest_vertex(*start_outer[:3]) end_outer_vertex = outerROI.mesh.faces[ end_outer[3]].nearest_vertex(*end_outer[:3]) start_distance, start_coords, start_inner = points.by_distance_from_point( (start_outer_vertex.x, start_outer_vertex.y, start_outer_vertex.z)).next() end_distance, end_coords, end_inner = points.by_distance_from_point( (end_outer_vertex.x, end_outer_vertex.y, end_outer_vertex.z)).next() inner_strip = [ x.edge for x in self.inner_mesh.get_vertex_path( start_inner, end_inner) ] outer_strip = [ x.edge for x in self.outer_mesh.get_vertex_path( start_outer_vertex, end_outer_vertex) ] inner_avoid_edges = inner_avoid_edges + inner_strip outer_avoid_edges = outer_avoid_edges + outer_strip join_strip = join_strip + [ (start_inner, inner_strip, start_outer_vertex, outer_strip) ] triangle_distance, triangle_coords, triangle_vertex_inner = points.by_distance_from_point( triangle.vertices[0]).next() start_triangle = triangle_vertex_inner.faces[0] innerMesh = self.inner_mesh.cloneSubVol(start_triangle, inner_avoid_edges) print outer_avoid_edges outerMesh = self.outer_mesh.cloneSubVol(triangle, outer_avoid_edges) newMesh = mesh.Mesh() newMesh.add_mesh(outerMesh) newMesh.add_mesh(innerMesh, invert=True) for current_inner, inner_strip, current_outer, outer_strip in join_strip: inner_list = list_vertices(newMesh, current_inner, inner_strip) outer_list = list_vertices(newMesh, current_outer, outer_strip) while len(inner_list) > 1 or len(outer_list) > 1: if len(outer_list) == 1 or ( len(inner_list) > 1 and (inner_list[0] - outer_list[1]).magnitude() > (inner_list[1] - outer_list[0]).magnitude()): newMesh.add_face(inner_list[0], inner_list[1], outer_list[0]) inner_list = inner_list[1:] else: newMesh.add_face(inner_list[0], outer_list[1], outer_list[0]) outer_list = outer_list[1:] for edge in newMesh.edges.values(): if edge.lface is None or edge.rface is None: print edge print newMesh.closed() stlwriter = mesh.fileio.StlWriter(mesh.fileio.STL_FORMAT_BINARY) stlwriter.write(newMesh, "Mould", self.base_file + "mould.stl")