diff --git a/Modules/CppRestSdk/include/mitkRESTClient.h b/Modules/CppRestSdk/include/mitkRESTClient.h index 4ea071c392..bf4d3b4147 100644 --- a/Modules/CppRestSdk/include/mitkRESTClient.h +++ b/Modules/CppRestSdk/include/mitkRESTClient.h @@ -1,59 +1,59 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef MITKRESTCLIENT_H #define MITKRESTCLIENT_H #include "cpprest/asyncrt_utils.h" #include "cpprest/containerstream.h" #include "cpprest/filestream.h" #include "cpprest/http_client.h" #include "cpprest/json.h" #include "cpprest/producerconsumerstream.h" #include "cpprest/uri.h" // hm.. maybe go after that warning at some time? seems like a nasty hack, but works so far :) #pragma warning(disable : 4251) #include "MitkCppRestSdkExports.h" typedef web::http::client::http_client MitkClient; typedef web::http::http_request MitkRequest; typedef web::http::http_response MitkResponse; typedef web::http::methods MitkRESTMethods; typedef web::http::uri_builder MitkUriBuilder; typedef web::http::status_codes MitkRestStatusCodes; typedef web::json::json_exception MitkJsonException; namespace mitk { class MITKCPPRESTSDK_EXPORT RESTClient { public:; RESTClient(utility::string_t url); virtual ~RESTClient(); - void executeGETRequest(const utility::string_t filePath, utility::string_t uri); - void executeWADOGET(const utility::string_t filePath, std::string studyUID, std::string seriesUID, std::string instanceUID); - void executeWADOGET(const utility::string_t filePath, std::string studyUID, std::string seriesUID); + pplx::task executeGETRequest(const utility::string_t filePath, utility::string_t uri); + pplx::task executeWADOGET(const utility::string_t filePath, std::string studyUID, std::string seriesUID, std::string instanceUID); + pplx::task executeWADOGET(const utility::string_t filePath, std::string studyUID, std::string seriesUID); private: MitkClient m_Client; }; }; #endif // MITKRESTCLIENT_H \ No newline at end of file diff --git a/Modules/CppRestSdk/src/mitkRESTClient.cpp b/Modules/CppRestSdk/src/mitkRESTClient.cpp index db91239c53..d664d047ab 100644 --- a/Modules/CppRestSdk/src/mitkRESTClient.cpp +++ b/Modules/CppRestSdk/src/mitkRESTClient.cpp @@ -1,97 +1,115 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkRESTClient.h" #include -mitk::RESTClient::RESTClient(utility::string_t url) : m_Client(url) {} +mitk::RESTClient::RESTClient(utility::string_t url) : m_Client(url) { +} mitk::RESTClient::~RESTClient() {} -void mitk::RESTClient::executeGETRequest(utility::string_t filePath, utility::string_t uri) +pplx::task mitk::RESTClient::executeGETRequest(utility::string_t filePath, utility::string_t uri) { MITK_INFO << "Calling GET with " << utility::conversions::to_utf8string(uri) << " on client " << utility::conversions::to_utf8string(m_Client.base_uri().to_string()) << " save into " << utility::conversions::to_utf8string(filePath); auto fileBuffer = std::make_shared>(); - concurrency::streams::file_buffer::open(filePath, std::ios::out).then([=](concurrency::streams::streambuf outFile) -> pplx::task + return concurrency::streams::file_buffer::open(filePath, std::ios::out).then([=](concurrency::streams::streambuf outFile) -> pplx::task { *fileBuffer = outFile; return m_Client.request(MitkRESTMethods::GET, uri); }) // Write the response body into the file buffer. .then([=](MitkResponse response) -> pplx::task { MITK_INFO << "Status code: " << response.status_code(); return response.body().read_to_end(*fileBuffer); }) // Close the file buffer. .then([=](size_t) { return fileBuffer->close(); - }) - // Wait for the entire response body to be written into the file. - .wait(); + }); + // // Wait for the entire response body to be written into the file. + // .wait(); - return; } -void mitk::RESTClient::executeWADOGET(utility::string_t filePath, std::string studyUID, std::string seriesUID, std::string instanceUID) +pplx::task mitk::RESTClient::executeWADOGET(utility::string_t filePath, std::string studyUID, std::string seriesUID, std::string instanceUID) { MitkUriBuilder builder(U("wado")); builder.append_query(U("requestType"), U("WADO")); builder.append_query(U("studyUID"), utility::conversions::to_string_t(studyUID)); builder.append_query(U("seriesUID"), utility::conversions::to_string_t(seriesUID)); builder.append_query(U("objectUID"), utility::conversions::to_string_t(instanceUID)); builder.append_query(U("contentType"), U("application/dicom")); - executeGETRequest(filePath, builder.to_string()); + return executeGETRequest(filePath, builder.to_string()); } -void mitk::RESTClient::executeWADOGET(const utility::string_t folderPath, std::string studyUID, std::string seriesUID) +pplx::task mitk::RESTClient::executeWADOGET(const utility::string_t folderPath, std::string studyUID, std::string seriesUID) { - MitkUriBuilder builder(U("instances")); - builder.append_query(U("studyUID"), utility::conversions::to_string_t(studyUID)); - builder.append_query(U("seriesUID"), utility::conversions::to_string_t(seriesUID)); + MitkUriBuilder builder(U("rs/instances")); + builder.append_query(U("StudyInstanceUID"), utility::conversions::to_string_t(studyUID)); + builder.append_query(U("SeriesInstanceUID"), utility::conversions::to_string_t(seriesUID)); - m_Client.request(MitkRESTMethods::GET, builder.to_string()).then([=](MitkResponse response) + MITK_INFO << utility::conversions::to_utf8string(builder.to_string()); + MitkRequest getSeries(MitkRESTMethods::GET); + getSeries.set_request_uri(builder.to_string()); + getSeries.headers().add(U("Accept"), U("application/json")); + + return m_Client.request(getSeries).then([=](MitkResponse response) { MITK_INFO << "search for instances in series with uid " << seriesUID << " status: " << response.status_code(); auto jsonListResult = response.extract_json().get(); auto resultArray = jsonListResult.as_array(); + std::vector> tasks; + for (unsigned short i = 0; i < resultArray.size(); i++) { - auto firstResult = resultArray[i]; - auto sopInstanceUIDKey = firstResult.at(U("00080018")); - auto sopInstanceObject = sopInstanceUIDKey.as_object(); - auto valueKey = sopInstanceObject.at(U("Value")); - auto sopInstanceUID = valueKey.as_string(); - - auto filePath = utility::string_t(folderPath) - .append(sopInstanceUID) - .append(U(".dcm")); - executeWADOGET(filePath, studyUID, seriesUID, utility::conversions::to_utf8string(sopInstanceUID)); + try + { + auto firstResult = resultArray[i]; + auto sopInstanceUIDKey = firstResult.at(U("00080018")); + auto sopInstanceObject = sopInstanceUIDKey.as_object(); + auto valueKey = sopInstanceObject.at(U("Value")); + auto valueArray = valueKey.as_array(); + auto sopInstanceUID = valueArray[0].as_string(); + + auto filePath = utility::string_t(folderPath) + .append(sopInstanceUID) + .append(U(".dcm")); + auto task = executeWADOGET(filePath, studyUID, seriesUID, utility::conversions::to_utf8string(sopInstanceUID)); + tasks.push_back(task); + } + catch (const web::json::json_exception& e) + { + MITK_ERROR << e.what(); + } } - }); + auto joinTask = pplx::when_all(begin(tasks), end(tasks)); + return joinTask; + }); } diff --git a/Plugins/org.mitk.gui.qt.segmentation.rework/CMakeLists.txt b/Plugins/org.mitk.gui.qt.segmentation.rework/CMakeLists.txt index fb79d2b4b1..05d0b97c3b 100644 --- a/Plugins/org.mitk.gui.qt.segmentation.rework/CMakeLists.txt +++ b/Plugins/org.mitk.gui.qt.segmentation.rework/CMakeLists.txt @@ -1,7 +1,8 @@ project(org_mitk_gui_qt_segmentation_rework) mitk_create_plugin( EXPORT_DIRECTIVE REWORK_EXPORT EXPORTED_INCLUDE_SUFFIXES src + PACKAGE_DEPENDS Boost MODULE_DEPENDS MitkQtWidgetsExt MitkCppRestSdk MitkChart ) diff --git a/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/SegmentationReworkView.cpp b/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/SegmentationReworkView.cpp index abbda47838..399e4a08c0 100644 --- a/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/SegmentationReworkView.cpp +++ b/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/SegmentationReworkView.cpp @@ -1,158 +1,162 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include // Qmitk #include "SegmentationReworkView.h" // Qt #include #include const std::string SegmentationReworkView::VIEW_ID = "org.mitk.views.segmentationreworkview"; void SegmentationReworkView::SetFocus() { } void SegmentationReworkView::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); connect(m_Controls.buttonUpload, &QPushButton::clicked, this, &SegmentationReworkView::UploadNewSegmentation); utility::string_t port = U("2020"); utility::string_t address = U("http://127.0.0.1:"); address.append(port); m_HttpHandler = std::unique_ptr(new SegmentationReworkREST(address)); connect(m_HttpHandler.get(), &SegmentationReworkREST::InvokeUpdateChartWidget, this, &SegmentationReworkView::UpdateChartWidget); m_HttpHandler->SetPutCallback(std::bind(&SegmentationReworkView::RESTPutCallback, this, std::placeholders::_1)); m_HttpHandler->Open().wait(); MITK_INFO << "Listening for requests at: " << utility::conversions::to_utf8string(address); utility::string_t pacsHost = U("http://193.174.48.78:8090/dcm4chee-arc/aets/DCM4CHEE"); - m_RestClient = new mitk::RESTClient(U("http://www.officesupplyuae.com")); + m_RestClient = new mitk::RESTClient(pacsHost); - m_RestClient->executeWADOGET(U("/tmp/"), "1.2.840.113654.2.70.1.311779127785374989361829772874593461506", "1.2.840.113654.2.70.1.182762555335754050396179618615436313390"); + utility::string_t folderPathSeries = U("/temp/downloadSeries/"); + m_RestClient->executeWADOGET(folderPathSeries, "1.2.840.113654.2.70.1.311779127785374989361829772874593461506", "1.2.840.113654.2.70.1.182762555335754050396179618615436313390").wait(); + MITK_INFO << "Loading series"; + auto firstFilePath = folderPathSeries.append(U("1.2.840.113654.2.70.1.102028037630900004226480999888296698838.dcm")); + mitk::IOUtil::Load(utility::conversions::to_utf8string(firstFilePath), *this->GetDataStorage()); } void SegmentationReworkView::RESTPutCallback(const SegmentationReworkREST::DicomDTO& dto) { MITK_INFO << "callback! " << dto.studyUID << dto.seriesUID << dto.instanceUID; SetSimilarityGraph(dto.simScoreArray, dto.minSliceStart); auto filePath = U("/temp/downloadWADO.dcm"); // m_RestClient->executeWADOGET(filePath, dto.studyUID, dto.seriesUID, dto.instanceUID); MITK_INFO << "load file into data storage"; - //mitk::IOUtil::Load(utility::conversions::to_utf8string(filePath), *this->GetDataStorage()); + //mitk::IOUtil::Load(utility::conversions::to_utf8string(filePath), *this->GetDataStorage()).wait(); this->GetDataStorage()->GetAll()->at(0)->Update(); } void SegmentationReworkView::UpdateChartWidget() { m_Controls.chartWidget->Show(); } void SegmentationReworkView::SetSimilarityGraph(std::vector simScoreArray, int sliceMinStart) { std::map map; MITK_INFO << simScoreArray.size(); double sliceIndex = sliceMinStart; for (double score : simScoreArray) { map.insert(std::map::value_type(sliceIndex, score)); sliceIndex++; } m_Controls.chartWidget->AddData2D(map, "similarity score"); m_Controls.chartWidget->SetChartType("similarity score", QmitkChartWidget::ChartType::line); m_Controls.chartWidget->SetXAxisLabel("slice number"); m_Controls.chartWidget->SetYAxisLabel("similarity score"); } void SegmentationReworkView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*source*/, const QList &nodes) { // iterate all selected objects, adjust warning visibility foreach (mitk::DataNode::Pointer node, nodes) { if (node.IsNotNull() && dynamic_cast(node->GetData())) { m_Controls.labelWarning->setVisible(false); return; } } m_Controls.labelWarning->setVisible(true); } void SegmentationReworkView::UploadNewSegmentation() { } void SegmentationReworkView::DoImageProcessing() { QList nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; mitk::DataNode *node = nodes.front(); if (!node) { // Nothing selected. Inform the user and return QMessageBox::information(nullptr, "Template", "Please load and select an image before starting image processing."); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData *data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image *image = dynamic_cast(data); if (image) { std::stringstream message; std::string name; message << "Performing image processing for image "; if (node->GetName(name)) { // a property called "name" was found for this DataNode message << "'" << name << "'"; } message << "."; MITK_INFO << message.str(); // actually do something here... } } }