Преглед изворни кода

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 пре 14 година
родитељ
комит
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 ();