Explorar o código

Add parameter passing for filtered queries

ctkDICOMWidgets now expose a parameters() method that passes
back a QMap<QString, QVariant> of the currently selected
gui configuration.  These are passed to the ctkDICOMQuery for
use in constructing the query to the dicom servers (work
in progress)
Steve Pieper %!s(int64=14) %!d(string=hai) anos
pai
achega
99aa79d15d

+ 39 - 1
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -64,6 +64,7 @@ public:
   QString CalledAETitle;
   QString Host;
   int Port;
+  QMap<QString,QVariant> Filters;
   DcmSCU SCU;
   DcmDataset* query;
   QStringList StudyInstanceUIDList;
@@ -147,7 +148,16 @@ int ctkDICOMQuery::port()
   Q_D(ctkDICOMQuery);
   return d->Port;
 }
-
+void ctkDICOMQuery::setFilters ( QMap<QString,QVariant> filters ) 
+{
+  Q_D(ctkDICOMQuery);
+  d->Filters = filters;
+}
+QMap<QString,QVariant> ctkDICOMQuery::filters()
+{
+  Q_D(ctkDICOMQuery);
+  return d->Filters;
+}
 
 
 //------------------------------------------------------------------------------
@@ -214,6 +224,34 @@ void ctkDICOMQuery::query(ctkDICOMDatabase& database )
 
   d->query->putAndInsertString ( DCM_QueryRetrieveLevel, "STUDY" );
 
+  foreach( QString key, d->Filters.keys() )
+  {
+    if ( key == QString("Name") )
+    {
+      // make the filter a wildcard in dicom style
+      d->query->putAndInsertString( DCM_PatientsName,
+        (QString("*") + d->Filters[key].toString() + QString("*")).toAscii().data());
+    }
+    if ( key == QString("Study") )
+    {
+      // make the filter a wildcard in dicom style
+      d->query->putAndInsertString( DCM_StudyDescription,
+        (QString("*") + d->Filters[key].toString() + QString("*")).toAscii().data());
+    }
+    if ( key == QString("Series") )
+    {
+      // make the filter a wildcard in dicom style
+      d->query->putAndInsertString( DCM_SeriesDescription,
+        (QString("*") + d->Filters[key].toString() + QString("*")).toAscii().data());
+    }
+    if ( key == QString("ID") )
+    {
+      // make the filter a wildcard in dicom style
+      d->query->putAndInsertString( DCM_PatientID,
+        (QString("*") + d->Filters[key].toString() + QString("*")).toAscii().data());
+    }
+  }
+
   FINDResponses *responses = new FINDResponses();
 
   Uint16 presentationContex = 0;

+ 12 - 1
Libs/DICOM/Core/ctkDICOMQuery.h

@@ -23,6 +23,8 @@
 
 // Qt includes 
 #include <QObject>
+#include <QMap>
+#include <QString>
 #include <QSqlDatabase>
 
 // CTK includes
@@ -38,6 +40,7 @@ class CTK_DICOM_CORE_EXPORT ctkDICOMQuery : public QObject
   Q_PROPERTY(QString callingAETitle READ callingAETitle WRITE setCallingAETitle);
   Q_PROPERTY(QString calledAETitle READ calledAETitle WRITE setCallingAETitle);
   Q_PROPERTY(int port READ port WRITE setPort);
+
 public:
   explicit ctkDICOMQuery();
   virtual ~ctkDICOMQuery();
@@ -55,9 +58,17 @@ public:
   /// Query a remote DICOM Image Store SCP
   void query(ctkDICOMDatabase& database);
 
-  // Add a StudyInstanceUID to be queried
+  /// Add a StudyInstanceUID to be queried
   void addStudyInstanceUID ( QString StudyInstanceUID );
 
+  ///
+  // Filters are keyword/value pairs as generated by
+  // the ctkDICOMWidgets in a human readable (and editable)
+  // format.  The Query is responsible for converting these
+  // into the appropriate dicom syntax for the C-Find
+  void setFilters(QMap<QString,QVariant>);
+  QMap<QString,QVariant> filters();
+
 protected:
   QScopedPointer<ctkDICOMQueryPrivate> d_ptr;
 

+ 4 - 4
Libs/DICOM/Widgets/Resources/UI/ctkDICOMQueryWidget.ui

@@ -42,7 +42,7 @@
         </attribute>
         <layout class="QVBoxLayout" name="verticalLayout_7">
          <item>
-          <widget class="QLineEdit" name="NameSearch"/>
+          <widget class="QLineEdit" name="nameSearch"/>
          </item>
         </layout>
        </widget>
@@ -55,7 +55,7 @@
         </attribute>
         <layout class="QVBoxLayout" name="verticalLayout_8">
          <item>
-          <widget class="QLineEdit" name="StudySearch"/>
+          <widget class="QLineEdit" name="studySearch"/>
          </item>
         </layout>
        </widget>
@@ -68,7 +68,7 @@
         </attribute>
         <layout class="QVBoxLayout" name="verticalLayout_9">
          <item>
-          <widget class="QLineEdit" name="SeriesSearch"/>
+          <widget class="QLineEdit" name="seriesSearch"/>
          </item>
         </layout>
        </widget>
@@ -81,7 +81,7 @@
         </attribute>
         <layout class="QVBoxLayout" name="verticalLayout_10">
          <item>
-          <widget class="QLineEdit" name="IDSearch"/>
+          <widget class="QLineEdit" name="idSearch"/>
          </item>
         </layout>
        </widget>

+ 5 - 5
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -88,13 +88,13 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
   QStringList serverNodes = d->serverNodeWidget->nodes();
   foreach (QString server, serverNodes)
   {
-    QMap<QString, QString> parameters = d->serverNodeWidget->nodeParameters(server);
-    if ( parameters["CheckState"] == QVariant(Qt::Checked).toString() )
+    QMap<QString, QVariant> parameters = d->serverNodeWidget->nodeParameters(server);
+    if ( parameters["CheckState"] == Qt::Checked )
     {
       d->queries[server] = new ctkDICOMQuery;
       d->queries[server]->setCallingAETitle(d->serverNodeWidget->callingAETitle());
-      d->queries[server]->setCalledAETitle(parameters["AETitle"]);
-      d->queries[server]->setHost(parameters["Address"]);
+      d->queries[server]->setCalledAETitle(parameters["AETitle"].toString());
+      d->queries[server]->setHost(parameters["Address"].toString());
       d->queries[server]->setPort(parameters["Port"].toInt());
       // TODO: add interface to ctkDICOMQuery for specifying query params
       // for now, query for everything
@@ -106,7 +106,7 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
       }
       catch (std::exception e)
       {
-        logger.error ( "Query error: " + parameters["Name"] );
+        logger.error ( "Query error: " + parameters["Name"].toString() );
       }
     }
   }

+ 9 - 12
Libs/DICOM/Widgets/ctkDICOMQueryWidget.cpp

@@ -37,19 +37,16 @@ ctkDICOMQueryWidget::~ctkDICOMQueryWidget()
 
 
 //----------------------------------------------------------------------------
-void ctkDICOMQueryWidget::populateQuery(/*ctkDICOMQuery &query*/)
+QMap<QString,QVariant> ctkDICOMQueryWidget::parameters()
 {
   Q_D(ctkDICOMQueryWidget);
-  if ( d->CT->isChecked() )
-  {
-    std::cerr << "CT\n";
-    //query.addModality( "CT" );
-  }
-
-  if ( d->MR->isChecked() )
-  {
-    std::cerr << "MR\n";
-    //query.addModality( "CT" );
-  }
 
+  QMap<QString,QVariant> parameters;
+
+  parameters["Name"] = d->nameSearch->text();
+  parameters["Study"] = d->studySearch->text();
+  parameters["Series"] = d->seriesSearch->text();
+  parameters["ID"] = d->idSearch->text();
+
+  return parameters;
 }

+ 2 - 2
Libs/DICOM/Widgets/ctkDICOMQueryWidget.h

@@ -35,8 +35,8 @@ public:
   explicit ctkDICOMQueryWidget(QWidget* parent=0);
   virtual ~ctkDICOMQueryWidget();
   
-  /// set properties of query based on current widget state
-  void populateQuery (/*ctkDICOMQuery &query*/);
+  /// return map of field names and values
+  QMap<QString,QVariant> parameters();
 
 protected:
   QScopedPointer<ctkDICOMQueryWidgetPrivate> d_ptr;

+ 3 - 3
Libs/DICOM/Widgets/ctkDICOMServerNodeWidget.cpp

@@ -213,11 +213,11 @@ QStringList ctkDICOMServerNodeWidget::nodes()
 }
 
 //----------------------------------------------------------------------------
-QMap<QString, QString> ctkDICOMServerNodeWidget::nodeParameters(QString &node)
+QMap<QString, QVariant> ctkDICOMServerNodeWidget::nodeParameters(QString &node)
 {
   Q_D(ctkDICOMServerNodeWidget);
 
-  QMap<QString, QString> parameters;
+  QMap<QString, QVariant> parameters;
   int count = d->nodeTable->rowCount();
   QStringList keys;
   keys << "Name" << "AETitle" << "Address" << "Port";
@@ -231,7 +231,7 @@ QMap<QString, QString> ctkDICOMServerNodeWidget::nodeParameters(QString &node)
         {
           parameters[keys.at(k)] = d->nodeTable->item(row,k)->text();
         }
-        parameters["CheckState"] = QVariant(d->nodeTable->item(row,0)->checkState()).toString();
+        parameters["CheckState"] = d->nodeTable->item(row,0)->checkState();
       }
     }
   }

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMServerNodeWidget.h

@@ -42,7 +42,7 @@ public:
 
   QString callingAETitle();
   QStringList nodes();
-  QMap<QString,QString> nodeParameters(QString &node);
+  QMap<QString,QVariant> nodeParameters(QString &node);
 
 public slots:
   void addNode ();