Python 当我在vtk窗口中选择一个框时,我可以作为观察者放置哪种vtk.vtkCommand事件?

Python 当我在vtk窗口中选择一个框时,我可以作为观察者放置哪种vtk.vtkCommand事件?,python,events,vtk,Python,Events,Vtk,我正在试图找到一种方法来检测我何时结束在vtk窗口中制作一个框。 要允许选择,我首先按键盘上的“r”,然后用鼠标左键在窗口上创建一个框。 我试图向MouseInteractorHighLightActor类添加观察者,但找不到正确的vtk.vtkCommand事件来触发我的函数。 有人知道我应该用哪一个吗 在vtk.VTKnderedAreaPicker上使用vtk.vtkCommand.EndPickEvent观察者,并将该区域选取器添加到VTKnderWindowInterActor 下面

我正在试图找到一种方法来检测我何时结束在vtk窗口中制作一个框。 要允许选择,我首先按键盘上的“r”,然后用鼠标左键在窗口上创建一个框。 我试图向
MouseInteractorHighLightActor
类添加观察者,但找不到正确的
vtk.vtkCommand
事件来触发我的函数。 有人知道我应该用哪一个吗


vtk.VTKnderedAreaPicker
上使用
vtk.vtkCommand.EndPickEvent
观察者,并将该区域选取器添加到
VTKnderWindowInterActor

下面是执行此操作的代码:

导入vtk
类MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):
def uuu init uuu(self,parent=None):
self.AddObserver(vtk.vtkCommand.PickEvent,self.PickEvent)
self.AddObserver(vtk.vtkCommand.KeyPressEvent,self.keypresscallback函数)
self.area_picker=vtk.vtcrenderedareapicker()
self.area_picker.AddObserver(vtk.vtkCommand.EndPickEvent,self.EndPickEventfunc)
self.area\u picker.AddObserver(vtk.vtkCommand.PickEvent,self.PickEvent)
返回
def键按Callback功能(自身、对象、事件):
打印('按键!')
def拾取事件(自身、obj、事件):
打印('PickEvent!')
def EndPickEventfunc(自身、对象、事件):
打印(“我在这里!”)
clickPos=self.GetInteractitor().GetEventPosition()
#渲染器和渲染窗口
renderer=vtk.vtkrender()
渲染器.SetBackground(.3、.4、.5)
renwin=vtk.vtkRenderWindow()
renwin.AddRenderer(渲染器)
#互动者
interactor=vtk.vtkRenderWindowInteractor()
interactior.SetRenderWindow(renwin)
#添加自定义样式
style=MouseInteractorHighLightActor()
style.SetDefaultRenderer(渲染器)
interactior.setInteractitorStyle(样式)
interactor.SetPicker(样式区域选择器)
#添加要玩的球体
对于范围(10)内的i:
source=vtk.vtkSphereSource()
source.SetRadius(vtk.vtkMath.Random(.5,1.0))
SetCenter(vtk.vtkMath.Random(-5,5),vtk.vtkMath.Random(-5,5),vtk.vtkMath.Random(-5,5))
资料来源:决议(11)
来源。设置解决方案(21)
mapper=vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor=vtk.vtkActor()
actor.SetMapper(映射器)
actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4,1.0)、vtk.vtkMath.Random(.4,1.0)、vtk.vtkMath.Random(.4,1.0))
renderer.AddActor(actor)
#开始
interactior.Initialize()
interactior.Start()
PyVista使这种方式更容易 签出PyVista:

将pyvista导入为pv
将numpy作为np导入
球体=pv.MultiBlock()
对于范围(10)内的i:
球体附加(pv.Sphere(半径=(i+5)/10,
中心=np.随机.兰德(3)*5)
绘图仪=pv.绘图仪(笔记本=0)
对于范围(10)内的i:
球体=pv.球体(半径=(i)/10,
中心=np.随机.兰德(3)*10-5)
绘图仪。添加网格(球体)
def k_按钮():
打印(“按K键”)
def拾取(网格):
打印(“挑选了一些东西”)
绘图仪。添加按键事件(“k”,k按钮)
绘图仪。启用单元拾取(回调=拾取,通过=假)
plotter.show()

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()