comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 2089:63d77859edee dicom-sr

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Nov 2023 19:30:44 +0100
parents b98d159c7545
children c2dfc253bd04
comparison
equal deleted inserted replaced
2088:b98d159c7545 2089:63d77859edee
80 #include "../../../OrthancStone/Sources/Scene2D/PolylineSceneLayer.h" 80 #include "../../../OrthancStone/Sources/Scene2D/PolylineSceneLayer.h"
81 #include "../../../OrthancStone/Sources/Scene2D/TextSceneLayer.h" 81 #include "../../../OrthancStone/Sources/Scene2D/TextSceneLayer.h"
82 #include "../../../OrthancStone/Sources/Scene2DViewport/ViewportController.h" 82 #include "../../../OrthancStone/Sources/Scene2DViewport/ViewportController.h"
83 #include "../../../OrthancStone/Sources/StoneException.h" 83 #include "../../../OrthancStone/Sources/StoneException.h"
84 #include "../../../OrthancStone/Sources/Toolbox/DicomInstanceParameters.h" 84 #include "../../../OrthancStone/Sources/Toolbox/DicomInstanceParameters.h"
85 #include "../../../OrthancStone/Sources/Toolbox/DicomStructuredReport.h"
85 #include "../../../OrthancStone/Sources/Toolbox/GeometryToolbox.h" 86 #include "../../../OrthancStone/Sources/Toolbox/GeometryToolbox.h"
86 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/AngleAnnotation.h" 87 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/AngleAnnotation.h"
87 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/CollectionOfAnnotations.h" 88 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/CollectionOfAnnotations.h"
88 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/LineAnnotation.h" 89 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/LineAnnotation.h"
89 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/TextAnnotation.h" 90 #include "../../../OrthancStone/Sources/Toolbox/OsiriX/TextAnnotation.h"
99 #include <algorithm> 100 #include <algorithm>
100 #include <boost/make_shared.hpp> 101 #include <boost/make_shared.hpp>
101 #include <boost/math/constants/constants.hpp> 102 #include <boost/math/constants/constants.hpp>
102 #include <boost/math/special_functions/round.hpp> 103 #include <boost/math/special_functions/round.hpp>
103 #include <stdio.h> 104 #include <stdio.h>
104
105 static const char* const DICOM_COMPREHENSIVE_SR_IOD = "1.2.840.10008.5.1.4.1.1.88.33";
106 105
107 static const double PI = boost::math::constants::pi<double>(); 106 static const double PI = boost::math::constants::pi<double>();
108 107
109 #if !defined(STONE_WEB_VIEWER_EXPORT) 108 #if !defined(STONE_WEB_VIEWER_EXPORT)
110 // We are not running ParseWebAssemblyExports.py, but we're compiling the wasm 109 // We are not running ParseWebAssemblyExports.py, but we're compiling the wasm
425 { 424 {
426 if (observer_.get() != NULL) 425 if (observer_.get() != NULL)
427 { 426 {
428 for (size_t i = 0; i < message.GetInstancesCount(); i++) 427 for (size_t i = 0; i < message.GetInstancesCount(); i++)
429 { 428 {
430 std::string sopClassUid; 429 std::string sopInstanceUid, sopClassUid;
431 if (message.GetInstance(i).LookupStringValue(sopClassUid, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) && 430 if (message.GetInstance(i).LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false) &&
432 sopClassUid == DICOM_COMPREHENSIVE_SR_IOD) 431 message.GetInstance(i).LookupStringValue(sopClassUid, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) &&
432 OrthancStone::StringToSopClassUid(sopClassUid) == OrthancStone::SopClassUid_ComprehensiveSR)
433 { 433 {
434 LOG(ERROR) << "ICI " << message.GetSeriesInstanceUid(); 434 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(context_.Lock());
435 lock->Schedule(
436 GetSharedObserver(), PRIORITY_NORMAL, OrthancStone::ParseDicomFromWadoCommand::Create(
437 source_, message.GetStudyInstanceUid(), message.GetSeriesInstanceUid(), sopInstanceUid,
438 false /* no transcoding */, Orthanc::DicomTransferSyntax_LittleEndianExplicit /* dummy value */,
439 new InstanceInfo(message.GetStudyInstanceUid(), message.GetSeriesInstanceUid(), OrthancStone::SopClassUid_ComprehensiveSR)));
440 return;
435 } 441 }
436 } 442 }
437 443
438 observer_->SignalSeriesMetadataLoaded( 444 observer_->SignalSeriesMetadataLoaded(
439 message.GetStudyInstanceUid(), message.GetSeriesInstanceUid()); 445 message.GetStudyInstanceUid(), message.GetSeriesInstanceUid());
531 } 537 }
532 else 538 else
533 { 539 {
534 LOG(ERROR) << "Unable to extract PDF from series: " << info.GetSeriesInstanceUid(); 540 LOG(ERROR) << "Unable to extract PDF from series: " << info.GetSeriesInstanceUid();
535 } 541 }
542
543 break;
544 }
545
546 case OrthancStone::SopClassUid_ComprehensiveSR:
547 {
548 try
549 {
550 OrthancStone::DicomStructuredReport sr(message.GetDicom());
551
552 std::list<OrthancStone::DicomStructuredReport::Frame> frames;
553 sr.ExportOrderedFrames(frames);
554
555 for (std::list<OrthancStone::DicomStructuredReport::Frame>::const_iterator
556 it = frames.begin(); it != frames.end(); ++it)
557 {
558 LOG(ERROR) << "YOU " << it->GetSopInstanceUid() << " " << it->GetFrameNumber();
559 }
560 }
561 catch (Orthanc::OrthancException& e)
562 {
563 LOG(ERROR) << "Cannot decode DICOM-SR: " << e.What();
564 }
565 break;
536 } 566 }
537 567
538 default: 568 default:
539 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); 569 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
540 } 570 }