简体   繁体   中英

how to implement myself interactor style in vtk python

Currently, I need to start our project by using pyqt and vtk. I need to implement myself interact style. I inherit a class from vtk.vtkInteractorStyleTrackballCamera. My code is:

import vtk, sys

from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor

from PyQt5.QtWidgets import *

class myInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):

    def __init__(self):
        super(myInteractorStyle, self).__init__()

    def OnLeftButtonDown(self):
        super(myInteractorStyle, self).OnLeftButtonDown()
        print('left button down')

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)

        self.frame = QFrame()

        self.vl = QVBoxLayout()
        self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
        self.vl.addWidget(self.vtkWidget)

        self.ren = vtk.vtkRenderer()
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()

        # style = vtk.vtkInteractorStyleTrackballCamera()
        style = myInteractorStyle()
        self.iren.SetInteractorStyle(style)

        # Create source
        source = vtk.vtkSphereSource()
        source.SetCenter(0, 0, 0)
        source.SetRadius(5.0)

        # Create a mapper
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(source.GetOutputPort())
        mapper.ScalarVisibilityOff()

        # Create an actor
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetColor(1, 1, 1)
        actor.GetProperty().ShadingOff()

        self.ren.AddActor(actor)

        self.ren.ResetCamera()

        self.frame.setLayout(self.vl)
        self.setCentralWidget(self.frame)

        self.show()
        self.iren.Initialize()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()

    sys.exit(app.exec_())

When the left button click, I hope this code can print "left button down", but it don't. what's the wrong with my code? Any suggestion is appreciated.

Try it:

...

class myInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
    def __init__(self, parent=None):
        self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)

    def leftButtonPressEvent(self, obj, event):
        self.OnLeftButtonDown()
        print('left button down')

...

Update:

how can I get the coordinate of the clicked point?

class myInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
    def __init__(self, parent=None):
        self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)

    def leftButtonPressEvent(self, obj, event):

        clickPos = self.GetInteractor().GetEventPosition()       # <<<-----<
        print(f'left button down: {clickPos}')

        self.OnLeftButtonDown()

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM