Browse Source

Merge branch 'dicom-simple-preview'

Marco Nolden 14 years ago
parent
commit
26d26b56b3

+ 2 - 1
Libs/DICOM/Core/Resources/dicom-schema.sql

@@ -13,10 +13,11 @@ DROP TABLE IF EXISTS 'Studies' ;
 DROP TABLE IF EXISTS 'Directories' ;
 
 CREATE TABLE 'Images' (
+  'SOPInstanceUID' VARCHAR(64) NOT NULL,
   'Filename' VARCHAR(1024) NOT NULL ,
   'SeriesInstanceUID' VARCHAR(64) NOT NULL ,
   'InsertTimestamp' VARCHAR(20) NOT NULL ,
-  PRIMARY KEY ('Filename') );
+  PRIMARY KEY ('SOPInstanceUID') );
 CREATE TABLE 'Patients' (
   'UID' INTEGER PRIMARY KEY AUTOINCREMENT,
   'PatientsName' VARCHAR(255) NULL ,

+ 1 - 1
Libs/DICOM/Core/Testing/Cpp/ctkDICOMModelTest1.cpp

@@ -49,7 +49,7 @@ int ctkDICOMModelTest1( int argc, char * argv [] )
   qDebug() << "titi: " << titi.seek(0) << myCTK.lastError();
   QSqlQuery tata("SELECT SeriesInstanceUID as UID, BodyPartExamined as Scan, SeriesDate as Date, AcquisitionNumber as Number FROM Series WHERE StudyInstanceUID='1.2.826.0.1.3680043.2.1125.1.73379483469717886505187028001198162'", myCTK.database());
   qDebug() << "tata: " << tata.seek(0) << myCTK.lastError();
-  QSqlQuery tutu("SELECT Filename as UID, Filename as Name, SeriesInstanceUID as Date FROM Images WHERE SeriesInstanceUID='%1'", myCTK.database());
+  QSqlQuery tutu("SELECT SOPInstanceUID as UID, Filename as Name, SeriesInstanceUID as Date FROM Images WHERE SeriesInstanceUID='%1'", myCTK.database());
   qDebug() << "tutu: " << tutu.seek(0) << myCTK.lastError();
   */
 

+ 7 - 5
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -249,7 +249,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
   OFString seriesInstanceUID, seriesDate, seriesTime,
     seriesDescription, bodyPartExamined, frameOfReferenceUID,
     contrastAgent, scanningSequence;
-  OFString instanceNumber;
+  OFString instanceNumber, sopInstanceUID ;
 
   Sint32 seriesNumber = 0, acquisitionNumber = 0, echoNumber = 0, temporalPosition = 0;
 
@@ -258,6 +258,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
   dataset->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID);
   dataset->findAndGetOFString(DCM_SeriesInstanceUID, seriesInstanceUID);
   dataset->findAndGetOFString(DCM_PatientID, patientID);
+  dataset->findAndGetOFString(DCM_SOPInstanceUID, sopInstanceUID);
 
   dataset->findAndGetOFString(DCM_PatientsBirthDate, patientsBirthDate);
   dataset->findAndGetOFString(DCM_PatientsBirthTime, patientsBirthTime);
@@ -384,10 +385,11 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, QString filename ) {
     if(!check_exists_query.next())
       {
       QSqlQuery statement ( d->Database );
-      statement.prepare ( "INSERT INTO Images ( 'Filename', 'SeriesInstanceUID', 'InsertTimestamp' ) VALUES ( ?, ?, ? )" );
-      statement.bindValue ( 0, filename );
-      statement.bindValue ( 1, QString ( seriesInstanceUID.c_str() ) );
-      statement.bindValue ( 2, QDateTime::currentDateTime() );
+      statement.prepare ( "INSERT INTO Images ( 'SOPInstanceUID', 'Filename', 'SeriesInstanceUID', 'InsertTimestamp' ) VALUES ( ?, ?, ?, ? )" );
+      statement.bindValue ( 0, QString ( sopInstanceUID.c_str() ) );
+      statement.bindValue ( 1, filename );
+      statement.bindValue ( 2, QString ( seriesInstanceUID.c_str() ) );
+      statement.bindValue ( 3, QDateTime::currentDateTime() );
       statement.exec();
       }
     }

+ 2 - 2
Libs/DICOM/Core/ctkDICOMIndexer.cpp

@@ -420,7 +420,7 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
     QSqlQuery check_exists_query(database.database());
     std::stringstream check_exists_query_string;
 //    check_exists_query_string << "SELECT * FROM Images WHERE Filename = '" << relativeFilePath.str() << "'";
-    check_exists_query_string << "SELECT * FROM Images WHERE Filename = '" << filename << "'";
+    check_exists_query_string << "SELECT * FROM Images WHERE SOPInstanceUID = '" << sopInstanceUID << "'";
     check_exists_query.exec(check_exists_query_string.str().c_str());
 
     if(!check_exists_query.next())
@@ -429,7 +429,7 @@ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& database, const QString& di
 
       //To save absolute path: destDirectoryPath.str()
       query_string << "INSERT INTO Images VALUES('"
-        << qfilename.toStdString() << "','" << seriesInstanceUID << "','" << QDateTime::currentDateTime().toString(Qt::ISODate).toStdString() << "')";
+        << sopInstanceUID << "','" << qfilename.toStdString() << "','" << seriesInstanceUID << "','" << QDateTime::currentDateTime().toString(Qt::ISODate).toStdString() << "')";
 
       query.exec(query_string.str().c_str());
     }

+ 12 - 1
Libs/DICOM/Core/ctkDICOMModel.cpp

@@ -316,7 +316,7 @@ void ctkDICOMModelPrivate::updateQueries(Node* node)const
       break;
     case ctkDICOMModelPrivate::SeriesType:
       //query = QString("SELECT Filename as UID, Filename as Name, SeriesInstanceUID as Date FROM Images WHERE SeriesInstanceUID='%1'").arg(node->UID);
-      query = this->generateQuery("Filename as UID, Filename as Name, SeriesInstanceUID as Date", "Images", QString("SeriesInstanceUID='%1'").arg(node->UID));
+      query = this->generateQuery("SOPInstanceUID as UID, Filename as Name, SeriesInstanceUID as Date", "Images", QString("SeriesInstanceUID='%1'").arg(node->UID));
       logger.debug ( "ctkDICOMModelPrivate::updateQueries for Series: query is: " + query );
       break;
     case ctkDICOMModelPrivate::ImageType:
@@ -413,6 +413,17 @@ int ctkDICOMModel::columnCount ( const QModelIndex & _parent ) const
 QVariant ctkDICOMModel::data ( const QModelIndex & dataIndex, int role ) const
 {
   Q_D(const ctkDICOMModel);
+  if ( role == UIDRole )
+    {
+    Node* node = d->nodeFromIndex(dataIndex);
+    return node ? node->UID : QString() ;
+    }
+  else if ( role == TypeRole )
+    {
+    Node* node = d->nodeFromIndex(dataIndex);
+    return node ? node->Type : 0;
+    }
+
   if (role != Qt::DisplayRole && role != Qt::EditRole)
     {
     return QVariant();

+ 6 - 0
Libs/DICOM/Core/ctkDICOMModel.h

@@ -32,6 +32,12 @@ class CTK_DICOM_CORE_EXPORT ctkDICOMModel : public QAbstractItemModel
 {
   Q_OBJECT
 public:
+
+  enum {
+    UIDRole = Qt::UserRole,
+    TypeRole
+  };
+
   explicit ctkDICOMModel(QObject* parent = 0);
   virtual ~ctkDICOMModel();
 

+ 10 - 1
Libs/DICOM/Widgets/Resources/UI/ctkDICOMAppWidget.ui

@@ -123,13 +123,22 @@
         </widget>
        </item>
        <item>
-        <widget class="QWidget" name="previewWidget" native="true">
+        <widget class="QFrame" name="previewFrame">
          <property name="minimumSize">
           <size>
            <width>256</width>
            <height>256</height>
           </size>
          </property>
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <item>
+           <widget class="QLabel" name="imagePreview">
+            <property name="text">
+             <string>TextLabel</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
         </widget>
        </item>
       </layout>

+ 19 - 1
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -92,6 +92,8 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
 
+  connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
+
 }
 
 //----------------------------------------------------------------------------
@@ -159,11 +161,27 @@ void ctkDICOMAppWidget::onQuery(){
   d->QueryRetrieveWidget->raise();
 }
 
-void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index){
+void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index)
+{
   Q_D(ctkDICOMAppWidget);
 
   //TODO: update thumbnails and previewer
   d->thumbnailsWidget->setModelIndex(index);
+
+  // TODO: this could check the type of the model entries
+  QString thumbnailPath = d->DICOMDatabase->databaseDirectory();
+  thumbnailPath.append("/thumbs/").append(d->DICOMModel.data(index.parent().parent() ,ctkDICOMModel::UIDRole).toString());
+  thumbnailPath.append("/").append(d->DICOMModel.data(index.parent() ,ctkDICOMModel::UIDRole).toString());
+  thumbnailPath.append("/").append(d->DICOMModel.data(index ,ctkDICOMModel::UIDRole).toString());
+  thumbnailPath.append(".png");
+  if (QFile(thumbnailPath).exists())
+  {
+    d->imagePreview->setPixmap(QPixmap(thumbnailPath));
+  }
+  else
+  {
+    d->imagePreview->setText("No preview");
+  }
 }
 
 void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget){