3DSlicer31:结构的实例分析IGSReader
生活随笔
收集整理的這篇文章主要介紹了
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);};#endifNotice: 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"頭文件中),有如下代碼: #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 }; #endifvtkSlicerIGSReaderLogic: // 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WDM驱动程序入门(3)——安装步骤
- 下一篇: 创业者的十大“必杀技”