APIの基本的な使用方法#
PyVistaには,ほぼすべてのVTKデータセットを使い始め,そのオブジェクトを簡単にアクセスできるデータオブジェクトにラップするためのツールが用意されています.VTKライブラリーを初めて使用する場合でもパワーユーザーの場合でも,まずはPyVistaの pyvista.wrap()
および pyvista.read()
関数を使って,VTKデータオブジェクトをメモリーにラップするか,VTKまたはVTKに適したファイルフォーマットを読み取ることから始めるのがベストです.
VTKデータオブジェクトのラップ#
ラッピング関数 pyvista.wrap()
はPyVistaのトップレベルから使用できます.これにより,ユーザは持っている任意のVTKデータセットをPyVistaオブジェクトとして素早くラップすることができます.
import vtk
import pyvista as pv
stuff = vtk.vtkPolyData()
better = pv.wrap(stuff)
VTKファイルの読み取り#
PyVistaには,VTKファイル形式をそれぞれのPyVistaデータオブジェクトに読み込むための便利な関数が用意されています.ファイル名を渡して pyvista.read()
関数を呼び出します.
import pyvista as pv
mesh = pv.read('my_strange_vtk_file.vtk')
ラップされたデータオブジェクトへのアクセス#
ラップされたVTKデータオブジェクトができたので,データセットへのアクセスと変更を開始することができます.アクセスする最も一般的なプロパティには,ポイントおよびポイント/セルデータ(メッシュのノードまたはセルにそれぞれ割り当てられたデータアトリビュート)があります.
まず,一般的なメタプロパティをいくつか見てみましょう.
>>> import pyvista as pv
>>> from pyvista import examples
>>> import numpy as np
>>> mesh = examples.load_airplane()
Inspect how many cells are in this mesh
>>> mesh.n_cells
2452
Inspect how many points are in this mesh
>>> mesh.n_points
1335
What about scalar arrays? Are there any?
>>> mesh.n_arrays
0
What are the mesh bounds?
>>> mesh.bounds
[139.061, 1654.93, 32.09, 1319.95, -17.74, 282.13]
Where is the center of this mesh?
>>> mesh.center
[897.0, 676.02, 132.19]
ポイントにアクセスするには,任意のPyVistaメッシュの points
属性を numpy.ndarray
としてフェッチします.
>>> the_pts = mesh.points
>>> isinstance(the_pts, np.ndarray)
True
>>> the_pts[0:5, :]
array([[896.994 , 48.7601, 82.2656],
[906.593 , 48.7601, 80.7452],
[907.539 , 55.4902, 83.6581],
[896.994 , 55.4902, 85.3283],
[896.994 , 42.8477, 77.825 ]], dtype=float32)
メッシュのノードとセルのさまざまなデータアトリビュートへのアクセスは,VTKオブジェクトへのコールバックを持つディクショナリを介してインタフェースされます.これらの異なる点配列やセル配列のディクショナリには,NumPy配列として直接アクセスしたり修正することができます.次の例では,データセットを読み込み,そのデータセット上の配列にアクセスし,さらにデータを追加します.
>>> mesh = examples.load_uniform()
Fetch a data array from the point data dictionary
>>> arr = mesh.point_data['Spatial Point Data']
Assign a new array to the cell data:
>>> mesh.cell_data['foo'] = np.random.rand(mesh.n_cells)
Don't remember if your array is point or cell data? You can
directly query the mesh object and access the array from the
dataset.
>>> foo = mesh['foo']
>>> isinstance(foo, np.ndarray)
True
Or maybe you just want to add an array where it fits.
>>> mesh['new-array'] = np.random.rand(mesh.n_points)
プロット#
PyVistaには,直感的に操作でき, matplotlib
に似た構文やキーワード引数で高度に制御できることを目的とした数多くのプロッティングルーチンが含まれています.
まずは,各PyVistaデータオブジェクトにバインドされている便利な pyvista.plot()
メソッドを試してみてください.
import pyvista as pv
from pyvista import examples
mesh = examples.load_airplane()
mesh.plot()
プロッターオブジェクトを作成して,シーンの微調整を行うこともできます.まず, pyvista.Plotter
や pyvistaqt.BackgroundPlotter
などのプロッターをインスタンス化します. pyvista.Plotter
は, show()
を呼び出した後,コードの実行を一時停止するレンダリングウィンドウを作成します.
mesh = examples.load_airplane()
plotter = pv.Plotter() # instantiate the plotter
plotter.add_mesh(mesh) # add a mesh to the scene
plotter.camera.zoom(2) # Note how we can now access underlying attributes
plotter.show() # show the rendering window
オプションで show()
を使用すると,カメラポジションを選択して後で再度使用したい場合に,レンダリングウィンドウの最後に使用されたカメラポジションを返すことができます.カメラの位置は,プロッタの camera_position
属性としても利用できます(プロッタが閉じられた後でも).
このキャッシュされたカメラ位置は,プロットウィンドウを手動で操作しなくても,追加のプロットに使用できます:
# reuse the camera position from the previous plotter
cpos = plotter.camera_position
plotter = pv.Plotter(off_screen=True)
plotter.add_mesh(mesh, color='lightblue')
plotter.camera_position = cpos
plotter.show(screenshot='airplane.png')
使用する用途に応じて,使用可能なすべてのプロッタとオプションを確認してください.
pyvista.Plotter
: 閉じるまでコードを一時停止する標準的なプロッタです.pyvistaqt.BackgroundPlotter
: インタラクティブで,コードの実行を一時停止しないレンダリングウィンドウを作成します(詳細は pyvistaqt ライブラリを参照してください).
出力#
どんなPyVistaメッシュオブジェクトでも, save()
を使ってVTKファイルフォーマットに保存することができます.例えば,上のコードブロックのメッシュは次のように保存できます.
mesh.save("mesh.vtk")
または,メッシュが pyvista.PolyData
であるため, .vtp
, .stl
,または .ply
形式も使用できます. .save()
メソッドでサポートされている形式の詳細については,各メッシュタイプのメソッドに関するドキュメントを参照してください.
また,任意のPyVistaメッシュを meshio でサポートされている任意のファイル形式に書き出すことができます.Meshioは,Abaqus,Ansys msh,AVS-UCD,CGNS,DOLFIN XML,Exodus,FLAC 3 D,H 5 M,Kratos/MDPA,Medit,MED/Salome,Gmsh (バージョン2および4),OBJ,OFF,PERMAS,PLY,STL,TetGen .node/.ele,SVG (2Dのみ,出力のみ),UGRID, WKT (TIN),XDMFなど,多くの形式をサポートしています!
meshio
を使用してPyVistaメッシュを保存するには, pyvista.save_meshio()
を使用します:
pv.save_meshio("mesh.obj", mesh)