1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
"""
.. _composite_picking_example:
Composite Picking
~~~~~~~~~~~~~~~~~
Demonstrate how to pick individual blocks of a :class:`pyvista.MultiBlock`
using :func:`pyvista.Plotter.enable_block_picking`.
"""
from __future__ import annotations
import numpy as np
import pyvista as pv
# %%
# Create a MultiBlock Dataset
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Create 100 superellipsoids using :func:`pyvista.ParametricSuperEllipsoid`
# Seed rng for reproducibility
rng = np.random.default_rng(seed=0)
def make_poly():
"""Create a superellipsoid in a random location."""
poly = pv.ParametricSuperEllipsoid(
n1=rng.random(),
n2=rng.random() * 2,
u_res=50,
v_res=50,
)
poly.points += rng.random(3) * 20
return poly
# Assemble the multiblock and plot it using the default plotting settings
blocks = pv.MultiBlock([make_poly() for _ in range(100)])
blocks.plot()
# %%
# Enable Block Picking
# ~~~~~~~~~~~~~~~~~~~~
# Add ``blocks`` to a :class:`pyvista.Plotter` and enable block picking. For
# fun, let's also enable physically based rendering and set the callback to set
# the block color to red when the block is clicked and unset the color if the
# color has already been set for the block.
# sphinx_gallery_start_ignore
# physically based rendering does not work in interactive mode
PYVISTA_GALLERY_FORCE_STATIC = True
# sphinx_gallery_end_ignore
pl = pv.Plotter()
actor, mapper = pl.add_composite(blocks, color='w', pbr=True, metallic=True)
def callback(index, *args): # noqa: ARG001
"""Change a block to red if color is unset, and back to the actor color if set."""
if mapper.block_attr[index].color is None:
mapper.block_attr[index].color = 'r'
else:
mapper.block_attr[index].color = None
pl.enable_block_picking(callback, side='left')
pl.background_color = 'w'
pl.show()
# %%
# .. tags:: plot
|