Mercurial > hg > orthanc-stone
comparison Samples/Sdl/FusionMprSdl.cpp @ 828:28f99af358fa
Merge + FusionMprSdl
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 29 May 2019 16:15:04 +0200 |
parents | 2fd96a637a59 |
children | c47031d9f6b1 |
comparison
equal
deleted
inserted
replaced
827:2fd96a637a59 | 828:28f99af358fa |
---|---|
22 | 22 |
23 #include "../../Applications/Sdl/SdlOpenGLWindow.h" | 23 #include "../../Applications/Sdl/SdlOpenGLWindow.h" |
24 | 24 |
25 #include "../../Framework/StoneInitialization.h" | 25 #include "../../Framework/StoneInitialization.h" |
26 | 26 |
27 #include "../../Framework/Messages/IMessageEmitter.h" | |
28 | |
29 #include "../../Framework/Scene2D/CairoCompositor.h" | 27 #include "../../Framework/Scene2D/CairoCompositor.h" |
30 #include "../../Framework/Scene2D/ColorTextureSceneLayer.h" | 28 #include "../../Framework/Scene2D/ColorTextureSceneLayer.h" |
31 #include "../../Framework/Scene2D/OpenGLCompositor.h" | 29 #include "../../Framework/Scene2D/OpenGLCompositor.h" |
32 #include "../../Framework/Scene2D/PanSceneTracker.h" | 30 #include "../../Framework/Scene2D/PanSceneTracker.h" |
33 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | 31 #include "../../Framework/Scene2D/ZoomSceneTracker.h" |
48 #include <Core/OrthancException.h> | 46 #include <Core/OrthancException.h> |
49 | 47 |
50 #include <boost/shared_ptr.hpp> | 48 #include <boost/shared_ptr.hpp> |
51 #include <boost/weak_ptr.hpp> | 49 #include <boost/weak_ptr.hpp> |
52 #include <boost/make_shared.hpp> | 50 #include <boost/make_shared.hpp> |
53 #include <boost/thread.hpp> | |
54 | 51 |
55 #include <stdio.h> | 52 #include <stdio.h> |
56 #include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" | 53 #include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" |
57 #include "../../Framework/Oracle/ThreadedOracle.h" | 54 #include "../../Framework/Oracle/ThreadedOracle.h" |
58 #include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" | 55 #include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" |
63 #include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" | 60 #include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" |
64 #include "Core/SystemToolbox.h" | 61 #include "Core/SystemToolbox.h" |
65 | 62 |
66 namespace OrthancStone | 63 namespace OrthancStone |
67 { | 64 { |
68 | |
69 class NativeApplicationContext : public IMessageEmitter | |
70 { | |
71 private: | |
72 boost::shared_mutex mutex_; | |
73 MessageBroker broker_; | |
74 IObservable oracleObservable_; | |
75 | |
76 public: | |
77 NativeApplicationContext() : | |
78 oracleObservable_(broker_) | |
79 { | |
80 } | |
81 | |
82 | |
83 virtual void EmitMessage(const IObserver& observer, | |
84 const IMessage& message) ORTHANC_OVERRIDE | |
85 { | |
86 try | |
87 { | |
88 boost::unique_lock<boost::shared_mutex> lock(mutex_); | |
89 oracleObservable_.EmitMessage(observer, message); | |
90 } | |
91 catch (Orthanc::OrthancException& e) | |
92 { | |
93 LOG(ERROR) << "Exception while emitting a message: " << e.What(); | |
94 } | |
95 } | |
96 | |
97 | |
98 class ReaderLock : public boost::noncopyable | |
99 { | |
100 private: | |
101 NativeApplicationContext& that_; | |
102 boost::shared_lock<boost::shared_mutex> lock_; | |
103 | |
104 public: | |
105 ReaderLock(NativeApplicationContext& that) : | |
106 that_(that), | |
107 lock_(that.mutex_) | |
108 { | |
109 } | |
110 }; | |
111 | |
112 | |
113 class WriterLock : public boost::noncopyable | |
114 { | |
115 private: | |
116 NativeApplicationContext& that_; | |
117 boost::unique_lock<boost::shared_mutex> lock_; | |
118 | |
119 public: | |
120 WriterLock(NativeApplicationContext& that) : | |
121 that_(that), | |
122 lock_(that.mutex_) | |
123 { | |
124 } | |
125 | |
126 MessageBroker& GetBroker() | |
127 { | |
128 return that_.broker_; | |
129 } | |
130 | |
131 IObservable& GetOracleObservable() | |
132 { | |
133 return that_.oracleObservable_; | |
134 } | |
135 }; | |
136 }; | |
137 | |
138 const char* FusionMprMeasureToolToString(size_t i) | 65 const char* FusionMprMeasureToolToString(size_t i) |
139 { | 66 { |
140 static const char* descs[] = { | 67 static const char* descs[] = { |
141 "FusionMprGuiTool_Rotate", | 68 "FusionMprGuiTool_Rotate", |
142 "FusionMprGuiTool_Pan", | 69 "FusionMprGuiTool_Pan", |
472 return boost::shared_ptr<IFlexiblePointerTracker>(); | 399 return boost::shared_ptr<IFlexiblePointerTracker>(); |
473 } | 400 } |
474 } | 401 } |
475 | 402 |
476 | 403 |
477 FusionMprSdlApp::FusionMprSdlApp(MessageBroker& broker) : IObserver(broker) | 404 FusionMprSdlApp::FusionMprSdlApp(MessageBroker& broker) |
405 : IObserver(broker) | |
406 , broker_(broker) | |
407 , oracleObservable_(broker) | |
408 , oracle_(*this) | |
478 , currentTool_(FusionMprGuiTool_Rotate) | 409 , currentTool_(FusionMprGuiTool_Rotate) |
479 { | 410 { |
480 controller_ = boost::shared_ptr<ViewportController>(new ViewportController(broker)); | 411 //oracleObservable.RegisterObserverCallback |
412 //(new Callable | |
413 // <FusionMprSdlApp, SleepOracleCommand::TimeoutMessage>(*this, &FusionMprSdlApp::Handle)); | |
414 | |
415 //oracleObservable.RegisterObserverCallback | |
416 //(new Callable | |
417 // <Toto, GetOrthancImageCommand::SuccessMessage>(*this, &FusionMprSdlApp::Handle)); | |
418 | |
419 //oracleObservable.RegisterObserverCallback | |
420 //(new Callable | |
421 // <FusionMprSdlApp, GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &ToFusionMprSdlAppto::Handle)); | |
422 | |
423 oracleObservable_.RegisterObserverCallback | |
424 (new Callable | |
425 <FusionMprSdlApp, OracleCommandExceptionMessage>(*this, &FusionMprSdlApp::Handle)); | |
426 | |
427 controller_ = boost::shared_ptr<ViewportController>( | |
428 new ViewportController(broker_)); | |
481 | 429 |
482 controller_->RegisterObserverCallback( | 430 controller_->RegisterObserverCallback( |
483 new Callable<FusionMprSdlApp, ViewportController::SceneTransformChanged> | 431 new Callable<FusionMprSdlApp, ViewportController::SceneTransformChanged> |
484 (*this, &FusionMprSdlApp::OnSceneTransformChanged)); | 432 (*this, &FusionMprSdlApp::OnSceneTransformChanged)); |
485 | 433 |
651 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, | 599 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, |
652 FONT_SIZE_1, Orthanc::Encoding_Latin1); | 600 FONT_SIZE_1, Orthanc::Encoding_Latin1); |
653 | 601 |
654 | 602 |
655 //////// from loader | 603 //////// from loader |
656 | |
657 // from main | |
658 NativeApplicationContext context; | |
659 ThreadedOracle oracle(context); | |
660 | |
661 | |
662 | |
663 { | 604 { |
664 Orthanc::WebServiceParameters p; | 605 Orthanc::WebServiceParameters p; |
665 //p.SetUrl("http://localhost:8043/"); | 606 //p.SetUrl("http://localhost:8043/"); |
666 p.SetCredentials("orthanc", "orthanc"); | 607 p.SetCredentials("orthanc", "orthanc"); |
667 oracle.SetOrthancParameters(p); | 608 oracle_.SetOrthancParameters(p); |
668 } | 609 } |
669 | 610 |
670 //////// from Run | 611 //////// from Run |
671 | 612 |
672 boost::shared_ptr<DicomVolumeImage> ct(new DicomVolumeImage); | 613 boost::shared_ptr<DicomVolumeImage> ct(new DicomVolumeImage); |
676 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> ctLoader; | 617 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> ctLoader; |
677 boost::shared_ptr<OrthancMultiframeVolumeLoader> doseLoader; | 618 boost::shared_ptr<OrthancMultiframeVolumeLoader> doseLoader; |
678 boost::shared_ptr<DicomStructureSetLoader> rtstructLoader; | 619 boost::shared_ptr<DicomStructureSetLoader> rtstructLoader; |
679 | 620 |
680 { | 621 { |
681 NativeApplicationContext::WriterLock lock(context); | 622 ctLoader.reset(new OrthancSeriesVolumeProgressiveLoader(ct, oracle_, oracleObservable_)); |
682 //toto.reset(new Toto(oracle, lock.GetOracleObservable())); | 623 doseLoader.reset(new OrthancMultiframeVolumeLoader(dose, oracle_, oracleObservable_)); |
683 oracle_ = &oracle; | 624 rtstructLoader.reset(new DicomStructureSetLoader(oracle_, oracleObservable_)); |
684 IObservable* oracleObservable = &lock.GetOracleObservable(); | 625 } |
685 | |
686 | |
687 //oracleObservable->RegisterObserverCallback | |
688 //(new Callable | |
689 // <FusionMprSdlApp, SleepOracleCommand::TimeoutMessage>(*this, &FusionMprSdlApp::Handle)); | |
690 | |
691 | |
692 //oracleObservable->RegisterObserverCallback | |
693 //(new Callable | |
694 // <Toto, GetOrthancImageCommand::SuccessMessage>(*this, &FusionMprSdlApp::Handle)); | |
695 | |
696 //oracleObservable->RegisterObserverCallback | |
697 //(new Callable | |
698 // <FusionMprSdlApp, GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &ToFusionMprSdlAppto::Handle)); | |
699 | |
700 oracleObservable->RegisterObserverCallback | |
701 (new Callable | |
702 <FusionMprSdlApp, OracleCommandExceptionMessage>(*this, &FusionMprSdlApp::Handle)); | |
703 | |
704 | |
705 ctLoader.reset(new OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); | |
706 doseLoader.reset(new OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); | |
707 rtstructLoader.reset(new DicomStructureSetLoader(oracle, lock.GetOracleObservable())); | |
708 } | |
709 | |
710 | 626 |
711 //toto->SetReferenceLoader(*ctLoader); | 627 //toto->SetReferenceLoader(*ctLoader); |
712 doseLoader->RegisterObserverCallback | 628 //doseLoader->RegisterObserverCallback |
629 //(new Callable | |
630 // <FusionMprSdlApp, DicomVolumeImage::GeometryReadyMessage>(*this, &FusionMprSdlApp::Handle)); | |
631 ctLoader->RegisterObserverCallback | |
713 (new Callable | 632 (new Callable |
714 <FusionMprSdlApp, DicomVolumeImage::GeometryReadyMessage>(*this, &FusionMprSdlApp::Handle)); | 633 <FusionMprSdlApp, DicomVolumeImage::GeometryReadyMessage>(*this, &FusionMprSdlApp::Handle)); |
715 | 634 |
716 this->SetVolume1(0, ctLoader, new GrayscaleStyleConfigurator); | 635 this->SetVolume1(0, ctLoader, new GrayscaleStyleConfigurator); |
717 | 636 |
723 this->SetVolume2(1, tmp, config.release()); | 642 this->SetVolume2(1, tmp, config.release()); |
724 } | 643 } |
725 | 644 |
726 this->SetStructureSet(2, rtstructLoader); | 645 this->SetStructureSet(2, rtstructLoader); |
727 | 646 |
728 #if 0 | 647 #if 1 |
729 // BGO data | 648 // BGO data |
730 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT | 649 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT |
731 doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE | 650 //doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE |
732 //rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT | 651 //rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT |
733 #else | 652 #else |
734 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT | 653 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT |
735 //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE | 654 //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE |
736 //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT | 655 //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT |
739 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT | 658 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT |
740 doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE | 659 doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE |
741 rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT | 660 rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT |
742 #endif | 661 #endif |
743 | 662 |
744 oracle.Start(); | 663 oracle_.Start(); |
745 | 664 |
746 //// END from loader | 665 //// END from loader |
747 | 666 |
748 while (!g_stopApplication) | 667 while (!g_stopApplication) |
749 { | 668 { |
816 * might still be running while their parent object is destroyed, | 735 * might still be running while their parent object is destroyed, |
817 * resulting in crashes. This is very visible if adding a sleep(), | 736 * resulting in crashes. This is very visible if adding a sleep(), |
818 * as in (*). | 737 * as in (*). |
819 **/ | 738 **/ |
820 | 739 |
821 oracle.Stop(); | 740 oracle_.Stop(); |
822 //// END from loader | 741 //// END from loader |
823 } | 742 } |
824 | 743 |
825 void FusionMprSdlApp::SetInfoDisplayMessage( | 744 void FusionMprSdlApp::SetInfoDisplayMessage( |
826 std::string key, std::string value) | 745 std::string key, std::string value) |
859 Orthanc::Logging::EnableInfoLevel(true); | 778 Orthanc::Logging::EnableInfoLevel(true); |
860 // Orthanc::Logging::EnableTraceLevel(true); | 779 // Orthanc::Logging::EnableTraceLevel(true); |
861 | 780 |
862 try | 781 try |
863 { | 782 { |
864 MessageBroker broker; | 783 OrthancStone::MessageBroker broker; |
865 boost::shared_ptr<FusionMprSdlApp> app(new FusionMprSdlApp(broker)); | 784 boost::shared_ptr<FusionMprSdlApp> app(new FusionMprSdlApp(broker)); |
866 g_app = app; | 785 g_app = app; |
867 app->PrepareScene(); | 786 app->PrepareScene(); |
868 app->Run(); | 787 app->Run(); |
869 } | 788 } |