zoukankan      html  css  js  c++  java
  • 3D Slicer 结构的实例分析IGSReader

    1.qSlicerIGSReaderModule.h

     1 #ifndef __qSlicerIGSReaderModule_h
     2 #define __qSlicerIGSReaderModule_h
     3  
     4 // SlicerQt includes
     5 #include "qSlicerLoadableModule.h" //模板类
     6  
     7 #include "qSlicerIGSReaderModuleExport.h" //捕获Unix和Windows操作系统之间的差异
     8  
     9 class qSlicerIGSReaderModulePrivate; //声明了一个类,但是该类没有在头文件中定义
    10  
    11 /// ingroup Slicer_QtModules_ExtensionTemplate
    12 class Q_SLICER_QTMODULES_IGSREADER_EXPORT
    13 qSlicerIGSReaderModule
    14   : public qSlicerLoadableModule
    15 {
    16   Q_OBJECT
    17 #ifdef Slicer_HAVE_QT5
    18   Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0");
    19 #endif
    20   Q_INTERFACES(qSlicerLoadableModule);
    21  
    22 public:
    23  
    24   typedef qSlicerLoadableModule Superclass;//类型重定义 方便使用
    25   explicit qSlicerIGSReaderModule(QObject *parent=0); //显式的构造函数
    26   virtual ~qSlicerIGSReaderModule();
    27  
    28   qSlicerGetTitleMacro(QTMODULE_TITLE);
    29  
    30   virtual QString helpText()const;
    31   virtual QString acknowledgementText()const;
    32   virtual QStringList contributors()const;
    33  
    34   virtual QIcon icon()const;
    35  
    36   virtual QStringList categories()const;
    37   virtual QStringList dependencies() const;
    38  
    39 protected:
    40  
    41   /// 初始化模块,实现三维数据读/写功能
    42   virtual void setup();
    43  
    44   /// 创建并返回与此模块相关的窗体表示
    45   virtual qSlicerAbstractModuleRepresentation * createWidgetRepresentation();
    46  
    47   /// 创建并返回与此模块相关的逻辑连接
    48   virtual vtkMRMLAbstractLogic* createLogic();
    49 protected:
    50   QScopedPointer<qSlicerIGSReaderModulePrivate> d_ptr;
    51  
    52 private:
    53   Q_DECLARE_PRIVATE(qSlicerIGSReaderModule);
    54   Q_DISABLE_COPY(qSlicerIGSReaderModule);
    55  
    56 };
    57  
    58 #endif
    Notice:
    1.explicit qSlicerIGSReaderModule(QObject *parent=0);
    explicit约束构造函数进行显式转换,避免默认的隐式转换,提高代码可理解性。
    http://blog.csdn.net/shenziheng1/article/details/78026883
    2 .class Q_SLICER_QTMODULES_IGSREADER_EXPORT  qSlicerIGSReaderModule : public qSlicerLoadableModule {};
    起初看到这样定义类有点懵,我们可以查看Q_SLICER_QTMODULES_IGSREADER_EXPORT ("qSlicerIGSReaderModuleExport.h"头文件中),有如下代码:
    1 #if defined(qSlicerIGSReaderModule_EXPORTS)
    2   #define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllexport )
    3 #else
    4   #define Q_SLICER_QTMODULES_IGSREADER_EXPORT __declspec( dllimport )
    通过这一行我们可以了解到,其实就是定义了一个宏,该宏的作用是提供给外部应用程序或DLL使用,有点像extent的味道,但据说比extend的性能要好。
    http://blog.csdn.net/clever101/article/details/5421782

    2.qSlicerIGSReaderModule.cpp

     1 // IGSReader Logic includes:逻辑功能
     2 #include <vtkSlicerIGSReaderLogic.h>
     3  
     4 // IGSReader includes:总控与布局
     5 #include "qSlicerIGSReaderModule.h"
     6 #include "qSlicerIGSReaderModuleWidget.h"
     7  
     8 //-----------------------------------------------------------------------------
     9 #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))  //本项目使用的是qt-4.8.7就是比较低的版本
    10 #include <QtPlugin> //Plug-in 机制
    11 Q_EXPORT_PLUGIN2(qSlicerIGSReaderModule, qSlicerIGSReaderModule);
    12 #endif
    13  
    14 //-----------------------------------------------------------------------------
    15 /// ingroup Slicer_QtModules_ExtensionTemplate
    16 class qSlicerIGSReaderModulePrivate //头文件中声明的类,在此处定义、实现
    17 {
    18 public:
    19   qSlicerIGSReaderModulePrivate();
    20 };
    21  
    22 //-----------------------------------------------------------------------------
    23 // qSlicerIGSReaderModulePrivate methods
    24  
    25 //-----------------------------------------------------------------------------
    26 qSlicerIGSReaderModulePrivate::qSlicerIGSReaderModulePrivate() //声明类构造函数
    27 {
    28 }
    29  
    30 //-----------------------------------------------------------------------------
    31 // qSlicerIGSReaderModule methods 主类的方法
    32  
    33 //-----------------------------------------------------------------------------
    34 qSlicerIGSReaderModule::qSlicerIGSReaderModule(QObject* _parent)
    35   : Superclass(_parent)
    36   , d_ptr(new qSlicerIGSReaderModulePrivate) //构造函数初始化
    37 {
    38 }
    39 //-----------------------------------------------------------------------------
    40 qSlicerIGSReaderModule::~qSlicerIGSReaderModule() //析构函数初始化
    41 {
    42 }
    43 //-----------------------------------------------------------------------------
    44 QString qSlicerIGSReaderModule::helpText() const
    45 {
    46   return "This is a loadable module that can be bundled in an extension";
    47 }
    48 //-----------------------------------------------------------------------------
    49 QString qSlicerIGSReaderModule::acknowledgementText() const
    50 {
    51   return "This work was partially funded by NIH grant NXNNXXNNNNNN-NNXN";
    52 }
    53 //-----------------------------------------------------------------------------
    54 QStringList qSlicerIGSReaderModule::contributors() const
    55 {
    56   QStringList moduleContributors;
    57   moduleContributors << QString("John Doe (AnyWare Corp.)");
    58   return moduleContributors;
    59 }
    60 //-----------------------------------------------------------------------------
    61 QIcon qSlicerIGSReaderModule::icon() const
    62 {
    63   return QIcon(":/Icons/IGSReader.png");
    64 }
    65 //-----------------------------------------------------------------------------
    66 QStringList qSlicerIGSReaderModule::categories() const
    67 {
    68   return QStringList() << "Examples";
    69 }
    70 //-----------------------------------------------------------------------------
    71 QStringList qSlicerIGSReaderModule::dependencies() const
    72 {
    73   return QStringList();
    74 }
    75 //-----------------------------------------------------------------------------
    76 void qSlicerIGSReaderModule::setup()
    77 {
    78   this->Superclass::setup();
    79 }
    80 //-----------------------------------------------------------------------------
    81 qSlicerAbstractModuleRepresentation* qSlicerIGSReaderModule
    82 ::createWidgetRepresentation() //创建窗体
    83 {
    84   return new qSlicerIGSReaderModuleWidget;
    85 }
    86  
    87 //-----------------------------------------------------------------------------
    88 vtkMRMLAbstractLogic* qSlicerIGSReaderModule::createLogic() //创建并调用逻辑结构
    89 {
    90   return vtkSlicerIGSReaderLogic::New(); //域名解析,类域为vtkSlicerIGSReaderLogic
    Notice:成员函数被const修饰
    如果一个成员函数不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大 大提高了程序的健壮性。 
    http://blog.csdn.net/shenziheng1/article/details/78028327

    3.主框架 qSlicerIGSReaderModuleWidget.h  qSlicerIGSReaderModuleWidget.cpp

     1 #ifndef __qSlicerIGSReaderModuleWidget_h
     2 #define __qSlicerIGSReaderModuleWidget_h
     3 // SlicerQt includes:基类
     4 #include "qSlicerAbstractModuleWidget.h"
     5 #include "qSlicerIGSReaderModuleExport.h"
     6 //类声明
     7 class qSlicerIGSReaderModuleWidgetPrivate;
     8 class vtkMRMLNode;
     9  
    10 /// ingroup Slicer_QtModules_ExtensionTemplate
    11 class Q_SLICER_QTMODULES_IGSREADER_EXPORT qSlicerIGSReaderModuleWidget :
    12   public qSlicerAbstractModuleWidget
    13 {
    14   Q_OBJECT
    15  
    16 public:
    17  
    18   typedef qSlicerAbstractModuleWidget Superclass;
    19   qSlicerIGSReaderModuleWidget(QWidget *parent=0);
    20   virtual ~qSlicerIGSReaderModuleWidget();
    21  
    22 public slots://槽函数
    23 protected:
    24   QScopedPointer<qSlicerIGSReaderModuleWidgetPrivate> d_ptr;
    25   virtual void setup();
    26 private:
    27   Q_DECLARE_PRIVATE(qSlicerIGSReaderModuleWidget);
    28   Q_DISABLE_COPY(qSlicerIGSReaderModuleWidget);
    29 };
    30 #endif
     1 // Qt includes
     2 #include <QDebug>
     3  
     4 // SlicerQt includes
     5 #include "qSlicerIGSReaderModuleWidget.h"
     6 #include "ui_qSlicerIGSReaderModuleWidget.h"//加载主控面板
     7 //-----------------------------------------------------------------------------
     8 /// ingroup Slicer_QtModules_ExtensionTemplate :类定义
     9 class qSlicerIGSReaderModuleWidgetPrivate: public Ui_qSlicerIGSReaderModuleWidget //继承自主控面板
    10 {
    11 public:
    12   qSlicerIGSReaderModuleWidgetPrivate();
    13 };
    14 //-----------------------------------------------------------------------------
    15 // qSlicerIGSReaderModuleWidgetPrivate methods:类方法
    16  
    17 //-----------------------------------------------------------------------------
    18 qSlicerIGSReaderModuleWidgetPrivate::qSlicerIGSReaderModuleWidgetPrivate()
    19 {
    20 }
    21 //-----------------------------------------------------------------------------
    22 // qSlicerIGSReaderModuleWidget methods:主类的方法
    23 //-----------------------------------------------------------------------------
    24 qSlicerIGSReaderModuleWidget::qSlicerIGSReaderModuleWidget(QWidget* _parent)
    25   : Superclass( _parent )
    26   , d_ptr( new qSlicerIGSReaderModuleWidgetPrivate ) //子类进行动态初始化
    27 {
    28 }
    29 //-----------------------------------------------------------------------------
    30 qSlicerIGSReaderModuleWidget::~qSlicerIGSReaderModuleWidget()
    31 {
    32 }
    33 //-----------------------------------------------------------------------------
    34 void qSlicerIGSReaderModuleWidget::setup()
    35 {
    36   Q_D(qSlicerIGSReaderModuleWidget);
    37   d->setupUi(this);
    38   this->Superclass::setup();
    39 }
    
    
    Help & Ackowledgement利用Module主体进行设计;Display等窗体我们可以利用Qt自行设计。
    Notice:
    这里有一个问题啊???class vtkMRMLnode应该是一个相当主要的类了,但这个类是怎么定义以及使用的呢???

    4.vtkSlicerIGSReaderModuleLogic

    该项目与qSlicerIGSReaderModule项目(负责总控及主面板)、qSlicerIGSReaderModuleWidgets项目(负责其他独立的面板)一同构成了Module开发的主要项目集。其中,vtkSlicerIGSReaderModuleLogic负责3D操作的Slicer逻辑类管理,更具体的就是,该类管理3D视场中数据的读取、属性更改、保存等。
    vtkSlicerIGSReaderLogic.h:
     1 // .NAME vtkSlicerIGSReaderLogic - slicer logic class for volumes manipulation
     2 // .SECTION Description
     3 // This class manages the logic associated with reading, saving,
     4 // and changing propertied of the volumes
     5 #ifndef __vtkSlicerIGSReaderLogic_h
     6 #define __vtkSlicerIGSReaderLogic_h
     7 // Slicer includes
     8 #include "vtkSlicerModuleLogic.h"
     9 // MRML includes ????
    10 // STD includes
    11 #include <cstdlib>
    12 #include "vtkSlicerIGSReaderModuleLogicExport.h"
    13  
    14 /// ingroup Slicer_QtModules_ExtensionTemplate
    15 class VTK_SLICER_IGSREADER_MODULE_LOGIC_EXPORT vtkSlicerIGSReaderLogic :
    16   public vtkSlicerModuleLogic
    17 {
    18 public:
    19   static vtkSlicerIGSReaderLogic *New();
    20   vtkTypeMacro(vtkSlicerIGSReaderLogic, vtkSlicerModuleLogic);
    21   void PrintSelf(ostream& os, vtkIndent indent);
    22  
    23 protected:
    24   vtkSlicerIGSReaderLogic();
    25   virtual ~vtkSlicerIGSReaderLogic();
    26  
    27   virtual void SetMRMLSceneInternal(vtkMRMLScene* newScene);
    28   ///场景中注册MRML节点类. 当MRMLScene连接到这个逻辑类的时候,会自动被调用
    29   virtual void RegisterNodes();
    30   virtual void UpdateFromMRMLScene();
    31   virtual void OnMRMLSceneNodeAdded(vtkMRMLNode* node);
    32   virtual void OnMRMLSceneNodeRemoved(vtkMRMLNode* node);
    33 private:
    34   vtkSlicerIGSReaderLogic(const vtkSlicerIGSReaderLogic&); // Not implemented
    35   void operator=(const vtkSlicerIGSReaderLogic&); // Not implemented
    36 };
    37 #endif

    vtkSlicerIGSReaderLogic:

     1 // IGSReader Logic includes
     2 #include "vtkSlicerIGSReaderLogic.h"
     3  
     4 // MRML includes
     5 #include <vtkMRMLScene.h>
     6  
     7 // VTK includes
     8 #include <vtkIntArray.h>
     9 #include <vtkNew.h>
    10 #include <vtkObjectFactory.h>
    11  
    12 // STD includes
    13 #include <cassert>
    14 //----------------------------------------------------------------------------
    15 vtkStandardNewMacro(vtkSlicerIGSReaderLogic);
    16 //----------------------------------------------------------------------------
    17 vtkSlicerIGSReaderLogic::vtkSlicerIGSReaderLogic() //构造函数
    18 {
    19 }
    20 //----------------------------------------------------------------------------
    21 vtkSlicerIGSReaderLogic::~vtkSlicerIGSReaderLogic() //析构函数
    22 {
    23 }
    24 //----------------------------------------------------------------------------
    25 void vtkSlicerIGSReaderLogic::PrintSelf(ostream& os, vtkIndent indent)
    26 {
    27   this->Superclass::PrintSelf(os, indent);
    28 }
    29  
    30 //---------------------------------------------------------------------------
    31 void vtkSlicerIGSReaderLogic::SetMRMLSceneInternal(vtkMRMLScene * newScene) //场景设置
    32 {
    33   vtkNew<vtkIntArray> events;
    34   events->InsertNextValue(vtkMRMLScene::NodeAddedEvent);
    35   events->InsertNextValue(vtkMRMLScene::NodeRemovedEvent);
    36   events->InsertNextValue(vtkMRMLScene::EndBatchProcessEvent);
    37   this->SetAndObserveMRMLSceneEventsInternal(newScene, events.GetPointer());
    38 }
    39  
    40 //-----------------------------------------------------------------------------
    41 void vtkSlicerIGSReaderLogic::RegisterNodes()
    42 {
    43   assert(this->GetMRMLScene() != 0);
    44 }
    45 //---------------------------------------------------------------------------
    46 void vtkSlicerIGSReaderLogic::UpdateFromMRMLScene()
    47 {
    48   assert(this->GetMRMLScene() != 0);
    49 }
    50 //---------------------------------------------------------------------------
    51 void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeAdded(vtkMRMLNode* vtkNotUsed(node))
    52 {
    53 }
    54 //---------------------------------------------------------------------------
    55 void vtkSlicerIGSReaderLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode* vtkNotUsed(node))
    56 {
    57 }

    5.参考资料

    《Slicer源码》
  • 相关阅读:
    QPBOC扩展应用交易流程
    探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB
    Java 存储和读取 oracle CLOB 类型字段的实用方法
    Java读取property配置文件
    AOP (面向切面编程)
    OJB
    JDO
    toplink
    JPA
    ORM
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14235663.html
Copyright © 2011-2022 走看看