注釈
完全なサンプルコードをダウンロードしたり、Binderを使ってブラウザでこのサンプルを実行するには、 最後に進んでください 。
平面ウィジェット#
プレーンウィジェットは,それぞれ pyvista.Plotter.add_plane_widget()
と pyvista.Plotter.clear_plane_widgets()
メソッドによって有効と無効にすることができます.すべてのウィジェットと同様に,このプレーンを利用するにはカスタム・コールバック・メソッドを提供する必要があります.メッシュのクリッピングとスライスに平面が最も一般的に使用されることを考慮して,これらのタスクを実行する2つのヘルパーメソッドを用意しました.
平面を使用してメッシュをクリップしましょう:
import pyvista as pv
from pyvista import examples
vol = examples.download_brain()
p = pv.Plotter()
p.add_mesh_clip_plane(vol)
p.show()
シーンを操作すると,クリップされたメッシュは次のように使用できます.
[UnstructuredGrid (0x7fa60f14f400)
N Cells: 3538080
N Points: 3613484
X Bounds: 9.000e+01, 1.800e+02
Y Bounds: 0.000e+00, 2.160e+02
Z Bounds: 0.000e+00, 1.800e+02
N Arrays: 2]
以下はユーザ対話型のスクリーンショットです
または,平面ウィジェットを使用してメッシュをスライスすることもできます.
p = pv.Plotter()
p.add_mesh_slice(vol)
p.show()
シーンを操作すると,スライスは次のように表示されます.
[PolyData (0x7fa60f14fe20)
N Cells: 38880
N Points: 39277
N Strips: 0
X Bounds: 9.000e+01, 9.000e+01
Y Bounds: 0.000e+00, 2.160e+02
Z Bounds: 0.000e+00, 1.800e+02
N Arrays: 1]
以下はユーザ対話型のスクリーンショットです
あるいは,平面ウィジェットを利用して,その平面に沿ってベクトルフィールドをグリフするなどのカスタムタスクを実行することもできます. add_mesh
を呼び出す際には,一度に出力されるグリフのセットが1つだけであることを保証するために name
を渡す必要があることに注意してください.
import pyvista as pv
from pyvista import examples
mesh = examples.download_carotid()
p = pv.Plotter()
p.add_mesh(mesh.contour(8).extract_largest(), opacity=0.5)
def my_plane_func(normal, origin) -> None:
slc = mesh.slice(normal=normal, origin=origin)
arrows = slc.glyph(orient="vectors", scale="scalars", factor=0.01)
p.add_mesh(arrows, name="arrows")
p.add_plane_widget(my_plane_func)
p.show_grid()
p.add_axes()
p.show()
以下はユーザ対話型のスクリーンショットです
さらに, normal_rotation
引数を False
に設定することで,矢印ベクトルを無効にすることができます.たとえば,ここでは平面を移動する法線ベクトルをプログラムで設定し,矢印を無効にして回転を防止します.
p = pv.Plotter()
p.add_mesh_slice(vol, normal=(1, 1, 1), normal_rotation=False)
p.show()
また, assign_to_axis
引数が設定されているときは常に,ベクターは強制的に無効になります.
p = pv.Plotter()
p.add_mesh_slice(vol, assign_to_axis="z")
p.show()
さらに,ユーザは interaction_event
キーワード引数を通して,利用可能な場合,異なるプレーンウィジェットヘルパーが処理するコールバック関数をトリガーするインタラクションイベントを変更することができます.例えば, InteractionEvent
オブザーバを使用することで,連続的なスライスを行うことができます.
import vtk
p = pv.Plotter()
p.add_mesh_slice(vol, assign_to_axis="z", interaction_event=vtk.vtkCommand.InteractionEvent)
p.show()
そして,これは InteractionEvent
オブザーバを介して,ユーザーが継続的にこのイベントを操作している画面のキャプチャです.
Total running time of the script: (0 minutes 12.360 seconds)