瀏覽代碼

ENH: new application DICOM indexer, file moving still not working correctly

Marco Nolden 15 年之前
父節點
當前提交
3251369d3a

+ 45 - 0
Applications/ctkDICOMIndexer/CMakeLists.txt

@@ -0,0 +1,45 @@
+PROJECT(ctkDICOMIndexer)
+
+#
+# See CTK/CMake/ctkMacroBuildQtApp.cmake for details
+#
+  
+# Source files
+SET(KIT_SRCS
+  ctkDICOMIndexer.cxx
+  )
+
+# Headers that should run through moc
+SET(KIT_MOC_SRCS
+  )
+
+# UI files
+SET(KIT_UI_FORMS
+)
+
+# Resources
+SET(KIT_resources
+)
+
+# Additional target libraries - Note that CTK_BASE_LIBRARIES is already included
+SET(KIT_target_libraries
+  )
+
+# Additional directories to include - Not that CTK_INCLUDE_LIBRARIES is already included
+SET(KIT_include_directories
+  )
+
+ctkMacroBuildQtApp(
+  NAME ${PROJECT_NAME}
+  INCLUDE_DIRECTORIES ${KIT_include_directories}
+  SRCS ${KIT_SRCS}
+  MOC_SRCS ${KIT_MOC_SRCS}
+  UI_FORMS ${KIT_UI_FORMS}
+  TARGET_LIBRARIES ${KIT_target_libraries}
+  RESOURCES ${KIT_resources}
+  )
+
+# Testing
+IF(BUILD_TESTING)
+#   ADD_SUBDIRECTORY(Testing)
+ENDIF(BUILD_TESTING)

+ 46 - 0
Applications/ctkDICOMIndexer/ctkDICOMIndexer.cxx

@@ -0,0 +1,46 @@
+
+// QT includes
+#include <QApplication>
+#include <QPushButton>
+#include <QTextStream>
+// STD includes
+//#include <cstdlib>
+
+#include <qCTKDCMTKIndexer.h>
+#include <qCTKDCMTK.h>
+
+
+int main(int argc, char** argv)
+{
+  QApplication app(argc, argv);
+  QTextStream out(stdout);
+
+  qCTKDCMTKIndexer idx;
+
+  qCTKDCMTK myCTK;
+  if ( myCTK.openDatabase( argv[1]) )
+    {
+    out << "open db success\n";
+    /// make sure it is empty and properly initialized
+    myCTK.initializeDatabase();
+    out << "init db done\n";
+    if (argc > 3)
+      {
+      idx.addDirectory(myCTK.database(),argv[2],argv[3]);
+      } 
+      else 
+      {
+      idx.addDirectory(myCTK.database(),argv[2]);
+      }
+    out << "add db done\n";
+    idx.refreshDatabase(myCTK.database(),argv[2]);
+    out << "refresh db done\n";
+    myCTK.closeDatabase();
+    }
+  else
+    { 
+    out << "ERROR: " ;
+    out << myCTK.GetLastError();
+    }
+  return EXIT_SUCCESS;
+}

Libs/DICOM/Applications/ctkDicomIndex.cxx → Applications/ctkDICOMIndexer/ctkDicomIndex.cxx


+ 1 - 0
CMakeLists.txt

@@ -117,6 +117,7 @@ SET(ctk_plugins
 #
 SET(ctk_applications
   ctkDICOM
+  ctkDICOMIndexer
   )
   
 #-----------------------------------------------------------------------------

+ 21 - 27
Libs/DICOM/Core/qCTKDCMTKIndexer.cxx

@@ -23,6 +23,7 @@
 #include <QFile>
 #include <QDirIterator>
 #include <QFileInfo>
+#include <QDebug>
 
 #define MITK_ERROR std::cout
 #define MITK_INFO std::cout
@@ -51,11 +52,10 @@ qCTKDCMTKIndexer::~qCTKDCMTKIndexer()
 {
 }
 
-void qCTKDCMTKIndexer::AddDirectory(QSqlDatabase database, const QString& directoryName)  
+void qCTKDCMTKIndexer::addDirectory(QSqlDatabase database, const QString& directoryName,const QString& destinationDirectoryName)  
 {
   QSqlDatabase db = database;
   const std::string src_directory(directoryName.toStdString());
-  // db.transaction();
 
   OFList<OFString> originalDcmtkFileNames;
   OFList<OFString> dcmtkFileNames;
@@ -124,6 +124,7 @@ void qCTKDCMTKIndexer::AddDirectory(QSqlDatabase database, const QString& direct
     OFString seriesInstanceUID, seriesDate, seriesTime,
       seriesDescription, bodyPartExamined, frameOfReferenceUID,
       contrastAgent, scanningSequence;
+    OFString instanceNumber;
 
     Sint32 seriesNumber = 0, acquisitionNumber = 0, echoNumber = 0, temporalPosition = 0;
 
@@ -148,6 +149,12 @@ void qCTKDCMTKIndexer::AddDirectory(QSqlDatabase database, const QString& direct
       MITK_ERROR << "Could not read DCM_SeriesInstanceUID from " << filename;
       continue;
     }
+    if (!fileformat.getDataset()->findAndGetOFString(DCM_InstanceNumber, instanceNumber).good())
+    {
+      MITK_ERROR << "Could not read DCM_InstanceNumber from " << filename;
+      continue;
+    }
+
 
     fileformat.getDataset()->findAndGetOFString(DCM_PatientID, patientID);
     fileformat.getDataset()->findAndGetOFString(DCM_PatientsBirthDate, patientsBirthDate);
@@ -313,35 +320,22 @@ void qCTKDCMTKIndexer::AddDirectory(QSqlDatabase database, const QString& direct
     //----------------------------------
     //Move file to destination directory
     //----------------------------------
-    /*
-    // This depends on Poco and should be converted to Qt code
-
-    Poco::File currentFile(filename);
-    Poco::Path currentFilePath(filename);
-    MITK_INFO << "currentFilePath.getFileName(): " << currentFilePath.getFileName() << "\n";
-
-    if(moveFiles)
-    {
-      std::stringstream destDirectoryPath;
-      if((dest_directory[dest_directory.length()-1] != '/') && (dest_directory[dest_directory.length()-1] != '\\'))
-        destDirectoryPath << dest_directory << Poco::Path::separator() << seriesInstanceUID.c_str();
-      else
-        destDirectoryPath << dest_directory << seriesInstanceUID.c_str();
-
-      MITK_INFO << "last symbol: " << dest_directory[dest_directory.length()-1]
-      << "\ndestDirectoryPath: " << destDirectoryPath.str() << "\n";
-
-      Poco::File directory(destDirectoryPath.str());
 
-      if (!directory.exists()) directory.createDirectory();
-
-      destDirectoryPath << Poco::Path::separator() << currentFilePath.getFileName();
-
-      currentFile.moveTo(destDirectoryPath.str());
+    if (!destinationDirectoryName.isEmpty())
+      {
+      QFile currentFile( qfilename );
+      QDir destinationDir(destinationDirectoryName);
+
+      QString uniqueDirName = QString(studyInstanceUID.c_str()) + "/" + seriesInstanceUID.c_str();
+      qDebug() << "MKPath: " << uniqueDirName;
+      destinationDir.mkpath(uniqueDirName);
+      QString destFileName = destinationDir.absolutePath().append("/").append(instanceNumber.c_str());
+      qDebug() << "Copy: " << qfilename << " -> " << destFileName;
+      currentFile.copy(destFileName);
       //for testing only: copy file instead of moving
       //currentFile.copyTo(destDirectoryPath.str());
     }
-    */
+    // */
     //------------------------
     //Add Filename to Database
     //------------------------

+ 2 - 1
Libs/DICOM/Core/qCTKDCMTKIndexer.h

@@ -15,7 +15,8 @@ class Q_CTK_DICOM_CORE_EXPORT qCTKDCMTKIndexer
 public:
   explicit qCTKDCMTKIndexer();
   virtual ~qCTKDCMTKIndexer();
-  void AddDirectory(QSqlDatabase database, const QString& directoryName);
+  /// add directory to database and optionally copy files to destinationDirectory
+  void addDirectory(QSqlDatabase database, const QString& directoryName, const QString& destinationDirectoryName = "");
   void refreshDatabase(QSqlDatabase database, const QString& directoryName);
 
 private: