代码之家  ›  专栏  ›  技术社区  ›  ymmx

当VTK嵌入到pyqT5中时,Windows和macOS之间的单击VTK参与者的反应是不同的

  •  0
  • ymmx  · 技术社区  · 5 年前

    我在Qt窗口中使用VTK以便与3D环境交互。 我举一个最小的例子,当我们点击球体时,代码会把一个球体涂成红色。 我既找不到原因也找不到解决办法。

    import vtk
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
    import sys
    
    NUMBER_OF_SPHERES = 10
    
    
    class MouseInteractorHighLightActor(vtk.vtkInteractorStyleTrackballCamera):
    
        def __init__(self, parent=None):
            self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)
    
            self.LastPickedActor = None
            self.LastPickedProperty = vtk.vtkProperty()
    
        def leftButtonPressEvent(self, obj, event):
            clickPos = self.GetInteractor().GetEventPosition()
            print(clickPos)
            picker = vtk.vtkPropPicker()
            picker.Pick(clickPos[0], clickPos[1], 0, self.GetDefaultRenderer())
    
            # get the new
            self.NewPickedActor = picker.GetActor()
    
            # If something was selected
            if self.NewPickedActor:
                # If we picked something before, reset its property
                if self.LastPickedActor:
                    self.LastPickedActor.GetProperty().DeepCopy(self.LastPickedProperty)
    
                # Save the property of the picked actor so that we can
                # restore it next time
                self.LastPickedProperty.DeepCopy(self.NewPickedActor.GetProperty())
                # Highlight the picked actor by changing its properties
                self.NewPickedActor.GetProperty().SetColor(1.0, 0.0, 0.0)
    
                # save the last picked actor
                self.LastPickedActor = self.NewPickedActor
    
            self.OnLeftButtonDown()
            return
    
    
    
    
    
    class Graph_viewer3D_VTK(QMainWindow):
        def __init__(self, parent=None):
            super(Graph_viewer3D_VTK, self).__init__(parent)
            import platform
            if platform.system() == 'Darwin':
                self.facteurzoom = 1.05
            else:
                self.facteurzoom = 1.25
    
            self.parent=parent
    
    
            # self.scene = QGraphicsScene(self)
            # self.setScene(self.scene)
    
            self.frame = QFrame()
    
            self.vl = QVBoxLayout()
            self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
            self.vl.addWidget(self.vtkWidget)
    
            self.ren = vtk.vtkRenderer()
            self.ren.SetBackground(.1, .1, .1)
            self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
    
    
            self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
            style = MouseInteractorHighLightActor(self)
            style.SetDefaultRenderer(self.ren)
            self.iren.SetInteractorStyle(style)
    
    
            self.ren.ResetCamera()
    
            self.frame.setLayout(self.vl)
            self.setCentralWidget(self.frame)
            self.show()
            self.iren.Initialize()
            self.iren.Start()
    
            self.selected_cells = []
        #
    
        def set_center(self):
            self.ren.ResetCamera()
    
        def draw_Graph(self,):
            self.ren.RemoveAllViewProps()
    
            # Add spheres to play with
            for i in range(NUMBER_OF_SPHERES):
                source = vtk.vtkSphereSource()
    
                # random position and radius
                x = vtk.vtkMath.Random(-5, 5)
                y = vtk.vtkMath.Random(-5, 5)
                z = vtk.vtkMath.Random(-5, 5)
                radius = vtk.vtkMath.Random(.5, 1.0)
    
                source.SetRadius(radius)
                source.SetCenter(x, y, z)
                source.SetPhiResolution(11)
                source.SetThetaResolution(21)
    
                mapper = vtk.vtkPolyDataMapper()
                mapper.SetInputConnection(source.GetOutputPort())
                actor = vtk.vtkActor()
                actor.SetMapper(mapper)
    
                r = vtk.vtkMath.Random(.4, 1.0)
                g = vtk.vtkMath.Random(.4, 1.0)
                b = vtk.vtkMath.Random(.4, 1.0)
                actor.GetProperty().SetDiffuseColor(r, g, b)
                actor.GetProperty().SetDiffuse(.8)
                actor.GetProperty().SetSpecular(.5)
                actor.GetProperty().SetSpecularColor(1.0, 1.0, 1.0)
                actor.GetProperty().SetSpecularPower(30.0)
    
                self.ren.AddActor(actor)
    
    
            self.iren.GetRenderWindow().Render()
            self.set_center()
    
    class Window(QMainWindow):
        def __init__(self, parent=None):
            super(Window, self).__init__()
            self.centralWidget = QWidget()
            self.setCentralWidget(self.centralWidget)
    
            self.Graph_viewer = Graph_viewer3D_VTK(self)
            self.Graph_viewer.draw_Graph()
            layout = QVBoxLayout()
            layout.addWidget(self.Graph_viewer)
            self.centralWidget.setLayout(layout)
    
    
    def main():
        app = QApplication(sys.argv)
        app.setStyle('Windows')
        ex = Window(app)
        ex.setWindowTitle('Model micro GUI')
        # ex.showMaximized()
        ex.show()
        sys.exit(app.exec())
    
    
    if __name__ == '__main__':
        main()
    
    0 回复  |  直到 5 年前