3DSlicer31:结构的实例分析IGSReader
1.qSlicerIGSReaderModule.h
#ifndef __qSlicerIGSReaderModule_h #define __qSlicerIGSReaderModule_h// SlicerQt includes #include "qSlicerLoadableModule.h" //模板类#include "qSlicerIGSReaderModuleExport.h" //捕获Unix和Windows操作系统之间的差异class qSlicerIGSReaderModulePrivate; //声明了一个类,但是该类没有在头文件中定义/// \ingroup Slicer_QtModules_ExtensionTemplate class Q_SLICER_QTMODULES_IGSREADER_EXPORT qSlicerIGSReaderModule: public qSlicerLoadableModule {Q_OBJECT #ifdef Slicer_HAVE_QT5Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0"); #endifQ_INTERFACES(qSlicerLoadableModule);public:typedef qSlicerLoadableModule Superclass;//类型重定义 方便使用explicit qSlicerIGSReaderModule(QObject *parent=0); //显式的构造函数virtual ~qSlicerIGSReaderModule();qSlicerGetTitleMacro(QTMODULE_TITLE);virtual QString helpText()const;virtual QString acknowledgementText()const;virtual QStringList contributors()const;virtual QIcon icon()const;virtual QStringList categories()const;virtual QStringList dependencies() const;protected:/// 初始化模块,实现三维数据读/写功能virtual void setup();/// 创建并返回与此模块相关的窗体表示virtual qSlicerAbstractModuleRepresentation * createWidgetRepresentation();/// 创建并返回与此模块相关的逻辑连接 virtual vtkMRMLAbstractLogic* createLogic(); protected:QScopedPointer<qSlicerIGSReaderModulePrivate> d_ptr;private:Q_DECLARE_PRIVATE(qSlicerIGSReaderModule);Q_DISABLE_COPY(qSlicerIGSReaderModule);};#endif
Notice:1.explicit qSlicerIGSReaderModule(QObject *parent=0);explicit约束构造函数进行显式转换,避免默认的隐式转换,提高代码可理解性。http://blog.csdn.net/shenziheng1/article/details/780268832.class Q_SLICER_QTMODULES_IGSREADER_EXPORT qSlicerIGSReaderModule : public qSlicerLoadableModule {};起初看到这样定义类有点懵,我们可以查看Q_SLICER_QTMODULES_IGSREADER_EXPORT ("qSlicerIGSReaderModuleExport.h"头文件中),有如下代码:#if defined(qSlicerIGSReaderModule_EXPORTS)#define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllexport ) #else#define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllimport )
通过这一行我们可以了解到,其实就是定义了一个宏,该宏的作用是提供给外部应用程序或DLL使用,有点像extent的味道,但据说比extend的性能要好。
http://blog.csdn.net/clever101/article/details/5421782
2.qSlicerIGSReaderModule.cpp
// IGSReader Logic includes:逻辑功能 #include <vtkSlicerIGSReaderLogic.h>// IGSReader includes:总控与布局 #include "qSlicerIGSReaderModule.h" #include "qSlicerIGSReaderModuleWidget.h"//----------------------------------------------------------------------------- #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) //本项目使用的是qt-4.8.7就是比较低的版本 #include <QtPlugin> //Plug-in 机制 Q_EXPORT_PLUGIN2(qSlicerIGSReaderModule, qSlicerIGSReaderModule); #endif//----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate class qSlicerIGSReaderModulePrivate //头文件中声明的类,在此处定义、实现 { public:qSlicerIGSReaderModulePrivate(); };//----------------------------------------------------------------------------- // qSlicerIGSReaderModulePrivate methods//----------------------------------------------------------------------------- qSlicerIGSReaderModulePrivate::qSlicerIGSReaderModulePrivate() //声明类构造函数 { }//----------------------------------------------------------------------------- // qSlicerIGSReaderModule methods 主类的方法//----------------------------------------------------------------------------- qSlicerIGSReaderModule::qSlicerIGSReaderModule(QObject* _parent): Superclass(_parent), d_ptr(new qSlicerIGSReaderModulePrivate) //构造函数初始化 { } //----------------------------------------------------------------------------- qSlicerIGSReaderModule::~qSlicerIGSReaderModule() //析构函数初始化 { } //----------------------------------------------------------------------------- QString qSlicerIGSReaderModule::helpText() const {return "This is a loadable module that can be bundled in an extension"; } //----------------------------------------------------------------------------- QString qSlicerIGSReaderModule::acknowledgementText() const {return "This work was partially funded by NIH grant NXNNXXNNNNNN-NNXN"; } //----------------------------------------------------------------------------- QStringList qSlicerIGSReaderModule::contributors() const {QStringList moduleContributors;moduleContributors << QString("John Doe (AnyWare Corp.)");return moduleContributors; } //----------------------------------------------------------------------------- QIcon qSlicerIGSReaderModule::icon() const {return QIcon(":/Icons/IGSReader.png"); } //----------------------------------------------------------------------------- QStringList qSlicerIGSReaderModule::categories() const {return QStringList() << "Examples"; } //----------------------------------------------------------------------------- QStringList qSlicerIGSReaderModule::dependencies() const {return QStringList(); } //----------------------------------------------------------------------------- void qSlicerIGSReaderModule::setup() {this->Superclass::setup(); } //----------------------------------------------------------------------------- qSlicerAbstractModuleRepresentation* qSlicerIGSReaderModule ::createWidgetRepresentation() //创建窗体 {return new qSlicerIGSReaderModuleWidget; }//----------------------------------------------------------------------------- vtkMRMLAbstractLogic* qSlicerIGSReaderModule::createLogic() //创建并调用逻辑结构 {return vtkSlicerIGSReaderLogic::New(); //域名解析,类域为vtkSlicerIGSReaderLogic }
Notice:成员函数被const修饰
如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大 大提高了程序的健壮性。http://blog.csdn.net/shenziheng1/article/details/78028327
3.主框架 qSlicerIGSReaderModuleWidget.h qSlicerIGSReaderModuleWidget.cpp
#ifndef __qSlicerIGSReaderModuleWidget_h #define __qSlicerIGSReaderModuleWidget_h // SlicerQt includes:基类 #include "qSlicerAbstractModuleWidget.h" #include "qSlicerIGSReaderModuleExport.h" //类声明 class qSlicerIGSReaderModuleWidgetPrivate; class vtkMRMLNode;/// \ingroup Slicer_QtModules_ExtensionTemplate class Q_SLICER_QTMODULES_IGSREADER_EXPORT qSlicerIGSReaderModuleWidget :public qSlicerAbstractModuleWidget {Q_OBJECTpublic:typedef qSlicerAbstractModuleWidget Superclass;qSlicerIGSReaderModuleWidget(QWidget *parent=0);virtual ~qSlicerIGSReaderModuleWidget();public slots://槽函数 protected:QScopedPointer<qSlicerIGSReaderModuleWidgetPrivate> d_ptr;virtual void setup(); private:Q_DECLARE_PRIVATE(qSlicerIGSReaderModuleWidget);Q_DISABLE_COPY(qSlicerIGSReaderModuleWidget); }; #endif
// Qt includes #include <QDebug>// SlicerQt includes #include "qSlicerIGSReaderModuleWidget.h" #include "ui_qSlicerIGSReaderModuleWidget.h"//加载主控面板 //----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate :类定义 class qSlicerIGSReaderModuleWidgetPrivate: public Ui_qSlicerIGSReaderModuleWidget //继承自主控面板 { public:qSlicerIGSReaderModuleWidgetPrivate(); }; //----------------------------------------------------------------------------- // qSlicerIGSReaderModuleWidgetPrivate methods:类方法//----------------------------------------------------------------------------- qSlicerIGSReaderModuleWidgetPrivate::qSlicerIGSReaderModuleWidgetPrivate() { } //----------------------------------------------------------------------------- // qSlicerIGSReaderModuleWidget methods:主类的方法 //----------------------------------------------------------------------------- qSlicerIGSReaderModuleWidget::qSlicerIGSReaderModuleWidget(QWidget* _parent): Superclass( _parent ), d_ptr( new qSlicerIGSReaderModuleWidgetPrivate ) //子类进行动态初始化 { } //----------------------------------------------------------------------------- qSlicerIGSReaderModuleWidget::~qSlicerIGSReaderModuleWidget() { } //----------------------------------------------------------------------------- void qSlicerIGSReaderModuleWidget::setup() {Q_D(qSlicerIGSReaderModuleWidget);d->setupUi(this);this->Superclass::setup(); }
![]()
Help & Ackowledgement利用Module主体进行设计;Display等窗体我们可以利用Qt自行设计。
Notice:这里有一个问题啊???class vtkMRMLnode应该是一个相当主要的类了,但这个类是怎么定义以及使用的呢???
4.vtkSlicerIGSReaderModuleLogic
该项目与qSlicerIGSReaderModule项目(负责总控及主面板)、qSlicerIGSReaderModuleWidgets项目(负责其他独立的面板)一同构成了Module开发的主要项目集。其中,vtkSlicerIGSReaderModuleLogic负责3D操作的Slicer逻辑类管理,更具体的就是,该类管理3D视场中数据的读取、属性更改、保存等。vtkSlicerIGSReaderLogic.h:// .NAME vtkSlicerIGSReaderLogic - slicer logic class for volumes manipulation // .SECTION Description // This class manages the logic associated with reading, saving, // and changing propertied of the volumes #ifndef __vtkSlicerIGSReaderLogic_h #define __vtkSlicerIGSReaderLogic_h // Slicer includes #include "vtkSlicerModuleLogic.h" // MRML includes ???? // STD includes #include <cstdlib> #include "vtkSlicerIGSReaderModuleLogicExport.h"/// \ingroup Slicer_QtModules_ExtensionTemplate class VTK_SLICER_IGSREADER_MODULE_LOGIC_EXPORT vtkSlicerIGSReaderLogic :public vtkSlicerModuleLogic { public:static vtkSlicerIGSReaderLogic *New();vtkTypeMacro(vtkSlicerIGSReaderLogic, vtkSlicerModuleLogic);void PrintSelf(ostream& os, vtkIndent indent);protected:vtkSlicerIGSReaderLogic();virtual ~vtkSlicerIGSReaderLogic();virtual void SetMRMLSceneInternal(vtkMRMLScene* newScene);///场景中注册MRML节点类. 当MRMLScene连接到这个逻辑类的时候,会自动被调用virtual void RegisterNodes();virtual void UpdateFromMRMLScene();virtual void OnMRMLSceneNodeAdded(vtkMRMLNode* node);virtual void OnMRMLSceneNodeRemoved(vtkMRMLNode* node); private:vtkSlicerIGSReaderLogic(const vtkSlicerIGSReaderLogic&); // Not implementedvoid operator=(const vtkSlicerIGSReaderLogic&); // Not implemented }; #endif
vtkSlicerIGSReaderLogic:
// IGSReader Logic includes #include "vtkSlicerIGSReaderLogic.h"// MRML includes #include <vtkMRMLScene.h>// VTK includes #include <vtkIntArray.h> #include <vtkNew.h> #include <vtkObjectFactory.h>// STD includes #include <cassert> //---------------------------------------------------------------------------- vtkStandardNewMacro(vtkSlicerIGSReaderLogic); //---------------------------------------------------------------------------- vtkSlicerIGSReaderLogic::vtkSlicerIGSReaderLogic() //构造函数 { } //---------------------------------------------------------------------------- vtkSlicerIGSReaderLogic::~vtkSlicerIGSReaderLogic() //析构函数 { } //---------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::PrintSelf(ostream& os, vtkIndent indent) {this->Superclass::PrintSelf(os, indent); }//--------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::SetMRMLSceneInternal(vtkMRMLScene * newScene) //场景设置 {vtkNew<vtkIntArray> events;events->InsertNextValue(vtkMRMLScene::NodeAddedEvent);events->InsertNextValue(vtkMRMLScene::NodeRemovedEvent);events->InsertNextValue(vtkMRMLScene::EndBatchProcessEvent);this->SetAndObserveMRMLSceneEventsInternal(newScene, events.GetPointer()); }//----------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::RegisterNodes() {assert(this->GetMRMLScene() != 0); } //--------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::UpdateFromMRMLScene() {assert(this->GetMRMLScene() != 0); } //--------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeAdded(vtkMRMLNode* vtkNotUsed(node)) { } //--------------------------------------------------------------------------- void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode* vtkNotUsed(node)) { }
5.参考资料
《Slicer源码》
3DSlicer31:结构的实例分析IGSReader相关推荐
- 第02章 一个实例初识WorkBench分析流程-卡扣结构的动作分析
第02章 一个实例初识WorkBench分析流程-卡扣结构的动作分析 1问题描述,关心的结果 2. 建模的介绍,模型改如何简化 3. 复杂特征的网格初步试划分 4. 网格再次的划分及调整 5. 材料的 ...
- Abaqus高级实例分析视频教程-材料 静力 结构优化分析教程
Abaqus高级实例分析视频教程-材料 静力 结构优化分析教程 链接:https://pan.baidu.com/s/11ri8tIpbMWYvtTciQYK8Wg 提取码:i3qw
- 基于结构应力方法的焊接结构疲劳评估及实例分析(上篇)
作者 | 裴宪军博士 ,仿真秀专栏作者 一.写在文前 焊接技术作为现代制造业中的支柱技术之一,由于其整体性强.轻量化.经济性好等优点,焊接结构被广泛应用于轨道交通.航空航天,船舶.重型装备等领域,安全 ...
- 基于结构应力方法的焊接结构疲劳评估及实例分析(下篇)
作者 | 裴宪军 ,仿真秀专栏作者 一.写在文前 焊接技术作为现代制造业中的支柱技术之一,是制造强国的关键保障.由于其整体性强.轻量化.经济性好等优点,焊接结构被广泛应用于轨道交通.航空航天,船舶.重 ...
- 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?
AutoSAR入门到精通系列讲解 将从2019年开始更新关于AutoSAR的知识,从入门到精通,博主xyfx和大家一起进步 雪云飞星 ¥29.90 去订阅 简单地说结构化分析方法主要用来分析系统的功能 ...
- gpgpu-sim卡分配程序设计实例分析
gpgpu-sim卡分配程序设计实例分析 运行代码地址:https://github.com/gpgpu-sim/gpgpu-sim_distribution 一.概述 此文件包含有关安装.生成和运行 ...
- RPC-原理及RPC实例分析
还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...
- 马歇尔·赫伯特:人工智能的前沿技术与实例分析
来源:中国人工智能学会 2017年12月11日,国际知名机器人专家.美国卡耐基梅隆大学机器人研究所所长马歇尔·赫伯特(Martial Hebert)教授和首席科学家大卫·伯恩(David Bourne ...
- Android10.0 Binder通信原理(四)-Native-C\C++实例分析
摘要:本节主要来讲解Android10.0 Binder的Native层实例流程 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...
最新文章
- 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
- C++继承中父类和子类之间的赋值兼容
- svm涉及的一些概念
- 【牢骚】360,你怎么对待别人,别人就怎么对待你。
- Leet Code OJ 83. Remove Duplicates from Sorted List [Difficulty: Easy]
- Squared Permutation(线段树)
- 1071svm函数 r语言_R语言机器学习之核心包e1071 - 数据分析
- ES11新特性_动态import---JavaScript_ECMAScript_ES6-ES11新特性工作笔记065
- HDU1434 幸福列车【模拟+优先队列】
- 五大步骤快速搭建个人网站
- 第七届蓝桥杯省赛C/C++大学B组真题解析
- POJ 3641 Pseudoprime numbers (miller-rabin 素数判定)
- c语言printf()输出格式大全(转载)
- 概率统计及其应用第三章知识总结_高中数学130分,知识点最全总结,高分必看!...
- php今日头条抓取正文,今日头条文章爬虫采集 - 八爪鱼采集器
- chmod 777 到底是啥 ???看完这个你就完全懂了!
- python 千位分隔符_千位分隔符的完整攻略
- 突破软件测试的瓶颈(上)
- 【golang】golang使用cmd去ping网址在window和linux的区别
- dblp搜文献时各颜色含义