示例#1
0
def test_volume_from_surface_with_features():
    helpers.download("elephant.vtu", "3552eb5b7f549b345d871999b4218dfc")
    mesh = pygalmesh.generate_volume_mesh_from_surface_mesh(
        "/tmp/elephant.vtu",
        detect_features=True,
        perturb=False,
        exude=False,
        edge_size=0.05,
        facet_angle=25.0,
        facet_size=0.15,
        facet_distance=0.008,
        cell_radius_edge_ratio=3.0,
        cell_size=1.0,
        verbose=False,
    )

    tol = 1.0e-3
    assert abs(max(mesh.points[:, 0]) - 0.36021700) < tol
    assert abs(min(mesh.points[:, 0]) + 0.35832974) < tol
    assert abs(max(mesh.points[:, 1]) - 0.49749655) < tol
    assert abs(min(mesh.points[:, 1]) + 0.49925193) < tol
    assert abs(max(mesh.points[:, 2]) - 0.29955834) < tol
    assert abs(min(mesh.points[:, 2]) + 0.29849035) < tol

    vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"]))
    assert abs(vol - 0.044164693065) < tol
    return
示例#2
0
def meshVolumetricFromSurface(
    filename: str,
    lloyd: bool = False,
    odt: bool = False,
    perturb: bool = False,
    exude: bool = False,
    max_edge_size_at_feature_edges: float = 0.0,
    min_facet_angle: float = 0.0,
    max_radius_surface_delaunay_ball: float = 0.0,
    max_facet_distance: float = 0.0,
    max_circumradius_edge_ratio: float = 0.0,
    max_cell_circumradius: float = 0.0,
    verbose: bool = True,
    reorient: bool = False,
    seed: int = 0,
) -> str:
    """Converts a surface mesh (e.g. triangles from an stl) to a volume mesh consisting of tetrahedra. Saves the volume mesh to a vtk file and returns the filename as a string.
    """

    mesh = pygalmesh.generate_volume_mesh_from_surface_mesh(
        filename=filename,
        lloyd=lloyd,
        odt=odt,
        perturb=perturb,
        exude=exude,
        max_edge_size_at_feature_edges=max_edge_size_at_feature_edges,
        min_facet_angle=min_facet_angle,
        max_radius_surface_delaunay_ball=max_radius_surface_delaunay_ball,
        max_facet_distance=max_facet_distance,
        max_circumradius_edge_ratio=max_circumradius_edge_ratio,
        max_cell_circumradius=max_cell_circumradius,
        verbose=verbose,
        reorient=reorient,
        seed=seed,
    )

    output_path = Path(filename).parent / Path(
        Path(filename).stem + "_volumetric.vtk")
    output_filename = str(output_path)

    if Path(output_filename).is_file() and verbose:
        print(f"[INFO] {output_filename} existist and will be rewritten.")

    mesh.write(output_filename)

    return output_filename
示例#3
0
def test_volume_from_surface():
    this_dir = os.path.dirname(os.path.abspath(__file__))
    mesh = pygalmesh.generate_volume_mesh_from_surface_mesh(
        os.path.join(this_dir, "meshes", "elephant.vtu"),
        facet_angle=25.0,
        facet_size=0.15,
        facet_distance=0.008,
        cell_radius_edge_ratio=3.0,
        verbose=False,
    )

    tol = 1.0e-3
    assert abs(max(mesh.points[:, 0]) - 0.357612477657) < tol
    assert abs(min(mesh.points[:, 0]) + 0.358747130015) < tol
    assert abs(max(mesh.points[:, 1]) - 0.496137874959) < tol
    assert abs(min(mesh.points[:, 1]) + 0.495301051456) < tol
    assert abs(max(mesh.points[:, 2]) - 0.298780230629) < tol
    assert abs(min(mesh.points[:, 2]) + 0.300472866512) < tol

    vol = sum(helpers.compute_volumes(mesh.points, mesh.get_cells_type("tetra")))
    assert abs(vol - 0.044164693065) < tol