浏览代码

Initial pass at Retrive is working.

Daniel Blezek 15 年之前
父节点
当前提交
c4c58138fe

+ 11 - 2
Applications/ctkDICOMRetrieve/ctkDICOMRetrieveMain.cpp

@@ -59,7 +59,7 @@ int main(int argc, char** argv)
   QTextStream out(stdout);
 
   QString SeriesUID ( argv[1] );
-  QDir OutputDirectory ( argv[1] );
+  QDir OutputDirectory ( argv[2] );
   QString CallingAETitle ( argv[3] ); 
   bool ok;
   int CallingPort = QString ( argv[4] ).toInt ( &ok );
@@ -87,10 +87,19 @@ int main(int argc, char** argv)
   retrieve.setCalledPort ( CalledPort );
   retrieve.setHost ( Host );
 
+  logger.info ( "SeriesUID: " + SeriesUID + "\n" 
+                + "OutputDirectory: " + OutputDirectory.absolutePath() + "\n"
+                + "CallingAETitle: " + CallingAETitle + "\n"
+                + "CallingPort: " + QString ( CallingPort ) + "\n"
+                + "CalledAEtitle: " + CalledAETitle + "\n"
+                + "Host: " + Host + "\n"
+                + "CalledPort: " + QString ( CalledPort ) + "\n" );
+
+
   logger.info ( "Starting to retrieve" );
   try
     {
-    retrieve.retrieveSeries ( SeriesUID, QDir ( OutputDirectory ) );
+    retrieve.retrieveSeries ( SeriesUID, OutputDirectory );
     }
   catch (std::exception e)
     {

+ 70 - 2
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -50,8 +50,15 @@
 #include <dcmtk/ofstd/ofstd.h>        /* for class OFStandard */
 #include <dcmtk/dcmdata/dcddirif.h>   /* for class DicomDirInterface */
 
+#include <dcmtk/dcmjpeg/djdecode.h>  /* for dcmjpeg decoders */
+#include <dcmtk/dcmjpeg/djencode.h>  /* for dcmjpeg encoders */
+#include <dcmtk/dcmdata/dcrledrg.h>  /* for DcmRLEDecoderRegistration */
+#include <dcmtk/dcmdata/dcrleerg.h>  /* for DcmRLEEncoderRegistration */
+
 #include <dcmtk/dcmnet/scu.h>
 
+#include "dcmtk/oflog/oflog.h"
+
 static ctkLogger logger ( "org.commontk.dicom.DICOMRetrieve" );
 
 //------------------------------------------------------------------------------
@@ -158,8 +165,25 @@ int ctkDICOMRetrieve::calledPort()
 void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir directory ) {
   CTK_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveSeries" );
+
+  // Register the JPEG libraries in case we need them
+  //   (registration only happens once, so it's okay to call repeatedly)
+  // register global JPEG decompression codecs
+  DJDecoderRegistration::registerCodecs();
+  // register global JPEG compression codecs
+  DJEncoderRegistration::registerCodecs();
+  // register RLE compression codec
+  DcmRLEEncoderRegistration::registerCodecs();
+  // register RLE decompression codec
+  DcmRLEDecoderRegistration::registerCodecs();
+
+  // Set the DCMTK log level
+  log4cplus::Logger rootLogger = log4cplus::Logger::getRoot();
+  rootLogger.setLogLevel(log4cplus::DEBUG_LOG_LEVEL);
+
   DcmSCU scu;
   scu.setAETitle ( this->callingAETitle().toStdString() );
+  scu.setPort ( this->callingPort() );
   scu.setPeerAETitle ( this->calledAETitle().toStdString() );
   scu.setPeerHostName ( this->host().toStdString() );
   scu.setPeerPort ( this->calledPort() );
@@ -169,6 +193,7 @@ void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir director
   transferSyntaxes.push_back ( UID_LittleEndianExplicitTransferSyntax );
   transferSyntaxes.push_back ( UID_BigEndianExplicitTransferSyntax );
   transferSyntaxes.push_back ( UID_LittleEndianImplicitTransferSyntax );
+  scu.addPresentationContext ( UID_FINDStudyRootQueryRetrieveInformationModel, transferSyntaxes );
   scu.addPresentationContext ( UID_MOVEStudyRootQueryRetrieveInformationModel, transferSyntaxes );
 
 
@@ -190,6 +215,7 @@ void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir director
     {
     d->parameters->remove ( (unsigned long) 0 );
     }
+  d->parameters->putAndInsertString ( DCM_QueryRetrieveLevel, "SERIES" );
   d->parameters->putAndInsertString ( DCM_SeriesInstanceUID, seriesInstanceUID.toStdString().c_str() );
 
   MOVEResponses *responses = new MOVEResponses();
@@ -197,14 +223,56 @@ void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir director
   if ( status.good() )
     {
     logger.debug ( "Find succeded" );
+
+    // Try to create the directory
+    directory.mkpath ( directory.absolutePath() );
+
+    // Write the responses out to disk
+    for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
+      {
+      DcmDataset *dataset = (*it)->m_dataset;
+      if ( dataset != NULL )
+        {
+        // Save in correct directory
+        E_TransferSyntax output_transfersyntax = dataset->getOriginalXfer();
+        dataset->chooseRepresentation( output_transfersyntax, NULL );
+        
+        if ( !dataset->canWriteXfer( output_transfersyntax ) )
+          {
+          // Pick EXS_LittleEndianExplicit as our default
+          output_transfersyntax = EXS_LittleEndianExplicit;
+          }
+        
+        DcmXfer opt_oxferSyn( output_transfersyntax );
+        if ( !dataset->chooseRepresentation( opt_oxferSyn.getXfer(), NULL ).bad() )
+          {
+          DcmFileFormat* fileformat = new DcmFileFormat ( dataset );
+          
+          // Follow dcmdjpeg example
+          fileformat->loadAllDataIntoMemory();
+          OFString SOPInstanceUID;
+          dataset->findAndGetOFString ( DCM_SOPInstanceUID, SOPInstanceUID );
+          QFileInfo fi ( directory, QString ( SOPInstanceUID.c_str() ) );
+          logger.debug ( "Saving file: " + fi.absoluteFilePath() );
+          status = fileformat->saveFile ( fi.absoluteFilePath().toStdString().c_str(), opt_oxferSyn.getXfer() );
+          if ( !status.good() )
+            {
+            logger.error ( "Error saving file: " + fi.absoluteFilePath() + " Error is " + status.text() );
+            }
+          
+          delete fileformat;
+          }
+        }
+      }
     }
   else
     {
-    logger.error ( "Find failed" );
+    logger.error ( "MOVE Request failed: " + QString ( status.text() ) );
     }
+  delete responses;
   return;
-  
 }
+
 void ctkDICOMRetrieve::retrieveStudy ( QString studyInstanceUID, QDir directory ) {
 }
 

+ 61 - 11
Utilities/CMake/FindDCMTK.cmake

@@ -106,6 +106,59 @@ FIND_LIBRARY( DCMTK_dcmdata_LIBRARY dcmdata
   NO_DEFAULT_PATH
 )
 
+FIND_PATH( DCMTK_dcmjpeg_INCLUDE_DIR djdecode.h
+  PATHS
+    ${DCMTK_DIR}/include/dcmjpeg
+    ${DCMTK_DIR}/include/dcmtk/dcmjpeg
+    ${DCMTK_DIR}/dcmjpeg
+    ${DCMTK_DIR}/dcmjpeg/include
+  NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY( DCMTK_dcmjpeg_LIBRARY dcmjpeg
+  PATHS
+    ${DCMTK_DIR}/dcmjpeg/libsrc
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Release
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Debug
+    ${DCMTK_DIR}/dcmjpeg/Release
+    ${DCMTK_DIR}/dcmjpeg/Debug
+    ${DCMTK_DIR}/lib
+  NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY( DCMTK_ijg12_LIBRARY ijg12
+  PATHS
+    ${DCMTK_DIR}/dcmjpeg/libsrc
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Release
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Debug
+    ${DCMTK_DIR}/dcmjpeg/Release
+    ${DCMTK_DIR}/dcmjpeg/Debug
+    ${DCMTK_DIR}/lib
+  NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY( DCMTK_ijg16_LIBRARY ijg16
+  PATHS
+    ${DCMTK_DIR}/dcmjpeg/libsrc
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Release
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Debug
+    ${DCMTK_DIR}/dcmjpeg/Release
+    ${DCMTK_DIR}/dcmjpeg/Debug
+    ${DCMTK_DIR}/lib
+  NO_DEFAULT_PATH
+)
+
+FIND_LIBRARY( DCMTK_ijg8_LIBRARY ijg8
+  PATHS
+    ${DCMTK_DIR}/dcmjpeg/libsrc
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Release
+    ${DCMTK_DIR}/dcmjpeg/libsrc/Debug
+    ${DCMTK_DIR}/dcmjpeg/Release
+    ${DCMTK_DIR}/dcmjpeg/Debug
+    ${DCMTK_DIR}/lib
+  NO_DEFAULT_PATH
+)
+
 FIND_PATH( DCMTK_dcmnet_INCLUDE_DIR dimse.h
   PATHS
     ${DCMTK_DIR}/include/dcmnet
@@ -163,6 +216,8 @@ IF( DCMTK_config_INCLUDE_DIR
     AND DCMTK_oflog_LIBRARY
     AND DCMTK_dcmdata_INCLUDE_DIR
     AND DCMTK_dcmdata_LIBRARY
+    AND DCMTK_dcmjpeg_INCLUDE_DIR
+    AND DCMTK_dcmjpeg_LIBRARY
     AND DCMTK_dcmnet_INCLUDE_DIR
     AND DCMTK_dcmnet_LIBRARY    
     AND DCMTK_dcmimgle_INCLUDE_DIR
@@ -185,6 +240,7 @@ IF( DCMTK_config_INCLUDE_DIR
     ${DCMTK_ofstd_INCLUDE_DIR}
     ${DCMTK_oflog_INCLUDE_DIR}    
     ${DCMTK_dcmdata_INCLUDE_DIR}
+    ${DCMTK_dcmjpeg_INCLUDE_DIR}
     ${DCMTK_dcmnet_INCLUDE_DIR}
     ${DCMTK_dcmimgle_INCLUDE_DIR}
   )
@@ -192,7 +248,11 @@ IF( DCMTK_config_INCLUDE_DIR
   SET( DCMTK_LIBRARIES
     ${DCMTK_dcmimgle_LIBRARY}
     ${DCMTK_dcmnet_LIBRARY}    
+    ${DCMTK_dcmjpeg_LIBRARY}
     ${DCMTK_dcmdata_LIBRARY}
+    ${DCMTK_ijg8_LIBRARY}
+    ${DCMTK_ijg12_LIBRARY}
+    ${DCMTK_ijg16_LIBRARY}
     ${DCMTK_oflog_LIBRARY}    
     ${DCMTK_ofstd_LIBRARY}
     ${DCMTK_config_LIBRARY}
@@ -213,17 +273,7 @@ IF( DCMTK_config_INCLUDE_DIR
 #     SET( DCMTK_LIBRARIES ${DCMTK_LIBRARIES} ${DCMTK_wrap_LIBRARY} )
 #   ENDIF()
 
-ENDIF( DCMTK_config_INCLUDE_DIR 
-    AND DCMTK_ofstd_INCLUDE_DIR 
-    AND DCMTK_ofstd_LIBRARY
-    AND DCMTK_oflog_INCLUDE_DIR
-    AND DCMTK_oflog_LIBRARY
-    AND DCMTK_dcmdata_INCLUDE_DIR
-    AND DCMTK_dcmdata_LIBRARY
-    AND DCMTK_dcmnet_INCLUDE_DIR
-    AND DCMTK_dcmnet_LIBRARY    
-    AND DCMTK_dcmimgle_INCLUDE_DIR
-    AND DCMTK_dcmimgle_LIBRARY )
+ENDIF()
 
 FIND_PROGRAM(DCMTK_DCMDUMP_EXECUTABLE dcmdump
   PATHS