annotate Samples/Sdl/Loader.cpp @ 814:aead999345e0

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 28 May 2019 21:16:39 +0200
parents abc08ac721d3
children df442f1ba0c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Stone of Orthanc
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * modify it under the terms of the GNU Affero General Public License
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * as published by the Free Software Foundation, either version 3 of
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * the License, or (at your option) any later version.
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 *
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * Affero General Public License for more details.
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 *
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * You should have received a copy of the GNU Affero General Public License
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 **/
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
21
814
aead999345e0 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 812
diff changeset
22 #include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h"
aead999345e0 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 812
diff changeset
23 #include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h"
aead999345e0 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 812
diff changeset
24 #include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h"
aead999345e0 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 812
diff changeset
25 #include "../../Framework/Scene2D/LookupTableStyleConfigurator.h"
748
ab236bb5dbc7 ThreadedOracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 746
diff changeset
26 #include "../../Framework/Oracle/ThreadedOracle.h"
746
d716bfb3e07c reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 745
diff changeset
27 #include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h"
d716bfb3e07c reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 745
diff changeset
28 #include "../../Framework/Oracle/GetOrthancImageCommand.h"
d716bfb3e07c reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 745
diff changeset
29 #include "../../Framework/Oracle/OrthancRestApiCommand.h"
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
30 #include "../../Framework/Oracle/SleepOracleCommand.h"
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
31 #include "../../Framework/Oracle/OracleCommandExceptionMessage.h"
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
32
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 // From Stone
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
34 #include "../../Framework/Loaders/BasicFetchingItemsSorter.h"
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
35 #include "../../Framework/Loaders/BasicFetchingStrategy.h"
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
36 #include "../../Framework/Scene2D/CairoCompositor.h"
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
37 #include "../../Framework/Scene2D/Scene2D.h"
767
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 766
diff changeset
38 #include "../../Framework/Scene2D/PolylineSceneLayer.h"
768
55411e7da2f7 LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 767
diff changeset
39 #include "../../Framework/Scene2D/LookupTableTextureSceneLayer.h"
625
2eeb5857eb43 DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 623
diff changeset
40 #include "../../Framework/StoneInitialization.h"
2eeb5857eb43 DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 623
diff changeset
41 #include "../../Framework/Toolbox/GeometryToolbox.h"
683
dbc1d8bfc68a reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 681
diff changeset
42 #include "../../Framework/Toolbox/SlicesSorter.h"
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
43 #include "../../Framework/Toolbox/DicomStructureSet.h"
623
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
44 #include "../../Framework/Volumes/ImageBuffer3D.h"
742
fa5febe0f0c2 moved OrientedBoundingBox in the Volumes folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 735
diff changeset
45 #include "../../Framework/Volumes/VolumeImageGeometry.h"
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
46 #include "../../Framework/Volumes/VolumeReslicer.h"
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 // From Orthanc framework
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
49 #include <Core/DicomFormat/DicomArray.h>
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
50 #include <Core/Images/Image.h>
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 #include <Core/Images/ImageProcessing.h>
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
52 #include <Core/Images/PngWriter.h>
787
1a28fce57ff3 Fixed Visual Studio 2008 build
Benjamin Golinvaux <bgo@osimis.io>
parents: 769
diff changeset
53 #include <Core/Endianness.h>
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 #include <Core/Logging.h>
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 #include <Core/OrthancException.h>
683
dbc1d8bfc68a reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 681
diff changeset
56 #include <Core/SystemToolbox.h>
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
57 #include <Core/Toolbox.h>
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59
768
55411e7da2f7 LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 767
diff changeset
60 #include <EmbeddedResources.h>
55411e7da2f7 LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 767
diff changeset
61
55411e7da2f7 LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 767
diff changeset
62
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
63 namespace OrthancStone
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 {
803
d61728752790 more docs
Benjamin Golinvaux <bgo@osimis.io>
parents: 802
diff changeset
65 /**
802
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
66 This class is supplied with Oracle commands and will schedule up to
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
67 simultaneousDownloads_ of them at the same time, then will schedule the
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
68 rest once slots become available. It is used, a.o., by the
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
69 OrtancMultiframeVolumeLoader class.
800
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
70 */
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
71 class LoaderStateMachine : public IObserver
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
72 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
73 protected:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
74 class State : public Orthanc::IDynamicObject
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
75 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
76 private:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
77 LoaderStateMachine& that_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
78
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
79 public:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
80 State(LoaderStateMachine& that) :
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
81 that_(that)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
82 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
83 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
84
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
85 State(const State& currentState) :
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
86 that_(currentState.that_)
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
87 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
88 }
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
89
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
90 void Schedule(OracleCommandWithPayload* command) const
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
91 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
92 that_.Schedule(command);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
93 }
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
94
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
95 template <typename T>
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
96 T& GetLoader() const
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
97 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
98 return dynamic_cast<T&>(that_);
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
99 }
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
100
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
101 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
102 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
103 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
104 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
105
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
106 virtual void Handle(const GetOrthancImageCommand::SuccessMessage& message)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
107 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
108 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
109 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
110
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
111 virtual void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
112 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
113 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
114 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
115 };
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
116
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
117 void Schedule(OracleCommandWithPayload* command)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
118 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
119 std::auto_ptr<OracleCommandWithPayload> protection(command);
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
120
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
121 if (command == NULL)
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
122 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
123 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
124 }
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
125
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
126 if (!command->HasPayload())
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
127 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
128 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
129 "The payload must contain the next state");
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
130 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
131
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
132 pendingCommands_.push_back(protection.release());
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
133 Step();
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
134 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
135
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
136 void Start()
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
137 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
138 if (active_)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
139 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
140 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
141 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
142
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
143 active_ = true;
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
144
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
145 for (size_t i = 0; i < simultaneousDownloads_; i++)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
146 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
147 Step();
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
148 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
149 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
150
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
151 private:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
152 void Step()
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
153 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
154 if (!pendingCommands_.empty() &&
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
155 activeCommands_ < simultaneousDownloads_)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
156 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
157 oracle_.Schedule(*this, pendingCommands_.front());
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
158 pendingCommands_.pop_front();
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
159
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
160 activeCommands_++;
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
161 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
162 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
163
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
164 void Clear()
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
165 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
166 for (PendingCommands::iterator it = pendingCommands_.begin();
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
167 it != pendingCommands_.end(); ++it)
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
168 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
169 delete *it;
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
170 }
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
171
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
172 pendingCommands_.clear();
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
173 }
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
174
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
175 void HandleExceptionMessage(const OracleCommandExceptionMessage& message)
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
176 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
177 LOG(ERROR) << "Error in the state machine, stopping all processing";
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
178 Clear();
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
179 }
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
180
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
181 template <typename T>
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
182 void HandleSuccessMessage(const T& message)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
183 {
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
184 assert(activeCommands_ > 0);
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
185 activeCommands_--;
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
186
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
187 try
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
188 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
189 dynamic_cast<State&>(message.GetOrigin().GetPayload()).Handle(message);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
190 Step();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
191 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
192 catch (Orthanc::OrthancException& e)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
193 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
194 LOG(ERROR) << "Error in the state machine, stopping all processing: " << e.What();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
195 Clear();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
196 }
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
197 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
198
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
199 typedef std::list<IOracleCommand*> PendingCommands;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
200
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
201 IOracle& oracle_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
202 bool active_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
203 unsigned int simultaneousDownloads_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
204 PendingCommands pendingCommands_;
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
205 unsigned int activeCommands_;
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
206
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
207 public:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
208 LoaderStateMachine(IOracle& oracle,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
209 IObservable& oracleObservable) :
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
210 IObserver(oracleObservable.GetBroker()),
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
211 oracle_(oracle),
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
212 active_(false),
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
213 simultaneousDownloads_(4),
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
214 activeCommands_(0)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
215 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
216 oracleObservable.RegisterObserverCallback(
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
217 new Callable<LoaderStateMachine, OrthancRestApiCommand::SuccessMessage>
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
218 (*this, &LoaderStateMachine::HandleSuccessMessage));
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
219
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
220 oracleObservable.RegisterObserverCallback(
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
221 new Callable<LoaderStateMachine, GetOrthancImageCommand::SuccessMessage>
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
222 (*this, &LoaderStateMachine::HandleSuccessMessage));
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
223
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
224 oracleObservable.RegisterObserverCallback(
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
225 new Callable<LoaderStateMachine, GetOrthancWebViewerJpegCommand::SuccessMessage>
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
226 (*this, &LoaderStateMachine::HandleSuccessMessage));
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
227
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
228 oracleObservable.RegisterObserverCallback(
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
229 new Callable<LoaderStateMachine, OracleCommandExceptionMessage>
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
230 (*this, &LoaderStateMachine::HandleExceptionMessage));
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
231 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
232
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
233 virtual ~LoaderStateMachine()
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
234 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
235 Clear();
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
236 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
237
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
238 bool IsActive() const
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
239 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
240 return active_;
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
241 }
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
242
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
243 void SetSimultaneousDownloads(unsigned int count)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
244 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
245 if (active_)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
246 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
247 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
248 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
249 else if (count == 0)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
250 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
251 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
252 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
253 else
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
254 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
255 simultaneousDownloads_ = count;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
256 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
257 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
258 };
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
259
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
260
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
261
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
262 class OrthancMultiframeVolumeLoader :
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
263 public LoaderStateMachine,
793
f72b49954f62 DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
264 public IObservable
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
265 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
266 private:
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
267 class LoadRTDoseGeometry : public State
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
268 {
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
269 private:
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
270 std::auto_ptr<Orthanc::DicomMap> dicom_;
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
271
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
272 public:
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
273 LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that,
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
274 Orthanc::DicomMap* dicom) :
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
275 State(that),
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
276 dicom_(dicom)
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
277 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
278 if (dicom == NULL)
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
279 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
280 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
281 }
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
282
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
283 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
284
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
285 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
286 {
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
287 // Complete the DICOM tags with just-received "Grid Frame Offset Vector"
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
288 std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer());
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
289 dicom_->SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, s, false);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
290
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
291 GetLoader<OrthancMultiframeVolumeLoader>().SetGeometry(*dicom_);
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
292 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
293 };
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
294
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
295
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
296 static std::string GetSopClassUid(const Orthanc::DicomMap& dicom)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
297 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
298 std::string s;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
299 if (!dicom.CopyToString(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false))
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
300 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
301 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
302 "DICOM file without SOP class UID");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
303 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
304 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
305 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
306 return s;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
307 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
308 }
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
309
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
310
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
311 class LoadGeometry : public State
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
312 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
313 public:
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
314 LoadGeometry(OrthancMultiframeVolumeLoader& that) :
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
315 State(that)
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
316 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
317 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
318
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
319 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
320 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
321 OrthancMultiframeVolumeLoader& loader = GetLoader<OrthancMultiframeVolumeLoader>();
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
322
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
323 Json::Value body;
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
324 message.ParseJsonBody(body);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
325
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
326 if (body.type() != Json::objectValue)
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
327 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
328 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
329 }
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
330
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
331 std::auto_ptr<Orthanc::DicomMap> dicom(new Orthanc::DicomMap);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
332 dicom->FromDicomAsJson(body);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
333
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
334 if (StringToSopClassUid(GetSopClassUid(*dicom)) == SopClassUid_RTDose)
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
335 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
336 // Download the "Grid Frame Offset Vector" DICOM tag, that is
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
337 // mandatory for RT-DOSE, but is too long to be returned by default
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
338
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
339 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
340 command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" +
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
341 Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format());
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
342 command->SetPayload(new LoadRTDoseGeometry(loader, dicom.release()));
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
343
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
344 Schedule(command.release());
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
345 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
346 else
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
347 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
348 loader.SetGeometry(*dicom);
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
349 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
350 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
351 };
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
352
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
353
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
354
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
355 class LoadTransferSyntax : public State
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
356 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
357 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
358 LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) :
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
359 State(that)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
360 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
361 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
362
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
363 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
364 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
365 GetLoader<OrthancMultiframeVolumeLoader>().SetTransferSyntax(message.GetAnswer());
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
366 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
367 };
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
368
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
369
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
370 class LoadUncompressedPixelData : public State
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
371 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
372 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
373 LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) :
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
374 State(that)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
375 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
376 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
377
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
378 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
379 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
380 GetLoader<OrthancMultiframeVolumeLoader>().SetUncompressedPixelData(message.GetAnswer());
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
381 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
382 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
383
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
384
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
385
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
386 boost::shared_ptr<DicomVolumeImage> volume_;
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
387 std::string instanceId_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
388 std::string transferSyntaxUid_;
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
389
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
390
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
391 const std::string& GetInstanceId() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
392 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
393 if (IsActive())
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
394 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
395 return instanceId_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
396 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
397 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
398 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
399 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
400 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
401 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
402
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
403
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
404 void ScheduleFrameDownloads()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
405 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
406 if (transferSyntaxUid_.empty() ||
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
407 !volume_->HasGeometry())
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
408 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
409 return;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
410 }
800
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
411 /*
802
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
412 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM
Benjamin Golinvaux <bgo@osimis.io>
parents: 800 796
diff changeset
413 1.2.840.10008.1.2.1 Explicit VR Little Endian
800
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
414 1.2.840.10008.1.2.2 Explicit VR Big Endian
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
415
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
416 See https://www.dicomlibrary.com/dicom/transfer-syntax/
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
417 */
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
418 if (transferSyntaxUid_ == "1.2.840.10008.1.2" ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
419 transferSyntaxUid_ == "1.2.840.10008.1.2.1" ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
420 transferSyntaxUid_ == "1.2.840.10008.1.2.2")
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
421 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
422 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
423 command->SetHttpHeader("Accept-Encoding", "gzip");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
424 command->SetUri("/instances/" + instanceId_ + "/content/" +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
425 Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
426 command->SetPayload(new LoadUncompressedPixelData(*this));
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
427 Schedule(command.release());
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
428 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
429 else
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
430 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
431 throw Orthanc::OrthancException(
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
432 Orthanc::ErrorCode_NotImplemented,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
433 "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
434 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
435 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
436
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
437
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
438 void SetTransferSyntax(const std::string& transferSyntax)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
439 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
440 transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
441 ScheduleFrameDownloads();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
442 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
443
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
444
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
445 void SetGeometry(const Orthanc::DicomMap& dicom)
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
446 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
447 DicomInstanceParameters parameters(dicom);
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
448 volume_->SetDicomParameters(parameters);
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
449
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
450 Orthanc::PixelFormat format;
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
451 if (!parameters.GetImageInformation().ExtractPixelFormat(format, true))
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
452 {
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
453 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
454 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
455
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
456 double spacingZ;
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
457 switch (parameters.GetSopClassUid())
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
458 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
459 case SopClassUid_RTDose:
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
460 spacingZ = parameters.GetThickness();
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
461 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
462
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
463 default:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
464 throw Orthanc::OrthancException(
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
465 Orthanc::ErrorCode_NotImplemented,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
466 "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
467 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
468
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
469 const unsigned int width = parameters.GetImageInformation().GetWidth();
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
470 const unsigned int height = parameters.GetImageInformation().GetHeight();
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
471 const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames();
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
472
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
473 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
474 VolumeImageGeometry geometry;
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
475 geometry.SetSize(width, height, depth);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
476 geometry.SetAxialGeometry(parameters.GetGeometry());
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
477 geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(),
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
478 parameters.GetPixelSpacingY(), spacingZ);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
479 volume_->Initialize(geometry, format);
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
480 }
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
481
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
482 volume_->GetPixelData().Clear();
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
483
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
484 ScheduleFrameDownloads();
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
485
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
486 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_));
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
487 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
488
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
489
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
490 ORTHANC_FORCE_INLINE
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
491 static void CopyPixel(uint32_t& target,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
492 const void* source)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
493 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
494 // TODO - check alignement?
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
495 target = le32toh(*reinterpret_cast<const uint32_t*>(source));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
496 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
497
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
498
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
499 template <typename T>
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
500 void CopyPixelData(const std::string& pixelData)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
501 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
502 ImageBuffer3D& target = volume_->GetPixelData();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
503
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
504 const unsigned int bpp = target.GetBytesPerPixel();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
505 const unsigned int width = target.GetWidth();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
506 const unsigned int height = target.GetHeight();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
507 const unsigned int depth = target.GetDepth();
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
508
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
509 if (pixelData.size() != bpp * width * height * depth)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
510 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
511 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
512 "The pixel data has not the proper size");
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
513 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
514
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
515 if (pixelData.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
516 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
517 return;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
518 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
519
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
520 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
521
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
522 for (unsigned int z = 0; z < depth; z++)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
523 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
524 ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, z);
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
525
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
526 assert (writer.GetAccessor().GetWidth() == width &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
527 writer.GetAccessor().GetHeight() == height);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
528
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
529 for (unsigned int y = 0; y < height; y++)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
530 {
792
4fe4b221a31f deprecating MessagingToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 789
diff changeset
531 assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat()));
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
532
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
533 T* target = reinterpret_cast<T*>(writer.GetAccessor().GetRow(y));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
534
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
535 for (unsigned int x = 0; x < width; x++)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
536 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
537 CopyPixel(*target, source);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
538
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
539 target ++;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
540 source += bpp;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
541 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
542 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
543 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
544 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
545
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
546
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
547 void SetUncompressedPixelData(const std::string& pixelData)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
548 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
549 switch (volume_->GetPixelData().GetFormat())
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
550 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
551 case Orthanc::PixelFormat_Grayscale32:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
552 CopyPixelData<uint32_t>(pixelData);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
553 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
554
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
555 default:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
556 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
557 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
558
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
559 volume_->IncrementRevision();
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
560
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
561 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_));
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
562 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
563
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
564
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
565 public:
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
566 OrthancMultiframeVolumeLoader(const boost::shared_ptr<DicomVolumeImage>& volume,
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
567 IOracle& oracle,
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
568 IObservable& oracleObservable) :
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
569 LoaderStateMachine(oracle, oracleObservable),
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
570 IObservable(oracleObservable.GetBroker()),
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
571 volume_(volume)
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
572 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
573 if (volume.get() == NULL)
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
574 {
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
575 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
576 }
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
577 }
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
578
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
579
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
580 void LoadInstance(const std::string& instanceId)
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
581 {
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
582 Start();
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
583
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
584 instanceId_ = instanceId;
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
585
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
586 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
587 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
588 command->SetHttpHeader("Accept-Encoding", "gzip");
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
589 command->SetUri("/instances/" + instanceId + "/tags");
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
590 command->SetPayload(new LoadGeometry(*this));
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
591 Schedule(command.release());
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
592 }
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
593
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
594 {
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
595 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
596 command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax");
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
597 command->SetPayload(new LoadTransferSyntax(*this));
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
598 Schedule(command.release());
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
599 }
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
600 }
623
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
601 };
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
602
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
603
812
abc08ac721d3 small bit of doc
Benjamin Golinvaux <bgo@osimis.io>
parents: 806
diff changeset
604 /**
abc08ac721d3 small bit of doc
Benjamin Golinvaux <bgo@osimis.io>
parents: 806
diff changeset
605 This class is able to supply an extract slice for an arbitrary cutting
abc08ac721d3 small bit of doc
Benjamin Golinvaux <bgo@osimis.io>
parents: 806
diff changeset
606 plane through a volume image
abc08ac721d3 small bit of doc
Benjamin Golinvaux <bgo@osimis.io>
parents: 806
diff changeset
607 */
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
608 class DicomVolumeImageReslicer : public IVolumeSlicer
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
609 {
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
610 private:
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
611 class Slice : public IExtractedSlice
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
612 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
613 private:
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
614 DicomVolumeImageReslicer& that_;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
615 CoordinateSystem3D cuttingPlane_;
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
616
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
617 public:
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
618 Slice(DicomVolumeImageReslicer& that,
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
619 const CoordinateSystem3D& cuttingPlane) :
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
620 that_(that),
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
621 cuttingPlane_(cuttingPlane)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
622 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
623 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
624
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
625 virtual bool IsValid()
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
626 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
627 return true;
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
628 }
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
629
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
630 virtual uint64_t GetRevision()
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
631 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
632 return that_.volume_->GetRevision();
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
633 }
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
634
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
635 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator,
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
636 const CoordinateSystem3D& cuttingPlane)
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
637 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
638 VolumeReslicer& reslicer = that_.reslicer_;
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
639
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
640 if (configurator == NULL)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
641 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
642 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
643 "Must provide a layer style configurator");
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
644 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
645
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
646 reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat());
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
647 reslicer.Apply(that_.volume_->GetPixelData(),
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
648 that_.volume_->GetGeometry(),
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
649 cuttingPlane);
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
650
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
651 if (reslicer.IsSuccess())
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
652 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
653 std::auto_ptr<TextureBaseSceneLayer> layer
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
654 (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(),
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
655 that_.volume_->GetDicomParameters()));
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
656 if (layer.get() == NULL)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
657 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
658 return NULL;
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
659 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
660
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
661 double s = reslicer.GetPixelSpacing();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
662 layer->SetPixelSpacing(s, s);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
663 layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s,
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
664 reslicer.GetOutputExtent().GetY1() + 0.5 * s);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
665
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
666 // TODO - Angle!!
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
667
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
668 return layer.release();
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
669 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
670 else
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
671 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
672 return NULL;
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
673 }
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
674 }
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
675 };
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
676
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
677 boost::shared_ptr<DicomVolumeImage> volume_;
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
678 VolumeReslicer reslicer_;
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
679
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
680 public:
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
681 DicomVolumeImageReslicer(const boost::shared_ptr<DicomVolumeImage>& volume) :
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
682 volume_(volume)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
683 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
684 if (volume.get() == NULL)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
685 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
686 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
687 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
688 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
689
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
690 ImageInterpolation GetInterpolation() const
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
691 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
692 return reslicer_.GetInterpolation();
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
693 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
694
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
695 void SetInterpolation(ImageInterpolation interpolation)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
696 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
697 reslicer_.SetInterpolation(interpolation);
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
698 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
699
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
700 bool IsFastMode() const
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
701 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
702 return reslicer_.IsFastMode();
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
703 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
704
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
705 void SetFastMode(bool fast)
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
706 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
707 reslicer_.EnableFastMode(fast);
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
708 }
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
709
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
710 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane)
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
711 {
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
712 if (volume_->HasGeometry())
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
713 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
714 return new Slice(*this, cuttingPlane);
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
715 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
716 else
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
717 {
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
718 return new IVolumeSlicer::InvalidSlice;
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
719 }
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
720 }
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
721 };
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
722
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
723
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
724
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
725 class DicomStructureSetLoader :
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
726 public LoaderStateMachine,
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
727 public IVolumeSlicer
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
728 {
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
729 private:
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
730 class AddReferencedInstance : public State
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
731 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
732 private:
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
733 std::string instanceId_;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
734
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
735 public:
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
736 AddReferencedInstance(DicomStructureSetLoader& that,
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
737 const std::string& instanceId) :
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
738 State(that),
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
739 instanceId_(instanceId)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
740 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
741 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
742
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
743 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
744 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
745 Json::Value tags;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
746 message.ParseJsonBody(tags);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
747
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
748 Orthanc::DicomMap dicom;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
749 dicom.FromDicomAsJson(tags);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
750
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
751 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
752 loader.content_->AddReferencedSlice(dicom);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
753
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
754 loader.countProcessedInstances_ ++;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
755 assert(loader.countProcessedInstances_ <= loader.countReferencedInstances_);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
756
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
757 if (loader.countProcessedInstances_ == loader.countReferencedInstances_)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
758 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
759 // All the referenced instances have been loaded, finalize the RT-STRUCT
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
760 loader.content_->CheckReferencedSlices();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
761 loader.revision_++;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
762 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
763 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
764 };
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
765
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
766 // State that converts a "SOP Instance UID" to an Orthanc identifier
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
767 class LookupInstance : public State
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
768 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
769 private:
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
770 std::string sopInstanceUid_;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
771
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
772 public:
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
773 LookupInstance(DicomStructureSetLoader& that,
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
774 const std::string& sopInstanceUid) :
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
775 State(that),
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
776 sopInstanceUid_(sopInstanceUid)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
777 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
778 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
779
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
780 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
781 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
782 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
783
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
784 Json::Value lookup;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
785 message.ParseJsonBody(lookup);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
786
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
787 if (lookup.type() != Json::arrayValue ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
788 lookup.size() != 1 ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
789 !lookup[0].isMember("Type") ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
790 !lookup[0].isMember("Path") ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
791 lookup[0]["Type"].type() != Json::stringValue ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
792 lookup[0]["ID"].type() != Json::stringValue ||
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
793 lookup[0]["Type"].asString() != "Instance")
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
794 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
795 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
796 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
797
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
798 const std::string instanceId = lookup[0]["ID"].asString();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
799
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
800 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
801 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
802 command->SetHttpHeader("Accept-Encoding", "gzip");
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
803 command->SetUri("/instances/" + instanceId + "/tags");
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
804 command->SetPayload(new AddReferencedInstance(loader, instanceId));
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
805 Schedule(command.release());
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
806 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
807 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
808 };
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
809
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
810 class LoadStructure : public State
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
811 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
812 public:
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
813 LoadStructure(DicomStructureSetLoader& that) :
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
814 State(that)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
815 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
816 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
817
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
818 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
819 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
820 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
821
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
822 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
823 OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer());
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
824 loader.content_.reset(new DicomStructureSet(dicom));
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
825 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
826
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
827 std::set<std::string> instances;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
828 loader.content_->GetReferencedInstances(instances);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
829
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
830 loader.countReferencedInstances_ = instances.size();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
831
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
832 for (std::set<std::string>::const_iterator
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
833 it = instances.begin(); it != instances.end(); ++it)
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
834 {
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
835 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
836 command->SetUri("/tools/lookup");
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
837 command->SetMethod(Orthanc::HttpMethod_Post);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
838 command->SetBody(*it);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
839 command->SetPayload(new LookupInstance(loader, *it));
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
840 Schedule(command.release());
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
841 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
842 }
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
843 };
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
844
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
845
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
846
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
847 std::auto_ptr<DicomStructureSet> content_;
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
848 uint64_t revision_;
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
849 std::string instanceId_;
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
850 unsigned int countProcessedInstances_;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
851 unsigned int countReferencedInstances_;
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
852
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
853
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
854 class Slice : public IExtractedSlice
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
855 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
856 private:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
857 const DicomStructureSet& content_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
858 uint64_t revision_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
859 bool isValid_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
860
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
861 public:
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
862 Slice(const DicomStructureSet& content,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
863 uint64_t revision,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
864 const CoordinateSystem3D& cuttingPlane) :
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
865 content_(content),
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
866 revision_(revision)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
867 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
868 bool opposite;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
869
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
870 const Vector normal = content.GetNormal();
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
871 isValid_ = (
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
872 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) ||
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
873 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) ||
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
874 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY()));
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
875 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
876
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
877 virtual bool IsValid()
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
878 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
879 return isValid_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
880 }
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
881
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
882 virtual uint64_t GetRevision()
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
883 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
884 return revision_;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
885 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
886
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
887 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
888 const CoordinateSystem3D& cuttingPlane)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
889 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
890 assert(isValid_);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
891
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
892 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer);
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
893 layer->SetThickness(2);
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
894
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
895 for (size_t i = 0; i < content_.GetStructuresCount(); i++)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
896 {
804
61ba4b504e9a PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 802
diff changeset
897 const Color& color = content_.GetStructureColor(i);
61ba4b504e9a PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 802
diff changeset
898
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
899 std::vector< std::vector<DicomStructureSet::PolygonPoint> > polygons;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
900
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
901 if (content_.ProjectStructure(polygons, i, cuttingPlane))
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
902 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
903 for (size_t j = 0; j < polygons.size(); j++)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
904 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
905 PolylineSceneLayer::Chain chain;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
906 chain.resize(polygons[j].size());
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
907
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
908 for (size_t k = 0; k < polygons[j].size(); k++)
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
909 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
910 chain[k] = ScenePoint2D(polygons[j][k].first, polygons[j][k].second);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
911 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
912
804
61ba4b504e9a PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 802
diff changeset
913 layer->AddChain(chain, true /* closed */, color);
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
914 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
915 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
916 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
917
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
918 return layer.release();
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
919 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
920 };
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
921
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
922 public:
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
923 DicomStructureSetLoader(IOracle& oracle,
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
924 IObservable& oracleObservable) :
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
925 LoaderStateMachine(oracle, oracleObservable),
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
926 revision_(0),
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
927 countProcessedInstances_(0),
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
928 countReferencedInstances_(0)
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
929 {
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
930 }
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
931
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
932
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
933 void LoadInstance(const std::string& instanceId)
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
934 {
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
935 Start();
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
936
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
937 instanceId_ = instanceId;
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
938
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
939 {
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
940 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand);
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
941 command->SetHttpHeader("Accept-Encoding", "gzip");
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
942 command->SetUri("/instances/" + instanceId + "/tags?ignore-length=3006-0050");
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
943 command->SetPayload(new LoadStructure(*this));
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
944 Schedule(command.release());
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
945 }
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
946 }
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
947
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
948 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane)
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
949 {
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
950 if (content_.get() == NULL)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
951 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
952 // Geometry is not available yet
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
953 return new IVolumeSlicer::InvalidSlice;
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
954 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
955 else
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
956 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
957 return new Slice(*content_, revision_, cuttingPlane);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
958 }
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
959 }
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
960 };
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
961
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
962
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
963
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
964 class VolumeSceneLayerSource : public boost::noncopyable
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
965 {
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
966 private:
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
967 Scene2D& scene_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
968 int layerDepth_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
969 boost::shared_ptr<IVolumeSlicer> slicer_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
970 std::auto_ptr<ILayerStyleConfigurator> configurator_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
971 std::auto_ptr<CoordinateSystem3D> lastPlane_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
972 uint64_t lastRevision_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
973 uint64_t lastConfiguratorRevision_;
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
974
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
975 static bool IsSameCuttingPlane(const CoordinateSystem3D& a,
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
976 const CoordinateSystem3D& b)
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
977 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
978 // TODO - What if the normal is reversed?
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
979 double distance;
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
980 return (CoordinateSystem3D::ComputeDistance(distance, a, b) &&
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
981 LinearAlgebra::IsCloseToZero(distance));
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
982 }
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
983
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
984 void ClearLayer()
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
985 {
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
986 scene_.DeleteLayer(layerDepth_);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
987 lastPlane_.reset(NULL);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
988 }
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
989
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
990 public:
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
991 VolumeSceneLayerSource(Scene2D& scene,
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
992 int layerDepth,
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
993 const boost::shared_ptr<IVolumeSlicer>& slicer) :
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
994 scene_(scene),
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
995 layerDepth_(layerDepth),
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
996 slicer_(slicer)
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
997 {
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
998 if (slicer == NULL)
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
999 {
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1000 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1001 }
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1002 }
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1003
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1004 const IVolumeSlicer& GetSlicer() const
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1005 {
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
1006 return *slicer_;
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1007 }
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1008
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1009 void RemoveConfigurator()
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1010 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1011 configurator_.reset();
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1012 lastPlane_.reset();
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1013 }
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1014
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1015 void SetConfigurator(ILayerStyleConfigurator* configurator) // Takes ownership
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1016 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1017 if (configurator == NULL)
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1018 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1019 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1020 }
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1021
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1022 configurator_.reset(configurator);
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1023
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1024 // Invalidate the layer
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1025 lastPlane_.reset(NULL);
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1026 }
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1027
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1028 bool HasConfigurator() const
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1029 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1030 return configurator_.get() != NULL;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1031 }
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1032
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1033 ILayerStyleConfigurator& GetConfigurator() const
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1034 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1035 if (configurator_.get() == NULL)
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1036 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1037 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1038 }
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1039
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1040 return *configurator_;
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1041 }
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1042
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1043 void Update(const CoordinateSystem3D& plane)
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1044 {
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
1045 assert(slicer_.get() != NULL);
781
2bb72826fa3f IVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 780
diff changeset
1046 std::auto_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane));
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1047
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1048 if (slice.get() == NULL)
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1049 {
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1050 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1051 }
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1052
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1053 if (!slice->IsValid())
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1054 {
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1055 // The slicer cannot handle this cutting plane: Clear the layer
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1056 ClearLayer();
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1057 }
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1058 else if (lastPlane_.get() != NULL &&
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1059 IsSameCuttingPlane(*lastPlane_, plane) &&
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1060 lastRevision_ == slice->GetRevision())
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1061 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1062 // The content of the slice has not changed: Don't update the
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1063 // layer content, but possibly update its style
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1064
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1065 if (configurator_.get() != NULL &&
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1066 configurator_->GetRevision() != lastConfiguratorRevision_ &&
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1067 scene_.HasLayer(layerDepth_))
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1068 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1069 configurator_->ApplyStyle(scene_.GetLayer(layerDepth_));
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1070 }
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1071 }
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1072 else
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1073 {
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1074 // Content has changed: An update is needed
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1075 lastPlane_.reset(new CoordinateSystem3D(plane));
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1076 lastRevision_ = slice->GetRevision();
692
10910827f235 simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 691
diff changeset
1077
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1078 std::auto_ptr<ISceneLayer> layer(slice->CreateSceneLayer(configurator_.get(), plane));
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1079 if (layer.get() == NULL)
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1080 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1081 ClearLayer();
712
f334b098b243 IDicomVolumeSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 711
diff changeset
1082 }
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1083 else
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1084 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1085 if (configurator_.get() != NULL)
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1086 {
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1087 lastConfiguratorRevision_ = configurator_->GetRevision();
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1088 configurator_->ApplyStyle(*layer);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1089 }
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1090
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1091 scene_.SetLayer(layerDepth_, layer.release());
713
e63c8b9b7b02 setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 712
diff changeset
1092 }
691
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1093 }
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1094 }
032a94cca5c4 DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 684
diff changeset
1095 };
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1096
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1097
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1098
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1099
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1100
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1101 class NativeApplicationContext : public IMessageEmitter
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1102 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1103 private:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1104 boost::shared_mutex mutex_;
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1105 MessageBroker broker_;
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1106 IObservable oracleObservable_;
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1107
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1108 public:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1109 NativeApplicationContext() :
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1110 oracleObservable_(broker_)
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1111 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1112 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1113
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1114
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1115 virtual void EmitMessage(const IObserver& observer,
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1116 const IMessage& message)
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1117 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1118 try
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1119 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1120 boost::unique_lock<boost::shared_mutex> lock(mutex_);
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1121 oracleObservable_.EmitMessage(observer, message);
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1122 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1123 catch (Orthanc::OrthancException& e)
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1124 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1125 LOG(ERROR) << "Exception while emitting a message: " << e.What();
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1126 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1127 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1128
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1129
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1130 class ReaderLock : public boost::noncopyable
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1131 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1132 private:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1133 NativeApplicationContext& that_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1134 boost::shared_lock<boost::shared_mutex> lock_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1135
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1136 public:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1137 ReaderLock(NativeApplicationContext& that) :
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1138 that_(that),
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1139 lock_(that.mutex_)
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1140 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1141 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1142 };
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1143
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1144
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1145 class WriterLock : public boost::noncopyable
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1146 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1147 private:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1148 NativeApplicationContext& that_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1149 boost::unique_lock<boost::shared_mutex> lock_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1150
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1151 public:
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1152 WriterLock(NativeApplicationContext& that) :
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1153 that_(that),
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1154 lock_(that.mutex_)
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1155 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1156 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1157
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1158 MessageBroker& GetBroker()
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1159 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1160 return that_.broker_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1161 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1162
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1163 IObservable& GetOracleObservable()
681
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1164 {
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1165 return that_.oracleObservable_;
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1166 }
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1167 };
9723fceccb9f revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 680
diff changeset
1168 };
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1169 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1170
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1171
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1172
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1173 class Toto : public OrthancStone::IObserver
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1174 {
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1175 private:
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1176 OrthancStone::CoordinateSystem3D plane_;
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1177 OrthancStone::IOracle& oracle_;
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1178 OrthancStone::Scene2D scene_;
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1179 std::auto_ptr<OrthancStone::VolumeSceneLayerSource> source1_, source2_, source3_;
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1180
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1181
779
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1182 void Refresh()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1183 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1184 if (source1_.get() != NULL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1185 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1186 source1_->Update(plane_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1187 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1188
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1189 if (source2_.get() != NULL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1190 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1191 source2_->Update(plane_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1192 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1193
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1194 if (source3_.get() != NULL)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1195 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1196 source3_->Update(plane_);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1197 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1198
779
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1199 scene_.FitContent(1024, 768);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1200
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1201 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1202 OrthancStone::CairoCompositor compositor(scene_, 1024, 768);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1203 compositor.Refresh();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1204
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1205 Orthanc::ImageAccessor accessor;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1206 compositor.GetCanvas().GetReadOnlyAccessor(accessor);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1207
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1208 Orthanc::Image tmp(Orthanc::PixelFormat_RGB24, accessor.GetWidth(), accessor.GetHeight(), false);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1209 Orthanc::ImageProcessing::Convert(tmp, accessor);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1210
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1211 static unsigned int count = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1212 char buf[64];
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1213 sprintf(buf, "scene-%06d.png", count++);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1214
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1215 Orthanc::PngWriter writer;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1216 writer.WriteToFile(buf, tmp);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1217 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1218 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1219
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1220
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1221 void Handle(const OrthancStone::DicomVolumeImage::GeometryReadyMessage& message)
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1222 {
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1223 printf("Geometry ready\n");
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1224
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1225 //plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry();
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
1226 //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry();
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
1227 plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry();
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1228 plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f));
779
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1229
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1230 Refresh();
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1231 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1232
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1233
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1234 void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message)
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1235 {
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1236 if (message.GetOrigin().HasPayload())
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1237 {
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1238 printf("TIMEOUT! %d\n", dynamic_cast<const Orthanc::SingleValueObject<unsigned int>& >(message.GetOrigin().GetPayload()).GetValue());
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1239 }
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1240 else
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1241 {
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1242 printf("TIMEOUT\n");
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1243
779
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 778
diff changeset
1244 Refresh();
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1245
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1246 /**
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1247 * The sleep() leads to a crash if the oracle is still running,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1248 * while this object is destroyed. Always stop the oracle before
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1249 * destroying active objects. (*)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1250 **/
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1251 // boost::this_thread::sleep(boost::posix_time::seconds(2));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1252
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1253 oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(message.GetOrigin().GetDelay()));
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1254 }
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1255 }
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1256
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1257 void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message)
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1258 {
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1259 Json::Value v;
625
2eeb5857eb43 DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 623
diff changeset
1260 message.ParseJsonBody(v);
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1261
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1262 printf("ICI [%s]\n", v.toStyledString().c_str());
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1263 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1264
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1265 void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message)
637
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1266 {
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1267 printf("IMAGE %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight());
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1268 }
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1269
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1270 void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message)
642
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1271 {
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1272 printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight());
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1273 }
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1274
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1275 void Handle(const OrthancStone::OracleCommandExceptionMessage& message)
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1276 {
639
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1277 printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType());
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1278
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1279 switch (message.GetCommand().GetType())
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1280 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1281 case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg:
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1282 printf("URI: [%s]\n", dynamic_cast<const OrthancStone::GetOrthancWebViewerJpegCommand&>
639
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1283 (message.GetCommand()).GetUri().c_str());
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1284 break;
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1285
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1286 default:
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1287 break;
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1288 }
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1289 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1290
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1291 public:
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1292 Toto(OrthancStone::IOracle& oracle,
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1293 OrthancStone::IObservable& oracleObservable) :
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1294 IObserver(oracleObservable.GetBroker()),
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1295 oracle_(oracle)
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1296 {
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1297 oracleObservable.RegisterObserverCallback
623
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
1298 (new OrthancStone::Callable
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1299 <Toto, OrthancStone::SleepOracleCommand::TimeoutMessage>(*this, &Toto::Handle));
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1300
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1301 oracleObservable.RegisterObserverCallback
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1302 (new OrthancStone::Callable
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1303 <Toto, OrthancStone::OrthancRestApiCommand::SuccessMessage>(*this, &Toto::Handle));
637
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1304
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1305 oracleObservable.RegisterObserverCallback
637
afc91cdc5128 decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 636
diff changeset
1306 (new OrthancStone::Callable
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1307 <Toto, OrthancStone::GetOrthancImageCommand::SuccessMessage>(*this, &Toto::Handle));
639
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1308
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1309 oracleObservable.RegisterObserverCallback
639
d1f4521b9bbb OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 638
diff changeset
1310 (new OrthancStone::Callable
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1311 <Toto, OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &Toto::Handle));
642
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1312
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1313 oracleObservable.RegisterObserverCallback
642
7ca8dc7ec17b GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 641
diff changeset
1314 (new OrthancStone::Callable
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1315 <Toto, OrthancStone::OracleCommandExceptionMessage>(*this, &Toto::Handle));
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1316 }
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1317
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1318 void SetReferenceLoader(OrthancStone::IObservable& loader)
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1319 {
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1320 loader.RegisterObserverCallback
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1321 (new OrthancStone::Callable
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1322 <Toto, OrthancStone::DicomVolumeImage::GeometryReadyMessage>(*this, &Toto::Handle));
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1323 }
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1324
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1325 void SetVolume1(int depth,
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1326 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume,
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1327 OrthancStone::ILayerStyleConfigurator* style)
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1328 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1329 source1_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume));
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1330
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1331 if (style != NULL)
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1332 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1333 source1_->SetConfigurator(style);
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1334 }
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1335 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1336
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1337 void SetVolume2(int depth,
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1338 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume,
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1339 OrthancStone::ILayerStyleConfigurator* style)
766
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
1340 {
776
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1341 source2_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume));
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1342
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1343 if (style != NULL)
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1344 {
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1345 source2_->SetConfigurator(style);
0387485f048b ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 769
diff changeset
1346 }
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1347 }
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1348
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1349 void SetStructureSet(int depth,
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1350 const boost::shared_ptr<OrthancStone::DicomStructureSetLoader>& volume)
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1351 {
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1352 source3_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume));
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1353 }
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1354
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1355 };
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1356
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1357
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1358 void Run(OrthancStone::NativeApplicationContext& context,
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1359 OrthancStone::ThreadedOracle& oracle)
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1360 {
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1361 boost::shared_ptr<OrthancStone::DicomVolumeImage> ct(new OrthancStone::DicomVolumeImage);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1362 boost::shared_ptr<OrthancStone::DicomVolumeImage> dose(new OrthancStone::DicomVolumeImage);
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1363
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1364
762
26f4345e771e creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
1365 boost::shared_ptr<Toto> toto;
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1366 boost::shared_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> ctLoader;
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1367 boost::shared_ptr<OrthancStone::OrthancMultiframeVolumeLoader> doseLoader;
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
1368 boost::shared_ptr<OrthancStone::DicomStructureSetLoader> rtstructLoader;
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1369
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1370 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1371 OrthancStone::NativeApplicationContext::WriterLock lock(context);
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1372 toto.reset(new Toto(oracle, lock.GetOracleObservable()));
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1373 ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable()));
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1374 doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable()));
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
1375 rtstructLoader.reset(new OrthancStone::DicomStructureSetLoader(oracle, lock.GetOracleObservable()));
623
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
1376 }
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
1377
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1378
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1379 //toto->SetReferenceLoader(*ctLoader);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1380 toto->SetReferenceLoader(*doseLoader);
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1381
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1382
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1383 #if 1
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1384 toto->SetVolume1(0, ctLoader, new OrthancStone::GrayscaleStyleConfigurator);
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1385 #else
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1386 {
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1387 boost::shared_ptr<OrthancStone::IVolumeSlicer> reslicer(new OrthancStone::DicomVolumeImageReslicer(ct));
782
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1388 toto->SetVolume1(0, reslicer, new OrthancStone::GrayscaleStyleConfigurator);
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1389 }
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1390 #endif
b24c208fa953 VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 781
diff changeset
1391
780
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
1392
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
1393 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
1394 std::auto_ptr<OrthancStone::LookupTableStyleConfigurator> config(new OrthancStone::LookupTableStyleConfigurator);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
1395 config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT);
793
f72b49954f62 DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
1396
f72b49954f62 DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
1397 boost::shared_ptr<OrthancStone::DicomVolumeImageMPRSlicer> tmp(new OrthancStone::DicomVolumeImageMPRSlicer(dose));
f72b49954f62 DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
1398 toto->SetVolume2(1, tmp, config.release());
780
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
1399 }
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1400
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1401 toto->SetStructureSet(2, rtstructLoader);
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1402
793
f72b49954f62 DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
1403 oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100));
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1404
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1405 if (0)
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1406 {
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1407 Json::Value v = Json::objectValue;
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1408 v["Level"] = "Series";
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1409 v["Query"] = Json::objectValue;
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1410
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1411 std::auto_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand);
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1412 command->SetMethod(Orthanc::HttpMethod_Post);
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1413 command->SetUri("/tools/find");
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1414 command->SetBody(v);
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1415
623
42dadae61fa9 renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 622
diff changeset
1416 oracle.Schedule(*toto, command.release());
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1417 }
625
2eeb5857eb43 DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 623
diff changeset
1418
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1419 if (0)
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1420 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1421 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand);
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1422 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg)));
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1423 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1424 oracle.Schedule(*toto, command.release());
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1425 }
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1426
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1427 if (0)
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1428 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1429 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand);
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1430 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png)));
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1431 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1432 oracle.Schedule(*toto, command.release());
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1433 }
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1434
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1435 if (0)
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1436 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1437 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand);
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1438 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png)));
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1439 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1440 oracle.Schedule(*toto, command.release());
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1441 }
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1442
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1443 if (0)
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1444 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1445 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand);
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1446 command->SetHttpHeader("Accept-Encoding", "gzip");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1447 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam)));
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1448 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1449 oracle.Schedule(*toto, command.release());
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1450 }
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1451
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1452 if (0)
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1453 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1454 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand);
636
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1455 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam)));
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1456 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16");
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1457 oracle.Schedule(*toto, command.release());
fb00a8be03e2 starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 631
diff changeset
1458 }
638
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1459
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1460 if (0)
638
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1461 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1462 std::auto_ptr<OrthancStone::GetOrthancWebViewerJpegCommand> command(new OrthancStone::GetOrthancWebViewerJpegCommand);
638
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1463 command->SetHttpHeader("Accept-Encoding", "gzip");
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1464 command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e");
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1465 command->SetQuality(90);
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1466 oracle.Schedule(*toto, command.release());
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1467 }
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1468
e626f38c5512 DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 637
diff changeset
1469
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1470 if (0)
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1471 {
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1472 for (unsigned int i = 0; i < 10; i++)
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1473 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1474 std::auto_ptr<OrthancStone::SleepOracleCommand> command(new OrthancStone::SleepOracleCommand(i * 1000));
744
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1475 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i));
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1476 oracle.Schedule(*toto, command.release());
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1477 }
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1478 }
a4bfb420b869 SleepOracleCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 742
diff changeset
1479
784
9f3b2027a4a9 DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 783
diff changeset
1480
625
2eeb5857eb43 DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 623
diff changeset
1481 // 2017-11-17-Anonymized
800
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1482 #if 0
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1483 // BGO data
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1484 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1485 doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1486 //rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1487 #else
794
04f518ebd132 LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 793
diff changeset
1488 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1489 //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE
795
bc20e4c417ec refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 794
diff changeset
1490 //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1491
796
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1492 // 2017-05-16
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1493 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1494 doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE
d3197e0e321d DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 795
diff changeset
1495 rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT
800
98a89b116b62 Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents: 795
diff changeset
1496 #endif
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
1497 // 2015-01-28-Multiframe
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1498 //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT
764
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 763
diff changeset
1499
661
970949ff868a fix warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 648
diff changeset
1500 // Delphine
783
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1501 //ctLoader->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT
cd13a062c9bd DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 782
diff changeset
1502 //ctLoader->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm
661
970949ff868a fix warning
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 648
diff changeset
1503
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1504
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1505 {
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1506 LOG(WARNING) << "...Waiting for Ctrl-C...";
760
1181e1ad98ec progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 759
diff changeset
1507
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1508 oracle.Start();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1509
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1510 Orthanc::SystemToolbox::ServerBarrier();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1511
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1512 /**
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1513 * WARNING => The oracle must be stopped BEFORE the objects using
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1514 * it are destroyed!!! This forces to wait for the completion of
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1515 * the running callback methods. Otherwise, the callbacks methods
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1516 * might still be running while their parent object is destroyed,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1517 * resulting in crashes. This is very visible if adding a sleep(),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1518 * as in (*).
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1519 **/
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1520
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1521 oracle.Stop();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1522 }
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1523 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1524
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1525
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1526
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1527 /**
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1528 * IMPORTANT: The full arguments to "main()" are needed for SDL on
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1529 * Windows. Otherwise, one gets the linking error "undefined reference
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1530 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1531 **/
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1532 int main(int argc, char* argv[])
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1533 {
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1534 OrthancStone::StoneInitialize();
778
78fcb907caf6 VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1535 //Orthanc::Logging::EnableInfoLevel(true);
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1536
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1537 try
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1538 {
745
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1539 OrthancStone::NativeApplicationContext context;
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1540
c44c1d2d3598 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 744
diff changeset
1541 OrthancStone::ThreadedOracle oracle(context);
767
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 766
diff changeset
1542 //oracle.SetThreadsCount(1);
680
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1543
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1544 {
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1545 Orthanc::WebServiceParameters p;
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1546 //p.SetUrl("http://localhost:8043/");
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1547 p.SetCredentials("orthanc", "orthanc");
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1548 oracle.SetOrthancParameters(p);
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1549 }
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1550
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1551 //oracle.Start();
680
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1552
0eb26f514ac5 loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 678
diff changeset
1553 Run(context, oracle);
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1554
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 764
diff changeset
1555 //oracle.Stop();
619
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1556 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1557 catch (Orthanc::OrthancException& e)
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1558 {
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1559 LOG(ERROR) << "EXCEPTION: " << e.What();
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1560 }
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1561
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1562 OrthancStone::StoneFinalize();
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1563
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1564 return 0;
9cd19b28f011 test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1565 }