前言

看了东灵出版的书的第八章,有点迷糊,这里简单做些笔记。

正文

观察者/命令模式(Observer / Command)

目的: 实现VTK的交互功能

定义: 一个vtkObject (包括它的子类) 可以拥有多个 Observer。  就是观察者在对象的状态发生改变时,调用相应的函数或者说是执行预定的动作。

实现

  • 事件回调函数
示例
//第一步,定义回调函数。注意回调函数的签名,不能更改。
void CallbackFunc(vtkObject*, unsigned long eid, void* clientdata, void *calldata)
{std::cout<<" ZYH "<<std::endl;
}
//第二步,将回调函数和 vtkCallbackCommand 联系起来
vtkSmartPointer<vtkCallbackCommand> mouseCallback = vtkSmartPointer<vtkCallbackCommand>::New();
mouseCallback->SetCallback ( CallbackFunc );//第三步,将vtkCallbackCommand对象添加到观察者列表。
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);

步骤就是上面所示的三步,需要注意的是:

① 灰调函数除了函数名可以自己重新定义,其他的是固定格式的
void func(vtkObject *obj, unsigned long eid, void *clientdata, void *calldata)

② AddObserver函数是将事件、回调函数、VTK对象联系在一起
  • 从vtkCommand派生出具体的子类
command的子类,绑定到vtk对应的事件中,即可实现观察者模式的消息响应机制 
示例  (种子点)
步骤一:
派生子类, 实现vtkCommand::Execute()
class vtkSeedCallback : public vtkCommand
{
public:static vtkSeedCallback *New(){ return new vtkSeedCallback; }vtkSeedCallback() {}//继承函数,实现回调时的响应操作,第一个参数是调用该事件的对象,第二个参数树消息类型,第三个参数为可以传递给 command 的参数  virtual void Execute(vtkObject*, unsigned long event, void *calldata){if (event == vtkCommand::PlacePointEvent){std::cout << "Placing point..." << std::endl;std::cout << "There are now " << this->SeedRepresentation->GetNumberOfSeeds() << " seeds." << std::endl;for(unsigned int seedId = 0; seedId < this->SeedRepresentation->GetNumberOfSeeds(); seedId++){double pos[3];this->SeedRepresentation->GetSeedDisplayPosition(seedId, pos);std::cout << "Seed " << seedId << " : (" << pos[0] << " " << pos[1] << " " << pos[2] << ")" << std::endl;}return;}if (event == vtkCommand::InteractionEvent){std::cout << "Interaction..." << std::endl;if (calldata){double pos[3];this->SeedRepresentation->GetSeedDisplayPosition(0, pos);std::cout << "Moved to (" << pos[0] << " " << pos[1] << " " << pos[2] << ")" << std::endl;}return;}}void SetRepresentation(vtkSmartPointer<vtkSeedRepresentation> rep){this->SeedRepresentation = rep;}void SetWidget(vtkSmartPointer<vtkSeedWidget> widget) {this->SeedWidget = widget;}private:vtkSeedRepresentation* SeedRepresentation;vtkSeedWidget* SeedWidget;
};

实现种子点的交互【个人觉得这个InteractorEvent这个有点麻烦,只要focus到这个窗口也响应,移动种子点也响应】

需要注意的是种子点的坐标是窗口坐标。
程序需要实现的功能一般都在 Execute() 函数中。
步骤二:
在主程序中实例化一个子类对象以及调用相关的方法
    // Create the representation  设置点的颜色vtkSmartPointer<vtkPointHandleRepresentation2D> handle = vtkSmartPointer<vtkPointHandleRepresentation2D>::New();handle->GetProperty()->SetColor(1,0,0);vtkSmartPointer<vtkSeedRepresentation> rep = vtkSmartPointer<vtkSeedRepresentation>::New();rep->SetHandleRepresentation(handle);// Seed widgetvtkSmartPointer<vtkSeedWidget> seedWidget = vtkSmartPointer<vtkSeedWidget>::New();seedWidget->SetInteractor(renderWindowInteractor);seedWidget->SetRepresentation(rep);<strong>vtkSmartPointer<vtkSeedCallback> seedCallback = vtkSmartPointer<vtkSeedCallback>::New();</strong>seedCallback->SetRepresentation(rep);seedCallback->SetWidget(seedWidget);seedWidget->AddObserver(vtkCommand::PlacePointEvent,seedCallback);seedWidget->AddObserver(vtkCommand::InteractionEvent,seedCallback);renderWindow->Render();renderWindowInteractor->Initialize();renderWindow->Render();seedWidget->On();

AddObserver 监听感兴趣的事件

这个示例是VTK官网上的示例,参见。

VTK中oberver 和 command 的信息机制详解相关推荐

  1. java中的CAS操作以及锁机制详解

    关于CAS操作 CAS:Compare And Swap   --  乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...

  2. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  3. OSPF中DR选举机制详解

    OSPF中DR选举机制详解--对于这方面不太清楚的可以看看附件 转载于:https://blog.51cto.com/gauyanm/226882

  4. Hadoop中RPC机制详解之Server端

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop 中 RPC 机制详解之 Client 端 1. Server.Listener RPC Client 端的 RP ...

  5. Java虚拟机中类加载机制详解

    Java虚拟机中类加载机制详解 1,什么是java类加载机制 **首先在java中,是通过编译来生成.class文件(可能在本地,或者网页下载),java的类加载机制就是 将这些.class文件加载到 ...

  6. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  7. 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...

  8. JAVA之JVM垃圾回收(GC)机制详解

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

  9. java 深拷贝_java 深拷贝与浅拷贝机制详解

    java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...

最新文章

  1. iOS APP提交上架流程
  2. 杭电1010java实现dfs
  3. 东方希望上云 告诉你数字化门槛儿到底有多高?
  4. linux编译安装含义,linux源码包编译安装详解
  5. [面试] 算法(七)—— 逆序输出链表
  6. Android Camera之SurfaceView学习
  7. Linux环形工作队列KFIFO的使用说明
  8. Affinity Designer 查询面板渐变颜色
  9. yii2 中 controller 向layout 传值
  10. OFFICE2003的自动保存功能。
  11. 模仿LordPE写了个PE解析工具
  12. 请问苹果x是如何建文件夹_教你12个技巧,最全苹果X使用教程。
  13. dwc3_gadget_init分析
  14. 瑞科生物港交所上市:市值121亿港元 9个月期内亏损5.2亿
  15. #loj3090 [BJOI2019] 勘破神机
  16. html5脑图_使用HTML5技术绘制思维导图
  17. 初学Python必备的软件你知道吗?
  18. BLE传输速率以及抓包工具
  19. 云计算大数据学习中心作业2
  20. EditPlus中文版下载

热门文章

  1. 背景的渐变/vatical的专题解析/cs元素的显示与隐藏-学习笔记
  2. 关于三星Galaxy S8最好的(和最坏的)事情
  3. 应用计算机测定电阻伏安特性实验,电路元件伏安特性测量实验报告答案.doc
  4. html中写页边距,html整体页面边距怎么设置
  5. nm命令 查看符号文件
  6. 2018年实现营收79.17亿元,科大讯飞能否决胜于人工智能时代?
  7. java平均分排序_编写java程序,输入10个成绩,计算最高分,最低分,平均分,并按从小到大排序,最后统计高于平均分的人有多少?...
  8. Vue3 组件示例工程(二) —— AQI组件
  9. uniapp css实现轮播图片逐渐放大效果
  10. dell服务器硬件检测cable,DELL服务器硬件报错解决方法——错误代码寄解决和处理办法...