当我在vtk窗口中选择一个框时,可以将哪种vtk.vtkCommand事件设置为Observer? [英] What kind of vtk.vtkCommand event I can put as Observer when I select a box in a vtk window?

查看:72
本文介绍了当我在vtk窗口中选择一个框时,可以将哪种vtk.vtkCommand事件设置为Observer?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找到一种方法来检测何时结束在vtk窗口中创建盒子.为了进行选择,我首先按键盘上的"r",然后用鼠标左键在窗口上打一个框.我试图将观察者添加到 MouseInteractorHighLightActor 类中,但是找不到正确的 vtk.vtkCommand 事件来触发我的功能.有人知道我应该使用哪一个吗?

  import vtk类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)返回def KeypressCallbackFunction(self,obj,event):打印('按键被按下!')def PickEvent(self,obj,event):打印('PickEvent!')def EndPickEventfunc(自己,obj,事件):打印('我在这里!')clickPos = self.GetInteractor().GetEventPosition()#渲染器和渲染窗口渲染器= vtk.vtkRenderer()renderer.SetBackground(.3,.4,.5)renwin = vtk.vtkRenderWindow()renwin.AddRenderer(渲染器)#互动者互动者= vtk.vtkRenderWindowInteractor()interactor.SetRenderWindow(renwin)#添加自定义样式样式= MouseInteractorHighLightActor()style.SetDefaultRenderer(renderer)interactor.SetInteractorStyle(样式)#添加球体来玩对于我在范围(10)中:源= 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)映射器= vtk.vtkPolyDataMapper()mapper.SetInputConnection(source.GetOutputPort())演员= 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)# 开始interactor.Initialize()interactor.Start() 

解决方案

vtk.vtkRenderedAreaPicker 上使用 vtk.vtkCommand.EndPickEvent 观察器,并将该区域选择器添加到 vtkRenderWindowInteractor

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

  import vtk类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)返回def KeypressCallbackFunction(self,obj,event):打印('按键被按下!')def PickEvent(self,obj,event):打印('PickEvent!')def EndPickEventfunc(自己,obj,事件):打印('我在这里!')clickPos = self.GetInteractor().GetEventPosition()#渲染器和渲染窗口渲染器= vtk.vtkRenderer()renderer.SetBackground(.3,.4,.5)renwin = vtk.vtkRenderWindow()renwin.AddRenderer(渲染器)#互动者互动者= vtk.vtkRenderWindowInteractor()interactor.SetRenderWindow(renwin)#添加自定义样式样式= MouseInteractorHighLightActor()style.SetDefaultRenderer(renderer)interactor.SetInteractorStyle(样式)interactor.SetPicker(style.area_picker)#添加球体来玩对于我在范围(10)中:源= 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)映射器= vtk.vtkPolyDataMapper()mapper.SetInputConnection(source.GetOutputPort())演员= 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)# 开始interactor.Initialize()interactor.Start() 

PyVista使这种方式更容易

结帐PyVista:

I'm trying to find a way to detect when I end to make a box in the vtk window. to allow the selection I first press 'r' on the keyboard, then I can make a box on the window with the left mouse. I tried to add an Observer to the MouseInteractorHighLightActor class but I cannot find the right vtk.vtkCommand event to trigger my function. does someone know which one I should use?

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

解决方案

Use a vtk.vtkCommand.EndPickEvent observer on an vtk.vtkRenderedAreaPicker and add that area picker to the vtkRenderWindowInteractor

Here is code to do it:

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 makes this way easier

Checkout 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窗口中选择一个框时,可以将哪种vtk.vtkCommand事件设置为Observer?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆