def test_vertex_merger_index_of(): merger = MeshVertexMerger() merger.add_vertices([(1, 2, 3), (4, 5, 6)]) assert merger.index((1, 2, 3)) == 0 assert merger.index((4, 5, 6)) == 1 with pytest.raises(IndexError): merger.index((7, 8, 9))
def extrude( profile: Iterable["Vertex"], path: Iterable["Vertex"], close=True ) -> MeshTransformer: """Extrude a `profile` polygon along a `path` polyline, vertices of profile should be in counter clockwise order. Args: profile: sweeping profile as list of (x, y, z) tuples in counter clockwise order path: extrusion path as list of (x, y, z) tuples close: close profile polygon if ``True`` Returns: :class:`~ezdxf.render.MeshTransformer` """ def add_hull(bottom_profile, top_profile): prev_bottom = bottom_profile[0] prev_top = top_profile[0] for bottom, top in zip(bottom_profile[1:], top_profile[1:]): face = ( prev_bottom, bottom, top, prev_top, ) # counter clock wise: normals outwards mesh.faces.append(face) prev_bottom = bottom prev_top = top mesh = MeshVertexMerger() profile = Vec3.list(profile) if close: profile = close_polygon(profile) path = Vec3.list(path) start_point = path[0] # type: ignore bottom_indices = mesh.add_vertices(profile) # base profile for target_point in path[1:]: # type: ignore translation_vector = target_point - start_point # profile will just be translated profile = [vec + translation_vector for vec in profile] top_indices = mesh.add_vertices(profile) add_hull(bottom_indices, top_indices) bottom_indices = top_indices start_point = target_point return MeshTransformer.from_builder(mesh)
def extrude(profile: Iterable['Vertex'], path: Iterable['Vertex'], close: bool = True) -> MeshVertexMerger: """ Extrude a profile polygon along a path polyline, vertices of profile should be in counter clockwise order. Args: profile: sweeping profile as list of (x, y, z) tuples in counter clock wise order path: extrusion path as list of (x, y, z) tuples close: close profile polygon if True Returns: MeshVertexMerger() """ def add_hull(bottom_profile, top_profile): prev_bottom = bottom_profile[0] prev_top = top_profile[0] for bottom, top in zip(bottom_profile[1:], top_profile[1:]): face = (prev_bottom, bottom, top, prev_top ) # counter clock wise: normals outwards mesh.faces.append(face) prev_bottom = bottom prev_top = top mesh = MeshVertexMerger() if close: profile = close_polygon(profile) profile = [Vector(p) for p in profile] path = [Vector(p) for p in path] start_point = path[0] bottom_indices = mesh.add_vertices(profile) # base profile for target_point in path[1:]: translation_vector = target_point - start_point # profile will just be translated profile = [vec + translation_vector for vec in profile] top_indices = mesh.add_vertices(profile) add_hull(bottom_indices, top_indices) bottom_indices = top_indices start_point = target_point return mesh
def test_vertex_merger_indices(): merger = MeshVertexMerger() indices = merger.add_vertices([(1, 2, 3), (4, 5, 6)]) indices2 = merger.add_vertices([(1, 2, 3), (4, 5, 6)]) assert indices == indices2
def test_vertex_merger_vertices(): merger = MeshVertexMerger() merger.add_vertices([(1, 2, 3), (4, 5, 6)]) merger.add_vertices([(1, 2, 3), (4, 5, 6)]) assert merger.vertices == [(1, 2, 3), (4, 5, 6)]