注釈
Go to the end をクリックすると完全なサンプルコードをダウンロードできます.
線形セル#
このサンプルは 非構造化グリッドの作成 のサンプルを拡張して,線形 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)
この線形セルは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')
この例は, 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.HEXAHEDRON
と pv.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
モジュールからセルを作成してその属性を確認することができます.
すべての線形セルタイプをプロットする#
(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()
Total running time of the script: (0 minutes 3.874 seconds)