Sfoglia il codice sorgente

Merge branch 'enable-remove-from-dicom-database'

Closes #97
Marco Nolden 13 anni fa
parent
commit
db1ea0183b

+ 49 - 9
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -798,12 +798,7 @@ bool ctkDICOMDatabase::isInMemory() const
   Q_D(const ctkDICOMDatabase);
   return d->DatabaseFileName == ":memory:";
 }
-/*
-bool ctkDICOMDatabase::removeImage(const QString& sopInstanceUID)
-{
-  return false;
-}
-*/
+
 bool ctkDICOMDatabase::removeSeries(const QString& seriesInstanceUID)
 {
   Q_D(ctkDICOMDatabase);
@@ -881,9 +876,54 @@ bool ctkDICOMDatabase::cleanup()
   seriesCleanup.exec("DELETE FROM Patients WHERE ( SELECT COUNT(*) FROM Studies WHERE Studies.PatientsUID = Patients.UID ) = 0;");
   return true;
 }
-/*
+
 bool ctkDICOMDatabase::removeStudy(const QString& studyInstanceUID)
 {
-  return false;
+  Q_D(ctkDICOMDatabase);
+  
+  QSqlQuery seriesForStudy( d->Database );
+  seriesForStudy.prepare("SELECT SeriesInstanceUID FROM Series WHERE StudyInstanceUID = :studyID");
+  seriesForStudy.bindValue(":studyID", studyInstanceUID);
+  bool success = seriesForStudy.exec();
+  if (!success)
+  {
+    logger.error("SQLITE ERROR: " + seriesForStudy.lastError().driverText());
+    return false;
+  }
+  bool result = true;
+  while ( seriesForStudy.next() )
+  {
+    QString seriesInstanceUID = seriesForStudy.value(seriesForStudy.record().indexOf("SeriesInstanceUID")).toString();
+    if ( ! this->removeSeries(seriesInstanceUID) )
+    {
+      result = false;
+    }
+  }
+  return result;;
+}
+
+bool ctkDICOMDatabase::removePatient(const QString& patientID)
+{
+  Q_D(ctkDICOMDatabase);
+
+  QSqlQuery studiesForPatient( d->Database );
+  studiesForPatient.prepare("SELECT StudyInstanceUID FROM Studies WHERE PatientsUID = :patientsID");
+  studiesForPatient.bindValue(":patientsID", patientID);
+  bool success = studiesForPatient.exec();
+  if (!success)
+  {
+    logger.error("SQLITE ERROR: " + studiesForPatient.lastError().driverText());
+    return false;
+  }
+  bool result = true;
+  while ( studiesForPatient.next() )
+  {
+    QString studyInstanceUID = studiesForPatient.value(studiesForPatient.record().indexOf("StudyInstanceUID")).toString();
+    if ( ! this->removeStudy(studyInstanceUID) )
+    {
+      result = false;
+    }
+  }
+  return result;;
 }
-*/
+

+ 2 - 2
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -145,11 +145,11 @@ public:
   /// Check if file is already in database and up-to-date
   bool fileExistsAndUpToDate(const QString& filePath);
 
-  // bool removeImage(const QString& sopInstanceUID);
   /// remove the series from the database, including images and
   /// thumbnails  
   bool removeSeries(const QString& seriesInstanceUID);
-  // bool removeStudy(const QString& studyInstanceUID);
+  bool removeStudy(const QString& studyInstanceUID);
+  bool removePatient(const QString& patientID);
   bool cleanup();
 
 Q_SIGNALS:

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

@@ -321,6 +321,16 @@ void ctkDICOMAppWidget::onRemoveAction()
     {
       QString seriesUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
       d->DICOMDatabase->removeSeries(seriesUID);
+    } 
+    else if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType))
+    {
+      QString studyUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
+      d->DICOMDatabase->removeStudy(studyUID);
+    }
+    else if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType))
+    {
+      QString patientUID = d->DICOMModel.data(index0,ctkDICOMModel::UIDRole).toString();
+      d->DICOMDatabase->removePatient(patientUID);
     }
   }
   d->DICOMModel.reset();
@@ -449,7 +459,10 @@ Q_D(ctkDICOMAppWidget);
           d->NextStudyButton->hide();
           d->PrevStudyButton->hide();
           }
-        d->ActionRemove->setEnabled(model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) );
+        d->ActionRemove->setEnabled(
+            model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) ||
+            model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType) ||
+            model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType) );
         }
 
       else