|
@@ -20,8 +20,13 @@
|
|
|
|
|
|
#include <iostream>
|
|
#include <iostream>
|
|
|
|
|
|
|
|
+// DCMTK includes
|
|
|
|
+#include <dcmimage.h>
|
|
|
|
+
|
|
// CTK includes
|
|
// CTK includes
|
|
#include "ctkQImageView.h"
|
|
#include "ctkQImageView.h"
|
|
|
|
+#include "ctkDICOMImage.h"
|
|
|
|
+#include "ctkDICOMModel.h"
|
|
#include "ctkDICOMDatasetView.h"
|
|
#include "ctkDICOMDatasetView.h"
|
|
|
|
|
|
// Qt includes
|
|
// Qt includes
|
|
@@ -32,6 +37,7 @@
|
|
#include <QMouseEvent>
|
|
#include <QMouseEvent>
|
|
#include <QKeyEvent>
|
|
#include <QKeyEvent>
|
|
#include <QPainter>
|
|
#include <QPainter>
|
|
|
|
+#include <QFile>
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
//--------------------------------------------------------------------------
|
|
class ctkDICOMDatasetViewPrivate
|
|
class ctkDICOMDatasetViewPrivate
|
|
@@ -47,7 +53,13 @@ public:
|
|
|
|
|
|
ctkDICOMDatasetViewPrivate( ctkDICOMDatasetView& object );
|
|
ctkDICOMDatasetViewPrivate( ctkDICOMDatasetView& object );
|
|
|
|
|
|
|
|
+ QString databaseDirectory;
|
|
|
|
+
|
|
void init();
|
|
void init();
|
|
|
|
+
|
|
|
|
+ void onPatientModelSelected(const QModelIndex& index);
|
|
|
|
+ void onStudyModelSelected(const QModelIndex& index);
|
|
|
|
+ void onSeriesModelSelected(const QModelIndex& index);
|
|
};
|
|
};
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
//--------------------------------------------------------------------------
|
|
@@ -70,6 +82,94 @@ void ctkDICOMDatasetViewPrivate::init()
|
|
*/
|
|
*/
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index){
|
|
|
|
+ Q_Q(ctkDICOMDatasetView);
|
|
|
|
+
|
|
|
|
+ ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
|
|
|
|
+
|
|
|
|
+ if(model){
|
|
|
|
+ QModelIndex patientIndex = index;
|
|
|
|
+ QModelIndex studyIndex = patientIndex.child(0,0);
|
|
|
|
+ QModelIndex seriesIndex = studyIndex.child(0,0);
|
|
|
|
+ QModelIndex imageIndex = seriesIndex.child(0,0);
|
|
|
|
+
|
|
|
|
+ QString thumbnailPath = this->databaseDirectory;
|
|
|
|
+ thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+
|
|
|
|
+ if (QFile(thumbnailPath).exists())
|
|
|
|
+ {
|
|
|
|
+ DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
|
|
|
|
+ ctkDICOMImage ctkImage( & dcmImage );
|
|
|
|
+ q->clearImages();
|
|
|
|
+ q->addImage( ctkImage );
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
|
|
|
|
+ Q_Q(ctkDICOMDatasetView);
|
|
|
|
+
|
|
|
|
+ ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
|
|
|
|
+
|
|
|
|
+ if(model){
|
|
|
|
+ QModelIndex studyIndex = index;
|
|
|
|
+ QModelIndex seriesIndex = studyIndex.child(0,0);
|
|
|
|
+ QModelIndex imageIndex = seriesIndex.child(0,0);
|
|
|
|
+
|
|
|
|
+ QString thumbnailPath = this->databaseDirectory;
|
|
|
|
+ thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+
|
|
|
|
+ if (QFile(thumbnailPath).exists())
|
|
|
|
+ {
|
|
|
|
+ DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
|
|
|
|
+ ctkDICOMImage ctkImage( & dcmImage );
|
|
|
|
+ q->clearImages();
|
|
|
|
+ q->addImage( ctkImage );
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index){
|
|
|
|
+ Q_Q(ctkDICOMDatasetView);
|
|
|
|
+
|
|
|
|
+ ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
|
|
|
|
+
|
|
|
|
+ if(model){
|
|
|
|
+ QModelIndex seriesIndex = index;
|
|
|
|
+ QModelIndex studyIndex = seriesIndex.parent();
|
|
|
|
+ QModelIndex imageIndex = seriesIndex.child(0,0);
|
|
|
|
+
|
|
|
|
+ QString thumbnailPath = this->databaseDirectory;
|
|
|
|
+ thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+ thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
|
|
|
|
+
|
|
|
|
+ if (QFile(thumbnailPath).exists())
|
|
|
|
+ {
|
|
|
|
+ DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
|
|
|
|
+ ctkDICOMImage ctkImage( & dcmImage );
|
|
|
|
+ q->clearImages();
|
|
|
|
+ q->addImage( ctkImage );
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+ }else{
|
|
|
|
+ q->clearImages();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
// -------------------------------------------------------------------------
|
|
// -------------------------------------------------------------------------
|
|
ctkDICOMDatasetView::ctkDICOMDatasetView( QWidget* _parent )
|
|
ctkDICOMDatasetView::ctkDICOMDatasetView( QWidget* _parent )
|
|
: Superclass( _parent ),
|
|
: Superclass( _parent ),
|
|
@@ -95,6 +195,13 @@ ctkDICOMDatasetView::~ctkDICOMDatasetView()
|
|
}
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// -------------------------------------------------------------------------
|
|
|
|
+void ctkDICOMDatasetView::setDatabaseDirectory(const QString &directory){
|
|
|
|
+ Q_D(ctkDICOMDatasetView);
|
|
|
|
+
|
|
|
|
+ d->databaseDirectory = directory;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// -------------------------------------------------------------------------
|
|
void ctkDICOMDatasetView::addImage( const ctkDICOMImage & image )
|
|
void ctkDICOMDatasetView::addImage( const ctkDICOMImage & image )
|
|
{
|
|
{
|
|
for( unsigned int i=0; i<image.frameCount(); ++i )
|
|
for( unsigned int i=0; i<image.frameCount(); ++i )
|
|
@@ -115,3 +222,21 @@ void ctkDICOMDatasetView::update( bool zoomChanged,
|
|
{
|
|
{
|
|
Superclass::update( zoomChanged, sizeChanged );
|
|
Superclass::update( zoomChanged, sizeChanged );
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+void ctkDICOMDatasetView::onModelSelected(const QModelIndex &index){
|
|
|
|
+ Q_D(ctkDICOMDatasetView);
|
|
|
|
+
|
|
|
|
+ ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
|
|
|
|
+
|
|
|
|
+ if(model){
|
|
|
|
+ QModelIndex index0 = index.sibling(index.row(), 0);
|
|
|
|
+
|
|
|
|
+ if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::PatientType ){
|
|
|
|
+ d->onPatientModelSelected(index0);
|
|
|
|
+ }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::StudyType ){
|
|
|
|
+ d->onStudyModelSelected(index0);
|
|
|
|
+ }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType ){
|
|
|
|
+ d->onSeriesModelSelected(index0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|