Kaynağa Gözat

Merge branch 'dicom-queries' of github.com:commontk/CTK into dicom-queries

nherlambang 14 yıl önce
ebeveyn
işleme
b7f7af694d

+ 1 - 1
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -168,7 +168,7 @@ void ctkDICOMDataset::Deserialize()
   {
     std::cerr << "** Condition code of Dataset::read() is " << condition.code() << std::endl;
     std::cerr << "** Buffer state: " << dcmbuffer.status().code() << " " <<  dcmbuffer.good() << " " << dcmbuffer.eos() << " tell " << dcmbuffer.tell() << " avail " << dcmbuffer.avail() << std::endl;
-    std::cerr << "** Dataset state: " << dataset.transferState() << std::endl;
+    std::cerr << "** Dataset state: " << (int)dataset.transferState() << std::endl;
     std::cerr << std::string("Could not DcmDataset::read(..): ") + condition.text() << std::endl;
     //throw std::invalid_argument( std::string("Could not DcmDataset::read(..): ") + condition.text() );
   }

+ 35 - 20
Libs/DICOM/Core/ctkDICOMModel.cpp

@@ -71,7 +71,7 @@ public:
 
   Node*        RootNode;
   QSqlDatabase DataBase;
-  QStringList  Headers;
+  QList<QMap<int, QVariant> > Headers;
   QString      Sort;
 };
 
@@ -114,8 +114,25 @@ ctkDICOMModelPrivate::~ctkDICOMModelPrivate()
 //------------------------------------------------------------------------------
 void ctkDICOMModelPrivate::init()
 {
-  this->Headers = QStringList() << "Name" << "Age" << "Scan" << "Date" << "Subject ID"
-                  << "Number" << "Institution" << "Referrer" << "Performer";
+  QMap<int, QVariant> data;
+  data[Qt::DisplayRole] = QString("Name");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Age");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Scan");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Date");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Subject ID");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Number");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Institution");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Referrer");
+  this->Headers << data;
+  data[Qt::DisplayRole] = QString("Performer");
+  this->Headers << data;
 }
 
 //------------------------------------------------------------------------------
@@ -406,7 +423,8 @@ QVariant ctkDICOMModel::data ( const QModelIndex & dataIndex, int role ) const
     {      
     const_cast<ctkDICOMModelPrivate *>(d)->fetch(dataIndex, dataIndex.row());
     }
-  int field = parentNode->Query.record().indexOf(d->Headers[dataIndex.column()]);
+  QString columnName = d->Headers[dataIndex.column()][Qt::DisplayRole].toString();
+  int field = parentNode->Query.record().indexOf(columnName);
   if (field < 0)
     {
     // Not all the columns are in the record, it's ok to have no field here.
@@ -469,18 +487,19 @@ bool ctkDICOMModel::hasChildren ( const QModelIndex & parentIndex ) const
 QVariant ctkDICOMModel::headerData(int section, Qt::Orientation orientation, int role)const
 {
   Q_D(const ctkDICOMModel);
-  if (role != Qt::DisplayRole &&
-      role != Qt::EditRole)
-    {
-    return QVariant();
-    }
   if (orientation == Qt::Vertical)
     {
+    if (role != Qt::DisplayRole)
+      {
+      return QVariant();
+      }
     return section;
     }
-  Q_ASSERT(orientation == Qt::Horizontal);
-  Q_ASSERT(section < d->Headers.size());
-  return d->Headers[section];
+  if (section < 0 || section >= d->Headers.size())
+    {
+    return QVariant();
+    }
+  return d->Headers[section][role];
 }
 
 //------------------------------------------------------------------------------
@@ -618,7 +637,7 @@ void ctkDICOMModel::sort(int column, Qt::SortOrder order)
   delete d->RootNode;
   d->RootNode = 0;
   d->Sort = QString("\"%1\" %2")
-    .arg(d->Headers[column])
+    .arg(d->Headers[column][Qt::DisplayRole].toString())
     .arg(order == Qt::AscendingOrder ? "ASC" : "DESC");
   d->RootNode = d->createNode(-1, QModelIndex());
   
@@ -629,20 +648,16 @@ void ctkDICOMModel::sort(int column, Qt::SortOrder order)
 bool ctkDICOMModel::setHeaderData ( int section, Qt::Orientation orientation, const QVariant & value, int role)
 {
   Q_D(ctkDICOMModel);
-  if (role != Qt::DisplayRole &&
-      role != Qt::EditRole)
-    {
-    return false;
-    }
   if (orientation == Qt::Vertical)
     {
     return false;
     }
-  if (value.toString() == d->Headers[section])
+  if (section < 0 || section >= d->Headers.size() ||
+      d->Headers[section][role] == value)
     {
     return false;
     }
-  d->Headers[section] = value.toString();
+  d->Headers[section][role] = value;
   emit this->headerDataChanged(orientation, section, section);
   return true;
 }

+ 20 - 3
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -124,7 +124,7 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
       }
     }
   }
-
+  
   // checkable headers - allow user to select the patient/studies to retrieve
   d->results->setModel(&d->model);
   d->model.setDatabase(d->queryResultDatabase.database());
@@ -148,6 +148,8 @@ void ctkDICOMQueryRetrieveWidget::processRetrieve()
 {
   Q_D(ctkDICOMQueryRetrieveWidget);
 
+  QMap<QString,QVariant> serverParameters = d->ServerNodeWidget->parameters();
+
   foreach( QString studyUID, d->queriesByStudyUID.keys() )
   {
     logger.debug("need to retrieve " + studyUID + " from " + d->queriesByStudyUID[studyUID]->host());
@@ -156,8 +158,23 @@ void ctkDICOMQueryRetrieveWidget::processRetrieve()
     d->retrievalsByStudyUID[studyUID] = retrieve;
     retrieve->setCallingAETitle( query->callingAETitle() );
     retrieve->setCalledAETitle( query->calledAETitle() );
-    retrieve->setHost( query->host() );
-    //retrieve->setCallingPort( query->port() );
     retrieve->setCalledPort( query->port() );
+    retrieve->setHost( query->host() );
+
+    // pull from GUI
+    retrieve->setMoveDestinationAETitle( serverParameters["StorageAETitle"].toString() );
+    retrieve->setCallingPort( serverParameters["StoragePort"].toInt() );
+
+    logger.info ( "Starting to retrieve" );
+    try
+      {
+      retrieve->retrieveStudy ( studyUID, QDir("/tmp/ctk") );
+      }
+    catch (std::exception e)
+      {
+      logger.error ( "Retrieve failed" );
+      return;
+      }
+    logger.info ( "Retrieve success" );
   }
 }

+ 16 - 0
Libs/DICOM/Widgets/ctkDICOMServerNodeWidget.cpp

@@ -218,6 +218,20 @@ QString ctkDICOMServerNodeWidget::callingAETitle()
 }
 
 //----------------------------------------------------------------------------
+QMap<QString,QVariant> ctkDICOMServerNodeWidget::parameters()
+{
+  Q_D(ctkDICOMServerNodeWidget);
+
+  QMap<QString, QVariant> parameters;
+
+  parameters["CallingAETitle"] = d->CallingAETitle->text();
+  parameters["StorageAETitle"] = d->StorageAETitle->text();
+  parameters["StoragePort"] = d->StoragePort->text();
+
+  return parameters;
+}
+
+//----------------------------------------------------------------------------
 QStringList ctkDICOMServerNodeWidget::nodes()
 {
   Q_D(ctkDICOMServerNodeWidget);
@@ -237,6 +251,7 @@ QMap<QString, QVariant> ctkDICOMServerNodeWidget::nodeParameters(QString &node)
   Q_D(ctkDICOMServerNodeWidget);
 
   QMap<QString, QVariant> parameters;
+
   int count = d->NodeTable->rowCount();
   QStringList keys;
   keys << "Name" << "AETitle" << "Address" << "Port";
@@ -254,5 +269,6 @@ QMap<QString, QVariant> ctkDICOMServerNodeWidget::nodeParameters(QString &node)
       }
     }
   }
+
   return parameters;
 }

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

@@ -41,6 +41,7 @@ public:
   virtual ~ctkDICOMServerNodeWidget();
 
   QString callingAETitle();
+  QMap<QString,QVariant> parameters();
   QStringList nodes();
   QMap<QString,QVariant> nodeParameters(QString &node);
 

+ 0 - 1
Libs/Widgets/ctkDateRangeWidget.cpp

@@ -192,7 +192,6 @@ void ctkDateRangeWidget::setDateTimeRange(QDateTime startDateTime, QDateTime end
 // --------------------------------------------------------------------------
 void ctkDateRangeWidget::setDateRange(QDate startDate, QDate endDate)
 {
-  Q_D(const ctkDateRangeWidget);
   this->setDateTimeRange(QDateTime(startDate), QDateTime(endDate));
 }
 

+ 0 - 3
Libs/Widgets/ctkFlowLayout.cpp

@@ -69,7 +69,6 @@ ctkFlowLayoutPrivate::ctkFlowLayoutPrivate(ctkFlowLayout& object)
 // --------------------------------------------------------------------------
 void ctkFlowLayoutPrivate::init()
 {
-  Q_Q(ctkFlowLayout);
 }
 
 // --------------------------------------------------------------------------
@@ -318,8 +317,6 @@ void ctkFlowLayout::addItem(QLayoutItem *item)
 // --------------------------------------------------------------------------
 Qt::Orientations ctkFlowLayout::expandingDirections() const
 {
-  Q_D(const ctkFlowLayout);
-  //return d->Orientation;
   return Qt::Vertical | Qt::Horizontal;
 }