瀏覽代碼

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 CalledAETitle;
   QString Host;
   QString Host;
   int Port;
   int Port;
+  QMap<QString,QVariant> Filters;
   DcmSCU SCU;
   DcmSCU SCU;
   DcmDataset* query;
   DcmDataset* query;
   QStringList StudyInstanceUIDList;
   QStringList StudyInstanceUIDList;
@@ -147,7 +148,16 @@ int ctkDICOMQuery::port()
   Q_D(ctkDICOMQuery);
   Q_D(ctkDICOMQuery);
   return d->Port;
   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" );
   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();
   FINDResponses *responses = new FINDResponses();
 
 
   Uint16 presentationContex = 0;
   Uint16 presentationContex = 0;

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

@@ -23,6 +23,8 @@
 
 
 // Qt includes 
 // Qt includes 
 #include <QObject>
 #include <QObject>
+#include <QMap>
+#include <QString>
 #include <QSqlDatabase>
 #include <QSqlDatabase>
 
 
 // CTK includes
 // 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 callingAETitle READ callingAETitle WRITE setCallingAETitle);
   Q_PROPERTY(QString calledAETitle READ calledAETitle WRITE setCallingAETitle);
   Q_PROPERTY(QString calledAETitle READ calledAETitle WRITE setCallingAETitle);
   Q_PROPERTY(int port READ port WRITE setPort);
   Q_PROPERTY(int port READ port WRITE setPort);
+
 public:
 public:
   explicit ctkDICOMQuery();
   explicit ctkDICOMQuery();
   virtual ~ctkDICOMQuery();
   virtual ~ctkDICOMQuery();
@@ -55,9 +58,17 @@ public:
   /// Query a remote DICOM Image Store SCP
   /// Query a remote DICOM Image Store SCP
   void query(ctkDICOMDatabase& database);
   void query(ctkDICOMDatabase& database);
 
 
-  // Add a StudyInstanceUID to be queried
+  /// Add a StudyInstanceUID to be queried
   void addStudyInstanceUID ( QString StudyInstanceUID );
   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:
 protected:
   QScopedPointer<ctkDICOMQueryPrivate> d_ptr;
   QScopedPointer<ctkDICOMQueryPrivate> d_ptr;
 
 

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

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

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

@@ -88,13 +88,13 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
   QStringList serverNodes = d->serverNodeWidget->nodes();
   QStringList serverNodes = d->serverNodeWidget->nodes();
   foreach (QString server, serverNodes)
   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] = new ctkDICOMQuery;
       d->queries[server]->setCallingAETitle(d->serverNodeWidget->callingAETitle());
       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());
       d->queries[server]->setPort(parameters["Port"].toInt());
       // TODO: add interface to ctkDICOMQuery for specifying query params
       // TODO: add interface to ctkDICOMQuery for specifying query params
       // for now, query for everything
       // for now, query for everything
@@ -106,7 +106,7 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
       }
       }
       catch (std::exception e)
       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);
   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);
   explicit ctkDICOMQueryWidget(QWidget* parent=0);
   virtual ~ctkDICOMQueryWidget();
   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:
 protected:
   QScopedPointer<ctkDICOMQueryWidgetPrivate> d_ptr;
   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);
   Q_D(ctkDICOMServerNodeWidget);
 
 
-  QMap<QString, QString> parameters;
+  QMap<QString, QVariant> parameters;
   int count = d->nodeTable->rowCount();
   int count = d->nodeTable->rowCount();
   QStringList keys;
   QStringList keys;
   keys << "Name" << "AETitle" << "Address" << "Port";
   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[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();
   QString callingAETitle();
   QStringList nodes();
   QStringList nodes();
-  QMap<QString,QString> nodeParameters(QString &node);
+  QMap<QString,QVariant> nodeParameters(QString &node);
 
 
 public slots:
 public slots:
   void addNode ();
   void addNode ();