def main(): args = parse_args() mesh = pymesh.load_mesh(args.input_mesh) f_indices = pymesh.get_degenerated_faces(mesh) if (len(f_indices) == 0): print("mesh does not have any degenerated faces") return v_indices = mesh.faces[f_indices].ravel() degenerated_faces = np.zeros(mesh.num_faces) degenerated_faces[f_indices] = 1.0 degenerated = np.zeros(mesh.num_vertices) degenerated[v_indices] = 1.0 mesh.add_attribute("degenerated_faces") mesh.set_attribute("degenerated_faces", degenerated_faces) mesh.add_attribute("degenerated") mesh.set_attribute("degenerated", degenerated) print("{} degenerated faces, consisting of {} vertices.".format( len(f_indices), np.count_nonzero(degenerated))) if args.verbose: print("Degenerated faces indices: {}".format(f_indices)) pymesh.save_mesh(args.output_mesh, mesh, "degenerated", "degenerated_faces") if args.extract_region is not None: region = extract_submesh(mesh, f_indices, 0) pymesh.save_mesh(args.extract_region, region, *region.get_attribute_names())
def main(): args = parse_args(); mesh = pymesh.load_mesh(args.input_mesh); f_indices = pymesh.get_degenerated_faces(mesh); if (len(f_indices) == 0): print("mesh does not have any degenerated faces"); return; v_indices = mesh.faces[f_indices].ravel(); degenerated_faces = np.zeros(mesh.num_faces); degenerated_faces[f_indices] = 1.0; degenerated = np.zeros(mesh.num_vertices); degenerated[v_indices] = 1.0; mesh.add_attribute("degenerated_faces"); mesh.set_attribute("degenerated_faces", degenerated_faces); mesh.add_attribute("degenerated"); mesh.set_attribute("degenerated", degenerated); print("{} degenerated faces, consisting of {} vertices.".format( len(f_indices), np.count_nonzero(degenerated))); if args.verbose: print("Degenerated faces indices: {}".format(f_indices)); pymesh.save_mesh(args.output_mesh, mesh, "degenerated", "degenerated_faces"); if args.extract_region is not None: region = pymesh.submesh(mesh, f_indices, 0); pymesh.save_mesh(args.extract_region, region, *region.get_attribute_names());
def print_extended_info(mesh, info): print_section_header("Extended info") num_cc = mesh.num_components num_f_cc = mesh.num_surface_components if mesh.num_voxels > 0: num_v_cc = mesh.num_volume_components else: num_v_cc = 0 isolated_vertices = mesh.num_isolated_vertices duplicated_faces = mesh.num_duplicated_faces degenerated_indices = pymesh.get_degenerated_faces(mesh) num_degenerated = len(degenerated_indices) if num_degenerated > 0: degenerated_faces = mesh.faces[degenerated_indices] combinatorially_degenerated_faces = \ [f for f in degenerated_faces if len(set(f)) != len(f) ] num_combinatorial_degenerated_faces =\ len(combinatorially_degenerated_faces) else: num_combinatorial_degenerated_faces = 0 print_property("num connected components", num_cc) print_property("num connected surface components", num_f_cc) print_property("num connected volume components", num_v_cc) print_property("num isolated vertices", isolated_vertices, 0) print_property("num duplicated faces", duplicated_faces, 0) print_property("num boundary edges", mesh.num_boundary_edges) print_property("num boundary loops", mesh.num_boundary_loops) print_property("num degenerated faces", num_degenerated, 0) if num_degenerated > 0: print_property(" combinatorially degenerated", num_combinatorial_degenerated_faces, 0) print_property(" geometrically degenerated", num_degenerated - num_combinatorial_degenerated_faces, 0) info["num_connected_components"] = num_cc info["num_connected_surface_components"] = num_f_cc info["num_connected_volume_components"] = num_v_cc info["num_isolated_vertices"] = isolated_vertices info["num_duplicated_faces"] = duplicated_faces info["num_boundary_edges"] = mesh.num_boundary_edges info["num_boundary_loops"] = mesh.num_boundary_loops info["num_degenerated_faces"] = num_degenerated info["num_combinatorial_degenerated_faces"] =\ num_combinatorial_degenerated_faces info["num_geometrical_degenerated_faces"] =\ num_degenerated - num_combinatorial_degenerated_faces is_closed = mesh.is_closed() is_edge_manifold = mesh.is_edge_manifold() is_vertex_manifold = mesh.is_vertex_manifold() is_oriented = mesh.is_oriented() euler = mesh.euler_characteristic print_property("oriented", is_oriented, True) print_property("closed", is_closed, True) print_property("edge manifold", is_edge_manifold, True) print_property("vertex manifold", is_vertex_manifold, True) print_property("euler characteristic", euler) info["oriented"] = is_oriented info["closed"] = is_closed info["vertex_manifold"] = is_vertex_manifold info["edge_manifold"] = is_edge_manifold info["euler_characteristic"] = euler
def print_extended_info(mesh, info): print_section_header("Extended info") num_cc = mesh.num_components num_f_cc = mesh.num_surface_components if mesh.num_voxels > 0: num_v_cc = mesh.num_volume_components else: num_v_cc = 0 isolated_vertices = mesh.num_isolated_vertices duplicated_faces = mesh.num_duplicated_faces unique_vertices = pymesh.unique_rows(mesh.vertices)[0] duplicated_vertices = mesh.num_vertices - len(unique_vertices) degenerated_indices = pymesh.get_degenerated_faces(mesh) num_degenerated = len(degenerated_indices) if num_degenerated > 0: degenerated_faces = mesh.faces[degenerated_indices] combinatorially_degenerated_faces = \ [f for f in degenerated_faces if len(set(f)) != len(f) ] num_combinatorial_degenerated_faces =\ len(combinatorially_degenerated_faces) else: num_combinatorial_degenerated_faces = 0 print_property("num connected components", num_cc) print_property("num connected surface components", num_f_cc) print_property("num connected volume components", num_v_cc) print_property("num isolated vertices", isolated_vertices, 0) print_property("num duplicated vertices", duplicated_vertices, 0) print_property("num duplicated faces", duplicated_faces, 0) print_property("num boundary edges", mesh.num_boundary_edges) print_property("num boundary loops", mesh.num_boundary_loops) print_property("num degenerated faces", num_degenerated, 0) if num_degenerated > 0: print_property(" combinatorially degenerated", num_combinatorial_degenerated_faces, 0) print_property(" geometrically degenerated", num_degenerated - num_combinatorial_degenerated_faces, 0) info["num_connected_components"] = num_cc info["num_connected_surface_components"] = num_f_cc info["num_connected_volume_components"] = num_v_cc info["num_isolated_vertices"] = isolated_vertices info["num_duplicated_vertices"] = duplicated_vertices info["num_duplicated_faces"] = duplicated_faces info["num_boundary_edges"] = mesh.num_boundary_edges info["num_boundary_loops"] = mesh.num_boundary_loops info["num_degenerated_faces"] = num_degenerated info["num_combinatorial_degenerated_faces"] =\ num_combinatorial_degenerated_faces info["num_geometrical_degenerated_faces"] =\ num_degenerated - num_combinatorial_degenerated_faces if mesh.dim == 2 and mesh.vertex_per_face == 3: tri_orientations = pymesh.get_triangle_orientations(mesh) num_inverted_tris = np.sum(tri_orientations < 0) print_property("num inverted triangles:", num_inverted_tris, 0) info["num_inverted_triangles"] = int(num_inverted_tris) if mesh.num_voxels > 0 and mesh.vertex_per_voxel == 4: tet_orientations = pymesh.get_tet_orientations(mesh) num_degenerate_tets = np.sum(tet_orientations == 0) num_inverted_tets = np.sum(tet_orientations < 0) print_property("num degenerated tets:", num_degenerate_tets, 0) print_property("num inverted tets:", num_inverted_tets, 0) info["num_degenerated_tets"] = int(num_degenerate_tets) info["num_inverted_tets"] = int(num_inverted_tets) is_closed = mesh.is_closed() is_edge_manifold = mesh.is_edge_manifold() is_vertex_manifold = mesh.is_vertex_manifold() is_oriented = mesh.is_oriented() euler = mesh.euler_characteristic print_property("oriented", is_oriented, True) print_property("closed", is_closed, True) print_property("edge manifold", is_edge_manifold, True) print_property("vertex manifold", is_vertex_manifold, True) print_property("euler characteristic", euler) info["oriented"] = is_oriented info["closed"] = is_closed info["vertex_manifold"] = is_vertex_manifold info["edge_manifold"] = is_edge_manifold info["euler_characteristic"] = euler
def print_extended_info(mesh, info): print_section_header("Extended info"); num_cc = mesh.num_components; num_f_cc = mesh.num_surface_components; if mesh.num_voxels > 0: num_v_cc = mesh.num_volume_components; else: num_v_cc = 0; isolated_vertices = mesh.num_isolated_vertices; duplicated_faces = mesh.num_duplicated_faces; degenerated_indices = pymesh.get_degenerated_faces(mesh); num_degenerated = len(degenerated_indices); if num_degenerated > 0: degenerated_faces = mesh.faces[degenerated_indices]; combinatorially_degenerated_faces = \ [f for f in degenerated_faces if len(set(f)) != len(f) ]; num_combinatorial_degenerated_faces =\ len(combinatorially_degenerated_faces); else: num_combinatorial_degenerated_faces = 0; print_property("num connected components", num_cc); print_property("num connected surface components", num_f_cc); print_property("num connected volume components", num_v_cc); print_property("num isolated vertices", isolated_vertices, 0); print_property("num duplicated faces", duplicated_faces, 0); print_property("num boundary edges", mesh.num_boundary_edges); print_property("num boundary loops", mesh.num_boundary_loops); print_property("num degenerated faces", num_degenerated, 0) if num_degenerated > 0: print_property(" combinatorially degenerated", num_combinatorial_degenerated_faces, 0); print_property(" geometrically degenerated", num_degenerated - num_combinatorial_degenerated_faces, 0); info["num_connected_components"] = num_cc; info["num_connected_surface_components"] = num_f_cc; info["num_connected_volume_components"] = num_v_cc; info["num_isolated_vertices"] = isolated_vertices; info["num_duplicated_faces"] = duplicated_faces; info["num_boundary_edges"] = mesh.num_boundary_edges; info["num_boundary_loops"] = mesh.num_boundary_loops; info["num_degenerated_faces"] = num_degenerated; info["num_combinatorial_degenerated_faces"] =\ num_combinatorial_degenerated_faces; info["num_geometrical_degenerated_faces"] =\ num_degenerated - num_combinatorial_degenerated_faces; is_closed = mesh.is_closed(); is_edge_manifold = mesh.is_edge_manifold(); is_vertex_manifold = mesh.is_vertex_manifold(); is_oriented = mesh.is_oriented(); euler = mesh.euler_characteristic; print_property("oriented", is_oriented, True); print_property("closed", is_closed, True) print_property("edge manifold", is_edge_manifold, True); print_property("vertex manifold", is_vertex_manifold, True); print_property("euler characteristic", euler); info["oriented"] = is_oriented; info["closed"] = is_closed; info["vertex_manifold"] = is_vertex_manifold; info["edge_manifold"] = is_edge_manifold; info["euler_characteristic"] = euler;
def print_extended_info(mesh, info): print_section_header("Extended info"); num_cc = mesh.num_components; num_f_cc = mesh.num_surface_components; if mesh.num_voxels > 0: num_v_cc = mesh.num_volume_components; else: num_v_cc = 0; isolated_vertices = mesh.num_isolated_vertices; duplicated_faces = mesh.num_duplicated_faces; degenerated_indices = pymesh.get_degenerated_faces(mesh); num_degenerated = len(degenerated_indices); if num_degenerated > 0: degenerated_faces = mesh.faces[degenerated_indices]; combinatorially_degenerated_faces = \ [f for f in degenerated_faces if len(set(f)) != len(f) ]; num_combinatorial_degenerated_faces =\ len(combinatorially_degenerated_faces); else: num_combinatorial_degenerated_faces = 0; print_property("num connected components", num_cc); print_property("num connected surface components", num_f_cc); print_property("num connected volume components", num_v_cc); print_property("num isolated vertices", isolated_vertices, 0); print_property("num duplicated faces", duplicated_faces, 0); print_property("num boundary edges", mesh.num_boundary_edges); print_property("num boundary loops", mesh.num_boundary_loops); print_property("num degenerated faces", num_degenerated, 0) if num_degenerated > 0: print_property(" combinatorially degenerated", num_combinatorial_degenerated_faces, 0); print_property(" geometrically degenerated", num_degenerated - num_combinatorial_degenerated_faces, 0); info["num_connected_components"] = num_cc; info["num_connected_surface_components"] = num_f_cc; info["num_connected_volume_components"] = num_v_cc; info["num_isolated_vertices"] = isolated_vertices; info["num_duplicated_faces"] = duplicated_faces; info["num_boundary_edges"] = mesh.num_boundary_edges; info["num_boundary_loops"] = mesh.num_boundary_loops; info["num_degenerated_faces"] = num_degenerated; info["num_combinatorial_degenerated_faces"] =\ num_combinatorial_degenerated_faces; info["num_geometrical_degenerated_faces"] =\ num_degenerated - num_combinatorial_degenerated_faces; if mesh.num_voxels > 0 and mesh.vertex_per_voxel == 4: tet_orientations = pymesh.get_tet_orientations(mesh); num_degenerate_tets = np.sum(tet_orientations == 0); num_inverted_tets = np.sum(tet_orientations < 0); print_property("num degenerated tets:", num_degenerate_tets, 0); print_property("num inverted tets:", num_inverted_tets, 0); info["num_degenerated_tets"] = int(num_degenerate_tets); info["num_inverted_tets"] = int(num_inverted_tets); is_closed = mesh.is_closed(); is_edge_manifold = mesh.is_edge_manifold(); is_vertex_manifold = mesh.is_vertex_manifold(); is_oriented = mesh.is_oriented(); euler = mesh.euler_characteristic; print_property("oriented", is_oriented, True); print_property("closed", is_closed, True) print_property("edge manifold", is_edge_manifold, True); print_property("vertex manifold", is_vertex_manifold, True); print_property("euler characteristic", euler); info["oriented"] = is_oriented; info["closed"] = is_closed; info["vertex_manifold"] = is_vertex_manifold; info["edge_manifold"] = is_edge_manifold; info["euler_characteristic"] = euler;