Explorar o código

More progress on retrieve.

Daniel Blezek %!s(int64=15) %!d(string=hai) anos
pai
achega
ca5b35b9ee

+ 1 - 0
CMakeLists.txt

@@ -293,6 +293,7 @@ SET(CTK_APPLICATIONS
   ctkDICOMIndexer:OFF
   ctkDICOMDemoSCU:OFF
   ctkDICOMQuery:OFF
+  ctkDICOMRetrieve:OFF
   ctkPluginBrowser:OFF
   )
   

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

@@ -174,8 +174,8 @@ void ctkDICOMQuery::query(QSqlDatabase database )
   transferSyntaxes.push_back ( UID_BigEndianExplicitTransferSyntax );
   transferSyntaxes.push_back ( UID_LittleEndianImplicitTransferSyntax );
 
-  // d->SCU.addPresentationContext ( UID_FINDStudyRootQueryRetrieveInformationModel, transferSyntaxes );
-  d->SCU.addPresentationContext ( UID_VerificationSOPClass, transferSyntaxes );
+  d->SCU.addPresentationContext ( UID_FINDStudyRootQueryRetrieveInformationModel, transferSyntaxes );
+  // d->SCU.addPresentationContext ( UID_VerificationSOPClass, transferSyntaxes );
   if ( !d->SCU.initNetwork().good() ) 
     {
     std::cerr << "Error initializing the network" << std::endl;
@@ -183,17 +183,7 @@ void ctkDICOMQuery::query(QSqlDatabase database )
     }
   logger.debug ( "Negotiating Association" );
   d->SCU.negotiateAssociation();
-  logger.debug ( "Sending Echo" );
-  OFString abstractSyntax;
-  OFString transferSyntax;
-  if ( d->SCU.sendECHORequest ( 0 ).good() )
-    {
-    std::cout << "ECHO Sucessful" << std::endl;
-    } 
-  else
-    {
-    std::cerr << "ECHO Failed" << std::endl;
-    }
+
   // Clear the query
   unsigned long elements = d->query->card();
   // Clean it out
@@ -201,7 +191,7 @@ void ctkDICOMQuery::query(QSqlDatabase database )
     {
     d->query->remove ( (unsigned long) 0 );
     }
-  d->query->insertEmptyElement ( DCM_QueryRetrieveLevel );
+//  d->query->insertEmptyElement ( DCM_QueryRetrieveLevel );
   d->query->insertEmptyElement ( DCM_PatientID );
   d->query->insertEmptyElement ( DCM_PatientsName );
   d->query->insertEmptyElement ( DCM_PatientsBirthDate );
@@ -229,7 +219,27 @@ void ctkDICOMQuery::query(QSqlDatabase database )
 
   FINDResponses *responses = new FINDResponses();
 
-  OFCondition status = d->SCU.sendFINDRequest ( 0, d->query, responses );
+  Uint16 presentationContex = 0;
+  presentationContex = d->SCU.findPresentationContextID ( UID_FINDStudyRootQueryRetrieveInformationModel, UID_LittleEndianExplicitTransferSyntax );
+  if ( presentationContex == 0 )
+    {
+  presentationContex = d->SCU.findPresentationContextID ( UID_FINDStudyRootQueryRetrieveInformationModel, UID_BigEndianExplicitTransferSyntax );
+    }
+  if ( presentationContex == 0 )
+    {
+    presentationContex = d->SCU.findPresentationContextID ( UID_FINDStudyRootQueryRetrieveInformationModel, UID_LittleEndianImplicitTransferSyntax );
+    }
+
+  if ( presentationContex == 0 )
+    {
+    logger.error ( "Failed to find acceptable presentation context" );
+    }
+  else
+    {
+    logger.info ( "Found useful presentation context" );
+    }
+
+  OFCondition status = d->SCU.sendFINDRequest ( presentationContex, d->query, responses );
   if ( status.good() )
     {
     logger.debug ( "Find succeded" );

+ 54 - 3
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -66,7 +66,7 @@ public:
   int CallingPort;
   int CalledPort;
   DcmSCU SCU;
-  DcmDataset* query;
+  DcmDataset* parameters;
 };
 
 //------------------------------------------------------------------------------
@@ -75,13 +75,13 @@ public:
 //------------------------------------------------------------------------------
 ctkDICOMRetrievePrivate::ctkDICOMRetrievePrivate()
 {
-  query = new DcmDataset();
+  parameters = new DcmDataset();
 }
 
 //------------------------------------------------------------------------------
 ctkDICOMRetrievePrivate::~ctkDICOMRetrievePrivate()
 {
-  delete query;
+  delete parameters;
 }
 
 
@@ -156,4 +156,55 @@ int ctkDICOMRetrieve::calledPort()
 
 //------------------------------------------------------------------------------
 void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir directory ) {
+  CTK_D(ctkDICOMRetrieve);
+  logger.info ( "Starting retrieveSeries" );
+  DcmSCU scu;
+  scu.setAETitle ( this->callingAETitle().toStdString() );
+  scu.setPeerAETitle ( this->calledAETitle().toStdString() );
+  scu.setPeerHostName ( this->host().toStdString() );
+  scu.setPeerPort ( this->calledPort() );
+
+  logger.error ( "Setting Transfer Syntaxes" );
+  OFList<OFString> transferSyntaxes;
+  transferSyntaxes.push_back ( UID_LittleEndianExplicitTransferSyntax );
+  transferSyntaxes.push_back ( UID_BigEndianExplicitTransferSyntax );
+  transferSyntaxes.push_back ( UID_LittleEndianImplicitTransferSyntax );
+  scu.addPresentationContext ( UID_MOVEStudyRootQueryRetrieveInformationModel, transferSyntaxes );
+
+
+  if ( !scu.initNetwork().good() ) 
+    {
+    logger.error ( "Error initializing the network" );
+    return;
+    }
+  logger.debug ( "Negotiating Association" );
+  if ( !scu.negotiateAssociation().good() )
+    {
+    logger.error ( "Error negotiating association" );
+    return;
+    }
+  // Clear the query
+  unsigned long elements = d->parameters->card();
+  // Clean it out
+  for ( unsigned long i = 0; i < elements; i++ ) 
+    {
+    d->parameters->remove ( (unsigned long) 0 );
+    }
+  d->parameters->putAndInsertString ( DCM_SeriesInstanceUID, seriesInstanceUID.toStdString().c_str() );
+
+  MOVEResponses *responses = new MOVEResponses();
+  OFCondition status = scu.sendMOVERequest ( 0, d->parameters, responses );
+  if ( status.good() )
+    {
+    logger.debug ( "Find succeded" );
+    }
+  else
+    {
+    logger.error ( "Find failed" );
+    }
+  return;
+  
+}
+void ctkDICOMRetrieve::retrieveStudy ( QString studyInstanceUID, QDir directory ) {
 }
+

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

@@ -54,8 +54,10 @@ public:
 
   // Could be a slot...
   void retrieveSeries ( QString seriesInstanceUID, QDir directory );
+  void retrieveStudy ( QString studyInstanceUID, QDir directory );
 
 private:
+  void retrieve ( QDir directory );
   CTK_DECLARE_PRIVATE(ctkDICOMRetrieve);
 
 };

+ 9 - 9
Libs/Widgets/ctkTransferFunctionNativeItem.cpp

@@ -32,8 +32,8 @@
 #include "ctkTransferFunctionScene.h"
 
 #include <windows.h>
-#include <gl\gl.h>							// Header File For The OpenGL32 Library
-#include <gl\glu.h>							// Header File For The GLu32 Library
+#include <gl\gl.h>							// Header File For The OpenGL32 Library
+#include <gl\glu.h>							// Header File For The GLu32 Library
 
 
 class ctkTransferFunctionNativeItemPrivate:public ctkPrivate<ctkTransferFunctionNativeItem>
@@ -55,9 +55,9 @@ void ctkTransferFunctionNativeItemPrivate::initTexture()
   glGenTextures(1, &this->Texture[0]);
 
   glBindTexture(GL_TEXTURE_2D, this->Texture[0]);
-  if (!glIsTexture(this->Texture[0]))
-    {
-    qDebug() << "pb texture";
+  if (!glIsTexture(this->Texture[0]))
+    {
+    qDebug() << "pb texture";
     }
   float transferFunction[12] = {0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,1.};
   glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 1, 0, GL_RGB, GL_FLOAT, transferFunction);
@@ -107,10 +107,10 @@ void ctkTransferFunctionNativeItem::paint(
   //glDisable(GL_DEPTH_TEST);
   //glDepthFunc(GL_LEQUAL);
   glBindTexture(GL_TEXTURE_2D, d->Texture[0]);
-  glBegin(GL_QUADS);
-		glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
-		glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f);
-		glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f);
+  glBegin(GL_QUADS);
+		glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
+		glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f);
+		glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f);
 		glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 0.0f);
   glEnd();
   painter->endNativePainting();