如何在vtk-python中实现交互式风格

2024-09-23 22:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我需要使用pyqt和vtk启动我们的项目。我需要实现我自己的风格。我从中继承了一个类vtk.vtkinteractorstyletrackball摄像机. 我的代码是:

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

当左键点击时,我希望这个代码可以打印“左键向下”,但它不能。我的代码怎么了? 任何建议都将不胜感激。你知道吗


Tags: 代码importselfsourceinitdefsysframe
1条回答
网友
1楼 · 发布于 2024-09-23 22:28:51

试试看:

...

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

...

更新:

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

enter image description here

相关问题 更多 >