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());
示例#3
0
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
示例#4
0
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
示例#5
0
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;
示例#6
0
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;