Sfoglia il codice sorgente

Initial pass at DICOMRetrieve. Query working with new DCMTK code.

ctkDICOMQuery uses the now DcmSCU class functionality for C-FIND requests.  Because the DcmSCU class doesn't yet support C-MOVE requests and setting up an SCP to "catch" the images.
Daniel Blezek 15 anni fa
parent
commit
c0afc8711a

+ 6 - 3
Libs/DICOM/Core/CMakeLists.txt

@@ -28,18 +28,21 @@ SET(KIT_SRCS
   ctkDICOMIndexer.h
   ctkDICOMIndexerBase.cpp
   ctkDICOMIndexerBase.h
-  ctkDICOMQuery.cpp
-  ctkDICOMQuery.h
   ctkDICOMModel.cpp
   ctkDICOMModel.h
+  ctkDICOMQuery.cpp
+  ctkDICOMQuery.h
+  ctkDICOMRetrieve.cpp
+  ctkDICOMRetrieve.h
   )
 
 # Headers that should run through moc
 SET(KIT_MOC_SRCS
   ctkDICOM.h
+  ctkDICOMIndexerBase.h
   ctkDICOMModel.h
   ctkDICOMQuery.h
-  ctkDICOMIndexerBase.h
+  ctkDICOMRetrieve.h
   )
 
 # UI files

+ 27 - 25
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -86,25 +86,6 @@ ctkDICOMQueryPrivate::~ctkDICOMQueryPrivate()
 }
 
 
-// Find callback
-static void QueryCallback (void *callbackData, 
-                           T_DIMSE_C_FindRQ* /*request*/, 
-                           int /*responseCount*/, 
-                           T_DIMSE_C_FindRSP* /*rsp*/, 
-                           DcmDataset *dataset) {
-  ctkDICOMQuery* query = (ctkDICOMQuery*) callbackData;
-  OFString StudyDescription, PatientID, PatientsName, SeriesDescription, StudyInstanceUID;
-  dataset->findAndGetOFString ( DCM_StudyDescription, StudyDescription );
-  dataset->findAndGetOFString ( DCM_StudyInstanceUID, StudyInstanceUID );
-  dataset->findAndGetOFString ( DCM_PatientID, PatientID );
-  dataset->findAndGetOFString ( DCM_PatientsName, PatientsName );
-  logger.debug ( "Found study description: " + QString ( StudyDescription.c_str() ) 
-                 + " for Patient: " + QString ( PatientsName.c_str() )
-                 + "/" + QString ( PatientID.c_str() ) );
-  query->insert ( dataset );
-  query->addStudyInstanceUID ( QString ( StudyInstanceUID.c_str() ) );
-}
-
 //------------------------------------------------------------------------------
 // ctkDICOMQuery methods
 
@@ -246,7 +227,9 @@ void ctkDICOMQuery::query(QSqlDatabase database )
   d->query->insertEmptyElement ( DCM_NumberOfStudyRelatedSeries ); // Number of images in the series
   d->query->putAndInsertString ( DCM_QueryRetrieveLevel, "STUDY" );
 
-  OFCondition status = d->SCU.sendFINDRequest ( 0, d->query, QueryCallback, (void*)this );
+  FINDResponses *responses = new FINDResponses();
+
+  OFCondition status = d->SCU.sendFINDRequest ( 0, d->query, responses );
   if ( status.good() )
     {
     logger.debug ( "Find succeded" );
@@ -256,26 +239,45 @@ void ctkDICOMQuery::query(QSqlDatabase database )
     logger.error ( "Find failed" );
     }
 
+  for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
+    {
+    DcmDataset *dataset = (*it)->m_dataset;
+    if ( dataset != NULL )
+      {
+      this->insert ( dataset );
+      OFString StudyInstanceUID;
+      dataset->findAndGetOFString ( DCM_StudyInstanceUID, StudyInstanceUID );
+      this->addStudyInstanceUID ( QString ( StudyInstanceUID.c_str() ) );
+      }
+    }
+  delete responses;
+
   // Now search each Study
   d->query->putAndInsertString ( DCM_QueryRetrieveLevel, "SERIES" );
   foreach ( QString StudyInstanceUID, d->StudyInstanceUIDList )
     {
     logger.debug ( "Starting Series C-FIND for Series: " + StudyInstanceUID );
     d->query->putAndInsertString ( DCM_StudyInstanceUID, StudyInstanceUID.toStdString().c_str() );
-    status = d->SCU.sendFINDRequest ( 0, d->query, QueryCallback, (void*)this );
+    responses = new FINDResponses();
+    status = d->SCU.sendFINDRequest ( 0, d->query, responses );
     if ( status.good() )
       {
       logger.debug ( "Find succeded for Series: " + StudyInstanceUID );
+      for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
+        {
+        DcmDataset *dataset = (*it)->m_dataset;
+        if ( dataset != NULL )
+          {
+          this->insert ( dataset );
+          }
+        }
       }
     else
       {
       logger.error ( "Find failed for Series: " + StudyInstanceUID );
       }
+    delete responses;
     }
-    
-    
-
-
   d->SCU.closeAssociation ( DUL_PEERREQUESTEDRELEASE );
 }
 

+ 159 - 0
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -0,0 +1,159 @@
+/*=========================================================================
+
+  Library:   CTK
+ 
+  Copyright (c) 2010  Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ 
+=========================================================================*/
+
+// Qt includes
+#include <QSqlQuery>
+#include <QSqlRecord>
+#include <QVariant>
+#include <QDate>
+#include <QStringList>
+#include <QSet>
+#include <QFile>
+#include <QDirIterator>
+#include <QFileInfo>
+#include <QDebug>
+
+// ctkDICOM includes
+#include "ctkDICOMRetrieve.h"
+#include "ctkLogger.h"
+
+// DCMTK includes
+#ifndef WIN32
+  #define HAVE_CONFIG_H 
+#endif
+#include "dcmtk/dcmnet/dimse.h"
+#include "dcmtk/dcmnet/diutil.h"
+
+#include <dcmtk/dcmdata/dcfilefo.h>
+#include <dcmtk/dcmdata/dcfilefo.h>
+#include <dcmtk/dcmdata/dcdeftag.h>
+#include <dcmtk/dcmdata/dcdatset.h>
+#include <dcmtk/ofstd/ofcond.h>
+#include <dcmtk/ofstd/ofstring.h>
+#include <dcmtk/ofstd/ofstd.h>        /* for class OFStandard */
+#include <dcmtk/dcmdata/dcddirif.h>   /* for class DicomDirInterface */
+
+#include <dcmtk/dcmnet/scu.h>
+
+static ctkLogger logger ( "org.commontk.dicom.DICOMRetrieve" );
+
+//------------------------------------------------------------------------------
+class ctkDICOMRetrievePrivate: public ctkPrivate<ctkDICOMRetrieve>
+{
+public:
+  ctkDICOMRetrievePrivate();
+  ~ctkDICOMRetrievePrivate();
+  QString CallingAETitle;
+  QString CalledAETitle;
+  QString Host;
+  int CallingPort;
+  int CalledPort;
+  DcmSCU SCU;
+  DcmDataset* query;
+};
+
+//------------------------------------------------------------------------------
+// ctkDICOMRetrievePrivate methods
+
+//------------------------------------------------------------------------------
+ctkDICOMRetrievePrivate::ctkDICOMRetrievePrivate()
+{
+  query = new DcmDataset();
+}
+
+//------------------------------------------------------------------------------
+ctkDICOMRetrievePrivate::~ctkDICOMRetrievePrivate()
+{
+  delete query;
+}
+
+
+
+//------------------------------------------------------------------------------
+// ctkDICOMRetrieve methods
+
+//------------------------------------------------------------------------------
+ctkDICOMRetrieve::ctkDICOMRetrieve()
+{
+}
+
+//------------------------------------------------------------------------------
+ctkDICOMRetrieve::~ctkDICOMRetrieve()
+{
+}
+
+/// Set methods for connectivity
+void ctkDICOMRetrieve::setCallingAETitle ( QString callingAETitle )
+{
+  CTK_D(ctkDICOMRetrieve);
+  d->CallingAETitle = callingAETitle;
+}
+const QString& ctkDICOMRetrieve::callingAETitle() 
+{
+  CTK_D(ctkDICOMRetrieve);
+  return d->CallingAETitle;
+}
+void ctkDICOMRetrieve::setCalledAETitle ( QString calledAETitle )
+{
+  CTK_D(ctkDICOMRetrieve);
+  d->CalledAETitle = calledAETitle;
+}
+const QString& ctkDICOMRetrieve::calledAETitle()
+{
+  CTK_D(ctkDICOMRetrieve);
+  return d->CalledAETitle;
+}
+void ctkDICOMRetrieve::setHost ( QString host )
+{
+  CTK_D(ctkDICOMRetrieve);
+  d->Host = host;
+}
+const QString& ctkDICOMRetrieve::host()
+{
+  CTK_D(ctkDICOMRetrieve);
+  return d->Host;
+}
+void ctkDICOMRetrieve::setCallingPort ( int port ) 
+{
+  CTK_D(ctkDICOMRetrieve);
+  d->CallingPort = port;
+}
+int ctkDICOMRetrieve::callingPort()
+{
+  CTK_D(ctkDICOMRetrieve);
+  return d->CallingPort;
+}
+
+void ctkDICOMRetrieve::setCalledPort ( int port ) 
+{
+  CTK_D(ctkDICOMRetrieve);
+  d->CalledPort = port;
+}
+int ctkDICOMRetrieve::calledPort()
+{
+  CTK_D(ctkDICOMRetrieve);
+  return d->CalledPort;
+}
+
+
+
+//------------------------------------------------------------------------------
+void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir directory ) {
+}

+ 64 - 0
Libs/DICOM/Core/ctkDICOMRetrieve.h

@@ -0,0 +1,64 @@
+/*=========================================================================
+
+  Library:   CTK
+ 
+  Copyright (c) 2010  Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ 
+=========================================================================*/
+
+#ifndef __ctkDICOMRetrieve_h
+#define __ctkDICOMRetrieve_h
+
+
+// Qt includes 
+#include <QObject>
+#include <QSqlDatabase>
+#include <QDir>
+
+// CTK includes
+#include <ctkPimpl.h>
+
+#include "CTKDICOMCoreExport.h"
+
+class ctkDICOMRetrievePrivate;
+class CTK_DICOM_CORE_EXPORT ctkDICOMRetrieve : public QObject
+{
+  Q_OBJECT
+public:
+  explicit ctkDICOMRetrieve();
+  virtual ~ctkDICOMRetrieve();
+
+  /// Set methods for connectivity
+  void setCallingAETitle ( QString callingAETitle );
+  const QString& callingAETitle();
+  void setCalledAETitle ( QString calledAETitle );
+  const QString& calledAETitle();
+  void setHost ( QString host );
+  const QString& host();
+  void setCallingPort ( int port );
+  int callingPort();
+  void setCalledPort ( int port );
+  int calledPort();
+
+  // Could be a slot...
+  void retrieveSeries ( QString seriesInstanceUID, QDir directory );
+
+private:
+  CTK_DECLARE_PRIVATE(ctkDICOMRetrieve);
+
+};
+
+
+#endif