ctkDICOMQueryRetrieveWidget.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include <QDebug>
  2. #include <QTreeView>
  3. #include <QTabBar>
  4. #include <QSettings>
  5. #include <QHBoxLayout>
  6. /// CTK includes
  7. #include <ctkCheckableHeaderView.h>
  8. // ctkDICOMCore includes
  9. #include "ctkDICOMDatabase.h"
  10. #include "ctkDICOMModel.h"
  11. #include "ctkDICOMQuery.h"
  12. #include "ctkDICOMRetrieve.h"
  13. // ctkDICOMWidgets includes
  14. #include "ctkDICOMQueryRetrieveWidget.h"
  15. #include "ctkDICOMQueryResultsTabWidget.h"
  16. #include "ui_ctkDICOMQueryRetrieveWidget.h"
  17. #include <ctkLogger.h>
  18. static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMQueryRetrieveWidget");
  19. //----------------------------------------------------------------------------
  20. class ctkDICOMQueryRetrieveWidgetPrivate: public Ui_ctkDICOMQueryRetrieveWidget
  21. {
  22. public:
  23. ctkDICOMQueryRetrieveWidgetPrivate(){}
  24. QMap<QString, ctkDICOMQuery*> QueriesByServer;
  25. QMap<QString, ctkDICOMQuery*> QueriesByStudyUID;
  26. QMap<QString, ctkDICOMRetrieve*> RetrievalsByStudyUID;
  27. ctkDICOMDatabase QueryResultDatabase;
  28. QSharedPointer<ctkDICOMDatabase> RetrieveDatabase;
  29. ctkDICOMModel model;
  30. };
  31. //----------------------------------------------------------------------------
  32. // ctkDICOMQueryRetrieveWidgetPrivate methods
  33. //----------------------------------------------------------------------------
  34. // ctkDICOMQueryRetrieveWidget methods
  35. //----------------------------------------------------------------------------
  36. ctkDICOMQueryRetrieveWidget::ctkDICOMQueryRetrieveWidget(QWidget* _parent):Superclass(_parent),
  37. d_ptr(new ctkDICOMQueryRetrieveWidgetPrivate)
  38. {
  39. Q_D(ctkDICOMQueryRetrieveWidget);
  40. d->setupUi(this);
  41. connect(d->QueryButton, SIGNAL(clicked()), this, SLOT(processQuery()));
  42. connect(d->RetrieveButton, SIGNAL(clicked()), this, SLOT(processRetrieve()));
  43. }
  44. //----------------------------------------------------------------------------
  45. ctkDICOMQueryRetrieveWidget::~ctkDICOMQueryRetrieveWidget()
  46. {
  47. }
  48. //----------------------------------------------------------------------------
  49. void ctkDICOMQueryRetrieveWidget::setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> dicomDatabase)
  50. {
  51. Q_D(ctkDICOMQueryRetrieveWidget);
  52. d->RetrieveDatabase = dicomDatabase;
  53. }
  54. //----------------------------------------------------------------------------
  55. void ctkDICOMQueryRetrieveWidget::processQuery()
  56. {
  57. Q_D(ctkDICOMQueryRetrieveWidget);
  58. d->RetrieveButton->setEnabled(false);
  59. // create a database in memory to hold query results
  60. try { d->QueryResultDatabase.openDatabase( ":memory:" ); }
  61. catch (std::exception e)
  62. {
  63. logger.error ( "Database error: " + d->QueryResultDatabase.lastError() );
  64. d->QueryResultDatabase.closeDatabase();
  65. return;
  66. }
  67. // for each of the selected server nodes, send the query
  68. QStringList serverNodes = d->ServerNodeWidget->nodes();
  69. foreach (QString server, serverNodes)
  70. {
  71. QMap<QString, QVariant> parameters = d->ServerNodeWidget->nodeParameters(server);
  72. if ( parameters["CheckState"] == Qt::Checked )
  73. {
  74. // create a query for the current server
  75. d->QueriesByServer[server] = new ctkDICOMQuery;
  76. d->QueriesByServer[server]->setCallingAETitle(d->ServerNodeWidget->callingAETitle());
  77. d->QueriesByServer[server]->setCalledAETitle(parameters["AETitle"].toString());
  78. d->QueriesByServer[server]->setHost(parameters["Address"].toString());
  79. d->QueriesByServer[server]->setPort(parameters["Port"].toInt());
  80. // populate the query with the current search options
  81. d->QueriesByServer[server]->setFilters( d->QueryWidget->parameters() );
  82. try
  83. {
  84. // run the query against the selected server and put results in database
  85. d->QueriesByServer[server]->query ( d->QueryResultDatabase );
  86. }
  87. catch (std::exception e)
  88. {
  89. logger.error ( "Query error: " + parameters["Name"].toString() );
  90. }
  91. foreach( QString studyUID, d->QueriesByServer[server]->studyInstanceUIDQueried() )
  92. {
  93. d->QueriesByStudyUID[studyUID] = d->QueriesByServer[server];
  94. }
  95. }
  96. }
  97. // checkable headers - allow user to select the patient/studies to retrieve
  98. d->results->setModel(&d->model);
  99. d->model.setDatabase(d->QueryResultDatabase.database());
  100. d->model.setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
  101. QHeaderView* previousHeaderView = d->results->header();
  102. ctkCheckableHeaderView* headerView = new ctkCheckableHeaderView(Qt::Horizontal, d->results);
  103. headerView->setClickable(previousHeaderView->isClickable());
  104. headerView->setMovable(previousHeaderView->isMovable());
  105. headerView->setHighlightSections(previousHeaderView->highlightSections());
  106. headerView->setPropagateToItems(true);
  107. d->results->setHeader(headerView);
  108. // headerView is hidden because it was created with a visisble parent widget
  109. headerView->setHidden(false);
  110. d->RetrieveButton->setEnabled(d->model.rowCount());
  111. }
  112. //----------------------------------------------------------------------------
  113. void ctkDICOMQueryRetrieveWidget::processRetrieve()
  114. {
  115. Q_D(ctkDICOMQueryRetrieveWidget);
  116. QMap<QString,QVariant> serverParameters = d->ServerNodeWidget->parameters();
  117. foreach( QString studyUID, d->QueriesByStudyUID.keys() )
  118. {
  119. logger.debug("need to retrieve " + studyUID + " from " + d->QueriesByStudyUID[studyUID]->host());
  120. ctkDICOMQuery *query = d->QueriesByStudyUID[studyUID];
  121. ctkDICOMRetrieve *retrieve = new ctkDICOMRetrieve;
  122. retrieve->setDICOMDatabase( d->RetrieveDatabase );
  123. d->RetrievalsByStudyUID[studyUID] = retrieve;
  124. retrieve->setCallingAETitle( query->callingAETitle() );
  125. retrieve->setCalledAETitle( query->calledAETitle() );
  126. retrieve->setCalledPort( query->port() );
  127. retrieve->setHost( query->host() );
  128. // pull from GUI
  129. retrieve->setMoveDestinationAETitle( serverParameters["StorageAETitle"].toString() );
  130. retrieve->setCallingPort( serverParameters["StoragePort"].toInt() );
  131. logger.info ( "Starting to retrieve" );
  132. try
  133. {
  134. retrieve->retrieveStudy ( studyUID );
  135. }
  136. catch (std::exception e)
  137. {
  138. logger.error ( "Retrieve failed" );
  139. return;
  140. }
  141. logger.info ( "Retrieve success" );
  142. }
  143. }