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 }