Source code for nanomesh.mesh._line

from __future__ import annotations

from typing import TYPE_CHECKING, Optional

import matplotlib.pyplot as plt
import numpy as np

from .._doc import doc
from ._mesh import Mesh

if TYPE_CHECKING:
    from ..mesh_container import MeshContainer


[docs]@doc(Mesh, prefix='Data class for line meshes', dim_points='2 or 3', dim_cells='2') class LineMesh(Mesh, cell_dim=2): cell_type = 'line'
[docs] def plot_mpl(self, *args, **kwargs) -> plt.Axes: """Simple line mesh plot using :mod:`matplotlib`. Shortcut for :func:`plotting.linemeshplot`. Parameters ---------- *args Arguments passed to :func:`plotting.linemeshplot` **kwargs Keyword arguments passed to :func:`plotting.linemeshplot` Returns ------- plt.Axes """ from ..plotting import linemeshplot return linemeshplot(self, *args, **kwargs)
[docs] @doc(plot_mpl) def plot(self, *args, **kwargs): return self.plot_mpl(*args, **kwargs)
[docs] def label_boundaries(self, left: Optional[int | str] = None, right: Optional[int | str] = None, top: Optional[int | str] = None, bottom: Optional[int | str] = None, key: str = None): """Labels the boundaries of the mesh with the given value. Parameters ---------- left : int | str, optional Labels left boundary segments with the given value. If a string is passed, the :attr:`LineMesh.fields` attribute is updated with the field / value pair. right : int | str, optional Same as above. top : int | str, optional Same as above. bottom : int | str, optional Same as above. key : str, optional Key of the :attr:`LineMesh.cell_data` dictionary to update. Defaults to :attr:`LineMesh.default_key`. """ if not key: key = self.default_key for side, f_bound, col in ( (left, np.min, 1), (right, np.max, 1), (top, np.max, 0), (bottom, np.min, 0), ): if not side: continue bound = f_bound(self.points) idx = np.argwhere(self.points[:, col] == bound) side_idx = np.nonzero(np.all(np.isin(self.cells, idx), axis=1)) if isinstance(side, str): int_label = max(self.cell_data[key].max(), 1) + 1 self.fields[side] = int_label else: int_label = side self.cell_data[key][side_idx] = int_label
[docs] @doc(prefix='Triangulate mesh using :func:`triangulate`') def triangulate(self, opts: str = 'pq30Aa100', **kwargs) -> MeshContainer: from .._triangle_wrapper import triangulate return triangulate(self, opts=opts, **kwargs)