comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 2088:b98d159c7545 dicom-sr

created branch dicom-sr
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Nov 2023 18:12:35 +0100
parents 07964689cb0b
children 63d77859edee
comparison
equal deleted inserted replaced
2087:51c8b21b81e4 2088:b98d159c7545
99 #include <algorithm> 99 #include <algorithm>
100 #include <boost/make_shared.hpp> 100 #include <boost/make_shared.hpp>
101 #include <boost/math/constants/constants.hpp> 101 #include <boost/math/constants/constants.hpp>
102 #include <boost/math/special_functions/round.hpp> 102 #include <boost/math/special_functions/round.hpp>
103 #include <stdio.h> 103 #include <stdio.h>
104
105 static const char* const DICOM_COMPREHENSIVE_SR_IOD = "1.2.840.10008.5.1.4.1.1.88.33";
104 106
105 static const double PI = boost::math::constants::pi<double>(); 107 static const double PI = boost::math::constants::pi<double>();
106 108
107 #if !defined(STONE_WEB_VIEWER_EXPORT) 109 #if !defined(STONE_WEB_VIEWER_EXPORT)
108 // We are not running ParseWebAssemblyExports.py, but we're compiling the wasm 110 // We are not running ParseWebAssemblyExports.py, but we're compiling the wasm
379 if (std::find(skipSeriesFromModalities_.begin(), skipSeriesFromModalities_.end(), modality) == skipSeriesFromModalities_.end()) 381 if (std::find(skipSeriesFromModalities_.begin(), skipSeriesFromModalities_.end(), modality) == skipSeriesFromModalities_.end())
380 { 382 {
381 thumbnailsLoader_->ScheduleLoadThumbnail(source_, "", studyInstanceUid, seriesInstanceUid); 383 thumbnailsLoader_->ScheduleLoadThumbnail(source_, "", studyInstanceUid, seriesInstanceUid);
382 metadataLoader_->ScheduleLoadSeries(PRIORITY_LOW + 1, source_, studyInstanceUid, seriesInstanceUid); 384 metadataLoader_->ScheduleLoadSeries(PRIORITY_LOW + 1, source_, studyInstanceUid, seriesInstanceUid);
383 } 385 }
384
385 else 386 else
386 { 387 {
387 seriesIdsToRemove.push_back(seriesInstanceUid); 388 seriesIdsToRemove.push_back(seriesInstanceUid);
388 } 389 }
389 } 390 }
422 423
423 void Handle(const OrthancStone::SeriesMetadataLoader::SuccessMessage& message) 424 void Handle(const OrthancStone::SeriesMetadataLoader::SuccessMessage& message)
424 { 425 {
425 if (observer_.get() != NULL) 426 if (observer_.get() != NULL)
426 { 427 {
428 for (size_t i = 0; i < message.GetInstancesCount(); i++)
429 {
430 std::string sopClassUid;
431 if (message.GetInstance(i).LookupStringValue(sopClassUid, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) &&
432 sopClassUid == DICOM_COMPREHENSIVE_SR_IOD)
433 {
434 LOG(ERROR) << "ICI " << message.GetSeriesInstanceUid();
435 }
436 }
437
427 observer_->SignalSeriesMetadataLoaded( 438 observer_->SignalSeriesMetadataLoaded(
428 message.GetStudyInstanceUid(), message.GetSeriesInstanceUid()); 439 message.GetStudyInstanceUid(), message.GetSeriesInstanceUid());
429 } 440 }
430 } 441 }
431 442
467 478
468 pending_ += 2; 479 pending_ += 2;
469 } 480 }
470 481
471 482
472 class PdfInfo : public Orthanc::IDynamicObject 483 class InstanceInfo : public Orthanc::IDynamicObject
473 { 484 {
474 private: 485 private:
475 std::string studyInstanceUid_; 486 std::string studyInstanceUid_;
476 std::string seriesInstanceUid_; 487 std::string seriesInstanceUid_;
488 OrthancStone::SopClassUid sopClassUid_;
477 489
478 public: 490 public:
479 PdfInfo(const std::string& studyInstanceUid, 491 InstanceInfo(const std::string& studyInstanceUid,
480 const std::string& seriesInstanceUid) : 492 const std::string& seriesInstanceUid,
493 OrthancStone::SopClassUid sopClassUid) :
481 studyInstanceUid_(studyInstanceUid), 494 studyInstanceUid_(studyInstanceUid),
482 seriesInstanceUid_(seriesInstanceUid) 495 seriesInstanceUid_(seriesInstanceUid),
496 sopClassUid_(sopClassUid)
483 { 497 {
484 } 498 }
485 499
486 const std::string& GetStudyInstanceUid() const 500 const std::string& GetStudyInstanceUid() const
487 { 501 {
490 504
491 const std::string& GetSeriesInstanceUid() const 505 const std::string& GetSeriesInstanceUid() const
492 { 506 {
493 return seriesInstanceUid_; 507 return seriesInstanceUid_;
494 } 508 }
509
510 OrthancStone::SopClassUid GetSopClassUid() const
511 {
512 return sopClassUid_;
513 }
495 }; 514 };
496 515
497 516
498 void Handle(const OrthancStone::ParseDicomSuccessMessage& message) 517 void Handle(const OrthancStone::ParseDicomSuccessMessage& message)
499 { 518 {
500 const PdfInfo& info = dynamic_cast<const PdfInfo&>(message.GetOrigin().GetPayload()); 519 const InstanceInfo& info = dynamic_cast<const InstanceInfo&>(message.GetOrigin().GetPayload());
501 520
502 if (observer_.get() != NULL) 521 if (observer_.get() != NULL)
503 { 522 {
504 std::string pdf; 523 switch (info.GetSopClassUid())
505 if (message.GetDicom().ExtractPdf(pdf)) 524 {
506 { 525 case OrthancStone::SopClassUid_EncapsulatedPdf:
507 observer_->SignalSeriesPdfLoaded(info.GetStudyInstanceUid(), info.GetSeriesInstanceUid(), pdf); 526 {
508 } 527 std::string pdf;
509 else 528 if (message.GetDicom().ExtractPdf(pdf))
510 { 529 {
511 LOG(ERROR) << "Unable to extract PDF from series: " << info.GetSeriesInstanceUid(); 530 observer_->SignalSeriesPdfLoaded(info.GetStudyInstanceUid(), info.GetSeriesInstanceUid(), pdf);
531 }
532 else
533 {
534 LOG(ERROR) << "Unable to extract PDF from series: " << info.GetSeriesInstanceUid();
535 }
536 }
537
538 default:
539 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
512 } 540 }
513 } 541 }
514 } 542 }
515 543
516 void FetchVirtualSeriesThumbnail(const std::string& virtualSeriesId, 544 void FetchVirtualSeriesThumbnail(const std::string& virtualSeriesId,
858 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(context_.Lock()); 886 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(context_.Lock());
859 lock->Schedule( 887 lock->Schedule(
860 GetSharedObserver(), PRIORITY_NORMAL, OrthancStone::ParseDicomFromWadoCommand::Create( 888 GetSharedObserver(), PRIORITY_NORMAL, OrthancStone::ParseDicomFromWadoCommand::Create(
861 source_, studyInstanceUid, seriesInstanceUid, sopInstanceUid, 889 source_, studyInstanceUid, seriesInstanceUid, sopInstanceUid,
862 false /* no transcoding */, Orthanc::DicomTransferSyntax_LittleEndianExplicit /* dummy value */, 890 false /* no transcoding */, Orthanc::DicomTransferSyntax_LittleEndianExplicit /* dummy value */,
863 new PdfInfo(studyInstanceUid, seriesInstanceUid))); 891 new InstanceInfo(studyInstanceUid, seriesInstanceUid, OrthancStone::SopClassUid_EncapsulatedPdf)));
864 892
865 return; 893 return;
866 } 894 }
867 } 895 }
868 896