米米米米粒儿~ 2024-03-26 19:25 采纳率: 66.7%
浏览 35
已结题

python vtk窗口拾取点云坐标之后, 如何将坐标进行传递

采用重写vtkInteractorStyle拾取到了vtk窗口中的点云坐标,将这个坐标存储到了一个变量中,想将其传递给主函数进行进一步处理。目前尝试过用signal信号机制进行通信,以及直接将vtkInteractorStyle实例化,打点调用其中的变量,但均失败

    def area_fra_show(self):
        style = MyInteractor(self.vtk_widget.iren, self.vtk_widget.ren)
        style.SetDefaultRenderer(self.vtk_widget.ren)
        self.vtk_widget.iren.SetInteractorStyle(style)
        data = style.data #每次都显示为空
class MyInteractor(vtk.vtkInteractorStyleTrackballCamera):
    parameter_Signal = pyqtSignal(list)
    def __init__(self, iren, ren):
        self.iren = iren
        self.ren = ren
        self.pick_Actor = []
        self.data = []

    def run(self):
        self.AddObserver("RightButtonPressEvent", self.RightButtonPressEvent)
        self.AddObserver("MiddleButtonPressEvent", self.quit_pick) #按键盘任意键停止

    def quit_pick(self, obj, event):
        for i in self.pick_Actor:
            self.ren.RemoveActor(i)
        self.iren.RemoveObservers('RightButtonPressEvent') #终止选择


    def RightButtonPressEvent(self, obj, event):
        clickPos = self.iren.GetEventPosition()
        cellPicker = vtk.vtkPointPicker()
        self.iren.SetPicker(cellPicker)
        picker = self.iren.GetPicker()
        picker.Pick(clickPos[0], clickPos[1], 0, self.ren)
        point_position = picker.GetPickPosition()
        print(point_position)
        self.data.append(point_position)

  • 写回答

1条回答 默认 最新

  • 关注

    米米米米粒儿~ 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在 Python 中使用 VTK 进行窗口拾取点云坐标后,将其传递给主函数进行进一步处理的方法有多种。以下是两种常见的方法:

    1. 使用信号/槽机制:
    • 创建一个新的信号,并在 MyInteractor 类中的 RightButtonPressEvent 方法中发射该信号,将点云坐标作为参数传递给信号。
    • 在主函数中连接该信号到槽函数来处理接收到的坐标。
    from PyQt5.QtCore import QObject, pyqtSignal
    
    class MyInteractor(vtk.vtkInteractorStyleTrackballCamera):
    
        parameter_Signal = pyqtSignal(list)
    
        def RightButtonPressEvent(self, obj, event):
            # ...
            point_position = picker.GetPickPosition()
            self.parameter_Signal.emit(point_position)
    
    class MainApp(QObject):
        def __init__(self):
            super().__init__()
            self.interactor = vtk.vtkRenderWindowInteractor()
    
        def area_fra_show(self):
            style = MyInteractor(self.interactor, self.vtk_widget.ren)
            style.SetDefaultRenderer(self.vtk_widget.ren)
            self.interactor.SetInteractorStyle(style)
    
            style.parameter_Signal.connect(self.handle_coordinates)
    
        def handle_coordinates(self, coordinates):
            print(coordinates)
            # 进行进一步处理
    
    
    1. data 变量设置为全局变量:
    • data 变量声明为全局变量,在 RightButtonPressEvent 方法中直接对其进行操作。
    • 在主函数中访问全局变量 data 进行进一步处理。
    data = []  # 全局变量
    
    class MyInteractor(vtk.vtkInteractorStyleTrackballCamera):
        def RightButtonPressEvent(self, obj, event):
            global data  # 使用全局变量
            # ...
            point_position = picker.GetPickPosition()
            data.append(point_position)
    
    class MainApp(QObject):
        def __init__(self):
            super().__init__()
            self.interactor = vtk.vtkRenderWindowInteractor()
    
        def area_fra_show(self):
            style = MyInteractor(self.interactor, self.vtk_widget.ren)
            style.SetDefaultRenderer(self.vtk_widget.ren)
            self.interactor.SetInteractorStyle(style)
    
        def handle_coordinates(self):
            global data  # 使用全局变量
            print(data)
            # 进行进一步处理
    
    

    注意事项:

    • 无论使用哪种方法,需要确保 MyInteractor 类的实例是活动的,即持久存在。
    • 信号/槽机制需要确保 MainAppQObject 的子类,并且有一个活动的事件循环。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表