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