VTK:与Actor / Assembly交互,而不必直接单击它

时间:2019-02-28 09:15:40

标签: python vtk

在我的应用程序中,我构建了一个vtkAssembly对象,并且可以使用自定义的InteractorStyle与之交互,该对象可以扩展vtkInteractorStyleTrackballActor。我将交互器添加到渲染窗口并设置我的自定义样式。我可以旋转,缩放和移动对象,一切都按预期工作。

因为这是渲染窗口中的唯一对象,所以我希望允许用户从任何地方控制该对象。更具体地说:用户不必将鼠标精确地放在对象上即可旋转,缩放等。

我已经有了一个观察者,当用户单击渲染窗口时,它不仅会触发对象本身,而且还会触发对象的相应旋转吗?

这是我自定义的vtkInteractorStyle类:

class SynchronousInteractorStyle(vtk.vtkInteractorStyleTrackballActor):

    button_active = False

    def __init__(self, process, parent=None):
        self.process = process
        self.AddObserver("LeftButtonPressEvent", self.left_button_press_event)
        self.AddObserver("LeftButtonReleaseEvent", self.left_button_release_event)
        self.AddObserver("MiddleButtonPressEvent", self.middle_button_press_event)
        self.AddObserver("MiddleButtonReleaseEvent", self.middle_button_release_event)
        self.AddObserver("RightButtonPressEvent", self.right_button_press_event)
        self.AddObserver("RightButtonReleaseEvent", self.right_button_release_event)

    def left_button_press_event(self, obj, event):
        print("I'm triggered!")
        self.button_active = True
        self.OnLeftButtonDown()
        return

    def left_button_release_event(self, obj, event):
        self.button_active = False
        self.OnLeftButtonUp()
        return

    def middle_button_press_event(self, obj, event):
        self.button_active = True
        self.OnMiddleButtonDown()
        return

    def middle_button_release_event(self, obj, event):
        self.button_active = False
        self.OnMiddleButtonUp()
        return

    def right_button_press_event(self, obj, event):
        self.button_active = True
        self.OnRightButtonDown()
        return

    def right_button_release_event(self, obj, event):
        self.button_active = False
        self.OnRightButtonUp()
        return

谢谢。

更新: 我想我找到了一种实现自己想要实现的目标的可能方法。 可以重写OnLeftButtonDown(interactor)方法,但是我无法弄清楚为启动旋转必须调用哪些函数。

这是我重写尝试的一个示例,但是交互器提供了一个vtkInteractorStyleTrackballActor对象,调用StartRotation()并没有任何作用。

def OnLeftButtonDown(interactor):
    print(interactor)
    interactor.StartRotate()
    return

0 个答案:

没有答案