vtk数据交互的两种方式之回调函数、vtkCommand

2023-11-04

参考博客:VTK交互之vtkCommand_阿兵-AI医疗的博客-CSDN博客_vtkcommand

一、观察者/命令模式

VTK中用的较多的设计模式是:观察者/命令模式(Observer/Command)。

要实现数据交互,主要基于观察者/命令模式,可以通过两种方式来实现:一种是回调函数;另外一种是从vtkCommand中派生出子类。两者基本类似,通过AddObserver监视事件,然后调用事件回调函数或者在vtkCommand::Execute()中实现功能。

二、事件回调函数

1、AddObserver中对某个事件添加观察者到VTK中,当这个事件一旦被触发,就会自动调用回调函数或者执行相关操作

unsigned long AddObserver(unsigned long event, vtkCommand *,  float priority = 0.0f);
unsigned long AddObserver(const char* event, vtkCommand *, float priority = 0.0f);

2、vtk中使用回调函数执行步骤主要是以下三步:

(1)定义回调函数(如下的fun函数)

void func(vtkObject* obj, unsigned long eid, void* clientdata, void* calldata)
  • obj是调用事件的对象(即调用AddObserver()函数的主题对象,例如interactor);
  • eid为所要监听的事件ID,VTK中的事件定义在vtkCommand.h文件中;
  • clientdata是与vtkCalbackCommand实例相关的数据。简单说,是指回调函数里需要访问主程序里的数据时,由主程序向回调函数传递的数据,可以通过vtkCallbackCommand::SetClientData()函数设置。
  • calldata是执行vtkObject::InvokeEvent()函数时,随着回调函数发送的数据,比如当调用ProgressEvent事件时,会自动发送当前的进度值作为calldata。
     

(2)创建一个vtkCallbackCommand对象,并调用vtkCallbackCommand::SetCallback()函数设置所定义的回调函数。

vtkSmartPointer<vtkCallbackCommand> mouseCallback = vtkSmartPointer<vtkCallbackCommand>::New();
mouseCallback->SetCallback(MyCallbackFunc);

 (3)将vtkCallbackCommand对象添加到对象的观察者列表中

interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);

vtkRenderWindowInteractor提供了一种独立于平台的交互机制,用来响应不同平台的鼠标、按键和时钟等消息。如当vtkRenderWindowInteractor来监听鼠标左键按下消息,一旦监听到对象的观察者列表中的消息时,程序就会自动调用事件的回调函数。

三、vtkCommand子类

实现vtkCommand子类同样也需要以下三个步骤:
1、从vtkCommand派生出子类,并实现vtkCommand::Execute()函数,该函数原型是

virtual void Exeute(vtkObject* caller, unsigned long eventId, void* callData) = 0;

Execute()是纯虚函数,所以从vtkCommand派生的类都必须实现这个方法。

2、在主程序中实例化一个vtkCommand子类的对象以及调用相关的方法。

3、调用AddObserver()函数监听感兴趣的事件。

补充:

除了基于的观察者/命令模式外,还有一种方式交互器样式,来实现,在VTK程序中,当实例化交互器样式vtkRenderWindowInteractor对象时,程序运行时会根据具体的平台实例化对应的子类来响应窗口消息,VTK内部通过vtkObject::InvokeEvent()函数将平台相关的消息翻译成VTK事件,最后再分发给不同的观察者,而观察者则调用回调函数vtkInteractorStyle::ProcessEvents()具体来处理这些VTK事件,因此,也可以从vtkInteractorStyle或其子类中派生出子类,在所派生的子类里定制这些VTK事件的处理过程,实现所需的交互。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vtk数据交互的两种方式之回调函数、vtkCommand 的相关文章

  • UE4材质11_材质参数集

    11 1 参数集全局控制材质 创建材质参数集 MPC 材质参数集的前缀 材质参数集可以添加标量和向量 标量一般就是数字 向量就是颜色或者是X Y Z 一个材质最多只能使用两个材质参数集 11 2 蓝图传递参数集及实例参数 打开关卡蓝图 添加
  • 高级应用:内部类的设计模式与内部类与外部类之间的交互

    1 内部类与外部类之间的交互 内部类与外部类之间可以相互访问对方的私有成员 这为程序设计提供了更大的灵活性和可扩展性 public class Outer private int outerVar public Outer int oute
  • mavonEditor中的图片上传与删除(前后端交互)

    我设置的存储图片服务器的地址 D Program Files apache tomcat 9 0 43 webapps ROOT newsimg 1 图片上传 1 1 前端 文本上传图片事件处理函数 imgAdd pos file var
  • 分享一个可交互的小场景(二)

    先看效果 可互动的小场景 再看代码 JS部分
  • win10环境下PCL安装和配置回顾(一)

    2020年博主有写过几篇关于PCL的博客 这边想先回顾下 再增加点新内容 之前写的博客专栏如下链接 https blog csdn net jiugeshao category 11993239 html spm 1001 2014 300
  • 唯一标识一台计算机解决方法:

    首先 网上介绍最多的方法就是cpu baseboard等硬件设备的序列号 但是 这两种获取方法都有问题 wmic cpu get processorid获取的cpu序列号 其实只是某个系列的代号 并不是唯一的 比如 12代i9都用的是一个C
  • mingw qt5.14.2 编译 vtk9.1.0

    1 软件 qt版本 qt opensource windows x86 5 14 2 exe 安装mingw选项 cmake版本 cmake 3 21 2 windows x86 64 msi VTK源码版本 VTK 9 1 0 tar g
  • 如何在 vtkStructuredGrid 上设置数据值

    我正在尝试用分析字段填充结构化网格 但是尽管阅读了 vtk 文档 我还没有找到如何在网格点实际设置标量值或设置网格的间距 原点信息 从下面的代码开始 我该如何 将空间信息与网格相关联 即单元格 0 0 0 位于坐标 0 0 0 每个方向的间
  • 使用 pip 安装 VTK

    我在 Arch Linux 上使用 Python 3 7 我一直在尝试用 pip 安装 Mayavi 但在安装 vtk 时总是失败 所以我发现即使尝试通过 pip 自行安装 vtk 应该有效 那个vtk确实没有安装 我收到此错误 sudo
  • vtkOBJReader 将 OBJ 作为单独的 vtkPolyData 对象导入

    我的目的是获得 vtkPolyData 通过 vtk OBJ 导入实现理想的颜色 纹理 传递给 k3d 查看器使用 k3d vtk poly data
  • Axure之中继器的使用(交互&动作&reperter属性&Item属性)

    目录 一 中继器的基本使用 二 中继器的动作 增删改查 2 1 新增 2 2 删除 2 3 更新行 2 4 效果展示 2 5 模糊查询 三 reperter属性 在Axure中 中继器 Repeater 是一种功能强大的组件 用于 创建重复
  • 在python中使用VTK找到3D空间中两个圆柱体的交集

    在 python 中使用 VTK 我编写了一些代码来为我想要的对象创建一个 actor 例如对于气缸 def cylinder object startPoint endPoint radius my color DarkRed USER
  • 未找到 vtkRenderer/ vtkRenderWindow 的覆盖

    我是 vtk 的新手 当我运行一个小示例时 它会生成两个错误 找不到 vtkRenderer 的覆盖 找不到 vtkRenderWindow 的覆盖 我用谷歌搜索了这个问题 但找不到合适的解决方案 当我尝试在没有 CMake 的情况下创建
  • 来自主线程的 VTK 窗口线程,C++

    我刚刚学习 VTK 和 C GUI 编程 希望有一个简单的问题 主应用程序在应用程序中的某个时刻启动渲染的窗口 希望在显示 VTK 窗口时主线程能够继续 是否有特定的方法可以将 VTK 窗口作为线程启动 我的环境是 Linux 可以使用 b
  • vtk中顶点和点的区别

    顶点和点之间的主要区别是什么VTK http www vtk org 好吧 我正在将一些计算点分配给vtkPolyData http www vtk org doc nightly html classvtkPolyData html ou
  • VTKCamera焦点和位置的差异

    我正在使用 vtkCamera 并尝试移动它并使其看起来在某个点 例如 如果我想把相机放在 x y z 并让它看看 0 0 0 例如 使用 openGL 中的 gluLookAt 我们会将眼睛坐标设置为 x y z 和中心坐标 0 0 0
  • 我是否缺少在 Ubuntu 9.04 上使用 Python2.6 绑定构建/安装 VTK-5.4 的步骤?

    我使用源代码的 Python 绑定成功构建并安装了 VTK 5 4 然而 当我尝试在 python 中导入 VTK 时 它给出了以下回溯错误 文件 第 1 行 位于 文件 usr local lib python2 6 dist packa
  • 在 Python 中保存 VTK 中的数据数组

    Question 如何从 Python 中的 VTK 中提取数据集数组并将其保存在新文件中 e g 对于具有幅度数据集的 VTKforce 移位 and current仅提取移位并将其保存在较小的文件中 Problem 我在远程服务器上有数
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • python 3+ 的缓冲函数

    我试图使用 vtk show 打开一个 vtk 窗口 但是每次我这样做时 我的 Ipython 控制台都会崩溃 显然这是因为 Ipython 无法显示外部窗口 而这正是 vtk show 所做的 我在谷歌上搜索了一个解决方案 但它是为 py

随机推荐

  • 网络安全技术(刘化君)第一章课后答案

    补充第七题答案 近年来 网络安全攻击事件层出不穷 以下是一些常见的网络安全攻击事件及其攻击手段 勒索软件攻击 勒索软件通过加密用户数据或控制用户设备来勒索赎金 攻击手段主要包括利用漏洞入侵 网络钓鱼 邮件附件等方式传播勒索软件 并利用加密技
  • Android “adb”不是内部或外部命令,也不是可运行的程序或批处理文件

    在Android Studio app真机测试中adb可以轻松找到安卓设备 ADB全称Android Debug Bridge 用于Android设备进行交互 也可以这样理解ADB是Android Studio连接安卓设备之间的一个桥梁或者
  • [1154]如何将字符串转换为datetime

    usr bin env python coding utf 8 import datetime import time 日期时间字符串 st 2017 11 23 16 10 10 当前日期时间 dt datetime datetime n
  • Unity踩坑 - 自定义动画事件Animator事件帧设置后不触发的情况

    动画设置 选择动画窗口并且设置事件 拖动到自己想要触发的位置 具体调整可以打开动画窗口 选择对应的Clip进行逐帧控制 设置事件 在这里写要触发的函数的名称 1 函数权限必须是Public的 2 大小写敏感 并且前后不能有空格 3 触发动画
  • Django REST framework中的序列化Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型 然后可以将它们轻松地呈现为 JSON XML 或其他内容类型 序列化器还提供反序列化 在首次验证传入数据之后 可以将解析的数据转换回复杂类型 简单来说 服务
  • 性能测试的指标

    性能测试的常见指标有 响应时间 并发数 吞吐量 点击数 错误率和资源利用率 一 响应时间 指的是用户从客户端发起一个请求开始 到客户端接收到从服务器端返回的结果 整个过程所耗费的时间 不包括前端页面的处理时间和渲染时间 这也是客户最能只管感
  • 蓝桥杯第七届模拟风扇

    一 初始化系统 首先将系统初始化 关闭蜂鸣器继电器 include STC15 h define uchar unsigned char define uint unsigned int void InitHC138 uchar n swi
  • 求两个正整数的最大公约数Python版

    求两个数的最大公约数我分别采用辗转相除法 辗转相减法 枚举法来求得 最小公倍数就是两个数之积除以最大公约数的结果 1 辗转相除法 思路 1 将两整数求余 a b x 2 如果x 0 则b为最大公约数 3 如果x 0 则 a b b x 继续
  • L298N驱动4个电机驱动小车

    程序代码下载地址 L298N驱动小车 L298N硬件说明 电源 驱动电源 12V 5V电压输出为单片机供电 GND 输出连接电机 OUT0 OUT2 通道A OUT3 OUT4 通道B 与单片机接口 通道A B使能 ENA ENB 逻辑输入
  • Vue3 的新特性

    Vue3 0的进度 7月18号 尤弟宣布首个 Vue 3 RC 发布 RC 即预发布版 这意味着 Vue3 内核的 API 和实现已到达稳定状态 在最终版本发布前 不会提出新功能或者做重大更改 看来距离 Vue3 0 正式版与我们见面已经不
  • 【 华为OD机试 2023】最多颜色的车辆(C++ Java JavaScript Python 100%)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 代码思路 C JavaScript Java Python 题目描述 在一个狭小的路口 每秒只能通过一辆车 假设车辆的颜色只有 3 种 找出 N 秒内经过的最多颜色的车辆数量 三种颜色
  • Java应用CPU占用过高故障排除

    一 背景 最近测试反馈测试环境接口偶现有访问超时 然后APP提示是网络失败 看了一下测试环境的应用完全没啥问题 一直以为是网络问题 今天测试有反馈了 赶紧看了一下测试服务器 这次终于有症状了 CPU直接飙到300 了 尽然问题复现了 直接开
  • uboot内存操作命令

    uboot内存操作命令命令用于直接对DRAM进行读写操作 常用命令有md nm mm mw cp cmp 1 md 命令格式 md b w l address of objects b w l 分别代表byte 1Byte word 2By
  • java和python二进制文件不能直接读取的解决方案

    前一阵在做一个项目时 会用到java和python 上下游的关系 java写 python读 但是发现两者的二进制文件无法直接读取 后来发现是由于编码的原因 比如在写入int时 一个是从左到右开始编码 一个是从右到左 所以无法直接读取 因此
  • opengl读取网格数据绘制三维物体_交互式三维绘图库(WxGL)速览

    WxGL是一个基于PyOpenGL的三维数据可视化库 以wx为显示后端 提供Matplotlib风格的交互式应用模式 同时 也可以和wxPython无缝结合 在wx的窗体上绘制三维模型 WxGL提供了一套简洁易用 对用户友好的API 将Op
  • 大龄失业超过半年,人生一劫,如何过关?

    在倒闭潮 裁员潮不断侵袭之下 如今的职场主打的就是一个惨烈 前一阵 38岁985硕士失业几个月被迫送外卖 的新闻 曾引起了不小的震动 同样也引起了很多人的共鸣 今天就来聊聊职场上的恐怖故事 如果将大龄 失业 超过半年这三个关键信息组合在一起
  • python使用openpyxl读取excel文件里的超链接文字与URL

    可以使用openpyxl这个库 pip install openpyxl 读取URL的示例代码 import openpyxl wb openpyxl load workbook data 文件 xlsx 读取文件 main sheet w
  • 秒杀多线程第二篇 原子操作 Interlocked系列函数

    秒杀多线程第二篇 原子操作 Interlocked系列函数 上一篇 CreateThread与 beginthreadex本质区别 中讲到一个多线程报数功能 为了描述方便和代码简洁起见 我们可以只输出最后的报数结果来观察程序是否运行出错 这
  • 在socket中使用域名

    客户端中直接使用IP地址会有很大的弊端 一旦IP地址变化 IP地址会经常变动 客户端软件就会出现错误 而使用域名会方便很多 注册后的域名只要每年续费就永远属于自己的 更换IP地址时修改域名解析即可 不会影响软件的正常使用 关于域名注册 域名
  • vtk数据交互的两种方式之回调函数、vtkCommand

    参考博客 VTK交互之vtkCommand 阿兵 AI医疗的博客 CSDN博客 vtkcommand 一 观察者 命令模式 VTK中用的较多的设计模式是 观察者 命令模式 Observer Command 要实现数据交互 主要基于观察者 命