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

VTK交互系统 1 交互模式入门

在VTK中,交互一般使用 命令/观察者模式来进行交互,即观察者等待命令,一旦有命令触发,就去执行该交互函数。

有两种实现模式:

1. 设置回调函数   2. 继承command类,然后实现内部函数

我们先看第一种方式。

我们看代码,首先定义一个回调函数,注意回调函数的函数签名,除了函数名以外其他部分例如返回值,参数列表都必须一样。

void MyCallbackFunc(vtkObject*, unsigned long eid, void* clientdata, void *calldata)
{
	std::cout << "aaaaaaaa " << std::endl;
}

然后在主函数里我们定义回调函数

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

最后再将回调函数命令对象添加到观察者列表中。

	interactor->SetRenderWindow(viewer->GetRenderWindow());
	interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);
// 这里的interactor的定义为 vtkSmartPointer<vtkRenderWindowInteractor> interactor

这样设置以后,我们点击vtk界面时就会在终端输出 "aaaaaaaa" 了

我们再看第二种方式:从vtkCommand类中派生出子类。

首先进行派生:

//第一步
class vtkMyCallback : public vtkCommand
{
public:
	static vtkMyCallback *New() 
	{ return new vtkMyCallback; }

	void someFunction(int a)
	{
		value = a;
	}
//就是打印一下这个value罢了,没别的用处
	virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
	{
		std::cout << "value = " << value << std::endl;
	}

private:
	int value;
};

为了看效果,在这里我们给里面进行了一个赋值:value,主要就是因为这里的参数是固定的,所以我们没有其他可以用来输出的东西了,就勉强输出一个value算了。

剩下的步骤和之前类似:

        //第二步
	vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();
	callback->someFunction(222);
	//第三步
	interactor->AddObserver(vtkCommand::LeftButtonPressEvent, callback);

点击屏幕区域,就会输出 "value = 222" 了。

相关文章:

  • VTK显示像素图
  • VTK交互系统 2 交互器样式
  • VTK交互系统 3 自定义交互器样式
  • VTK交互系统 4 自定义交互器样式2 键盘鼠标交互器设置
  • Qt多线程1
  • Qt多线程2
  • 基于QT的文件管理软件编写 系列 引言
  • 基于QT的文件管理软件编写 系列 1
  • python安装tensorflow
  • 机器学习之 Keras默认数据集/模型存放位置
  • 从零开始写出分而治之查找最大子列表的算法
  • 学机器学习必备的一些python句法基础 1 列表 元组 字典 条件语句
  • 学机器学习必备的一些python句法基础 2 循环
  • 学机器学习必备的一些python句法基础 3 函数 内建函数 模块 包 全局局部变量
  • 学机器学习必备的一些python句法基础 4 Python类和对象
  • php的引用
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Apache的80端口被占用以及访问时报错403
  • gcc介绍及安装
  • Git 使用集
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 多线程编程之:notify 和 wait 用法
  • js正则,这点儿就够用了
  • markdown编辑器简评
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • python学习笔记-类对象的信息
  • Swoft 源码剖析 - 代码自动更新机制
  • tab.js分享及浏览器兼容性问题汇总
  • vue-router 实现分析
  • Vue官网教程学习过程中值得记录的一些事情
  • 从PHP迁移至Golang - 基础篇
  • 技术胖1-4季视频复习— (看视频笔记)
  • 聊聊flink的BlobWriter
  • 前端知识点整理(待续)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 移动端唤起键盘时取消position:fixed定位
  • 智能合约Solidity教程-事件和日志(一)
  • hi-nginx-1.3.4编译安装
  • 昨天1024程序员节,我故意写了个死循环~
  • !!Dom4j 学习笔记
  • #if和#ifdef区别
  • $(selector).each()和$.each()的区别
  • (26)4.7 字符函数和字符串函数
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (三)终结任务
  • (四)模仿学习-完成后台管理页面查询
  • (算法设计与分析)第一章算法概述-习题
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)VC++中ondraw在什么时候调用的
  • .apk 成为历史!
  • .gitignore文件---让git自动忽略指定文件
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 连接数据库,通过数据库生成Modell