線形セル#

このサンプルは 非構造化グリッドの作成 のサンプルを拡張して,線形 VTK セルタイプの説明と PyVista でどのように作成できるかの説明を含んでいます.

線形セルとは,各セルのエッジにのみ点が存在するセルのことです.非線形のセルには,セルのエッジに沿ってさらに点が存在します.

pyvista.UnstructuredGrid がどのようなものであるかについての詳細は, ポイントセット を参照してください.

import numpy as np

import pyvista as pv
from pyvista.examples import cells as example_cells, plot_cell

# random generator for examples
rng = np.random.default_rng(2)

セルの例をプロットする#

PyVistaには,各 pyvista.UnstructuredGrid の基本単位である,1つのセルをプロットするためのシンプルなユーティリティが含まれています.例えば,単純な Wedge をプロットしてみましょう.

grid = example_cells.Wedge()
example_cells.plot_cell(grid)
linear cells

この線形セルは6点で構成されています.

grid.points
pyvista_ndarray([[0. , 1. , 0. ],
                 [0. , 0. , 0. ],
                 [0. , 0.5, 0.5],
                 [1. , 1. , 0. ],
                 [1. , 0. , 0. ],
                 [1. , 0.5, 0.5]])

UnstructuredGridも1つのセルで構成され,そのセルの点インデックスは cells で定義されています.

注釈

先頭の 6 はセル内のポイント数です.

grid.cells
array([6, 0, 1, 2, 3, 4, 5])

2つのUnstructuredGridを結合する#

2つの非構造化グリッドを組み合わせて,1つの非構造化グリッドを作るには, + 演算子を使用します.

注釈

これは pyvista.UnstructuredGrid オブジェクトを作成するための非効率的な方法です.より効率的な実装を見るには, 非構造化グリッドの作成 を参照してください.

grid_a = example_cells.Hexahedron()
grid_a.points += [0, 2.5, 0]

grid_b = example_cells.HexagonalPrism()

combined = grid_b + grid_a

plot_cell(combined, cpos='iso')
linear cells

この例は, cells 属性の背後にある意味を説明するのに役立ちます.最初のセルである6面体は8個の点を含み,6角プリズムは12個の点を含んでいます. cells 属性は,各セルを構成するインデックスと共に,これを表示します.

combined.cells
array([ 8,  0,  1,  2,  3,  4,  5,  6,  7, 12,  8,  9, 10, 11, 12, 13, 14,
       15, 16, 17, 18, 19])

セルタイプ#

PyVista には pyvista.CellType という列挙体があり,利用可能なすべての VTK セルタイプが Python の列挙体にマッピングされています.これらのセルタイプはセルを作成するときに使用され, celltypes 属性を確認するときにも使用されます.例えば, combined.celltypes には, pv.CellType.HEXAHEDRONpv.CellType.HEXAGONAL_PRISM という両方のセルタイプが含まれます.

print(pv.CellType.HEXAHEDRON, pv.CellType.HEXAGONAL_PRISM)
(pv.CellType.HEXAHEDRON, pv.CellType.HEXAGONAL_PRISM) == combined.celltypes
12 16

array([ True,  True])

単一の線形セルを持つUnstructuredGridを作成する#

pyvista.UnstructuredGrid の3つの主要な入力がわかったので,1つ以上のセルを持つ非構造化グリッドを作成することはとても簡単です.もし,点の順序や追加を参照する必要がある場合は, cells.py のソースを読むか,あるいは pyvista.core.cells モジュールからセルを作成してその属性を確認することができます.

points = [
    [1.0, 1.0, 0.0],
    [-1.0, 1.0, 0.0],
    [-1.0, -1.0, 0.0],
    [1.0, -1.0, 0.0],
    [0.0, 0.0, 1.60803807],
]
cells = [len(points)] + list(range(len(points)))
pyrmaid = pv.UnstructuredGrid(cells, [pv.CellType.PYRAMID], points)
example_cells.plot_cell(pyrmaid)
linear cells

すべての線形セルタイプをプロットする#

(4, 4) pyvista.Plotter を作成し,16個の線形セルすべてを1つのプロットにまとめてみましょう.

def add_cell_helper(pl, text, grid, subplot, cpos=None):
    """Add a single cell to a plotter with fancy plotting."""
    pl.subplot(*subplot)
    pl.add_text(text, 'lower_edge', color='k', font_size=8)
    pl.add_mesh(grid, opacity=0.5, color='lightblue', line_width=5)
    edges = grid.extract_all_edges()
    if edges.n_cells:
        pl.add_mesh(grid.extract_all_edges(), line_width=5, color='k')
    pl.add_points(grid, render_points_as_spheres=True, point_size=20, color='r')
    pl.add_point_labels(
        grid.points,
        range(grid.n_points),
        always_visible=True,
        fill_shape=False,
        margin=0,
        shape_opacity=0.0,
        font_size=20,
        text_color='k',
    )
    if cpos is None:
        pl.camera.azimuth = 20
        pl.camera.elevation = -20
    else:
        pl.camera_position = cpos
    pl.camera.zoom(0.8)


pl = pv.Plotter(shape=(4, 4))
add_cell_helper(pl, f'VERTEX ({pv.CellType.VERTEX})', example_cells.Vertex(), (0, 0))
add_cell_helper(pl, f'POLY_VERTEX ({pv.CellType.POLY_VERTEX})', example_cells.PolyVertex(), (0, 1))
add_cell_helper(pl, f'LINE ({pv.CellType.LINE})', example_cells.Line(), (0, 2))
add_cell_helper(pl, f'POLY_LINE ({pv.CellType.POLY_LINE})', example_cells.PolyLine(), (0, 3))

add_cell_helper(
    pl, f'TRIANGLE ({pv.CellType.TRIANGLE})', example_cells.Triangle(), (1, 0), cpos='xy'
)
add_cell_helper(
    pl,
    f'TRIANGLE_STRIP ({pv.CellType.TRIANGLE_STRIP})',
    example_cells.TriangleStrip().rotate_z(90, inplace=False),
    (1, 1),
    cpos='xy',
)
add_cell_helper(pl, f'POLYGON ({pv.CellType.POLYGON})', example_cells.Polygon(), (1, 2), cpos='xy')
add_cell_helper(pl, f'PIXEL ({pv.CellType.PIXEL})', example_cells.Pixel(), (1, 3), cpos='xy')

# make irregular
quad_grid = example_cells.Quadrilateral()
quad_grid.points += rng.random((4, 3)) * 0.5

add_cell_helper(pl, f'QUAD ({pv.CellType.QUAD})', quad_grid, (2, 0))
add_cell_helper(pl, f'TETRA ({pv.CellType.TETRA})', example_cells.Tetrahedron(), (2, 1))
add_cell_helper(pl, f'VOXEL ({pv.CellType.VOXEL})', example_cells.Voxel(), (2, 2))

# make irregular
hex_grid = example_cells.Hexahedron()
hex_grid.points += rng.random((8, 3)) * 0.4
add_cell_helper(pl, f'HEXAHEDRON ({pv.CellType.HEXAHEDRON})', hex_grid, (2, 3))

add_cell_helper(pl, f'WEDGE ({pv.CellType.WEDGE})', example_cells.Wedge(), (3, 0))
add_cell_helper(pl, f'PYRAMID ({pv.CellType.PYRAMID})', example_cells.Pyramid(), (3, 1))
add_cell_helper(
    pl,
    f'PENTAGONAL_PRISM ({pv.CellType.PENTAGONAL_PRISM})',
    example_cells.PentagonalPrism(),
    (3, 2),
)
add_cell_helper(
    pl, f'HEXAGONAL_PRISM ({pv.CellType.HEXAGONAL_PRISM})', example_cells.HexagonalPrism(), (3, 3)
)

pl.background_color = 'w'
pl.show()
linear cells

Total running time of the script: (0 minutes 3.874 seconds)

Sphinx-Galleryによるギャラリー