Mercurial > hg > orthanc-stone
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 |