平面ウィジェット#

プレーンウィジェットは,それぞれ 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()
plane widget

シーンを操作すると,クリップされたメッシュは次のように使用できます.

[UnstructuredGrid (0x7f21833936a0)
  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]

以下はユーザ対話型のスクリーンショットです

../../_images/plane-clip.gif

または,平面ウィジェットを使用してメッシュをスライスすることもできます.

p = pv.Plotter()
p.add_mesh_slice(vol)
p.show()
plane widget

シーンを操作すると,スライスは次のように表示されます.

[PolyData (0x7f2186c5a020)
  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]

以下はユーザ対話型のスクリーンショットです

../../_images/plane-slice.gif

あるいは,平面ウィジェットを利用して,その平面に沿ってベクトルフィールドをグリフするなどのカスタムタスクを実行することもできます. 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):
    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()
plane widget

以下はユーザ対話型のスクリーンショットです

../../_images/plane-glyph.gif

さらに, normal_rotation 引数を False に設定することで,矢印ベクトルを無効にすることができます.たとえば,ここでは平面を移動する法線ベクトルをプログラムで設定し,矢印を無効にして回転を防止します.

p = pv.Plotter()
p.add_mesh_slice(vol, normal=(1, 1, 1), normal_rotation=False)
p.show()
plane widget

このベクトルは, assign_to_axis 引数が設定されている場合は常に強制的に無効にされます.

p = pv.Plotter()
p.add_mesh_slice(vol, assign_to_axis='z')
p.show()
plane widget

さらに,ユーザは interaction_event キーワード引数を通して,利用可能な場合,異なるプレーンウィジェットヘルパーが処理するコールバック関数をトリガーするインタラクションイベントを変更することができます.例えば, InteractionEvent オブザーバを使用することで,連続的なスライスを行うことができます.

import vtk

p = pv.Plotter()
p.add_mesh_slice(vol, assign_to_axis='z', interaction_event=vtk.vtkCommand.InteractionEvent)
p.show()
plane widget

そして,これは InteractionEvent オブザーバを介して,ユーザーが継続的にこのイベントを操作している画面のキャプチャです.

../../_images/plane-slice-continuous.gif

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

Sphinx-Galleryによるギャラリー