Пример #1
0
def test_box_grid():
    grid = np.zeros((30, 30, 30))
    grid[13:18, 5:25, 13:18] = 1

    elements, vertices, vert_manager = grid_to_tets(grid, 0.1)

    mesh = examples.download_cow()
    distances = mesh_select(vertices, mesh)
    print("distances: ", distances)

    print(elements, vertices)
    constraints = [[0, [1, 1, 1]], [1, [1, 1, 1]], [2, [1, 1, 1]],
                   [3, [1, 1, 1]]]

    loads = [[32, -10000., 0.0, 0]]
    # [20, 1000., 0.0, 0],
    #[34, 1000., 0.0, 0],
    # [31, 10000., 0.0, 0]]
    poisson = 0.3
    youngs = 2000

    displacements = solve_full(elements, vertices, poisson, youngs,
                               constraints, loads)
    magnitudes = get_displacement_magnitudes(displacements)
    print("magnitudes", magnitudes)

    plotter = pv.Plotter()
    #add_tets_to_display(vertices, elements, plotter, magnitudes)

    surface = generate_unstructured_grid(elements, vertices)
    voxels = pv.voxelize(surface, density=surface.length / 200)
    plotter.add_mesh(voxels)
    plotter.show()
Пример #2
0
def logo_atomized(density=0.05, scale=0.6, depth=0.05):
    """Generate a voxelized pyvista logo with intra-cell spacing."""
    mesh_letters = logo_letters(depth=depth)
    grids = []
    for letter in mesh_letters.values():
        grid = pyvista.voxelize(letter, density=density)
        grids.append(atomize(grid, scale=scale))

    return grids[0].merge(grids[1:])
Пример #3
0
def test_voxelize_throws_when_density_is_not_length_3():
    with pytest.raises(ValueError) as e:
        mesh = pyvista.PolyData(ex.load_uniform().points)
        vox = pyvista.voxelize(mesh, [0.5, 0.3])
    assert "not enough values to unpack" in str(e.value)
Пример #4
0
def test_voxelize_non_uniform_desnity():
    mesh = pyvista.PolyData(ex.load_uniform().points)
    vox = pyvista.voxelize(mesh, [0.5, 0.3, 0.2])
    assert vox.n_cells
Пример #5
0
def test_voxelize():
    mesh = pyvista.PolyData(ex.load_uniform().points)
    vox = pyvista.voxelize(mesh, 0.5)
    assert vox.n_cells
Пример #6
0
 def filter(self):
     voxelized_mesh = pyvista.voxelize(self.mesh.pyvista, **self.kwargs)
     return self.mesh.mesh_class(offset=1)(voxelized_mesh,
                                           parents=[self.mesh])
Пример #7
0
#-----------------------------
# voxelize each cell and merge it into an image pixel array
#-----------------------------

# create a blank image array sized by the extents vector (plus edge padding)
image = np.zeros(tuple(np.around(vrange / PIXEL_SIZE).astype(int) + 3),
                 'uint16')

# iterate through the cell files
for fname in flist:
    print(fname)
    surface = pv.read(fname)
    surface.translate(trans)  # translate to positive quadrant

    # voxelize the surface mesh
    voxels = pv.voxelize(surface, density=PIXEL_SIZE)

    # get voxel centers mapped to indices into the image array
    centers = np.around(voxels.cell_centers().points / PIXEL_SIZE).astype(int)

    # color the image pixels for this cell by cell number
    for row in centers:
        image[tuple(row)] = 200 + int(fname[-7:-4])

# save the image
tif.imsave('stack.tif', np.swapaxes(image, 0, 2))

#voxels.plot(color=True, show_edges=True)

#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
Пример #8
0
def logo_voxel(density=0.03):
    """Create a voxelized PyVista logo."""
    return pyvista.voxelize(text_3d(LOGO_TITLE, depth=0.3), density)
Пример #9
0
def _for_landing_page(jupyter_backend='ipygany', **kwargs):
    """Plot the stylized PyVista logo for ipygany.

    To be shown on the landing page at index.rst

    """
    mesh_letters = logo_letters()

    # letter 'P'
    p_mesh = mesh_letters['P'].compute_normals(split_vertices=True)

    # letter 'y'
    y_mesh = mesh_letters['y'].compute_normals(split_vertices=True)

    # letter 'V'
    v_grid = pyvista.voxelize(mesh_letters['V'], density=0.08)
    v_grid_atom = atomize(v_grid)
    v_grid_atom['scalars'] = v_grid_atom.points[:, 0]

    i_grid = pyvista.voxelize(mesh_letters['i'], density=0.1)
    i_mesh = i_grid.extract_surface().triangulate().subdivide(2)
    i_mesh = i_mesh.smooth(500)
    old_center = np.array(i_mesh.center)
    i_mesh.points *= 1.07
    i_mesh.points += old_center - np.array(i_mesh.center)

    # letter 's'
    s_vox = pyvista.voxelize(mesh_letters['s'], density=0.04)
    s_cent = s_vox.cell_centers()
    pd = pyvista.PolyData(s_cent.points)

    sphere = pyvista.Sphere(theta_resolution=9, phi_resolution=9)
    s_grid = pd.glyph(factor=0.04, geom=sphere)

    # letter 't'
    # t_mesh = mesh_letters['t'].subdivide(5)
    # t_mesh.flip_normals()
    # t_mesh = t_mesh.compute_normals(consistent_normals=True)
    # import pyacvd
    # clus = pyacvd.Clustering(t_mesh)
    # clus.cluster(140)
    # t_cmesh = clus.create_mesh()

    # import _ as fe
    # src = fe.Surface(t_cmesh)
    # tgt = fe.Surface(t_mesh)
    # src.morph(tgt, settings={'local_with_centroid': True, 'local_steps': 300})
    # src.morph(tgt, settings={'local_with_centroid': True, 'local_steps': 300})

    # t_mesh = t_cmesh.extract_all_edges().tube(radius=0.005, n_sides=4)
    # t_mesh.extract_surface().save(...)

    t_mesh_filename = os.path.join(THIS_PATH, 't_mesh.ply')
    t_mesh = pyvista.read(t_mesh_filename)

    # letter 'a'
    grid = examples.download_letter_a()
    grid.points[:, 0] += (mesh_letters['a'].center[0] - grid.center[0])

    # select some cells from grid
    cells = grid.cells.reshape(-1, 5)
    mask = grid.points[cells[:, 1:], 2] < 0.2
    mask = mask.all(1)

    a_part = grid.extract_cells(mask)

    plotter = pyvista.Plotter()
    plotter.add_mesh(p_mesh, color='#376fa0')
    plotter.add_mesh(y_mesh, color='#ffd040')
    vista = v_grid_atom.merge([i_mesh, s_grid, t_mesh, a_part])
    vista['xdist'] = vista.points[:, 0]
    plotter.add_mesh(vista, cmap='viridis')

    # cpos = None
    # cpos = [(-0.9785294154224577, 1.2712499319005408, 10.965733716449193),
    #         (2.553950615449191, 0.34145688392081264, 0.06127122762851659),
    #         (0.019308531920309947, 0.996708840795678, -0.07873161547192065)]

    # cpos = [(0.9060226106040606, 0.7752122028710583, 5.148283455883558),
    #         (2.553950615449191, 0.34145688392081264, 0.06127122762851659),
    #         (0.019308531920309943, 0.9967088407956779, -0.07873161547192063)]

    # cpos = [(0.6861237002108157, 0.7572283207509382, 5.078581054505883),
    #         (2.334051705055946, 0.3234730018006926, -0.008431173749159387),
    #         (0.019308531920309947, 0.996708840795678, -0.07873161547192065)]

    if jupyter_backend == 'ipygany':
        x = 2.7
        cpos = [(x, 0.306, 5), (x, 0.306, 0.15), (0.0, 1.0, 0.0)]

        text = text_3d("I'm interactive!", depth=0.1)
        text.points *= 0.15
        text.translate([4, -0.4, 0])

        plotter.add_mesh(text, color='black')

    else:
        cpos = [(0.9060226106040606, 0.7752122028710583, 5.148283455883558),
                (2.553950615449191, 0.34145688392081264, 0.06127122762851659),
                (0.019308531920309943, 0.9967088407956779,
                 -0.07873161547192063)]

    plotter.background_color = 'white'
    plotter.remove_scalar_bar()
    return plotter.show(cpos=cpos,
                        jupyter_backend=jupyter_backend,
                        jupyter_kwargs=kwargs)
Пример #10
0
def plot_logo(window_size=None,
              off_screen=None,
              screenshot=None,
              cpos=None,
              **kwargs):
    """Plot the stylized PyVista logo.

    Examples
    --------
    >>> from pyvista import demos
    >>> cpos = demos.plot_logo()

    """
    # initialize plotter
    if window_size is None:
        window_size = [960, 400]
    plotter = pyvista.Plotter(window_size=window_size, off_screen=off_screen)

    mesh_letters = logo_letters()

    # letter 'P'
    p_mesh = mesh_letters['P'].compute_normals(split_vertices=True)
    plotter.add_mesh(p_mesh, color='#376fa0', smooth_shading=True)

    # letter 'y'
    p_mesh = mesh_letters['y'].compute_normals(split_vertices=True)
    plotter.add_mesh(p_mesh, color='#ffd040', smooth_shading=True)

    # letter 'V'
    v_grid = pyvista.voxelize(mesh_letters['V'], density=0.08)
    v_grid_atom = atomize(v_grid)
    v_grid_atom['scalars'] = v_grid_atom.points[:, 0]
    plotter.add_mesh(v_grid_atom,
                     scalars='scalars',
                     show_edges=True,
                     cmap='winter',
                     show_scalar_bar=False)

    # letter 'i'
    i_grid = pyvista.voxelize(mesh_letters['i'], density=0.1)

    plotter.add_mesh(i_grid.extract_surface(),
                     style='points',
                     color='r',
                     render_points_as_spheres=True,
                     point_size=8)
    plotter.add_mesh(i_grid, style='wireframe', color='k', line_width=4)

    # letter 's'
    mesh = mesh_letters['s']
    scalars = mesh.points[:, 0]
    plotter.add_mesh(mesh,
                     scalars=scalars,
                     style='wireframe',
                     color='w',
                     show_edges=True,
                     line_width=2,
                     cmap='gist_heat',
                     backface_culling=True,
                     render_lines_as_tubes=True)

    # letter 't'
    mesh = mesh_letters['t']
    scalars = mesh.points[:, 0]
    plotter.add_mesh(mesh,
                     scalars=scalars,
                     show_edges=True,
                     cmap='autumn',
                     lighting=True)

    # letter 'a'
    grid = examples.download_letter_a()
    grid.points[:, 0] += (mesh_letters['a'].center[0] - grid.center[0])

    # select some cells from grid
    cells = grid.cells.reshape(-1, 5)
    mask = grid.points[cells[:, 1:], 2] < 0.2
    mask = mask.all(1)

    a_part = grid.extract_cells(mask)

    cells = a_part.cells.reshape(-1, 5)
    scalars = grid.points[cells[:, 1], 1]
    plotter.add_mesh(a_part, scalars=scalars, show_edges=True, cmap='Greens')

    # finalize plot and show it
    plotter.set_background(kwargs.pop('background', 'white'))
    if cpos is None:
        cpos = [(0.9060226106040606, 0.7752122028710583, 5.148283455883558),
                (2.553950615449191, 0.34145688392081264, 0.06127122762851659),
                (0.019308531920309943, 0.9967088407956779,
                 -0.07873161547192063)]
    plotter.camera_position = cpos

    plotter.remove_scalar_bar()
    if screenshot:  # pragma: no cover
        plotter.show(cpos=cpos, auto_close=False)
        plotter.screenshot(screenshot, True)
        cpos_final = plotter.camera_position
        plotter.close()
        return cpos_final
    else:
        return plotter.show(cpos=cpos, **kwargs)
Пример #11
0
def test_voxel_fem():
    surface = examples.download_foot_bones()
    voxels = pv.voxelize(surface, density=surface.length / 200)
    import ipdb
    ipdb.set_trace()
Пример #12
0
import numpy as np

# Load a surface to voxelize
surface = examples.download_foot_bones()
surface

###############################################################################
cpos = [(7.656346967151718, -9.802071079151158, -11.021236183314311),
        (0.2224512272564101, -0.4594554282112895, 0.5549738359311297),
        (-0.6279216753504941, -0.7513057097368635, 0.20311105371647392)]

surface.plot(cpos=cpos, opacity=0.75)

###############################################################################
# Create a voxel model of the bounding surface
voxels = pv.voxelize(surface, density=surface.length / 200)

p = pv.Plotter()
p.add_mesh(voxels, color=True, show_edges=True, opacity=0.5)
p.add_mesh(surface, color="lightblue", opacity=0.5)
p.show(cpos=cpos)

###############################################################################
# We could even add a scalar field to that new voxel model in case we
# wanted to create grids for modelling. In this case, let's add a scalar field
# for bone density noting:
voxels["density"] = np.full(voxels.n_cells, 3.65)  # g/cc
voxels

###############################################################################
voxels.plot(scalars="density", cpos=cpos)
    print(f"Points Array1 shape: {points_array1.shape}")
    points_array2 = create_box_points(x_size=2.0,
                                      y_size=2.0,
                                      z_size=2.0,
                                      step=0.04)
    print(f"Points Array2 type: {type(points_array2)}")
    print(f"Points Array2 shape: {points_array2.shape}")

    points_array = np.concatenate((points_array1, points_array2), axis=0)
    print(f"Points Array type: {type(points_array)}")
    print(f"Points Array shape: {points_array.shape}")

    # Create PyVista Meshes
    point_cloud = pv.PolyData(points_array)

    voxels = pv.voxelize(point_cloud, density=0.05)
    p = pv.Plotter()
    p.add_mesh(voxels, color=True, show_edges=True, opacity=0.5)
    p.add_mesh(point_cloud, color="lightblue", opacity=0.5)
    p.show()

    # Get a Z component of the point array
    #zData = points_array[:,-1]
    xData = points_array[:, 0]
    print(f"xData points Array type: {type(xData)}")
    print(f"xData points Array shape: {xData.shape}")
    # Add to mesh
    #point_cloud["height"] = zData
    point_cloud["distance"] = xData

    # Plot PyVista mesh
Пример #14
0
def plot_logo(window_size=None,
              off_screen=None,
              screenshot=None,
              cpos=None,
              just_return_plotter=False,
              show_note=False,
              **kwargs):
    """Plot the stylized PyVista logo.

    Examples
    --------
    >>> from pyvista import demos
    >>> cpos = demos.plot_logo()

    """
    # initialize plotter
    if window_size is None:
        window_size = [960, 400]
    plotter = pyvista.Plotter(window_size=window_size, off_screen=off_screen)

    mesh_letters = logo_letters()

    # letter 'P'
    p_mesh = mesh_letters['P'].compute_normals(split_vertices=True)
    p_mesh.flip_normals()
    plotter.add_mesh(p_mesh, color='#376fa0', smooth_shading=True)

    # letter 'y'
    y_mesh = mesh_letters['y'].compute_normals(split_vertices=True)
    y_mesh.flip_normals()
    plotter.add_mesh(y_mesh, color='#ffd040', smooth_shading=True)

    # letter 'V'
    v_grid = pyvista.voxelize(mesh_letters['V'], density=0.08)
    v_grid_atom = atomize(v_grid)
    v_grid_atom['scalars'] = v_grid_atom.points[:, 0]
    v_grid_atom_surf = v_grid_atom.extract_surface()
    faces = v_grid_atom_surf.faces.reshape(-1, 5)
    faces[:, 1:] = faces[:, 1:][:, ::-1]
    v_grid_atom_surf.faces = faces
    plotter.add_mesh(v_grid_atom_surf,
                     scalars='scalars',
                     show_edges=True,
                     cmap='winter',
                     show_scalar_bar=False)

    # letter 'i'
    i_grid = pyvista.voxelize(mesh_letters['i'], density=0.1)

    plotter.add_mesh(i_grid.extract_surface(),
                     style='points',
                     color='r',
                     render_points_as_spheres=True,
                     point_size=14)
    plotter.add_mesh(i_grid, style='wireframe', color='k', line_width=4)

    # letter 's'
    mesh = mesh_letters['s']
    mesh['scalars'] = mesh.points[:, 0]
    plotter.add_mesh(mesh,
                     scalars='scalars',
                     style='wireframe',
                     show_edges=True,
                     line_width=2,
                     cmap='gist_heat',
                     backface_culling=True,
                     render_lines_as_tubes=True,
                     show_scalar_bar=False)

    # letter 't'
    mesh = mesh_letters['t'].clean().compute_normals()
    # strange behavior with pythreejs
    if pyvista.global_theme.jupyter_backend == 'pythreejs':
        mesh.flip_normals()
    scalars = mesh.points[:, 0]
    plotter.add_mesh(mesh,
                     scalars=scalars,
                     show_edges=True,
                     cmap='autumn',
                     show_scalar_bar=False)

    # letter 'a'
    grid = examples.download_letter_a()
    grid.points[:, 0] += (mesh_letters['a'].center[0] - grid.center[0])

    # select some cells from grid
    cells = grid.cells.reshape(-1, 5)
    mask = grid.points[cells[:, 1:], 2] < 0.2
    mask = mask.all(1)

    a_part = grid.extract_cells(mask)

    cells = a_part.cells.reshape(-1, 5)
    scalars = grid.points[cells[:, 1], 1]
    plotter.add_mesh(a_part,
                     scalars=scalars,
                     show_edges=True,
                     cmap='Greens',
                     show_scalar_bar=False)

    if show_note:
        text = text_3d("You can move me!", depth=0.1)
        text.points *= 0.1
        text.translate([4.0, -0.3, 0])
        plotter.add_mesh(text, color='black')

    # finalize plot and show it
    plotter.set_background(kwargs.pop('background', 'white'))
    plotter.camera_position = 'xy'
    if 'zoom' in kwargs:
        plotter.camera.zoom(kwargs.pop('zoom'))

    # plotter.remove_scalar_bar()
    plotter.enable_anti_aliasing()

    if just_return_plotter:
        return plotter

    if screenshot:  # pragma: no cover
        plotter.show(cpos=cpos, auto_close=False)
        plotter.screenshot(screenshot, True)
        cpos_final = plotter.camera_position
        plotter.close()
        return cpos_final
    else:
        return plotter.show(cpos=cpos, **kwargs)