VTK学习记录9-Observer/command设计模式
时间:2021-07-17
本文章向大家介绍VTK学习记录9-Observer/command设计模式,主要包括VTK学习记录9-Observer/command设计模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
用New()创建的,最后记得要用delete释放掉,不然时间久了会内容泄露。不用现在基本用智能指针了,那就另说了。
Observer模式:是一种行为模式,这一模式主要针对两个对象:Object和Observer。
一个Object可以有多个Observer,它定义对象间的一种一对多的依赖关系。
当一个Object的状态发生改变时,所有依赖于它的Observer对象都得到通知并被自动更新。
Command模式:属于对象行为模式,Command模式将一个请求封装成一个对象,并提供一致性请求的接口。
事件调用者只是和接口打交道。不和具体实现交互。
-------------------------------------------------------------------------------------------------------------------------
vtkObject通过注册感兴趣的事件把Command和事件联系在一起,然后编写回调函数响应事件的发生。
比如vtkRenderer当消息StartEvent发生时,开始对数据进行渲染,而当消息EndEvent发生时停止渲染。
任意一个vtkObject的实例可以通过调用AddObserver()方法来添加对事件的观察。
只需将事件的id和自定义的回调函数进行关联,VTK就能方便地实现消息处理。
代码:
1 //tips:如果不是用cmake编译,而是用vs编译的,需要加这三行。 2 #include "vtkAutoInit.h" 3 VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 4 VTK_MODULE_INIT(vtkInteractionStyle); 5 6 #include <vtkConeSource.h> 7 #include <vtkRenderer.h> 8 #include <vtkPolyDataMapper.h> 9 #include <vtkRenderWindow.h> 10 #include <vtkActor.h> 11 #include <vtkCamera.h> 12 #include <vtkRenderWindowInteractor.h> 13 #include <vtkCommand.h> 14 #include <vtkProperty.h> 15 16 class vtkMyCallback : public vtkCommand //打印相机位置 17 { 18 public: 19 static vtkMyCallback *New() 20 { 21 return new vtkMyCallback; 22 } 23 virtual void Execute(vtkObject *caller, unsigned long, void*) 24 { 25 vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller); 26 cout << renderer->GetActiveCamera()->GetPosition()[0] << " " 27 << renderer->GetActiveCamera()->GetPosition()[1] << " " 28 << renderer->GetActiveCamera()->GetPosition()[2] << "\n"; 29 } 30 }; 31 class vtkMyCallback2 : public vtkCommand //点击p拾取变红色 32 { 33 public: 34 static vtkMyCallback2 *New() 35 { 36 return new vtkMyCallback2; 37 } 38 virtual void Execute(vtkObject *caller, unsigned long eventID, void * callData) 39 {//以下是自定义内容,上面几行是固有写法? 40 vtkActor *actor2 = reinterpret_cast<vtkActor*>(caller); 41 actor2->GetProperty()->SetColor(1.0, 0.0, 0.0); //设置actor颜色为红色 42 } 43 44 }; 45 int main() 46 { 47 vtkConeSource *cone = vtkConeSource::New(); 48 cone->SetResolution(8); 49 cone->SetHeight(5); 50 cone->SetRadius(2); 51 52 vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); 53 coneMapper->SetInputData(cone->GetOutput()); 54 coneMapper->SetInputConnection(cone->GetOutputPort()); 55 56 vtkActor *vtkactor = vtkActor::New(); 57 vtkactor->SetMapper(coneMapper); 58 //加入自定义回调函数2,点击变红 59 vtkMyCallback2 *mol2 = vtkMyCallback2::New(); 60 vtkactor->AddObserver(vtkCommand::PickEvent, mol2); 61 mol2->Delete(); //这里一旦监听到拾取动作,就调用回调函数2,触发自定义的内容(即变红色) 62 63 vtkRenderer *render = vtkRenderer::New(); 64 render->AddActor(vtkactor); 65 render->SetBackground(0.1, 0.2, 0.3); 66 67 //加入自己写的回调函数 68 vtkMyCallback *mol = vtkMyCallback::New(); 69 render->AddObserver(vtkCommand::StartEvent, mol); 70 71 72 vtkRenderWindow *window = vtkRenderWindow::New(); 73 window->SetSize(500, 500); 74 window->AddRenderer(render); 75 76 vtkRenderWindowInteractor *inter = vtkRenderWindowInteractor::New(); 77 inter->SetRenderWindow(window); 78 79 window->Render(); 80 81 inter->Initialize(); 82 inter->Start(); 83 84 //释放掉,其他的懒得写了。自己添加吧 85 cone->Delete(); 86 coneMapper->Delete(); 87 vtkactor->Delete(); 88 render->Delete(); 89 window->Delete(); 90 return 0; 91 }
效果图:
原文地址:https://www.cnblogs.com/beautifulmoonlight/p/15024150.html
- Enterprise Library Policy Injection Application Block 之四:如何控制CallHandler的执行顺序
- 人工智能时代的艺术
- asp.net生成静态页
- Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成
- 照虎画猫写自己的Spring
- 照虎画猫写自己的Spring
- mybatis 框架实战,实现数据库的增删改查
- CodeSmith 创建Ado.Net自定义模版(一)
- CodeSmith 创建Ado.Net自定义模版(二)
- 一文读懂卷积神经网络CNN
- NVIDIA张建中:自主学习芯片,推动人工智能发展
- CodeSmith 创建Ado.Net自定义模版(三)
- Android注解学习(2)
- Android注解学习(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windwos10下使用VS2017搭建cocos2d-x 4.0开发环境
- JavaScript 中的函数式编程:函数,组合和柯里化
- 如何设置一个生产级别的高可用etcd集群
- NVIDIA Jetson nano可以处理4K相机吗?来验证编码性能吧(中)
- House Of Lore原理学习
- 使用 rush 进行命令并行处理
- 老生常谈 Spring Aop 日志收集与处理做的工具包,贼好用?
- Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
- Go by Example 中文版: 行过滤器
- Elasticsearch重要知识点 | 选举流程详解
- 妹妹问我:Dubbo集群容错负载均衡
- 系统内核溢出提权
- 201312-3 最大的矩形(Python)
- Kafka组消费之Rebalance机制
- Spring:没有人比我更懂Java对象的创建!