Source code for geomfum.wrap.pyvista
"""Wraps pyvista functions."""
import pyvista as pv
from geomfum.plot import ShapePlotter
from geomfum.shape.convert import to_pv_polydata
[docs]
class PvMeshPlotter(ShapePlotter):
"""Plotting object to display meshes."""
# NB: for now assumes only one mesh is plotted
def __init__(self, colormap="viridis", **kwargs):
self.colormap = colormap
self._plotter = pv.Plotter(**kwargs)
self._mesh = None
self._add_mesh = None
def __getattr__(self, name):
"""Get attribute.
It is only called when ``__getattribute__`` fails.
Delegates attribute calling to plotter.
"""
return getattr(self._plotter, name)
[docs]
def add_mesh(self, mesh, **kwargs):
"""Add mesh to plot.
Parameters
----------
mesh : TriangleMesh
Mesh to be plotted.
"""
self._mesh = to_pv_polydata(mesh)
self._add_mesh = lambda mesh: self._plotter.add_mesh(
mesh, cmap=self.colormap, **kwargs
)
return self
[docs]
def set_vertex_scalars(self, scalars, name="scalars"):
"""Set vertex scalars on mesh.
Parameters
----------
scalars : array-like
Value at each vertex.
name : str
Scalar field name.
"""
self._mesh.point_data.set_scalars(scalars, name=name)
return self
[docs]
def highlight_vertices(self, coords, color='red', size=0.01):
"""
Highlight vertices on the mesh using PyVista.
Parameters
----------
coords : array-like, shape = [n_vertices, 3]
Coordinates of vertices to highlight.
color : str or tuple
Color of the highlighted vertices.
size : float
Size of the highlighted vertices (radius of spheres).
"""
name = 'Highlighted_points'
points = pv.PolyData(coords)
glyphs = points.glyph(scale=False, geom=pv.Sphere(radius=size))
self._plotter.add_mesh(glyphs, color=color, name=name)
return self
[docs]
def show(self):
"""Display plot."""
self._add_mesh(self._mesh)
self._plotter.show()