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()
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:])
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)
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
def test_voxelize(): mesh = pyvista.PolyData(ex.load_uniform().points) vox = pyvista.voxelize(mesh, 0.5) assert vox.n_cells
def filter(self): voxelized_mesh = pyvista.voxelize(self.mesh.pyvista, **self.kwargs) return self.mesh.mesh_class(offset=1)(voxelized_mesh, parents=[self.mesh])
#----------------------------- # 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) #------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
def logo_voxel(density=0.03): """Create a voxelized PyVista logo.""" return pyvista.voxelize(text_3d(LOGO_TITLE, depth=0.3), density)
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)
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)
def test_voxel_fem(): surface = examples.download_foot_bones() voxels = pv.voxelize(surface, density=surface.length / 200) import ipdb ipdb.set_trace()
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
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)