当我 select vtk window 中的一个框时,我可以将什么样的 vtk.vtkCommand 事件作为观察者?
What kind of vtk.vtkCommand event I can put as Observer when I select a box in a vtk window?
我正在尝试找到一种方法来检测我何时结束在 vtk 中制作一个盒子 window。
为了允许选择,我首先按下键盘上的 'r',然后我可以用鼠标左键在 window 上创建一个框。
我试图向 MouseInteractorHighLightActor
class 添加一个观察者,但我找不到正确的 vtk.vtkCommand
事件来触发我的功能。
有人知道我应该使用哪一个吗?
import vtk
class MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):
def __init__(self, parent=None):
self.AddObserver(vtk.vtkCommand.EndPickEvent, self.EndPickEventfunc)
self.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
self.AddObserver(vtk.vtkCommand.KeyPressEvent, self.KeypressCallbackFunction)
return
def KeypressCallbackFunction(self, obj, event):
print('Key pressed!')
def PickEvent(self, obj, event):
print('PickEvent!')
def EndPickEventfunc(self, obj, event):
print('I was here!')
clickPos = self.GetInteractor().GetEventPosition()
# A renderer and render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(.3, .4, .5)
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(renderer)
# An interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renwin)
# add the custom style
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(renderer)
interactor.SetInteractorStyle(style)
# Add spheres to play with
for i in range(10):
source = vtk.vtkSphereSource()
source.SetRadius(vtk.vtkMath.Random(.5, 1.0))
source.SetCenter(vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5))
source.SetPhiResolution(11)
source.SetThetaResolution(21)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0))
renderer.AddActor(actor)
# Start
interactor.Initialize()
interactor.Start()
在 vtk.vtkRenderedAreaPicker
上使用 vtk.vtkCommand.EndPickEvent
观察器并将该区域选择器添加到 vtkRenderWindowInteractor
这是执行此操作的代码:
import vtk
class MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):
def __init__(self, parent=None):
self.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
self.AddObserver(vtk.vtkCommand.KeyPressEvent, self.KeypressCallbackFunction)
self.area_picker = vtk.vtkRenderedAreaPicker()
self.area_picker.AddObserver(vtk.vtkCommand.EndPickEvent, self.EndPickEventfunc)
self.area_picker.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
return
def KeypressCallbackFunction(self, obj, event):
print('Key pressed!')
def PickEvent(self, obj, event):
print('PickEvent!')
def EndPickEventfunc(self, obj, event):
print('I was here!')
clickPos = self.GetInteractor().GetEventPosition()
# A renderer and render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(.3, .4, .5)
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(renderer)
# An interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renwin)
# add the custom style
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(renderer)
interactor.SetInteractorStyle(style)
interactor.SetPicker(style.area_picker)
# Add spheres to play with
for i in range(10):
source = vtk.vtkSphereSource()
source.SetRadius(vtk.vtkMath.Random(.5, 1.0))
source.SetCenter(vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5))
source.SetPhiResolution(11)
source.SetThetaResolution(21)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0))
renderer.AddActor(actor)
# Start
interactor.Initialize()
interactor.Start()
PyVista 使这种方式更容易
结帐 PyVista:https://docs.pyvista.org
import pyvista as pv
import numpy as np
spheres = pv.MultiBlock()
for i in range(10):
spheres.append(pv.Sphere(radius=(i + 5) / 10,
center=np.random.rand(3) * 5))
plotter = pv.Plotter(notebook=0)
for i in range(10):
sphere = pv.Sphere(radius=(i) / 10,
center=np.random.rand(3) * 10 - 5)
plotter.add_mesh(sphere)
def k_button():
print("K key pressed")
def picking(mesh):
print("Some stuff was picked")
plotter.add_key_event("k", k_button)
plotter.enable_cell_picking(callback=picking, through=False)
plotter.show()
我正在尝试找到一种方法来检测我何时结束在 vtk 中制作一个盒子 window。
为了允许选择,我首先按下键盘上的 'r',然后我可以用鼠标左键在 window 上创建一个框。
我试图向 MouseInteractorHighLightActor
class 添加一个观察者,但我找不到正确的 vtk.vtkCommand
事件来触发我的功能。
有人知道我应该使用哪一个吗?
import vtk
class MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):
def __init__(self, parent=None):
self.AddObserver(vtk.vtkCommand.EndPickEvent, self.EndPickEventfunc)
self.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
self.AddObserver(vtk.vtkCommand.KeyPressEvent, self.KeypressCallbackFunction)
return
def KeypressCallbackFunction(self, obj, event):
print('Key pressed!')
def PickEvent(self, obj, event):
print('PickEvent!')
def EndPickEventfunc(self, obj, event):
print('I was here!')
clickPos = self.GetInteractor().GetEventPosition()
# A renderer and render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(.3, .4, .5)
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(renderer)
# An interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renwin)
# add the custom style
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(renderer)
interactor.SetInteractorStyle(style)
# Add spheres to play with
for i in range(10):
source = vtk.vtkSphereSource()
source.SetRadius(vtk.vtkMath.Random(.5, 1.0))
source.SetCenter(vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5))
source.SetPhiResolution(11)
source.SetThetaResolution(21)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0))
renderer.AddActor(actor)
# Start
interactor.Initialize()
interactor.Start()
在 vtk.vtkRenderedAreaPicker
上使用 vtk.vtkCommand.EndPickEvent
观察器并将该区域选择器添加到 vtkRenderWindowInteractor
这是执行此操作的代码:
import vtk
class MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):
def __init__(self, parent=None):
self.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
self.AddObserver(vtk.vtkCommand.KeyPressEvent, self.KeypressCallbackFunction)
self.area_picker = vtk.vtkRenderedAreaPicker()
self.area_picker.AddObserver(vtk.vtkCommand.EndPickEvent, self.EndPickEventfunc)
self.area_picker.AddObserver(vtk.vtkCommand.PickEvent, self.PickEvent)
return
def KeypressCallbackFunction(self, obj, event):
print('Key pressed!')
def PickEvent(self, obj, event):
print('PickEvent!')
def EndPickEventfunc(self, obj, event):
print('I was here!')
clickPos = self.GetInteractor().GetEventPosition()
# A renderer and render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(.3, .4, .5)
renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(renderer)
# An interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renwin)
# add the custom style
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(renderer)
interactor.SetInteractorStyle(style)
interactor.SetPicker(style.area_picker)
# Add spheres to play with
for i in range(10):
source = vtk.vtkSphereSource()
source.SetRadius(vtk.vtkMath.Random(.5, 1.0))
source.SetCenter(vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5))
source.SetPhiResolution(11)
source.SetThetaResolution(21)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0))
renderer.AddActor(actor)
# Start
interactor.Initialize()
interactor.Start()
PyVista 使这种方式更容易
结帐 PyVista:https://docs.pyvista.org
import pyvista as pv
import numpy as np
spheres = pv.MultiBlock()
for i in range(10):
spheres.append(pv.Sphere(radius=(i + 5) / 10,
center=np.random.rand(3) * 5))
plotter = pv.Plotter(notebook=0)
for i in range(10):
sphere = pv.Sphere(radius=(i) / 10,
center=np.random.rand(3) * 10 - 5)
plotter.add_mesh(sphere)
def k_button():
print("K key pressed")
def picking(mesh):
print("Some stuff was picked")
plotter.add_key_event("k", k_button)
plotter.enable_cell_picking(callback=picking, through=False)
plotter.show()