当前位置: 首页 > news >正文

VTK笔记- 3D Widget类 vtkSplineWidget 样条部件

vtk3DWidget

  vtk3DWidget是用于3D交互观察器的基类,也就是各种3D小部件类的基类,主要是在三维渲染场景中生成一个可以用于控制数据的可视化实体,比如点,线段(曲线)、平面、球体、包围盒(线框)等

 这些3D小部件在场景中表示它们自己,并且具有与它们相关联的特殊回调,允许对小部件进行交互式操作。特别是,vtk3DWidget与其抽象超类vtkInteractorObserver之间的区别在于vtk3DWidget被“放置”在3D空间中。vtkInteractorObservers 不知道它们放在哪里,也可能根本不存在于3D空间中。3D小部件还提供辅助功能,如生成转换、创建polydata(用于播种流线、探测等)或创建隐式函数
 

part2: vtkSplineWidget

vtkSplineWidget是拟合样条的显示部件,可以当作曲线长度测量工具。也可以用于标注;

牙弓曲线我们用到了vtkSplineWidget,曲面提取用到了vtkProbeFilter.在这个功能中主要是根据牙弓线的位置,获取线上的点,
然后按照z轴的方向,按照原图像的z轴上的spacing,创建平面,最后用vtkProbeFilter去切源数据。获得的数据是一个曲面,
为了更好的观看,我们还要进行展平。所以我们需要创建一个imagedata.至此,我们就可以获得CPR。
 
  

Part3: code

import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5 import QtWidgets


class VTKSplineWidgetDemo(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(VTKSplineWidgetDemo, self).__init__(parent)

        # 设置主窗口
        self.setWindowTitle("PyQt + VTK SplineWidget Example")
        self.resize(800, 600)

        # 创建 VTK 渲染窗口
        self.vtk_widget = QVTKRenderWindowInteractor(self)
        self.setCentralWidget(self.vtk_widget)

        # 初始化 VTK 渲染器和窗口
        self.renderer = vtk.vtkRenderer()
        self.vtk_widget.GetRenderWindow().AddRenderer(self.renderer)

        # 创建 vtkSplineWidget
        self.spline_widget = vtk.vtkSplineWidget()
        self.spline_widget.SetInteractor(self.vtk_widget.GetRenderWindow().GetInteractor())
        self.spline_widget.SetCurrentRenderer(self.renderer)
        self.spline_widget.On()  # 启用 SplineWidget

        # 设置回调函数以获取样条曲线
        self.spline_widget.AddObserver("InteractionEvent", self.on_spline_interaction)

        # 设置背景颜色并启动
        self.renderer.SetBackground(0.2, 0.3, 0.4)
        self.vtk_widget.Initialize()
        self.vtk_widget.Start()

    def on_spline_interaction(self, obj, event):
        """当用户交互时更新样条曲线"""
        # 获取样条曲线的点
        points = obj.GetNumberOfHandles()
        if points > 0:
            print("Spline Points:")
            for i in range(points):
                handle = obj.GetHandlePosition(i)
                print(f"Handle {i}: {handle}")

        # 获取样条曲线的 PolyData
        spline_poly_data = obj.GetPolyData()
        if spline_poly_data:
            self.visualize_spline(spline_poly_data)

    def visualize_spline(self, poly_data):
        """将样条曲线可视化"""
        # 清除之前的样条曲线 Actor
        self.renderer.RemoveAllViewProps()

        # 创建映射器和 Actor
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputData(poly_data)

        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetColor(1, 0, 0)  # 设置样条曲线颜色为红色
        actor.GetProperty().SetLineWidth(2)

        # 将样条曲线 Actor 添加到渲染器
        self.renderer.AddActor(actor)
        self.vtk_widget.GetRenderWindow().Render()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = VTKSplineWidgetDemo()
    window.show()
    app.exec_()

相关文章:

  • Hadoop项目中的问题(1)——NetworkManager 和 network 服务冲突
  • mysql经典试题共34题
  • fastjson漏洞#不出网#原理#流量特征
  • CD10.【C++ Dev】类和对象(1)
  • 用户仿真任务调度管理平台数据库设计
  • 使用Qt调用HslCommunication(C++调用C#库)
  • 微服务拆分-远程调用
  • 电子学会—2024年12月青少年软件编程(图形化)级等级考试真题——猜年龄互动小游戏
  • Linux之Web控制台管理系统命令终端管理系统(保姆级)
  • 精选一百道题备赛蓝桥杯 —— 1.子串简写
  • 【AI】Deepseek本地部署探索,尝试联网搜索
  • 碰撞率降低57.4%!VLM-AD显著提升自动驾驶规划准确性,无需VLM实时推理
  • 使用 Docker 构建不同 Node 环境下的 Hexo 调试环境
  • 推荐一个好用的在线文本对比网站 - diffchecker
  • 【新手指南】pyqt可视化远程部署deepseek7B蒸馏版模型
  • 测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试
  • HTTPS加密原理详解
  • 江协科技/江科大-51单片机入门教程——P[4-1] 静态数码管显示 P[4-2] 动态数码管显示
  • Dify 本地部署教程
  • 框架基本知识总结 Day16
  • 国家统计局:4月份居民消费价格同比下降0.1%
  • 巴基斯坦对印度发起网络攻击,致其约70%电网瘫痪
  • 道指跌逾100点,特斯拉涨近5%
  • 央行设立服务消费与养老再贷款,额度5000亿元
  • 四川资阳市原市长王善平被双开,“笃信风水,大搞迷信活动”
  • 红场阅兵即将开始!中国人民解放军仪仗队亮相