Mercurial > hg > orthanc-stone
annotate Samples/Sdl/Loader.cpp @ 803:d61728752790
more docs
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 28 May 2019 15:31:12 +0200 |
parents | f38c1fc08655 |
children | 6a75f1c03c4e |
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 | 21 |
746 | 22 #include "../../Framework/Toolbox/DicomInstanceParameters.h" |
748 | 23 #include "../../Framework/Oracle/ThreadedOracle.h" |
746 | 24 #include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" |
25 #include "../../Framework/Oracle/GetOrthancImageCommand.h" | |
26 #include "../../Framework/Oracle/OrthancRestApiCommand.h" | |
745 | 27 #include "../../Framework/Oracle/SleepOracleCommand.h" |
28 #include "../../Framework/Oracle/OracleCommandExceptionMessage.h" | |
29 | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 // From Stone |
712 | 31 #include "../../Framework/Loaders/BasicFetchingItemsSorter.h" |
32 #include "../../Framework/Loaders/BasicFetchingStrategy.h" | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
33 #include "../../Framework/Scene2D/CairoCompositor.h" |
712 | 34 #include "../../Framework/Scene2D/Scene2D.h" |
767 | 35 #include "../../Framework/Scene2D/PolylineSceneLayer.h" |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
767
diff
changeset
|
36 #include "../../Framework/Scene2D/LookupTableTextureSceneLayer.h" |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
37 #include "../../Framework/StoneInitialization.h" |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
38 #include "../../Framework/Toolbox/GeometryToolbox.h" |
683
dbc1d8bfc68a
reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
681
diff
changeset
|
39 #include "../../Framework/Toolbox/SlicesSorter.h" |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
40 #include "../../Framework/Toolbox/DicomStructureSet.h" |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
41 #include "../../Framework/Volumes/ImageBuffer3D.h" |
742
fa5febe0f0c2
moved OrientedBoundingBox in the Volumes folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
735
diff
changeset
|
42 #include "../../Framework/Volumes/VolumeImageGeometry.h" |
781 | 43 #include "../../Framework/Volumes/VolumeReslicer.h" |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 // From Orthanc framework |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
46 #include <Core/DicomFormat/DicomArray.h> |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
47 #include <Core/Images/Image.h> |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 #include <Core/Images/ImageProcessing.h> |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
49 #include <Core/Images/PngWriter.h> |
787
1a28fce57ff3
Fixed Visual Studio 2008 build
Benjamin Golinvaux <bgo@osimis.io>
parents:
769
diff
changeset
|
50 #include <Core/Endianness.h> |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 #include <Core/Logging.h> |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 #include <Core/OrthancException.h> |
683
dbc1d8bfc68a
reorganizing ImageBuffer3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
681
diff
changeset
|
53 #include <Core/SystemToolbox.h> |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
54 #include <Core/Toolbox.h> |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
55 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
767
diff
changeset
|
57 #include <EmbeddedResources.h> |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
767
diff
changeset
|
58 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
767
diff
changeset
|
59 |
745 | 60 namespace OrthancStone |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 { |
803 | 62 /** |
63 This interface is implemented by objects able to create an ISceneLayer | |
64 suitable to display the Orthanc image supplied to the CreateTextureXX | |
65 factory methods (taking Dicom parameters into account if relevant). | |
66 | |
67 It can also refresh the style of an existing layer afterwards, to match | |
68 the configurator settings. | |
69 */ | |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
70 class ILayerStyleConfigurator |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
71 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
72 public: |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
73 virtual ~ILayerStyleConfigurator() |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
74 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
75 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
76 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
77 virtual uint64_t GetRevision() const = 0; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
78 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
79 virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const = 0; |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
80 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
81 virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
82 const DicomInstanceParameters& parameters) const = 0; |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
83 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
84 virtual void ApplyStyle(ISceneLayer& layer) const = 0; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
85 }; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
86 |
803 | 87 /** |
88 This configurator supplies an API to set a display range and a LUT. | |
89 */ | |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
90 class LookupTableStyleConfigurator : public ILayerStyleConfigurator |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
91 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
92 private: |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
93 uint64_t revision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
94 bool hasLut_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
95 std::string lut_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
96 bool hasRange_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
97 float minValue_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
98 float maxValue_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
99 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
100 public: |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
101 LookupTableStyleConfigurator() : |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
102 revision_(0), |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
103 hasLut_(false), |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
104 hasRange_(false) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
105 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
106 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
107 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
108 void SetLookupTable(Orthanc::EmbeddedResources::FileResourceId resource) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
109 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
110 hasLut_ = true; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
111 Orthanc::EmbeddedResources::GetFileResource(lut_, resource); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
112 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
113 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
114 void SetLookupTable(const std::string& lut) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
115 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
116 hasLut_ = true; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
117 lut_ = lut; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
118 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
119 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
120 void SetRange(float minValue, |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
121 float maxValue) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
122 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
123 if (minValue > maxValue) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
124 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
125 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
126 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
127 else |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
128 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
129 hasRange_ = true; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
130 minValue_ = minValue; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
131 maxValue_ = maxValue; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
132 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
133 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
134 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
135 virtual uint64_t GetRevision() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
136 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
137 return revision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
138 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
139 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
140 virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
141 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
142 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
143 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
144 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
145 virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
146 const DicomInstanceParameters& parameters) const |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
147 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
148 return parameters.CreateLookupTableTexture(frame); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
149 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
150 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
151 virtual void ApplyStyle(ISceneLayer& layer) const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
152 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
153 LookupTableTextureSceneLayer& l = dynamic_cast<LookupTableTextureSceneLayer&>(layer); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
154 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
155 if (hasLut_) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
156 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
157 l.SetLookupTable(lut_); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
158 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
159 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
160 if (hasRange_) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
161 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
162 l.SetRange(minValue_, maxValue_); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
163 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
164 else |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
165 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
166 l.FitRange(); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
167 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
168 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
169 }; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
170 |
803 | 171 /** |
172 Creates layers to display the supplied image in grayscale. No dynamic | |
173 style is available. | |
174 */ | |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
175 class GrayscaleStyleConfigurator : public ILayerStyleConfigurator |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
176 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
177 private: |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
178 uint64_t revision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
179 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
180 public: |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
181 GrayscaleStyleConfigurator() : |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
182 revision_(0) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
183 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
184 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
185 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
186 virtual uint64_t GetRevision() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
187 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
188 return revision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
189 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
190 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
191 virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
192 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
193 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
194 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
195 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
196 virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
197 const DicomInstanceParameters& parameters) const |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
198 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
199 return parameters.CreateTexture(frame); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
200 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
201 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
202 virtual void ApplyStyle(ISceneLayer& layer) const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
203 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
204 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
205 }; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
206 |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
207 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
208 This interface is implemented by objects representing 3D volume data and |
803 | 209 that are able to return an object that: |
210 - represent a slice of their data | |
211 - are able to create the corresponding slice visual representation. | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
212 */ |
757 | 213 class IVolumeSlicer : public boost::noncopyable |
214 { | |
215 public: | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
216 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
217 This interface is implemented by objects representing a slice of |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
218 volume data and that are able to create a 2D layer to display a this |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
219 slice. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
220 |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
221 The CreateSceneLayer factory method is called with an optional |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
222 configurator that possibly impacts the ISceneLayer subclass that is |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
223 created (for instance, if a LUT must be applied on the texture when |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
224 displaying it) |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
225 */ |
781 | 226 class IExtractedSlice : public boost::noncopyable |
757 | 227 { |
228 public: | |
781 | 229 virtual ~IExtractedSlice() |
757 | 230 { |
231 } | |
232 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
233 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
234 Invalid slices are created when the data is not ready yet or if the |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
235 cut is outside of the available geometry. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
236 */ |
757 | 237 virtual bool IsValid() = 0; |
238 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
239 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
240 This retrieves the *revision* that gets incremented every time the |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
241 underlying object undergoes a mutable operation (that it, changes its |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
242 state). |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
243 This **must** be a cheap call. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
244 */ |
757 | 245 virtual uint64_t GetRevision() = 0; |
246 | |
803 | 247 /** Creates the slice visual representation */ |
248 virtual ISceneLayer* CreateSceneLayer( | |
249 const ILayerStyleConfigurator* configurator, // possibly absent | |
250 const CoordinateSystem3D& cuttingPlane) = 0; | |
757 | 251 }; |
252 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
253 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
254 See IExtractedSlice.IsValid() |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
255 */ |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
256 class InvalidSlice : public IExtractedSlice |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
257 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
258 public: |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
259 virtual bool IsValid() |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
260 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
261 return false; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
262 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
263 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
264 virtual uint64_t GetRevision() |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
265 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
266 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
267 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
268 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
269 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
270 const CoordinateSystem3D& cuttingPlane) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
271 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
272 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
273 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
274 }; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
275 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
276 |
757 | 277 virtual ~IVolumeSlicer() |
278 { | |
279 } | |
280 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
281 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
282 This method is implemented by the objects representing volumetric data |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
283 and must returns an IExtractedSlice subclass that contains all the data |
803 | 284 needed to, later on, create its visual representation through |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
285 CreateSceneLayer. |
803 | 286 Subclasses a.o.: |
287 - InvalidSlice, | |
288 - DicomVolumeImageMPRSlicer::Slice, | |
289 - DicomVolumeImageReslicer::Slice | |
290 - DicomStructureSetLoader::Slice | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
291 */ |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
292 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) = 0; |
759 | 293 }; |
294 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
295 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
296 This class combines a 3D image buffer, a 3D volume geometry and |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
297 information about the DICOM parameters of the series. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
298 (MPR means MultiPlanar Reconstruction) |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
299 */ |
783 | 300 class DicomVolumeImage : public boost::noncopyable |
301 { | |
302 public: | |
303 ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, DicomVolumeImage); | |
304 ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentUpdatedMessage, DicomVolumeImage); | |
305 | |
306 private: | |
307 uint64_t revision_; | |
308 std::auto_ptr<VolumeImageGeometry> geometry_; | |
309 std::auto_ptr<ImageBuffer3D> image_; | |
310 std::auto_ptr<DicomInstanceParameters> parameters_; | |
311 | |
312 void CheckHasGeometry() const | |
313 { | |
314 if (!HasGeometry()) | |
315 { | |
316 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
317 } | |
318 } | |
319 | |
320 public: | |
321 DicomVolumeImage() : | |
322 revision_(0) | |
323 { | |
324 } | |
325 | |
326 void IncrementRevision() | |
327 { | |
328 revision_ ++; | |
329 } | |
330 | |
331 void Initialize(const VolumeImageGeometry& geometry, | |
332 Orthanc::PixelFormat format) | |
333 { | |
334 geometry_.reset(new VolumeImageGeometry(geometry)); | |
335 image_.reset(new ImageBuffer3D(format, geometry_->GetWidth(), geometry_->GetHeight(), | |
336 geometry_->GetDepth(), false /* don't compute range */)); | |
337 | |
338 revision_ ++; | |
339 } | |
340 | |
341 void SetDicomParameters(const DicomInstanceParameters& parameters) | |
342 { | |
343 parameters_.reset(parameters.Clone()); | |
344 revision_ ++; | |
345 } | |
346 | |
347 uint64_t GetRevision() const | |
348 { | |
349 return revision_; | |
350 } | |
351 | |
352 bool HasGeometry() const | |
353 { | |
354 return (geometry_.get() != NULL && | |
355 image_.get() != NULL); | |
356 } | |
357 | |
358 ImageBuffer3D& GetPixelData() | |
359 { | |
360 CheckHasGeometry(); | |
361 return *image_; | |
362 } | |
363 | |
364 const ImageBuffer3D& GetPixelData() const | |
365 { | |
366 CheckHasGeometry(); | |
367 return *image_; | |
368 } | |
369 | |
370 const VolumeImageGeometry& GetGeometry() const | |
371 { | |
372 CheckHasGeometry(); | |
373 return *geometry_; | |
374 } | |
375 | |
376 bool HasDicomParameters() const | |
377 { | |
378 return parameters_.get() != NULL; | |
379 } | |
380 | |
381 const DicomInstanceParameters& GetDicomParameters() const | |
382 { | |
383 if (HasDicomParameters()) | |
384 { | |
385 return *parameters_; | |
386 } | |
387 else | |
388 { | |
389 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
390 } | |
391 } | |
392 }; | |
393 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
394 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
395 Implements the IVolumeSlicer on Dicom volume data when the cutting plane |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
396 that is supplied to the slicer is either axial, sagittal or coronal. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
397 Arbitrary planes are *not* supported |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
398 */ |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
399 class DicomVolumeImageMPRSlicer : public IVolumeSlicer |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
400 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
401 public: |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
402 class Slice : public IExtractedSlice |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
403 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
404 private: |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
405 const DicomVolumeImage& volume_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
406 bool valid_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
407 VolumeProjection projection_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
408 unsigned int sliceIndex_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
409 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
410 void CheckValid() const |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
411 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
412 if (!valid_) |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
413 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
414 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
415 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
416 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
417 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
418 protected: |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
419 // Can be overloaded in subclasses |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
420 virtual uint64_t GetRevisionInternal(VolumeProjection projection, |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
421 unsigned int sliceIndex) const |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
422 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
423 return volume_.GetRevision(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
424 } |
757 | 425 |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
426 public: |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
427 /** |
803 | 428 Represents a slice of a volume image that is parallel to the |
429 coordinate system axis. | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
430 The constructor initializes the type of projection (axial, sagittal or |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
431 coronal) and the corresponding slice index, from the cutting plane. |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
432 */ |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
433 Slice(const DicomVolumeImage& volume, |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
434 const CoordinateSystem3D& cuttingPlane) : |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
435 volume_(volume) |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
436 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
437 valid_ = (volume_.HasDicomParameters() && |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
438 volume_.GetGeometry().DetectSlice(projection_, sliceIndex_, cuttingPlane)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
439 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
440 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
441 VolumeProjection GetProjection() const |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
442 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
443 CheckValid(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
444 return projection_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
445 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
446 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
447 unsigned int GetSliceIndex() const |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
448 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
449 CheckValid(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
450 return sliceIndex_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
451 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
452 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
453 virtual bool IsValid() |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
454 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
455 return valid_; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
456 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
457 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
458 virtual uint64_t GetRevision() |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
459 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
460 CheckValid(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
461 return GetRevisionInternal(projection_, sliceIndex_); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
462 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
463 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
464 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
465 const CoordinateSystem3D& cuttingPlane) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
466 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
467 CheckValid(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
468 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
469 if (configurator == NULL) |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
470 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
471 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer, |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
472 "A style configurator is mandatory for textures"); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
473 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
474 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
475 std::auto_ptr<TextureBaseSceneLayer> texture; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
476 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
477 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
478 const DicomInstanceParameters& parameters = volume_.GetDicomParameters(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
479 ImageBuffer3D::SliceReader reader(volume_.GetPixelData(), projection_, sliceIndex_); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
480 texture.reset(dynamic_cast<TextureBaseSceneLayer*> |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
481 (configurator->CreateTextureFromDicom(reader.GetAccessor(), parameters))); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
482 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
483 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
484 const CoordinateSystem3D& system = volume_.GetGeometry().GetProjectionGeometry(projection_); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
485 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
486 double x0, y0, x1, y1; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
487 cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin()); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
488 cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX()); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
489 texture->SetOrigin(x0, y0); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
490 |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
491 double dx = x1 - x0; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
492 double dy = y1 - y0; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
493 if (!LinearAlgebra::IsCloseToZero(dx) || |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
494 !LinearAlgebra::IsCloseToZero(dy)) |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
495 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
496 texture->SetAngle(atan2(dy, dx)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
497 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
498 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
499 Vector tmp = volume_.GetGeometry().GetVoxelDimensions(projection_); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
500 texture->SetPixelSpacing(tmp[0], tmp[1]); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
501 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
502 return texture.release(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
503 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
504 #if 0 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
505 double w = texture->GetTexture().GetWidth() * tmp[0]; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
506 double h = texture->GetTexture().GetHeight() * tmp[1]; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
507 printf("%.1f %.1f %.1f => %.1f %.1f => %.1f %.1f\n", |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
508 system.GetOrigin() [0], |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
509 system.GetOrigin() [1], |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
510 system.GetOrigin() [2], |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
511 x0, y0, x0 + w, y0 + h); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
512 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
513 std::auto_ptr<PolylineSceneLayer> toto(new PolylineSceneLayer); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
514 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
515 PolylineSceneLayer::Chain c; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
516 c.push_back(ScenePoint2D(x0, y0)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
517 c.push_back(ScenePoint2D(x0 + w, y0)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
518 c.push_back(ScenePoint2D(x0 + w, y0 + h)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
519 c.push_back(ScenePoint2D(x0, y0 + h)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
520 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
521 toto->AddChain(c, true); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
522 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
523 return toto.release(); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
524 #endif |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
525 } |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
526 }; |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
527 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
528 private: |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
529 boost::shared_ptr<DicomVolumeImage> volume_; |
757 | 530 |
531 public: | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
532 DicomVolumeImageMPRSlicer(const boost::shared_ptr<DicomVolumeImage>& volume) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
533 volume_(volume) |
757 | 534 { |
535 } | |
536 | |
803 | 537 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE |
757 | 538 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
539 if (volume_->HasGeometry()) |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
540 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
541 return new Slice(*volume_, cuttingPlane); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
542 } |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
543 else |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
544 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
545 return new IVolumeSlicer::InvalidSlice; |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
546 } |
757 | 547 } |
548 }; | |
549 | |
781 | 550 |
551 | |
552 | |
803 | 553 /** |
554 This class is used to manage the progressive loading of a volume that | |
555 is stored in a Dicom series. | |
556 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
557 // TODO - Refactor using LoaderStateMachine? |
803 | 558 // TODO: |
559 */ | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
560 class OrthancSeriesVolumeProgressiveLoader : |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
561 public IObserver, |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
562 public IObservable, |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
563 public IVolumeSlicer |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
564 { |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
565 private: |
711 | 566 static const unsigned int LOW_QUALITY = 0; |
567 static const unsigned int MIDDLE_QUALITY = 1; | |
568 static const unsigned int BEST_QUALITY = 2; | |
569 | |
803 | 570 /** Helper class internal to OrthancSeriesVolumeProgressiveLoader */ |
783 | 571 class SeriesGeometry : public boost::noncopyable |
572 { | |
573 private: | |
574 void CheckSlice(size_t index, | |
575 const DicomInstanceParameters& reference) const | |
576 { | |
577 const DicomInstanceParameters& slice = *slices_[index]; | |
578 | |
579 if (!GeometryToolbox::IsParallel( | |
580 reference.GetGeometry().GetNormal(), | |
581 slice.GetGeometry().GetNormal())) | |
582 { | |
583 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
584 "A slice in the volume image is not parallel to the others"); | |
585 } | |
586 | |
587 if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) | |
588 { | |
589 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, | |
590 "The pixel format changes across the slices of the volume image"); | |
591 } | |
592 | |
593 if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || | |
594 reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) | |
595 { | |
596 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, | |
597 "The width/height of slices are not constant in the volume image"); | |
598 } | |
599 | |
600 if (!LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || | |
601 !LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) | |
602 { | |
603 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
604 "The pixel spacing of the slices change across the volume image"); | |
605 } | |
606 } | |
607 | |
608 | |
609 void CheckVolume() const | |
610 { | |
611 for (size_t i = 0; i < slices_.size(); i++) | |
612 { | |
613 assert(slices_[i] != NULL); | |
614 if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) | |
615 { | |
616 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
617 "This class does not support multi-frame images"); | |
618 } | |
619 } | |
620 | |
621 if (slices_.size() != 0) | |
622 { | |
623 const DicomInstanceParameters& reference = *slices_[0]; | |
624 | |
625 for (size_t i = 1; i < slices_.size(); i++) | |
626 { | |
627 CheckSlice(i, reference); | |
628 } | |
629 } | |
630 } | |
631 | |
632 | |
633 void Clear() | |
634 { | |
635 for (size_t i = 0; i < slices_.size(); i++) | |
636 { | |
637 assert(slices_[i] != NULL); | |
638 delete slices_[i]; | |
639 } | |
640 | |
641 slices_.clear(); | |
642 slicesRevision_.clear(); | |
643 } | |
644 | |
645 | |
646 void CheckSliceIndex(size_t index) const | |
647 { | |
648 if (!HasGeometry()) | |
649 { | |
650 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
651 } | |
652 else if (index >= slices_.size()) | |
653 { | |
654 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
655 } | |
656 else | |
657 { | |
658 assert(slices_.size() == GetImageGeometry().GetDepth() && | |
659 slices_.size() == slicesRevision_.size()); | |
660 } | |
661 } | |
662 | |
663 | |
664 std::auto_ptr<VolumeImageGeometry> geometry_; | |
665 std::vector<DicomInstanceParameters*> slices_; | |
666 std::vector<uint64_t> slicesRevision_; | |
667 | |
668 public: | |
669 ~SeriesGeometry() | |
670 { | |
671 Clear(); | |
672 } | |
673 | |
674 // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
675 // (called with the slices created in LoadGeometry) |
783 | 676 void ComputeGeometry(SlicesSorter& slices) |
677 { | |
678 Clear(); | |
679 | |
680 if (!slices.Sort()) | |
681 { | |
682 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, | |
683 "Cannot sort the 3D slices of a DICOM series"); | |
684 } | |
685 | |
686 if (slices.GetSlicesCount() == 0) | |
687 { | |
688 geometry_.reset(new VolumeImageGeometry); | |
689 } | |
690 else | |
691 { | |
692 slices_.reserve(slices.GetSlicesCount()); | |
693 slicesRevision_.resize(slices.GetSlicesCount(), 0); | |
694 | |
695 for (size_t i = 0; i < slices.GetSlicesCount(); i++) | |
696 { | |
697 const DicomInstanceParameters& slice = | |
698 dynamic_cast<const DicomInstanceParameters&>(slices.GetSlicePayload(i)); | |
699 slices_.push_back(new DicomInstanceParameters(slice)); | |
700 } | |
701 | |
702 CheckVolume(); | |
703 | |
704 const double spacingZ = slices.ComputeSpacingBetweenSlices(); | |
705 LOG(INFO) << "Computed spacing between slices: " << spacingZ << "mm"; | |
706 | |
707 const DicomInstanceParameters& parameters = *slices_[0]; | |
708 | |
709 geometry_.reset(new VolumeImageGeometry); | |
710 geometry_->SetSize(parameters.GetImageInformation().GetWidth(), | |
711 parameters.GetImageInformation().GetHeight(), | |
712 static_cast<unsigned int>(slices.GetSlicesCount())); | |
713 geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); | |
714 geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
715 parameters.GetPixelSpacingY(), spacingZ); | |
716 } | |
717 } | |
718 | |
719 bool HasGeometry() const | |
720 { | |
721 return geometry_.get() != NULL; | |
722 } | |
723 | |
724 const VolumeImageGeometry& GetImageGeometry() const | |
725 { | |
726 if (!HasGeometry()) | |
727 { | |
728 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
729 } | |
730 else | |
731 { | |
732 assert(slices_.size() == geometry_->GetDepth()); | |
733 return *geometry_; | |
734 } | |
735 } | |
736 | |
737 const DicomInstanceParameters& GetSliceParameters(size_t index) const | |
738 { | |
739 CheckSliceIndex(index); | |
740 return *slices_[index]; | |
741 } | |
742 | |
743 uint64_t GetSliceRevision(size_t index) const | |
744 { | |
745 CheckSliceIndex(index); | |
746 return slicesRevision_[index]; | |
747 } | |
748 | |
749 void IncrementSliceRevision(size_t index) | |
750 { | |
751 CheckSliceIndex(index); | |
752 slicesRevision_[index] ++; | |
753 } | |
754 }; | |
755 | |
756 | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
757 class ExtractedSlice : public DicomVolumeImageMPRSlicer::Slice |
783 | 758 { |
759 private: | |
760 const OrthancSeriesVolumeProgressiveLoader& that_; | |
761 | |
762 protected: | |
763 virtual uint64_t GetRevisionInternal(VolumeProjection projection, | |
764 unsigned int sliceIndex) const | |
765 { | |
766 if (projection == VolumeProjection_Axial) | |
767 { | |
768 return that_.seriesGeometry_.GetSliceRevision(sliceIndex); | |
769 } | |
770 else | |
771 { | |
772 // For coronal and sagittal projections, we take the global | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
773 // revision of the volume because even if a single slice changes, |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
774 // this means the projection will yield a different result --> |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
775 // we must increase the revision as soon as any slice changes |
783 | 776 return that_.volume_->GetRevision(); |
777 } | |
778 } | |
779 | |
780 public: | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
781 ExtractedSlice(const OrthancSeriesVolumeProgressiveLoader& that, |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
782 const CoordinateSystem3D& plane) : |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
783 DicomVolumeImageMPRSlicer::Slice(*that.volume_, plane), |
783 | 784 that_(that) |
785 { | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
786 if (that_.strategy_.get() != NULL && |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
787 IsValid() && |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
788 GetProjection() == VolumeProjection_Axial) |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
789 { |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
790 that_.strategy_->SetCurrent(GetSliceIndex()); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
791 } |
783 | 792 } |
793 }; | |
794 | |
795 | |
796 | |
711 | 797 static unsigned int GetSliceIndexPayload(const OracleCommandWithPayload& command) |
798 { | |
799 return dynamic_cast< const Orthanc::SingleValueObject<unsigned int>& >(command.GetPayload()).GetValue(); | |
800 } | |
801 | |
802 | |
803 void ScheduleNextSliceDownload() | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
804 { |
711 | 805 assert(strategy_.get() != NULL); |
806 | |
807 unsigned int sliceIndex, quality; | |
808 | |
809 if (strategy_->GetNext(sliceIndex, quality)) | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
810 { |
711 | 811 assert(quality <= BEST_QUALITY); |
812 | |
783 | 813 const DicomInstanceParameters& slice = seriesGeometry_.GetSliceParameters(sliceIndex); |
711 | 814 |
815 const std::string& instance = slice.GetOrthancInstanceIdentifier(); | |
816 if (instance.empty()) | |
817 { | |
818 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
819 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
820 |
745 | 821 std::auto_ptr<OracleCommandWithPayload> command; |
711 | 822 |
823 if (quality == BEST_QUALITY) | |
824 { | |
745 | 825 std::auto_ptr<GetOrthancImageCommand> tmp(new GetOrthancImageCommand); |
711 | 826 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
827 tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); | |
828 tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); | |
829 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); | |
830 command.reset(tmp.release()); | |
831 } | |
832 else | |
833 { | |
745 | 834 std::auto_ptr<GetOrthancWebViewerJpegCommand> tmp(new GetOrthancWebViewerJpegCommand); |
711 | 835 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
836 tmp->SetInstance(instance); | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
837 tmp->SetQuality((quality == 0 ? 50 : 90)); |
711 | 838 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); |
839 command.reset(tmp.release()); | |
840 } | |
841 | |
842 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(sliceIndex)); | |
843 oracle_.Schedule(*this, command.release()); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
844 } |
711 | 845 } |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
846 |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
847 /** |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
848 This is called in response to GET "/series/XXXXXXXXXXXXX/instances-tags" |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
849 */ |
711 | 850 void LoadGeometry(const OrthancRestApiCommand::SuccessMessage& message) |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
851 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
852 Json::Value body; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
853 message.ParseJsonBody(body); |
711 | 854 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
855 if (body.type() != Json::objectValue) |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
856 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
857 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
858 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
859 |
710 | 860 { |
861 Json::Value::Members instances = body.getMemberNames(); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
862 |
745 | 863 SlicesSorter slices; |
710 | 864 |
865 for (size_t i = 0; i < instances.size(); i++) | |
866 { | |
867 Orthanc::DicomMap dicom; | |
868 dicom.FromDicomAsJson(body[instances[i]]); | |
869 | |
870 std::auto_ptr<DicomInstanceParameters> instance(new DicomInstanceParameters(dicom)); | |
871 instance->SetOrthancInstanceIdentifier(instances[i]); | |
872 | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
873 // the 3D plane corresponding to the slice |
745 | 874 CoordinateSystem3D geometry = instance->GetGeometry(); |
710 | 875 slices.AddSlice(geometry, instance.release()); |
876 } | |
877 | |
783 | 878 seriesGeometry_.ComputeGeometry(slices); |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
879 } |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
880 |
783 | 881 size_t slicesCount = seriesGeometry_.GetImageGeometry().GetDepth(); |
882 | |
883 if (slicesCount == 0) | |
884 { | |
885 volume_->Initialize(seriesGeometry_.GetImageGeometry(), Orthanc::PixelFormat_Grayscale8); | |
886 } | |
887 else | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
888 { |
783 | 889 const DicomInstanceParameters& parameters = seriesGeometry_.GetSliceParameters(0); |
890 | |
891 volume_->Initialize(seriesGeometry_.GetImageGeometry(), parameters.GetExpectedPixelFormat()); | |
892 volume_->SetDicomParameters(parameters); | |
893 volume_->GetPixelData().Clear(); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
894 |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
895 strategy_.reset(new BasicFetchingStrategy(sorter_->CreateSorter(static_cast<unsigned int>(slicesCount)), BEST_QUALITY)); |
783 | 896 |
757 | 897 assert(simultaneousDownloads_ != 0); |
898 for (unsigned int i = 0; i < simultaneousDownloads_; i++) | |
710 | 899 { |
900 ScheduleNextSliceDownload(); | |
901 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
902 } |
779 | 903 |
783 | 904 slicesQuality_.resize(slicesCount, 0); |
905 | |
906 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_)); | |
907 } | |
908 | |
909 | |
910 void SetSliceContent(unsigned int sliceIndex, | |
911 const Orthanc::ImageAccessor& image, | |
912 unsigned int quality) | |
913 { | |
914 assert(sliceIndex < slicesQuality_.size() && | |
915 slicesQuality_.size() == volume_->GetPixelData().GetDepth()); | |
916 | |
917 if (quality >= slicesQuality_[sliceIndex]) | |
918 { | |
919 { | |
920 ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), VolumeProjection_Axial, sliceIndex); | |
921 Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); | |
922 } | |
923 | |
924 volume_->IncrementRevision(); | |
925 seriesGeometry_.IncrementSliceRevision(sliceIndex); | |
926 slicesQuality_[sliceIndex] = quality; | |
927 | |
928 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_)); | |
929 } | |
930 | |
931 ScheduleNextSliceDownload(); | |
710 | 932 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
933 |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
934 |
745 | 935 void LoadBestQualitySliceContent(const GetOrthancImageCommand::SuccessMessage& message) |
783 | 936 { |
937 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), BEST_QUALITY); | |
709
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
938 } |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
939 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
940 |
745 | 941 void LoadJpegSliceContent(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
710 | 942 { |
711 | 943 unsigned int quality; |
710 | 944 |
711 | 945 switch (message.GetOrigin().GetQuality()) |
946 { | |
947 case 50: | |
948 quality = LOW_QUALITY; | |
949 break; | |
950 | |
951 case 90: | |
952 quality = MIDDLE_QUALITY; | |
953 break; | |
954 | |
955 default: | |
956 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
957 } | |
958 | |
783 | 959 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); |
710 | 960 } |
711 | 961 |
710 | 962 |
783 | 963 IOracle& oracle_; |
964 bool active_; | |
965 unsigned int simultaneousDownloads_; | |
966 SeriesGeometry seriesGeometry_; | |
967 | |
968 boost::shared_ptr<DicomVolumeImage> volume_; | |
757 | 969 std::auto_ptr<IFetchingItemsSorter::IFactory> sorter_; |
970 std::auto_ptr<IFetchingStrategy> strategy_; | |
783 | 971 std::vector<unsigned int> slicesQuality_; |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
972 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
973 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
974 public: |
783 | 975 OrthancSeriesVolumeProgressiveLoader(const boost::shared_ptr<DicomVolumeImage>& volume, |
976 IOracle& oracle, | |
757 | 977 IObservable& oracleObservable) : |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
978 IObserver(oracleObservable.GetBroker()), |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
979 IObservable(oracleObservable.GetBroker()), |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
980 oracle_(oracle), |
757 | 981 active_(false), |
982 simultaneousDownloads_(4), | |
783 | 983 volume_(volume), |
757 | 984 sorter_(new BasicFetchingItemsSorter::Factory) |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
985 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
986 oracleObservable.RegisterObserverCallback( |
757 | 987 new Callable<OrthancSeriesVolumeProgressiveLoader, OrthancRestApiCommand::SuccessMessage> |
988 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadGeometry)); | |
989 | |
990 oracleObservable.RegisterObserverCallback( | |
991 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancImageCommand::SuccessMessage> | |
992 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent)); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
993 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
994 oracleObservable.RegisterObserverCallback( |
757 | 995 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancWebViewerJpegCommand::SuccessMessage> |
996 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent)); | |
997 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
998 |
757 | 999 void SetSimultaneousDownloads(unsigned int count) |
1000 { | |
1001 if (active_) | |
1002 { | |
1003 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
1004 } | |
1005 else if (count == 0) | |
1006 { | |
1007 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
1008 } | |
1009 else | |
1010 { | |
1011 simultaneousDownloads_ = count; | |
1012 } | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1013 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1014 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
1015 void LoadSeries(const std::string& seriesId) |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1016 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1017 if (active_) |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1018 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1019 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1020 } |
757 | 1021 else |
1022 { | |
1023 active_ = true; | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1024 |
757 | 1025 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
1026 command->SetUri("/series/" + seriesId + "/instances-tags"); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1027 |
757 | 1028 oracle_.Schedule(*this, command.release()); |
1029 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1030 } |
781 | 1031 |
803 | 1032 /** |
1033 When a slice is requested, the strategy algorithm (that defines the | |
1034 sequence of resources to be loaded from the server) is modified to | |
1035 take into account this request (this is done in the ExtractedSlice ctor) | |
1036 */ | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1037 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1038 { |
783 | 1039 if (volume_->HasGeometry()) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1040 { |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
1041 return new ExtractedSlice(*this, cuttingPlane); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1042 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1043 else |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1044 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1045 return new IVolumeSlicer::InvalidSlice; |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1046 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1047 } |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1048 }; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1049 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1050 |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
1051 /** |
802 | 1052 This class is supplied with Oracle commands and will schedule up to |
1053 simultaneousDownloads_ of them at the same time, then will schedule the | |
1054 rest once slots become available. It is used, a.o., by the | |
1055 OrtancMultiframeVolumeLoader class. | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
1056 */ |
794 | 1057 class LoaderStateMachine : public IObserver |
1058 { | |
1059 protected: | |
1060 class State : public Orthanc::IDynamicObject | |
1061 { | |
1062 private: | |
1063 LoaderStateMachine& that_; | |
1064 | |
1065 public: | |
1066 State(LoaderStateMachine& that) : | |
1067 that_(that) | |
1068 { | |
1069 } | |
1070 | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1071 State(const State& currentState) : |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1072 that_(currentState.that_) |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1073 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1074 } |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1075 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1076 void Schedule(OracleCommandWithPayload* command) const |
794 | 1077 { |
1078 that_.Schedule(command); | |
1079 } | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1080 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1081 template <typename T> |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1082 T& GetLoader() const |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1083 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1084 return dynamic_cast<T&>(that_); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1085 } |
794 | 1086 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1087 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
794 | 1088 { |
1089 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
1090 } | |
1091 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1092 virtual void Handle(const GetOrthancImageCommand::SuccessMessage& message) |
794 | 1093 { |
1094 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
1095 } | |
1096 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1097 virtual void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
794 | 1098 { |
1099 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
1100 } | |
1101 }; | |
1102 | |
1103 void Schedule(OracleCommandWithPayload* command) | |
1104 { | |
1105 std::auto_ptr<OracleCommandWithPayload> protection(command); | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1106 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1107 if (command == NULL) |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1108 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1109 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1110 } |
794 | 1111 |
1112 if (!command->HasPayload()) | |
1113 { | |
1114 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, | |
1115 "The payload must contain the next state"); | |
1116 } | |
1117 | |
1118 pendingCommands_.push_back(protection.release()); | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1119 Step(); |
794 | 1120 } |
1121 | |
1122 void Start() | |
1123 { | |
1124 if (active_) | |
1125 { | |
1126 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
1127 } | |
1128 | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1129 active_ = true; |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1130 |
794 | 1131 for (size_t i = 0; i < simultaneousDownloads_; i++) |
1132 { | |
1133 Step(); | |
1134 } | |
1135 } | |
1136 | |
1137 private: | |
1138 void Step() | |
1139 { | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1140 if (!pendingCommands_.empty() && |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1141 activeCommands_ < simultaneousDownloads_) |
794 | 1142 { |
1143 oracle_.Schedule(*this, pendingCommands_.front()); | |
1144 pendingCommands_.pop_front(); | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1145 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1146 activeCommands_++; |
794 | 1147 } |
1148 } | |
1149 | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1150 void Clear() |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1151 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1152 for (PendingCommands::iterator it = pendingCommands_.begin(); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1153 it != pendingCommands_.end(); ++it) |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1154 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1155 delete *it; |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1156 } |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1157 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1158 pendingCommands_.clear(); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1159 } |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1160 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1161 void HandleExceptionMessage(const OracleCommandExceptionMessage& message) |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1162 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1163 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
|
1164 Clear(); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1165 } |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1166 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1167 template <typename T> |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1168 void HandleSuccessMessage(const T& message) |
794 | 1169 { |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1170 assert(activeCommands_ > 0); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1171 activeCommands_--; |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1172 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1173 try |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1174 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1175 dynamic_cast<State&>(message.GetOrigin().GetPayload()).Handle(message); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1176 Step(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1177 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1178 catch (Orthanc::OrthancException& e) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1179 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1180 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
|
1181 Clear(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1182 } |
794 | 1183 } |
1184 | |
1185 typedef std::list<IOracleCommand*> PendingCommands; | |
1186 | |
1187 IOracle& oracle_; | |
1188 bool active_; | |
1189 unsigned int simultaneousDownloads_; | |
1190 PendingCommands pendingCommands_; | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1191 unsigned int activeCommands_; |
794 | 1192 |
1193 public: | |
1194 LoaderStateMachine(IOracle& oracle, | |
1195 IObservable& oracleObservable) : | |
1196 IObserver(oracleObservable.GetBroker()), | |
1197 oracle_(oracle), | |
1198 active_(false), | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1199 simultaneousDownloads_(4), |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1200 activeCommands_(0) |
794 | 1201 { |
1202 oracleObservable.RegisterObserverCallback( | |
1203 new Callable<LoaderStateMachine, OrthancRestApiCommand::SuccessMessage> | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1204 (*this, &LoaderStateMachine::HandleSuccessMessage)); |
794 | 1205 |
1206 oracleObservable.RegisterObserverCallback( | |
1207 new Callable<LoaderStateMachine, GetOrthancImageCommand::SuccessMessage> | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1208 (*this, &LoaderStateMachine::HandleSuccessMessage)); |
794 | 1209 |
1210 oracleObservable.RegisterObserverCallback( | |
1211 new Callable<LoaderStateMachine, GetOrthancWebViewerJpegCommand::SuccessMessage> | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1212 (*this, &LoaderStateMachine::HandleSuccessMessage)); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1213 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1214 oracleObservable.RegisterObserverCallback( |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1215 new Callable<LoaderStateMachine, OracleCommandExceptionMessage> |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1216 (*this, &LoaderStateMachine::HandleExceptionMessage)); |
794 | 1217 } |
1218 | |
1219 virtual ~LoaderStateMachine() | |
1220 { | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1221 Clear(); |
794 | 1222 } |
1223 | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1224 bool IsActive() const |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1225 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1226 return active_; |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1227 } |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1228 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1229 void SetSimultaneousDownloads(unsigned int count) |
794 | 1230 { |
1231 if (active_) | |
1232 { | |
1233 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
1234 } | |
1235 else if (count == 0) | |
1236 { | |
1237 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
1238 } | |
1239 else | |
1240 { | |
1241 simultaneousDownloads_ = count; | |
1242 } | |
1243 } | |
1244 }; | |
1245 | |
1246 | |
1247 | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1248 class OrthancMultiframeVolumeLoader : |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1249 public LoaderStateMachine, |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
1250 public IObservable |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1251 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1252 private: |
764 | 1253 class LoadRTDoseGeometry : public State |
712 | 1254 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1255 private: |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1256 std::auto_ptr<Orthanc::DicomMap> dicom_; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1257 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1258 public: |
764 | 1259 LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1260 Orthanc::DicomMap* dicom) : |
764 | 1261 State(that), |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1262 dicom_(dicom) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1263 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1264 if (dicom == NULL) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1265 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1266 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1267 } |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1268 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1269 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1270 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1271 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
712 | 1272 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1273 // 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
|
1274 std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1275 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
|
1276 |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1277 GetLoader<OrthancMultiframeVolumeLoader>().SetGeometry(*dicom_); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1278 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1279 }; |
764 | 1280 |
1281 | |
1282 static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) | |
1283 { | |
1284 std::string s; | |
1285 if (!dicom.CopyToString(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) | |
1286 { | |
1287 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
1288 "DICOM file without SOP class UID"); | |
1289 } | |
1290 else | |
1291 { | |
1292 return s; | |
1293 } | |
1294 } | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1295 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1296 |
764 | 1297 class LoadGeometry : public State |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1298 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1299 public: |
764 | 1300 LoadGeometry(OrthancMultiframeVolumeLoader& that) : |
1301 State(that) | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1302 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1303 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1304 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1305 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1306 { |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1307 OrthancMultiframeVolumeLoader& loader = GetLoader<OrthancMultiframeVolumeLoader>(); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1308 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1309 Json::Value body; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1310 message.ParseJsonBody(body); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1311 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1312 if (body.type() != Json::objectValue) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1313 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1314 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1315 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1316 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1317 std::auto_ptr<Orthanc::DicomMap> dicom(new Orthanc::DicomMap); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1318 dicom->FromDicomAsJson(body); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1319 |
764 | 1320 if (StringToSopClassUid(GetSopClassUid(*dicom)) == SopClassUid_RTDose) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1321 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1322 // Download the "Grid Frame Offset Vector" DICOM tag, that is |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1323 // 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
|
1324 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1325 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1326 command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" + |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1327 Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1328 command->SetPayload(new LoadRTDoseGeometry(loader, dicom.release())); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1329 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1330 Schedule(command.release()); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1331 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1332 else |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1333 { |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1334 loader.SetGeometry(*dicom); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1335 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1336 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1337 }; |
764 | 1338 |
1339 | |
1340 | |
1341 class LoadTransferSyntax : public State | |
1342 { | |
1343 public: | |
1344 LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : | |
1345 State(that) | |
1346 { | |
1347 } | |
1348 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1349 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
764 | 1350 { |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1351 GetLoader<OrthancMultiframeVolumeLoader>().SetTransferSyntax(message.GetAnswer()); |
764 | 1352 } |
1353 }; | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1354 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1355 |
765 | 1356 class LoadUncompressedPixelData : public State |
1357 { | |
1358 public: | |
1359 LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : | |
1360 State(that) | |
1361 { | |
1362 } | |
1363 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1364 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
765 | 1365 { |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1366 GetLoader<OrthancMultiframeVolumeLoader>().SetUncompressedPixelData(message.GetAnswer()); |
765 | 1367 } |
1368 }; | |
1369 | |
1370 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1371 |
783 | 1372 boost::shared_ptr<DicomVolumeImage> volume_; |
764 | 1373 std::string instanceId_; |
1374 std::string transferSyntaxUid_; | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1375 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1376 |
764 | 1377 const std::string& GetInstanceId() const |
1378 { | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1379 if (IsActive()) |
764 | 1380 { |
1381 return instanceId_; | |
1382 } | |
1383 else | |
1384 { | |
1385 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
1386 } | |
1387 } | |
1388 | |
1389 | |
1390 void ScheduleFrameDownloads() | |
1391 { | |
1392 if (transferSyntaxUid_.empty() || | |
783 | 1393 !volume_->HasGeometry()) |
764 | 1394 { |
1395 return; | |
1396 } | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
1397 /* |
802 | 1398 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM |
1399 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
|
1400 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
|
1401 |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
1402 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
|
1403 */ |
765 | 1404 if (transferSyntaxUid_ == "1.2.840.10008.1.2" || |
1405 transferSyntaxUid_ == "1.2.840.10008.1.2.1" || | |
1406 transferSyntaxUid_ == "1.2.840.10008.1.2.2") | |
1407 { | |
1408 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
1409 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
1410 command->SetUri("/instances/" + instanceId_ + "/content/" + | |
1411 Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); | |
1412 command->SetPayload(new LoadUncompressedPixelData(*this)); | |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1413 Schedule(command.release()); |
765 | 1414 } |
1415 else | |
764 | 1416 { |
1417 throw Orthanc::OrthancException( | |
1418 Orthanc::ErrorCode_NotImplemented, | |
1419 "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); | |
1420 } | |
1421 } | |
1422 | |
1423 | |
1424 void SetTransferSyntax(const std::string& transferSyntax) | |
1425 { | |
1426 transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); | |
1427 ScheduleFrameDownloads(); | |
1428 } | |
1429 | |
1430 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1431 void SetGeometry(const Orthanc::DicomMap& dicom) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1432 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1433 DicomInstanceParameters parameters(dicom); |
783 | 1434 volume_->SetDicomParameters(parameters); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1435 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1436 Orthanc::PixelFormat format; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1437 if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1438 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1439 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1440 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1441 |
764 | 1442 double spacingZ; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1443 switch (parameters.GetSopClassUid()) |
764 | 1444 { |
1445 case SopClassUid_RTDose: | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1446 spacingZ = parameters.GetThickness(); |
764 | 1447 break; |
1448 | |
1449 default: | |
1450 throw Orthanc::OrthancException( | |
1451 Orthanc::ErrorCode_NotImplemented, | |
1452 "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); | |
1453 } | |
1454 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1455 const unsigned int width = parameters.GetImageInformation().GetWidth(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1456 const unsigned int height = parameters.GetImageInformation().GetHeight(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1457 const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1458 |
781 | 1459 { |
783 | 1460 VolumeImageGeometry geometry; |
1461 geometry.SetSize(width, height, depth); | |
1462 geometry.SetAxialGeometry(parameters.GetGeometry()); | |
1463 geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
1464 parameters.GetPixelSpacingY(), spacingZ); | |
1465 volume_->Initialize(geometry, format); | |
781 | 1466 } |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1467 |
783 | 1468 volume_->GetPixelData().Clear(); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1469 |
764 | 1470 ScheduleFrameDownloads(); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1471 |
783 | 1472 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_)); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1473 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1474 |
765 | 1475 |
1476 ORTHANC_FORCE_INLINE | |
1477 static void CopyPixel(uint32_t& target, | |
1478 const void* source) | |
1479 { | |
1480 // TODO - check alignement? | |
1481 target = le32toh(*reinterpret_cast<const uint32_t*>(source)); | |
1482 } | |
1483 | |
1484 | |
1485 template <typename T> | |
1486 void CopyPixelData(const std::string& pixelData) | |
1487 { | |
783 | 1488 ImageBuffer3D& target = volume_->GetPixelData(); |
1489 | |
1490 const unsigned int bpp = target.GetBytesPerPixel(); | |
1491 const unsigned int width = target.GetWidth(); | |
1492 const unsigned int height = target.GetHeight(); | |
1493 const unsigned int depth = target.GetDepth(); | |
765 | 1494 |
1495 if (pixelData.size() != bpp * width * height * depth) | |
1496 { | |
1497 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
1498 "The pixel data has not the proper size"); | |
1499 } | |
1500 | |
1501 if (pixelData.empty()) | |
1502 { | |
1503 return; | |
1504 } | |
1505 | |
1506 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str()); | |
1507 | |
1508 for (unsigned int z = 0; z < depth; z++) | |
1509 { | |
783 | 1510 ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, z); |
765 | 1511 |
1512 assert (writer.GetAccessor().GetWidth() == width && | |
1513 writer.GetAccessor().GetHeight() == height); | |
1514 | |
1515 for (unsigned int y = 0; y < height; y++) | |
1516 { | |
792
4fe4b221a31f
deprecating MessagingToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
789
diff
changeset
|
1517 assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); |
765 | 1518 |
1519 T* target = reinterpret_cast<T*>(writer.GetAccessor().GetRow(y)); | |
1520 | |
1521 for (unsigned int x = 0; x < width; x++) | |
1522 { | |
1523 CopyPixel(*target, source); | |
1524 | |
1525 target ++; | |
1526 source += bpp; | |
1527 } | |
1528 } | |
1529 } | |
1530 } | |
1531 | |
1532 | |
1533 void SetUncompressedPixelData(const std::string& pixelData) | |
1534 { | |
783 | 1535 switch (volume_->GetPixelData().GetFormat()) |
765 | 1536 { |
1537 case Orthanc::PixelFormat_Grayscale32: | |
1538 CopyPixelData<uint32_t>(pixelData); | |
1539 break; | |
1540 | |
1541 default: | |
1542 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
1543 } | |
1544 | |
783 | 1545 volume_->IncrementRevision(); |
781 | 1546 |
783 | 1547 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_)); |
765 | 1548 } |
1549 | |
766 | 1550 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1551 public: |
783 | 1552 OrthancMultiframeVolumeLoader(const boost::shared_ptr<DicomVolumeImage>& volume, |
1553 IOracle& oracle, | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1554 IObservable& oracleObservable) : |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1555 LoaderStateMachine(oracle, oracleObservable), |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1556 IObservable(oracleObservable.GetBroker()), |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1557 volume_(volume) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1558 { |
783 | 1559 if (volume.get() == NULL) |
1560 { | |
1561 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
1562 } | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1563 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1564 |
764 | 1565 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1566 void LoadInstance(const std::string& instanceId) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1567 { |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1568 Start(); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1569 |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1570 instanceId_ = instanceId; |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1571 |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1572 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1573 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1574 command->SetHttpHeader("Accept-Encoding", "gzip"); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1575 command->SetUri("/instances/" + instanceId + "/tags"); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1576 command->SetPayload(new LoadGeometry(*this)); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1577 Schedule(command.release()); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1578 } |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1579 |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1580 { |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1581 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1582 command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1583 command->SetPayload(new LoadTransferSyntax(*this)); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
1584 Schedule(command.release()); |
712 | 1585 } |
1586 } | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1587 }; |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1588 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1589 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1590 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1591 class DicomVolumeImageReslicer : public IVolumeSlicer |
781 | 1592 { |
1593 private: | |
1594 class Slice : public IExtractedSlice | |
1595 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1596 private: |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1597 DicomVolumeImageReslicer& that_; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1598 CoordinateSystem3D cuttingPlane_; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1599 |
781 | 1600 public: |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1601 Slice(DicomVolumeImageReslicer& that, |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1602 const CoordinateSystem3D& cuttingPlane) : |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1603 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1604 cuttingPlane_(cuttingPlane) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1605 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1606 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1607 |
781 | 1608 virtual bool IsValid() |
1609 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1610 return true; |
781 | 1611 } |
1612 | |
1613 virtual uint64_t GetRevision() | |
1614 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1615 return that_.volume_->GetRevision(); |
781 | 1616 } |
1617 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1618 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, |
781 | 1619 const CoordinateSystem3D& cuttingPlane) |
1620 { | |
783 | 1621 VolumeReslicer& reslicer = that_.reslicer_; |
1622 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1623 if (configurator == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1624 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1625 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1626 "Must provide a layer style configurator"); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1627 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1628 |
783 | 1629 reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat()); |
1630 reslicer.Apply(that_.volume_->GetPixelData(), | |
1631 that_.volume_->GetGeometry(), | |
1632 cuttingPlane); | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1633 |
783 | 1634 if (reslicer.IsSuccess()) |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1635 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1636 std::auto_ptr<TextureBaseSceneLayer> layer |
783 | 1637 (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(), |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1638 that_.volume_->GetDicomParameters())); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1639 if (layer.get() == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1640 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1641 return NULL; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1642 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1643 |
783 | 1644 double s = reslicer.GetPixelSpacing(); |
1645 layer->SetPixelSpacing(s, s); | |
1646 layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s, | |
1647 reslicer.GetOutputExtent().GetY1() + 0.5 * s); | |
1648 | |
1649 // TODO - Angle!! | |
1650 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1651 return layer.release(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1652 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1653 else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1654 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1655 return NULL; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1656 } |
781 | 1657 } |
1658 }; | |
1659 | |
783 | 1660 boost::shared_ptr<DicomVolumeImage> volume_; |
1661 VolumeReslicer reslicer_; | |
781 | 1662 |
1663 public: | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1664 DicomVolumeImageReslicer(const boost::shared_ptr<DicomVolumeImage>& volume) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1665 volume_(volume) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1666 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1667 if (volume.get() == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1668 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1669 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1670 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1671 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1672 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1673 ImageInterpolation GetInterpolation() const |
781 | 1674 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1675 return reslicer_.GetInterpolation(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1676 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1677 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1678 void SetInterpolation(ImageInterpolation interpolation) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1679 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1680 reslicer_.SetInterpolation(interpolation); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1681 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1682 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1683 bool IsFastMode() const |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1684 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1685 return reslicer_.IsFastMode(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1686 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1687 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1688 void SetFastMode(bool fast) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1689 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1690 reslicer_.EnableFastMode(fast); |
781 | 1691 } |
1692 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1693 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
781 | 1694 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1695 if (volume_->HasGeometry()) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1696 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1697 return new Slice(*this, cuttingPlane); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1698 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1699 else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1700 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1701 return new IVolumeSlicer::InvalidSlice; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1702 } |
781 | 1703 } |
1704 }; | |
1705 | |
1706 | |
1707 | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1708 class DicomStructureSetLoader : |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1709 public LoaderStateMachine, |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1710 public IVolumeSlicer |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1711 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1712 private: |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1713 class AddReferencedInstance : public State |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1714 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1715 private: |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1716 std::string instanceId_; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1717 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1718 public: |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1719 AddReferencedInstance(DicomStructureSetLoader& that, |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1720 const std::string& instanceId) : |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1721 State(that), |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1722 instanceId_(instanceId) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1723 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1724 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1725 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1726 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1727 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1728 Json::Value tags; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1729 message.ParseJsonBody(tags); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1730 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1731 Orthanc::DicomMap dicom; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1732 dicom.FromDicomAsJson(tags); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1733 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1734 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1735 loader.content_->AddReferencedSlice(dicom); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1736 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1737 loader.countProcessedInstances_ ++; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1738 assert(loader.countProcessedInstances_ <= loader.countReferencedInstances_); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1739 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1740 if (loader.countProcessedInstances_ == loader.countReferencedInstances_) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1741 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1742 // 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
|
1743 loader.content_->CheckReferencedSlices(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1744 loader.revision_++; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1745 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1746 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1747 }; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1748 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1749 // 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
|
1750 class LookupInstance : public State |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1751 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1752 private: |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1753 std::string sopInstanceUid_; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1754 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1755 public: |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1756 LookupInstance(DicomStructureSetLoader& that, |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1757 const std::string& sopInstanceUid) : |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1758 State(that), |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1759 sopInstanceUid_(sopInstanceUid) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1760 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1761 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1762 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1763 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1764 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1765 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1766 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1767 Json::Value lookup; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1768 message.ParseJsonBody(lookup); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1769 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1770 if (lookup.type() != Json::arrayValue || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1771 lookup.size() != 1 || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1772 !lookup[0].isMember("Type") || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1773 !lookup[0].isMember("Path") || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1774 lookup[0]["Type"].type() != Json::stringValue || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1775 lookup[0]["ID"].type() != Json::stringValue || |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1776 lookup[0]["Type"].asString() != "Instance") |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1777 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1778 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1779 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1780 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1781 const std::string instanceId = lookup[0]["ID"].asString(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1782 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1783 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1784 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1785 command->SetHttpHeader("Accept-Encoding", "gzip"); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1786 command->SetUri("/instances/" + instanceId + "/tags"); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1787 command->SetPayload(new AddReferencedInstance(loader, instanceId)); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1788 Schedule(command.release()); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1789 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1790 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1791 }; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1792 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1793 class LoadStructure : public State |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1794 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1795 public: |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1796 LoadStructure(DicomStructureSetLoader& that) : |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1797 State(that) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1798 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1799 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1800 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1801 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1802 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1803 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1804 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1805 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1806 OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer()); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1807 loader.content_.reset(new DicomStructureSet(dicom)); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1808 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1809 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1810 std::set<std::string> instances; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1811 loader.content_->GetReferencedInstances(instances); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1812 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1813 loader.countReferencedInstances_ = instances.size(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1814 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1815 for (std::set<std::string>::const_iterator |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1816 it = instances.begin(); it != instances.end(); ++it) |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1817 { |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1818 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1819 command->SetUri("/tools/lookup"); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1820 command->SetMethod(Orthanc::HttpMethod_Post); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1821 command->SetBody(*it); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1822 command->SetPayload(new LookupInstance(loader, *it)); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1823 Schedule(command.release()); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1824 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1825 printf("[%s]\n", it->c_str()); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1826 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1827 } |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1828 }; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1829 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1830 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1831 |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1832 std::auto_ptr<DicomStructureSet> content_; |
794 | 1833 uint64_t revision_; |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1834 std::string instanceId_; |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1835 unsigned int countProcessedInstances_; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1836 unsigned int countReferencedInstances_; |
794 | 1837 |
1838 | |
1839 class Slice : public IExtractedSlice | |
1840 { | |
1841 private: | |
1842 const DicomStructureSet& content_; | |
1843 uint64_t revision_; | |
1844 bool isValid_; | |
1845 | |
1846 public: | |
1847 Slice(const DicomStructureSet& content, | |
1848 uint64_t revision, | |
1849 const CoordinateSystem3D& cuttingPlane) : | |
1850 content_(content), | |
1851 revision_(revision) | |
1852 { | |
1853 bool opposite; | |
1854 | |
1855 const Vector normal = content.GetNormal(); | |
1856 isValid_ = ( | |
1857 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || | |
1858 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || | |
1859 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); | |
1860 } | |
1861 | |
1862 virtual bool IsValid() | |
1863 { | |
1864 return isValid_; | |
1865 } | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1866 |
794 | 1867 virtual uint64_t GetRevision() |
1868 { | |
1869 return revision_; | |
1870 } | |
1871 | |
1872 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, | |
1873 const CoordinateSystem3D& cuttingPlane) | |
1874 { | |
1875 assert(isValid_); | |
1876 | |
1877 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1878 layer->SetThickness(2); |
794 | 1879 |
1880 for (size_t i = 0; i < content_.GetStructuresCount(); i++) | |
1881 { | |
1882 std::vector< std::vector<DicomStructureSet::PolygonPoint> > polygons; | |
1883 | |
1884 if (content_.ProjectStructure(polygons, i, cuttingPlane)) | |
1885 { | |
800
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
1886 printf(">> %d\n", static_cast<int>(polygons.size())); |
794 | 1887 |
1888 for (size_t j = 0; j < polygons.size(); j++) | |
1889 { | |
1890 PolylineSceneLayer::Chain chain; | |
1891 chain.resize(polygons[j].size()); | |
1892 | |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1893 for (size_t k = 0; k < polygons[j].size(); k++) |
794 | 1894 { |
1895 chain[k] = ScenePoint2D(polygons[j][k].first, polygons[j][k].second); | |
1896 } | |
1897 | |
1898 layer->AddChain(chain, true /* closed */); | |
1899 } | |
1900 } | |
1901 } | |
1902 | |
1903 return layer.release(); | |
1904 } | |
1905 }; | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1906 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1907 public: |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1908 DicomStructureSetLoader(IOracle& oracle, |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1909 IObservable& oracleObservable) : |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1910 LoaderStateMachine(oracle, oracleObservable), |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1911 revision_(0), |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1912 countProcessedInstances_(0), |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1913 countReferencedInstances_(0) |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1914 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1915 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1916 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1917 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1918 void LoadInstance(const std::string& instanceId) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1919 { |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1920 Start(); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1921 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1922 instanceId_ = instanceId; |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1923 |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1924 { |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1925 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1926 command->SetHttpHeader("Accept-Encoding", "gzip"); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1927 command->SetUri("/instances/" + instanceId + "/tags?ignore-length=3006-0050"); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1928 command->SetPayload(new LoadStructure(*this)); |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
1929 Schedule(command.release()); |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1930 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1931 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1932 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1933 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1934 { |
794 | 1935 if (content_.get() == NULL) |
1936 { | |
1937 // Geometry is not available yet | |
1938 return new IVolumeSlicer::InvalidSlice; | |
1939 } | |
1940 else | |
1941 { | |
1942 return new Slice(*content_, revision_, cuttingPlane); | |
1943 } | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1944 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1945 }; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1946 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1947 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1948 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1949 class VolumeSceneLayerSource : public boost::noncopyable |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1950 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1951 private: |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1952 Scene2D& scene_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1953 int layerDepth_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1954 boost::shared_ptr<IVolumeSlicer> slicer_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1955 std::auto_ptr<ILayerStyleConfigurator> configurator_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1956 std::auto_ptr<CoordinateSystem3D> lastPlane_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1957 uint64_t lastRevision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1958 uint64_t lastConfiguratorRevision_; |
691 | 1959 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1960 static bool IsSameCuttingPlane(const CoordinateSystem3D& a, |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1961 const CoordinateSystem3D& b) |
745 | 1962 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1963 // TODO - What if the normal is reversed? |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1964 double distance; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1965 return (CoordinateSystem3D::ComputeDistance(distance, a, b) && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1966 LinearAlgebra::IsCloseToZero(distance)); |
745 | 1967 } |
1968 | |
783 | 1969 void ClearLayer() |
1970 { | |
1971 scene_.DeleteLayer(layerDepth_); | |
1972 lastPlane_.reset(NULL); | |
1973 } | |
1974 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1975 public: |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1976 VolumeSceneLayerSource(Scene2D& scene, |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1977 int layerDepth, |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1978 const boost::shared_ptr<IVolumeSlicer>& slicer) : |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1979 scene_(scene), |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1980 layerDepth_(layerDepth), |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1981 slicer_(slicer) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1982 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1983 if (slicer == NULL) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1984 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1985 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1986 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1987 } |
745 | 1988 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1989 const IVolumeSlicer& GetSlicer() const |
691 | 1990 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1991 return *slicer_; |
691 | 1992 } |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1993 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1994 void RemoveConfigurator() |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1995 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1996 configurator_.reset(); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1997 lastPlane_.reset(); |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1998 } |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1999 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2000 void SetConfigurator(ILayerStyleConfigurator* configurator) // Takes ownership |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
2001 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2002 if (configurator == NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2003 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2004 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2005 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2006 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2007 configurator_.reset(configurator); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2008 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2009 // Invalidate the layer |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2010 lastPlane_.reset(NULL); |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
2011 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2012 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2013 bool HasConfigurator() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2014 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2015 return configurator_.get() != NULL; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2016 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2017 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2018 ILayerStyleConfigurator& GetConfigurator() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2019 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2020 if (configurator_.get() == NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2021 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2022 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2023 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2024 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2025 return *configurator_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2026 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2027 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2028 void Update(const CoordinateSystem3D& plane) |
691 | 2029 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
2030 assert(slicer_.get() != NULL); |
781 | 2031 std::auto_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane)); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2032 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2033 if (slice.get() == NULL) |
691 | 2034 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2035 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
691 | 2036 } |
2037 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2038 if (!slice->IsValid()) |
691 | 2039 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2040 // The slicer cannot handle this cutting plane: Clear the layer |
783 | 2041 ClearLayer(); |
691 | 2042 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2043 else if (lastPlane_.get() != NULL && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2044 IsSameCuttingPlane(*lastPlane_, plane) && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2045 lastRevision_ == slice->GetRevision()) |
691 | 2046 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2047 // The content of the slice has not changed: Don't update the |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2048 // layer content, but possibly update its style |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2049 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2050 if (configurator_.get() != NULL && |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2051 configurator_->GetRevision() != lastConfiguratorRevision_ && |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2052 scene_.HasLayer(layerDepth_)) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2053 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2054 configurator_->ApplyStyle(scene_.GetLayer(layerDepth_)); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2055 } |
691 | 2056 } |
2057 else | |
2058 { | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2059 // Content has changed: An update is needed |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2060 lastPlane_.reset(new CoordinateSystem3D(plane)); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2061 lastRevision_ = slice->GetRevision(); |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
2062 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2063 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
|
2064 if (layer.get() == NULL) |
691 | 2065 { |
783 | 2066 ClearLayer(); |
712 | 2067 } |
783 | 2068 else |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
2069 { |
783 | 2070 if (configurator_.get() != NULL) |
2071 { | |
2072 lastConfiguratorRevision_ = configurator_->GetRevision(); | |
2073 configurator_->ApplyStyle(*layer); | |
2074 } | |
2075 | |
2076 scene_.SetLayer(layerDepth_, layer.release()); | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
2077 } |
691 | 2078 } |
2079 } | |
2080 }; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2081 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2082 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2083 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2084 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2085 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2086 class NativeApplicationContext : public IMessageEmitter |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2087 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2088 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2089 boost::shared_mutex mutex_; |
745 | 2090 MessageBroker broker_; |
2091 IObservable oracleObservable_; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2092 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2093 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2094 NativeApplicationContext() : |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2095 oracleObservable_(broker_) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2096 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2097 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2098 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2099 |
745 | 2100 virtual void EmitMessage(const IObserver& observer, |
2101 const IMessage& message) | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2102 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2103 try |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2104 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2105 boost::unique_lock<boost::shared_mutex> lock(mutex_); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2106 oracleObservable_.EmitMessage(observer, message); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2107 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2108 catch (Orthanc::OrthancException& e) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2109 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2110 LOG(ERROR) << "Exception while emitting a message: " << e.What(); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2111 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2112 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2113 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2114 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2115 class ReaderLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2116 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2117 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2118 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2119 boost::shared_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2120 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2121 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2122 ReaderLock(NativeApplicationContext& that) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2123 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2124 lock_(that.mutex_) |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2125 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2126 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2127 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2128 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2129 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2130 class WriterLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2131 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2132 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2133 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2134 boost::unique_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2135 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2136 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2137 WriterLock(NativeApplicationContext& that) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2138 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2139 lock_(that.mutex_) |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2140 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2141 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2142 |
745 | 2143 MessageBroker& GetBroker() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2144 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2145 return that_.broker_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2146 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2147 |
745 | 2148 IObservable& GetOracleObservable() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2149 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2150 return that_.oracleObservable_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2151 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2152 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
2153 }; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2154 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2155 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2156 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2157 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2158 class Toto : public OrthancStone::IObserver |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2159 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2160 private: |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2161 OrthancStone::CoordinateSystem3D plane_; |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2162 OrthancStone::IOracle& oracle_; |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2163 OrthancStone::Scene2D scene_; |
794 | 2164 std::auto_ptr<OrthancStone::VolumeSceneLayerSource> source1_, source2_, source3_; |
766 | 2165 |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2166 |
779 | 2167 void Refresh() |
2168 { | |
2169 if (source1_.get() != NULL) | |
2170 { | |
2171 source1_->Update(plane_); | |
2172 } | |
2173 | |
2174 if (source2_.get() != NULL) | |
2175 { | |
2176 source2_->Update(plane_); | |
2177 } | |
2178 | |
794 | 2179 if (source3_.get() != NULL) |
2180 { | |
2181 source3_->Update(plane_); | |
2182 } | |
2183 | |
779 | 2184 scene_.FitContent(1024, 768); |
2185 | |
2186 { | |
2187 OrthancStone::CairoCompositor compositor(scene_, 1024, 768); | |
2188 compositor.Refresh(); | |
2189 | |
2190 Orthanc::ImageAccessor accessor; | |
2191 compositor.GetCanvas().GetReadOnlyAccessor(accessor); | |
2192 | |
2193 Orthanc::Image tmp(Orthanc::PixelFormat_RGB24, accessor.GetWidth(), accessor.GetHeight(), false); | |
2194 Orthanc::ImageProcessing::Convert(tmp, accessor); | |
2195 | |
2196 static unsigned int count = 0; | |
2197 char buf[64]; | |
2198 sprintf(buf, "scene-%06d.png", count++); | |
2199 | |
2200 Orthanc::PngWriter writer; | |
2201 writer.WriteToFile(buf, tmp); | |
2202 } | |
2203 } | |
2204 | |
2205 | |
783 | 2206 void Handle(const OrthancStone::DicomVolumeImage::GeometryReadyMessage& message) |
766 | 2207 { |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2208 printf("Geometry ready\n"); |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2209 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2210 //plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); |
795
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
2211 //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); |
bc20e4c417ec
refactoring OrthancMultiframeVolumeLoader using LoaderStateMachine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
2212 plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2213 plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); |
779 | 2214 |
2215 Refresh(); | |
766 | 2216 } |
2217 | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2218 |
745 | 2219 void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message) |
744 | 2220 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2221 if (message.GetOrigin().HasPayload()) |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2222 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2223 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
|
2224 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2225 else |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2226 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2227 printf("TIMEOUT\n"); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2228 |
779 | 2229 Refresh(); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2230 |
765 | 2231 /** |
2232 * The sleep() leads to a crash if the oracle is still running, | |
2233 * while this object is destroyed. Always stop the oracle before | |
2234 * destroying active objects. (*) | |
2235 **/ | |
2236 // boost::this_thread::sleep(boost::posix_time::seconds(2)); | |
2237 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2238 oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(message.GetOrigin().GetDelay())); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2239 } |
744 | 2240 } |
2241 | |
745 | 2242 void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2243 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2244 Json::Value v; |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
2245 message.ParseJsonBody(v); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2246 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2247 printf("ICI [%s]\n", v.toStyledString().c_str()); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2248 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2249 |
745 | 2250 void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
2251 { |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
2252 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
|
2253 } |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
2254 |
745 | 2255 void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2256 { |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2257 printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2258 } |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2259 |
745 | 2260 void Handle(const OrthancStone::OracleCommandExceptionMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2261 { |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2262 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
|
2263 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2264 switch (message.GetCommand().GetType()) |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2265 { |
745 | 2266 case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg: |
2267 printf("URI: [%s]\n", dynamic_cast<const OrthancStone::GetOrthancWebViewerJpegCommand&> | |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2268 (message.GetCommand()).GetUri().c_str()); |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2269 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2270 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2271 default: |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2272 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2273 } |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2274 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2275 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2276 public: |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2277 Toto(OrthancStone::IOracle& oracle, |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2278 OrthancStone::IObservable& oracleObservable) : |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2279 IObserver(oracleObservable.GetBroker()), |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2280 oracle_(oracle) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2281 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2282 oracleObservable.RegisterObserverCallback |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
2283 (new OrthancStone::Callable |
745 | 2284 <Toto, OrthancStone::SleepOracleCommand::TimeoutMessage>(*this, &Toto::Handle)); |
744 | 2285 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2286 oracleObservable.RegisterObserverCallback |
744 | 2287 (new OrthancStone::Callable |
745 | 2288 <Toto, OrthancStone::OrthancRestApiCommand::SuccessMessage>(*this, &Toto::Handle)); |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
2289 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2290 oracleObservable.RegisterObserverCallback |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
2291 (new OrthancStone::Callable |
745 | 2292 <Toto, OrthancStone::GetOrthancImageCommand::SuccessMessage>(*this, &Toto::Handle)); |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2293 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2294 oracleObservable.RegisterObserverCallback |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
2295 (new OrthancStone::Callable |
745 | 2296 <Toto, OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &Toto::Handle)); |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2297 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2298 oracleObservable.RegisterObserverCallback |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
2299 (new OrthancStone::Callable |
745 | 2300 <Toto, OrthancStone::OracleCommandExceptionMessage>(*this, &Toto::Handle)); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2301 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2302 |
783 | 2303 void SetReferenceLoader(OrthancStone::IObservable& loader) |
2304 { | |
2305 loader.RegisterObserverCallback | |
2306 (new OrthancStone::Callable | |
2307 <Toto, OrthancStone::DicomVolumeImage::GeometryReadyMessage>(*this, &Toto::Handle)); | |
2308 } | |
2309 | |
766 | 2310 void SetVolume1(int depth, |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2311 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume, |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2312 OrthancStone::ILayerStyleConfigurator* style) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2313 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2314 source1_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2315 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2316 if (style != NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2317 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2318 source1_->SetConfigurator(style); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2319 } |
766 | 2320 } |
2321 | |
2322 void SetVolume2(int depth, | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2323 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume, |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2324 OrthancStone::ILayerStyleConfigurator* style) |
766 | 2325 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2326 source2_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2327 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2328 if (style != NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2329 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2330 source2_->SetConfigurator(style); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
2331 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2332 } |
794 | 2333 |
2334 void SetStructureSet(int depth, | |
2335 const boost::shared_ptr<OrthancStone::DicomStructureSetLoader>& volume) | |
2336 { | |
2337 source3_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); | |
2338 } | |
2339 | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2340 }; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2341 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2342 |
745 | 2343 void Run(OrthancStone::NativeApplicationContext& context, |
765 | 2344 OrthancStone::ThreadedOracle& oracle) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2345 { |
783 | 2346 boost::shared_ptr<OrthancStone::DicomVolumeImage> ct(new OrthancStone::DicomVolumeImage); |
2347 boost::shared_ptr<OrthancStone::DicomVolumeImage> dose(new OrthancStone::DicomVolumeImage); | |
2348 | |
2349 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
2350 boost::shared_ptr<Toto> toto; |
783 | 2351 boost::shared_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> ctLoader; |
2352 boost::shared_ptr<OrthancStone::OrthancMultiframeVolumeLoader> doseLoader; | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2353 boost::shared_ptr<OrthancStone::DicomStructureSetLoader> rtstructLoader; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2354 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2355 { |
745 | 2356 OrthancStone::NativeApplicationContext::WriterLock lock(context); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2357 toto.reset(new Toto(oracle, lock.GetOracleObservable())); |
783 | 2358 ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); |
2359 doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2360 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
|
2361 } |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
2362 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2363 |
794 | 2364 //toto->SetReferenceLoader(*ctLoader); |
2365 toto->SetReferenceLoader(*doseLoader); | |
783 | 2366 |
2367 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2368 #if 1 |
783 | 2369 toto->SetVolume1(0, ctLoader, new OrthancStone::GrayscaleStyleConfigurator); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2370 #else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2371 { |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2372 boost::shared_ptr<OrthancStone::IVolumeSlicer> reslicer(new OrthancStone::DicomVolumeImageReslicer(ct)); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2373 toto->SetVolume1(0, reslicer, new OrthancStone::GrayscaleStyleConfigurator); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2374 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2375 #endif |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
2376 |
780 | 2377 |
2378 { | |
2379 std::auto_ptr<OrthancStone::LookupTableStyleConfigurator> config(new OrthancStone::LookupTableStyleConfigurator); | |
2380 config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
2381 |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
2382 boost::shared_ptr<OrthancStone::DicomVolumeImageMPRSlicer> tmp(new OrthancStone::DicomVolumeImageMPRSlicer(dose)); |
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
2383 toto->SetVolume2(1, tmp, config.release()); |
780 | 2384 } |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2385 |
794 | 2386 toto->SetStructureSet(2, rtstructLoader); |
2387 | |
793
f72b49954f62
DicomVolumeImageMPRSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
792
diff
changeset
|
2388 oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100)); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2389 |
744 | 2390 if (0) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2391 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2392 Json::Value v = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2393 v["Level"] = "Series"; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2394 v["Query"] = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2395 |
745 | 2396 std::auto_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2397 command->SetMethod(Orthanc::HttpMethod_Post); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2398 command->SetUri("/tools/find"); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2399 command->SetBody(v); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2400 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
2401 oracle.Schedule(*toto, command.release()); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2402 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
2403 |
744 | 2404 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2405 { |
745 | 2406 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2407 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2408 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2409 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2410 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2411 |
744 | 2412 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2413 { |
745 | 2414 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2415 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2416 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2417 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2418 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2419 |
744 | 2420 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2421 { |
745 | 2422 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2423 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2424 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2425 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2426 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2427 |
744 | 2428 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2429 { |
745 | 2430 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2431 command->SetHttpHeader("Accept-Encoding", "gzip"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2432 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2433 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2434 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2435 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2436 |
744 | 2437 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2438 { |
745 | 2439 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2440 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2441 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2442 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2443 } |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2444 |
744 | 2445 if (0) |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2446 { |
745 | 2447 std::auto_ptr<OrthancStone::GetOrthancWebViewerJpegCommand> command(new OrthancStone::GetOrthancWebViewerJpegCommand); |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2448 command->SetHttpHeader("Accept-Encoding", "gzip"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2449 command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2450 command->SetQuality(90); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2451 oracle.Schedule(*toto, command.release()); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2452 } |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2453 |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2454 |
744 | 2455 if (0) |
2456 { | |
2457 for (unsigned int i = 0; i < 10; i++) | |
2458 { | |
745 | 2459 std::auto_ptr<OrthancStone::SleepOracleCommand> command(new OrthancStone::SleepOracleCommand(i * 1000)); |
744 | 2460 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i)); |
2461 oracle.Schedule(*toto, command.release()); | |
2462 } | |
2463 } | |
2464 | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2465 |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
2466 // 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
|
2467 #if 0 |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
2468 // BGO data |
98a89b116b62
Added doc + fixed truncation warnings (+ inactive Orthanc IDs for BGO tests)
Benjamin Golinvaux <bgo@osimis.io>
parents:
795
diff
changeset
|
2469 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
|
2470 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
|
2471 //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
|
2472 #else |
794 | 2473 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2474 //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
|
2475 //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2476 |
796
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2477 // 2017-05-16 |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2478 ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2479 doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE |
d3197e0e321d
DicomStructureSetLoader is working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
795
diff
changeset
|
2480 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
|
2481 #endif |
764 | 2482 // 2015-01-28-Multiframe |
783 | 2483 //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT |
764 | 2484 |
661 | 2485 // Delphine |
783 | 2486 //ctLoader->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT |
2487 //ctLoader->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm | |
661 | 2488 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2489 |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2490 { |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2491 LOG(WARNING) << "...Waiting for Ctrl-C..."; |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2492 |
765 | 2493 oracle.Start(); |
2494 | |
2495 Orthanc::SystemToolbox::ServerBarrier(); | |
2496 | |
2497 /** | |
2498 * WARNING => The oracle must be stopped BEFORE the objects using | |
2499 * it are destroyed!!! This forces to wait for the completion of | |
2500 * the running callback methods. Otherwise, the callbacks methods | |
2501 * might still be running while their parent object is destroyed, | |
2502 * resulting in crashes. This is very visible if adding a sleep(), | |
2503 * as in (*). | |
2504 **/ | |
2505 | |
2506 oracle.Stop(); | |
2507 } | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2508 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2509 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2510 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2511 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2512 /** |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2513 * IMPORTANT: The full arguments to "main()" are needed for SDL on |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2514 * Windows. Otherwise, one gets the linking error "undefined reference |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2515 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2516 **/ |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2517 int main(int argc, char* argv[]) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2518 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2519 OrthancStone::StoneInitialize(); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2520 //Orthanc::Logging::EnableInfoLevel(true); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2521 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2522 try |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2523 { |
745 | 2524 OrthancStone::NativeApplicationContext context; |
2525 | |
2526 OrthancStone::ThreadedOracle oracle(context); | |
767 | 2527 //oracle.SetThreadsCount(1); |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2528 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2529 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2530 Orthanc::WebServiceParameters p; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2531 //p.SetUrl("http://localhost:8043/"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2532 p.SetCredentials("orthanc", "orthanc"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2533 oracle.SetOrthancParameters(p); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2534 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2535 |
765 | 2536 //oracle.Start(); |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2537 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2538 Run(context, oracle); |
765 | 2539 |
2540 //oracle.Stop(); | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2541 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2542 catch (Orthanc::OrthancException& e) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2543 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2544 LOG(ERROR) << "EXCEPTION: " << e.What(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2545 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2546 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2547 OrthancStone::StoneFinalize(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2548 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2549 return 0; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2550 } |