3DSlicer31:结构的实例分析IGSReader

来源:互联网 发布:桌面定时器软件 编辑:程序博客网 时间:2024/05/29 18:50

1.qSlicerIGSReaderModule.h

#ifndef __qSlicerIGSReaderModule_h#define __qSlicerIGSReaderModule_h// SlicerQt includes#include "qSlicerLoadableModule.h" //模板类#include "qSlicerIGSReaderModuleExport.h" //捕获Unix和Windows操作系统之间的差异class qSlicerIGSReaderModulePrivate; //声明了一个类,但是该类没有在头文件中定义/// \ingroup Slicer_QtModules_ExtensionTemplateclass Q_SLICER_QTMODULES_IGSREADER_EXPORTqSlicerIGSReaderModule  : public qSlicerLoadableModule{  Q_OBJECT#ifdef Slicer_HAVE_QT5  Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0");#endif  Q_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/78026883
2.classQ_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_ExtensionTemplateclass 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_ExtensionTemplateclass 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_ExtensionTemplateclass 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 implemented  void 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源码

阅读全文
0 0
原创粉丝点击