Mercurial > hg > orthanc-stone
annotate Samples/Sdl/Loader.cpp @ 789:c83a45f864b2
Merge
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 28 May 2019 08:15:38 +0200 |
parents | e76c4eef1054 9f3b2027a4a9 |
children | 4fe4b221a31f |
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 | |
781 | 346 class DicomVolumeImageOrthogonalSlice : public IVolumeSlicer::IExtractedSlice |
667
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
347 { |
e9339f2b5de7
refactoring of VolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
661
diff
changeset
|
348 private: |
783 | 349 const DicomVolumeImage& volume_; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
350 bool valid_; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
351 VolumeProjection projection_; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
352 unsigned int sliceIndex_; |
757 | 353 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
354 void CheckValid() const |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
355 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
356 if (!valid_) |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
357 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
358 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
359 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
360 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
361 |
757 | 362 protected: |
783 | 363 // Can be overloaded in subclasses |
759 | 364 virtual uint64_t GetRevisionInternal(VolumeProjection projection, |
783 | 365 unsigned int sliceIndex) const |
366 { | |
367 return volume_.GetRevision(); | |
368 } | |
757 | 369 |
370 public: | |
783 | 371 DicomVolumeImageOrthogonalSlice(const DicomVolumeImage& volume, |
759 | 372 const CoordinateSystem3D& cuttingPlane) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
373 volume_(volume) |
757 | 374 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
375 valid_ = (volume_.HasDicomParameters() && |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
376 volume_.GetGeometry().DetectSlice(projection_, sliceIndex_, cuttingPlane)); |
757 | 377 } |
378 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
379 VolumeProjection GetProjection() const |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
380 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
381 CheckValid(); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
382 return projection_; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
383 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
384 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
385 unsigned int GetSliceIndex() const |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
386 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
387 CheckValid(); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
388 return sliceIndex_; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
389 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
390 |
757 | 391 virtual bool IsValid() |
392 { | |
393 return valid_; | |
394 } | |
395 | |
396 virtual uint64_t GetRevision() | |
397 { | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
398 CheckValid(); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
399 return GetRevisionInternal(projection_, sliceIndex_); |
757 | 400 } |
401 | |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
402 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
403 const CoordinateSystem3D& cuttingPlane) |
757 | 404 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
405 CheckValid(); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
406 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
407 if (configurator == NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
408 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
409 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer, |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
410 "A style configurator is mandatory for textures"); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
411 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
412 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
413 std::auto_ptr<TextureBaseSceneLayer> texture; |
757 | 414 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
415 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
416 const DicomInstanceParameters& parameters = volume_.GetDicomParameters(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
417 ImageBuffer3D::SliceReader reader(volume_.GetPixelData(), projection_, sliceIndex_); |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
418 texture.reset(dynamic_cast<TextureBaseSceneLayer*> |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
419 (configurator->CreateTextureFromDicom(reader.GetAccessor(), parameters))); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
420 } |
757 | 421 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
422 const CoordinateSystem3D& system = volume_.GetGeometry().GetProjectionGeometry(projection_); |
766 | 423 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
424 double x0, y0, x1, y1; |
766 | 425 cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin()); |
426 cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX()); | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
427 texture->SetOrigin(x0, y0); |
757 | 428 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
429 double dx = x1 - x0; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
430 double dy = y1 - y0; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
431 if (!LinearAlgebra::IsCloseToZero(dx) || |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
432 !LinearAlgebra::IsCloseToZero(dy)) |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
433 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
434 texture->SetAngle(atan2(dy, dx)); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
435 } |
757 | 436 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
437 Vector tmp = volume_.GetGeometry().GetVoxelDimensions(projection_); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
438 texture->SetPixelSpacing(tmp[0], tmp[1]); |
757 | 439 |
767 | 440 return texture.release(); |
441 | |
442 #if 0 | |
443 double w = texture->GetTexture().GetWidth() * tmp[0]; | |
444 double h = texture->GetTexture().GetHeight() * tmp[1]; | |
766 | 445 printf("%.1f %.1f %.1f => %.1f %.1f => %.1f %.1f\n", |
446 system.GetOrigin() [0], | |
447 system.GetOrigin() [1], | |
448 system.GetOrigin() [2], | |
767 | 449 x0, y0, x0 + w, y0 + h); |
450 | |
451 std::auto_ptr<PolylineSceneLayer> toto(new PolylineSceneLayer); | |
766 | 452 |
767 | 453 PolylineSceneLayer::Chain c; |
454 c.push_back(ScenePoint2D(x0, y0)); | |
455 c.push_back(ScenePoint2D(x0 + w, y0)); | |
456 c.push_back(ScenePoint2D(x0 + w, y0 + h)); | |
457 c.push_back(ScenePoint2D(x0, y0 + h)); | |
458 | |
459 toto->AddChain(c, true); | |
460 | |
461 return toto.release(); | |
462 #endif | |
757 | 463 } |
464 }; | |
465 | |
781 | 466 |
467 | |
468 | |
712 | 469 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
470 class OrthancSeriesVolumeProgressiveLoader : |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
471 public IObserver, |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
472 public IObservable, |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
473 public IVolumeSlicer |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
474 { |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
475 private: |
711 | 476 static const unsigned int LOW_QUALITY = 0; |
477 static const unsigned int MIDDLE_QUALITY = 1; | |
478 static const unsigned int BEST_QUALITY = 2; | |
479 | |
480 | |
783 | 481 // Helper class internal to OrthancSeriesVolumeProgressiveLoader |
482 class SeriesGeometry : public boost::noncopyable | |
483 { | |
484 private: | |
485 void CheckSlice(size_t index, | |
486 const DicomInstanceParameters& reference) const | |
487 { | |
488 const DicomInstanceParameters& slice = *slices_[index]; | |
489 | |
490 if (!GeometryToolbox::IsParallel( | |
491 reference.GetGeometry().GetNormal(), | |
492 slice.GetGeometry().GetNormal())) | |
493 { | |
494 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
495 "A slice in the volume image is not parallel to the others"); | |
496 } | |
497 | |
498 if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) | |
499 { | |
500 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, | |
501 "The pixel format changes across the slices of the volume image"); | |
502 } | |
503 | |
504 if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || | |
505 reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) | |
506 { | |
507 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, | |
508 "The width/height of slices are not constant in the volume image"); | |
509 } | |
510 | |
511 if (!LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || | |
512 !LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) | |
513 { | |
514 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
515 "The pixel spacing of the slices change across the volume image"); | |
516 } | |
517 } | |
518 | |
519 | |
520 void CheckVolume() const | |
521 { | |
522 for (size_t i = 0; i < slices_.size(); i++) | |
523 { | |
524 assert(slices_[i] != NULL); | |
525 if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) | |
526 { | |
527 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, | |
528 "This class does not support multi-frame images"); | |
529 } | |
530 } | |
531 | |
532 if (slices_.size() != 0) | |
533 { | |
534 const DicomInstanceParameters& reference = *slices_[0]; | |
535 | |
536 for (size_t i = 1; i < slices_.size(); i++) | |
537 { | |
538 CheckSlice(i, reference); | |
539 } | |
540 } | |
541 } | |
542 | |
543 | |
544 void Clear() | |
545 { | |
546 for (size_t i = 0; i < slices_.size(); i++) | |
547 { | |
548 assert(slices_[i] != NULL); | |
549 delete slices_[i]; | |
550 } | |
551 | |
552 slices_.clear(); | |
553 slicesRevision_.clear(); | |
554 } | |
555 | |
556 | |
557 void CheckSliceIndex(size_t index) const | |
558 { | |
559 if (!HasGeometry()) | |
560 { | |
561 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
562 } | |
563 else if (index >= slices_.size()) | |
564 { | |
565 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
566 } | |
567 else | |
568 { | |
569 assert(slices_.size() == GetImageGeometry().GetDepth() && | |
570 slices_.size() == slicesRevision_.size()); | |
571 } | |
572 } | |
573 | |
574 | |
575 std::auto_ptr<VolumeImageGeometry> geometry_; | |
576 std::vector<DicomInstanceParameters*> slices_; | |
577 std::vector<uint64_t> slicesRevision_; | |
578 | |
579 public: | |
580 ~SeriesGeometry() | |
581 { | |
582 Clear(); | |
583 } | |
584 | |
585 // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" | |
586 void ComputeGeometry(SlicesSorter& slices) | |
587 { | |
588 Clear(); | |
589 | |
590 if (!slices.Sort()) | |
591 { | |
592 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, | |
593 "Cannot sort the 3D slices of a DICOM series"); | |
594 } | |
595 | |
596 if (slices.GetSlicesCount() == 0) | |
597 { | |
598 geometry_.reset(new VolumeImageGeometry); | |
599 } | |
600 else | |
601 { | |
602 slices_.reserve(slices.GetSlicesCount()); | |
603 slicesRevision_.resize(slices.GetSlicesCount(), 0); | |
604 | |
605 for (size_t i = 0; i < slices.GetSlicesCount(); i++) | |
606 { | |
607 const DicomInstanceParameters& slice = | |
608 dynamic_cast<const DicomInstanceParameters&>(slices.GetSlicePayload(i)); | |
609 slices_.push_back(new DicomInstanceParameters(slice)); | |
610 } | |
611 | |
612 CheckVolume(); | |
613 | |
614 const double spacingZ = slices.ComputeSpacingBetweenSlices(); | |
615 LOG(INFO) << "Computed spacing between slices: " << spacingZ << "mm"; | |
616 | |
617 const DicomInstanceParameters& parameters = *slices_[0]; | |
618 | |
619 geometry_.reset(new VolumeImageGeometry); | |
620 geometry_->SetSize(parameters.GetImageInformation().GetWidth(), | |
621 parameters.GetImageInformation().GetHeight(), | |
622 static_cast<unsigned int>(slices.GetSlicesCount())); | |
623 geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); | |
624 geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
625 parameters.GetPixelSpacingY(), spacingZ); | |
626 } | |
627 } | |
628 | |
629 bool HasGeometry() const | |
630 { | |
631 return geometry_.get() != NULL; | |
632 } | |
633 | |
634 const VolumeImageGeometry& GetImageGeometry() const | |
635 { | |
636 if (!HasGeometry()) | |
637 { | |
638 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
639 } | |
640 else | |
641 { | |
642 assert(slices_.size() == geometry_->GetDepth()); | |
643 return *geometry_; | |
644 } | |
645 } | |
646 | |
647 const DicomInstanceParameters& GetSliceParameters(size_t index) const | |
648 { | |
649 CheckSliceIndex(index); | |
650 return *slices_[index]; | |
651 } | |
652 | |
653 uint64_t GetSliceRevision(size_t index) const | |
654 { | |
655 CheckSliceIndex(index); | |
656 return slicesRevision_[index]; | |
657 } | |
658 | |
659 void IncrementSliceRevision(size_t index) | |
660 { | |
661 CheckSliceIndex(index); | |
662 slicesRevision_[index] ++; | |
663 } | |
664 }; | |
665 | |
666 | |
667 class Slice : public DicomVolumeImageOrthogonalSlice | |
668 { | |
669 private: | |
670 const OrthancSeriesVolumeProgressiveLoader& that_; | |
671 | |
672 protected: | |
673 virtual uint64_t GetRevisionInternal(VolumeProjection projection, | |
674 unsigned int sliceIndex) const | |
675 { | |
676 if (projection == VolumeProjection_Axial) | |
677 { | |
678 return that_.seriesGeometry_.GetSliceRevision(sliceIndex); | |
679 } | |
680 else | |
681 { | |
682 // For coronal and sagittal projections, we take the global | |
683 // revision of the volume | |
684 return that_.volume_->GetRevision(); | |
685 } | |
686 } | |
687 | |
688 public: | |
689 Slice(const OrthancSeriesVolumeProgressiveLoader& that, | |
690 const CoordinateSystem3D& plane) : | |
691 DicomVolumeImageOrthogonalSlice(*that.volume_, plane), | |
692 that_(that) | |
693 { | |
694 } | |
695 }; | |
696 | |
697 | |
698 | |
711 | 699 static unsigned int GetSliceIndexPayload(const OracleCommandWithPayload& command) |
700 { | |
701 return dynamic_cast< const Orthanc::SingleValueObject<unsigned int>& >(command.GetPayload()).GetValue(); | |
702 } | |
703 | |
704 | |
705 void ScheduleNextSliceDownload() | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
706 { |
711 | 707 assert(strategy_.get() != NULL); |
708 | |
709 unsigned int sliceIndex, quality; | |
710 | |
711 if (strategy_->GetNext(sliceIndex, quality)) | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
712 { |
711 | 713 assert(quality <= BEST_QUALITY); |
714 | |
783 | 715 const DicomInstanceParameters& slice = seriesGeometry_.GetSliceParameters(sliceIndex); |
711 | 716 |
717 const std::string& instance = slice.GetOrthancInstanceIdentifier(); | |
718 if (instance.empty()) | |
719 { | |
720 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
721 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
722 |
745 | 723 std::auto_ptr<OracleCommandWithPayload> command; |
711 | 724 |
725 if (quality == BEST_QUALITY) | |
726 { | |
745 | 727 std::auto_ptr<GetOrthancImageCommand> tmp(new GetOrthancImageCommand); |
711 | 728 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
729 tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); | |
730 tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); | |
731 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); | |
732 command.reset(tmp.release()); | |
733 } | |
734 else | |
735 { | |
745 | 736 std::auto_ptr<GetOrthancWebViewerJpegCommand> tmp(new GetOrthancWebViewerJpegCommand); |
711 | 737 tmp->SetHttpHeader("Accept-Encoding", "gzip"); |
738 tmp->SetInstance(instance); | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
739 tmp->SetQuality((quality == 0 ? 50 : 90)); |
711 | 740 tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); |
741 command.reset(tmp.release()); | |
742 } | |
743 | |
744 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(sliceIndex)); | |
745 oracle_.Schedule(*this, command.release()); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
746 } |
711 | 747 } |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
748 |
711 | 749 |
750 void LoadGeometry(const OrthancRestApiCommand::SuccessMessage& message) | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
751 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
752 Json::Value body; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
753 message.ParseJsonBody(body); |
711 | 754 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
755 if (body.type() != Json::objectValue) |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
756 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
757 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
758 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
759 |
710 | 760 { |
761 Json::Value::Members instances = body.getMemberNames(); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
762 |
745 | 763 SlicesSorter slices; |
710 | 764 |
765 for (size_t i = 0; i < instances.size(); i++) | |
766 { | |
767 Orthanc::DicomMap dicom; | |
768 dicom.FromDicomAsJson(body[instances[i]]); | |
769 | |
770 std::auto_ptr<DicomInstanceParameters> instance(new DicomInstanceParameters(dicom)); | |
771 instance->SetOrthancInstanceIdentifier(instances[i]); | |
772 | |
745 | 773 CoordinateSystem3D geometry = instance->GetGeometry(); |
710 | 774 slices.AddSlice(geometry, instance.release()); |
775 } | |
776 | |
783 | 777 seriesGeometry_.ComputeGeometry(slices); |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
778 } |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
779 |
783 | 780 size_t slicesCount = seriesGeometry_.GetImageGeometry().GetDepth(); |
781 | |
782 if (slicesCount == 0) | |
783 { | |
784 volume_->Initialize(seriesGeometry_.GetImageGeometry(), Orthanc::PixelFormat_Grayscale8); | |
785 } | |
786 else | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
787 { |
783 | 788 const DicomInstanceParameters& parameters = seriesGeometry_.GetSliceParameters(0); |
789 | |
790 volume_->Initialize(seriesGeometry_.GetImageGeometry(), parameters.GetExpectedPixelFormat()); | |
791 volume_->SetDicomParameters(parameters); | |
792 volume_->GetPixelData().Clear(); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
793 |
783 | 794 strategy_.reset(new BasicFetchingStrategy(sorter_->CreateSorter(slicesCount), BEST_QUALITY)); |
795 | |
757 | 796 assert(simultaneousDownloads_ != 0); |
797 for (unsigned int i = 0; i < simultaneousDownloads_; i++) | |
710 | 798 { |
799 ScheduleNextSliceDownload(); | |
800 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
801 } |
779 | 802 |
783 | 803 slicesQuality_.resize(slicesCount, 0); |
804 | |
805 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_)); | |
806 } | |
807 | |
808 | |
809 void SetSliceContent(unsigned int sliceIndex, | |
810 const Orthanc::ImageAccessor& image, | |
811 unsigned int quality) | |
812 { | |
813 assert(sliceIndex < slicesQuality_.size() && | |
814 slicesQuality_.size() == volume_->GetPixelData().GetDepth()); | |
815 | |
816 if (quality >= slicesQuality_[sliceIndex]) | |
817 { | |
818 { | |
819 ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), VolumeProjection_Axial, sliceIndex); | |
820 Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); | |
821 } | |
822 | |
823 volume_->IncrementRevision(); | |
824 seriesGeometry_.IncrementSliceRevision(sliceIndex); | |
825 slicesQuality_[sliceIndex] = quality; | |
826 | |
827 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_)); | |
828 } | |
829 | |
830 ScheduleNextSliceDownload(); | |
710 | 831 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
832 |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
833 |
745 | 834 void LoadBestQualitySliceContent(const GetOrthancImageCommand::SuccessMessage& message) |
783 | 835 { |
836 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
|
837 } |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
838 |
7457b4ee1f29
VolumeSeriesOrthancLoader uses a prefetching strategy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
692
diff
changeset
|
839 |
745 | 840 void LoadJpegSliceContent(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
710 | 841 { |
711 | 842 unsigned int quality; |
710 | 843 |
711 | 844 switch (message.GetOrigin().GetQuality()) |
845 { | |
846 case 50: | |
847 quality = LOW_QUALITY; | |
848 break; | |
849 | |
850 case 90: | |
851 quality = MIDDLE_QUALITY; | |
852 break; | |
853 | |
854 default: | |
855 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
856 } | |
857 | |
783 | 858 SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); |
710 | 859 } |
711 | 860 |
710 | 861 |
783 | 862 IOracle& oracle_; |
863 bool active_; | |
864 unsigned int simultaneousDownloads_; | |
865 SeriesGeometry seriesGeometry_; | |
866 | |
867 boost::shared_ptr<DicomVolumeImage> volume_; | |
757 | 868 std::auto_ptr<IFetchingItemsSorter::IFactory> sorter_; |
869 std::auto_ptr<IFetchingStrategy> strategy_; | |
783 | 870 std::vector<unsigned int> slicesQuality_; |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
871 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
872 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
873 public: |
783 | 874 OrthancSeriesVolumeProgressiveLoader(const boost::shared_ptr<DicomVolumeImage>& volume, |
875 IOracle& oracle, | |
757 | 876 IObservable& oracleObservable) : |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
877 IObserver(oracleObservable.GetBroker()), |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
878 IObservable(oracleObservable.GetBroker()), |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
879 oracle_(oracle), |
757 | 880 active_(false), |
881 simultaneousDownloads_(4), | |
783 | 882 volume_(volume), |
757 | 883 sorter_(new BasicFetchingItemsSorter::Factory) |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
884 { |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
885 oracleObservable.RegisterObserverCallback( |
757 | 886 new Callable<OrthancSeriesVolumeProgressiveLoader, OrthancRestApiCommand::SuccessMessage> |
887 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadGeometry)); | |
888 | |
889 oracleObservable.RegisterObserverCallback( | |
890 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancImageCommand::SuccessMessage> | |
891 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent)); | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
892 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
893 oracleObservable.RegisterObserverCallback( |
757 | 894 new Callable<OrthancSeriesVolumeProgressiveLoader, GetOrthancWebViewerJpegCommand::SuccessMessage> |
895 (*this, &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent)); | |
896 } | |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
897 |
757 | 898 void SetSimultaneousDownloads(unsigned int count) |
899 { | |
900 if (active_) | |
901 { | |
902 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
903 } | |
904 else if (count == 0) | |
905 { | |
906 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
907 } | |
908 else | |
909 { | |
910 simultaneousDownloads_ = count; | |
911 } | |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
912 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
913 |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
914 void LoadSeries(const std::string& seriesId) |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
915 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
916 if (active_) |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
917 { |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
918 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
919 } |
757 | 920 else |
921 { | |
922 active_ = true; | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
923 |
757 | 924 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
925 command->SetUri("/series/" + seriesId + "/instances-tags"); | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
926 |
757 | 927 oracle_.Schedule(*this, command.release()); |
928 } | |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
929 } |
781 | 930 |
783 | 931 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
932 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
933 { |
783 | 934 if (volume_->HasGeometry()) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
935 { |
783 | 936 std::auto_ptr<Slice> slice(new Slice(*this, cuttingPlane)); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
937 |
783 | 938 if (strategy_.get() != NULL && |
939 slice->IsValid() && | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
940 slice->GetProjection() == VolumeProjection_Axial) |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
941 { |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
942 strategy_->SetCurrent(slice->GetSliceIndex()); |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
943 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
944 |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
945 return slice.release(); |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
946 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
947 else |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
948 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
949 return new IVolumeSlicer::InvalidSlice; |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
950 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
951 } |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
952 }; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
953 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
954 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
955 |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
956 class OrthancMultiframeVolumeLoader : |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
957 public IObserver, |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
958 public IObservable, |
783 | 959 public IVolumeSlicer |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
960 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
961 private: |
764 | 962 class State : public Orthanc::IDynamicObject |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
963 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
964 private: |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
965 OrthancMultiframeVolumeLoader& that_; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
966 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
967 protected: |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
968 void Schedule(OrthancRestApiCommand* command) const |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
969 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
970 that_.oracle_.Schedule(that_, command); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
971 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
972 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
973 OrthancMultiframeVolumeLoader& GetTarget() const |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
974 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
975 return that_; |
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 public: |
764 | 979 State(OrthancMultiframeVolumeLoader& that) : |
980 that_(that) | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
981 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
982 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
983 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
984 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) const = 0; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
985 }; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
986 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
987 void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
988 { |
764 | 989 dynamic_cast<const State&>(message.GetOrigin().GetPayload()).Handle(message); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
990 } |
712 | 991 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
992 |
764 | 993 class LoadRTDoseGeometry : public State |
712 | 994 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
995 private: |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
996 std::auto_ptr<Orthanc::DicomMap> dicom_; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
997 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
998 public: |
764 | 999 LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1000 Orthanc::DicomMap* dicom) : |
764 | 1001 State(that), |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1002 dicom_(dicom) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1003 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1004 if (dicom == NULL) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1005 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1006 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1007 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1008 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1009 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1010 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) const |
712 | 1011 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1012 // 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
|
1013 std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1014 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
|
1015 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1016 GetTarget().SetGeometry(*dicom_); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1017 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1018 }; |
764 | 1019 |
1020 | |
1021 static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) | |
1022 { | |
1023 std::string s; | |
1024 if (!dicom.CopyToString(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) | |
1025 { | |
1026 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
1027 "DICOM file without SOP class UID"); | |
1028 } | |
1029 else | |
1030 { | |
1031 return s; | |
1032 } | |
1033 } | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1034 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1035 |
764 | 1036 class LoadGeometry : public State |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1037 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1038 public: |
764 | 1039 LoadGeometry(OrthancMultiframeVolumeLoader& that) : |
1040 State(that) | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1041 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1042 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1043 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1044 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) const |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1045 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1046 Json::Value body; |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1047 message.ParseJsonBody(body); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1048 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1049 if (body.type() != Json::objectValue) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1050 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1051 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1052 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1053 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1054 std::auto_ptr<Orthanc::DicomMap> dicom(new Orthanc::DicomMap); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1055 dicom->FromDicomAsJson(body); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1056 |
764 | 1057 if (StringToSopClassUid(GetSopClassUid(*dicom)) == SopClassUid_RTDose) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1058 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1059 // Download the "Grid Frame Offset Vector" DICOM tag, that is |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1060 // 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
|
1061 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1062 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
764 | 1063 command->SetUri("/instances/" + GetTarget().GetInstanceId() + "/content/" + |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1064 Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); |
764 | 1065 command->SetPayload(new LoadRTDoseGeometry(GetTarget(), dicom.release())); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1066 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1067 Schedule(command.release()); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1068 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1069 else |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1070 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1071 GetTarget().SetGeometry(*dicom); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1072 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1073 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1074 }; |
764 | 1075 |
1076 | |
1077 | |
1078 class LoadTransferSyntax : public State | |
1079 { | |
1080 public: | |
1081 LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : | |
1082 State(that) | |
1083 { | |
1084 } | |
1085 | |
1086 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) const | |
1087 { | |
1088 GetTarget().SetTransferSyntax(message.GetAnswer()); | |
1089 } | |
1090 }; | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1091 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1092 |
765 | 1093 class LoadUncompressedPixelData : public State |
1094 { | |
1095 public: | |
1096 LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : | |
1097 State(that) | |
1098 { | |
1099 } | |
1100 | |
1101 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) const | |
1102 { | |
1103 GetTarget().SetUncompressedPixelData(message.GetAnswer()); | |
1104 } | |
1105 }; | |
1106 | |
1107 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1108 |
783 | 1109 boost::shared_ptr<DicomVolumeImage> volume_; |
764 | 1110 IOracle& oracle_; |
1111 bool active_; | |
1112 std::string instanceId_; | |
1113 std::string transferSyntaxUid_; | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1114 |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1115 |
764 | 1116 const std::string& GetInstanceId() const |
1117 { | |
1118 if (active_) | |
1119 { | |
1120 return instanceId_; | |
1121 } | |
1122 else | |
1123 { | |
1124 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
1125 } | |
1126 } | |
1127 | |
1128 | |
1129 void ScheduleFrameDownloads() | |
1130 { | |
1131 if (transferSyntaxUid_.empty() || | |
783 | 1132 !volume_->HasGeometry()) |
764 | 1133 { |
1134 return; | |
1135 } | |
1136 | |
765 | 1137 if (transferSyntaxUid_ == "1.2.840.10008.1.2" || |
1138 transferSyntaxUid_ == "1.2.840.10008.1.2.1" || | |
1139 transferSyntaxUid_ == "1.2.840.10008.1.2.2") | |
1140 { | |
1141 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
1142 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
1143 command->SetUri("/instances/" + instanceId_ + "/content/" + | |
1144 Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); | |
1145 command->SetPayload(new LoadUncompressedPixelData(*this)); | |
1146 oracle_.Schedule(*this, command.release()); | |
1147 } | |
1148 else | |
764 | 1149 { |
1150 throw Orthanc::OrthancException( | |
1151 Orthanc::ErrorCode_NotImplemented, | |
1152 "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); | |
1153 } | |
1154 } | |
1155 | |
1156 | |
1157 void SetTransferSyntax(const std::string& transferSyntax) | |
1158 { | |
1159 transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); | |
1160 ScheduleFrameDownloads(); | |
1161 } | |
1162 | |
1163 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1164 void SetGeometry(const Orthanc::DicomMap& dicom) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1165 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1166 DicomInstanceParameters parameters(dicom); |
783 | 1167 volume_->SetDicomParameters(parameters); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1168 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1169 Orthanc::PixelFormat format; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1170 if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1171 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1172 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
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 |
764 | 1175 double spacingZ; |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1176 switch (parameters.GetSopClassUid()) |
764 | 1177 { |
1178 case SopClassUid_RTDose: | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1179 spacingZ = parameters.GetThickness(); |
764 | 1180 break; |
1181 | |
1182 default: | |
1183 throw Orthanc::OrthancException( | |
1184 Orthanc::ErrorCode_NotImplemented, | |
1185 "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); | |
1186 } | |
1187 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1188 const unsigned int width = parameters.GetImageInformation().GetWidth(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1189 const unsigned int height = parameters.GetImageInformation().GetHeight(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1190 const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1191 |
781 | 1192 { |
783 | 1193 VolumeImageGeometry geometry; |
1194 geometry.SetSize(width, height, depth); | |
1195 geometry.SetAxialGeometry(parameters.GetGeometry()); | |
1196 geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), | |
1197 parameters.GetPixelSpacingY(), spacingZ); | |
1198 volume_->Initialize(geometry, format); | |
781 | 1199 } |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1200 |
783 | 1201 volume_->GetPixelData().Clear(); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1202 |
764 | 1203 ScheduleFrameDownloads(); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1204 |
783 | 1205 BroadcastMessage(DicomVolumeImage::GeometryReadyMessage(*volume_)); |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1206 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1207 |
765 | 1208 |
1209 ORTHANC_FORCE_INLINE | |
1210 static void CopyPixel(uint32_t& target, | |
1211 const void* source) | |
1212 { | |
1213 // TODO - check alignement? | |
1214 target = le32toh(*reinterpret_cast<const uint32_t*>(source)); | |
1215 } | |
1216 | |
1217 | |
1218 template <typename T> | |
1219 void CopyPixelData(const std::string& pixelData) | |
1220 { | |
783 | 1221 ImageBuffer3D& target = volume_->GetPixelData(); |
1222 | |
1223 const Orthanc::PixelFormat format = target.GetFormat(); | |
1224 const unsigned int bpp = target.GetBytesPerPixel(); | |
1225 const unsigned int width = target.GetWidth(); | |
1226 const unsigned int height = target.GetHeight(); | |
1227 const unsigned int depth = target.GetDepth(); | |
765 | 1228 |
1229 if (pixelData.size() != bpp * width * height * depth) | |
1230 { | |
1231 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, | |
1232 "The pixel data has not the proper size"); | |
1233 } | |
1234 | |
1235 if (pixelData.empty()) | |
1236 { | |
1237 return; | |
1238 } | |
1239 | |
1240 const uint8_t* source = reinterpret_cast<const uint8_t*>(pixelData.c_str()); | |
1241 | |
1242 for (unsigned int z = 0; z < depth; z++) | |
1243 { | |
783 | 1244 ImageBuffer3D::SliceWriter writer(target, VolumeProjection_Axial, z); |
765 | 1245 |
1246 assert (writer.GetAccessor().GetWidth() == width && | |
1247 writer.GetAccessor().GetHeight() == height); | |
1248 | |
1249 for (unsigned int y = 0; y < height; y++) | |
1250 { | |
1251 assert(sizeof(T) == Orthanc::GetBytesPerPixel(format)); | |
1252 | |
1253 T* target = reinterpret_cast<T*>(writer.GetAccessor().GetRow(y)); | |
1254 | |
1255 for (unsigned int x = 0; x < width; x++) | |
1256 { | |
1257 CopyPixel(*target, source); | |
1258 | |
1259 target ++; | |
1260 source += bpp; | |
1261 } | |
1262 } | |
1263 } | |
1264 } | |
1265 | |
1266 | |
1267 void SetUncompressedPixelData(const std::string& pixelData) | |
1268 { | |
783 | 1269 switch (volume_->GetPixelData().GetFormat()) |
765 | 1270 { |
1271 case Orthanc::PixelFormat_Grayscale32: | |
1272 CopyPixelData<uint32_t>(pixelData); | |
1273 break; | |
1274 | |
1275 default: | |
1276 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
1277 } | |
1278 | |
783 | 1279 volume_->IncrementRevision(); |
781 | 1280 |
783 | 1281 BroadcastMessage(DicomVolumeImage::ContentUpdatedMessage(*volume_)); |
765 | 1282 } |
1283 | |
766 | 1284 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1285 public: |
783 | 1286 OrthancMultiframeVolumeLoader(const boost::shared_ptr<DicomVolumeImage>& volume, |
1287 IOracle& oracle, | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1288 IObservable& oracleObservable) : |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1289 IObserver(oracleObservable.GetBroker()), |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1290 IObservable(oracleObservable.GetBroker()), |
783 | 1291 volume_(volume), |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1292 oracle_(oracle), |
781 | 1293 active_(false) |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1294 { |
783 | 1295 if (volume.get() == NULL) |
1296 { | |
1297 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
1298 } | |
1299 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1300 oracleObservable.RegisterObserverCallback( |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1301 new Callable<OrthancMultiframeVolumeLoader, OrthancRestApiCommand::SuccessMessage> |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1302 (*this, &OrthancMultiframeVolumeLoader::Handle)); |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1303 } |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1304 |
764 | 1305 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1306 void LoadInstance(const std::string& instanceId) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1307 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1308 if (active_) |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1309 { |
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1310 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
712 | 1311 } |
1312 else | |
1313 { | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1314 active_ = true; |
764 | 1315 instanceId_ = instanceId; |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1316 |
764 | 1317 { |
1318 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
765 | 1319 command->SetHttpHeader("Accept-Encoding", "gzip"); |
764 | 1320 command->SetUri("/instances/" + instanceId + "/tags"); |
1321 command->SetPayload(new LoadGeometry(*this)); | |
1322 oracle_.Schedule(*this, command.release()); | |
1323 } | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1324 |
764 | 1325 { |
1326 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
1327 command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); | |
1328 command->SetPayload(new LoadTransferSyntax(*this)); | |
1329 oracle_.Schedule(*this, command.release()); | |
1330 } | |
712 | 1331 } |
1332 } | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1333 |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1334 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1335 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1336 { |
783 | 1337 if (volume_->HasGeometry()) |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1338 { |
783 | 1339 return new DicomVolumeImageOrthogonalSlice(*volume_, cuttingPlane); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1340 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1341 else |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1342 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1343 return new IVolumeSlicer::InvalidSlice; |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1344 } |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1345 } |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1346 }; |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1347 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1348 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1349 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1350 class VolumeImageReslicer : public IVolumeSlicer |
781 | 1351 { |
1352 private: | |
1353 class Slice : public IExtractedSlice | |
1354 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1355 private: |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1356 VolumeImageReslicer& that_; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1357 CoordinateSystem3D cuttingPlane_; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1358 |
781 | 1359 public: |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1360 Slice(VolumeImageReslicer& that, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1361 const CoordinateSystem3D& cuttingPlane) : |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1362 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1363 cuttingPlane_(cuttingPlane) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1364 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1365 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1366 |
781 | 1367 virtual bool IsValid() |
1368 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1369 return true; |
781 | 1370 } |
1371 | |
1372 virtual uint64_t GetRevision() | |
1373 { | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1374 return that_.volume_->GetRevision(); |
781 | 1375 } |
1376 | |
1377 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, // possibly absent | |
1378 const CoordinateSystem3D& cuttingPlane) | |
1379 { | |
783 | 1380 VolumeReslicer& reslicer = that_.reslicer_; |
1381 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1382 if (configurator == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1383 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1384 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1385 "Must provide a layer style configurator"); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1386 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1387 |
783 | 1388 reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat()); |
1389 reslicer.Apply(that_.volume_->GetPixelData(), | |
1390 that_.volume_->GetGeometry(), | |
1391 cuttingPlane); | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1392 |
783 | 1393 if (reslicer.IsSuccess()) |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1394 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1395 std::auto_ptr<TextureBaseSceneLayer> layer |
783 | 1396 (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(), |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1397 that_.volume_->GetDicomParameters())); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1398 if (layer.get() == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1399 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1400 return NULL; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1401 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1402 |
783 | 1403 double s = reslicer.GetPixelSpacing(); |
1404 layer->SetPixelSpacing(s, s); | |
1405 layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s, | |
1406 reslicer.GetOutputExtent().GetY1() + 0.5 * s); | |
1407 | |
1408 // TODO - Angle!! | |
1409 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1410 return layer.release(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1411 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1412 else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1413 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1414 return NULL; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1415 } |
781 | 1416 } |
1417 }; | |
1418 | |
783 | 1419 boost::shared_ptr<DicomVolumeImage> volume_; |
1420 VolumeReslicer reslicer_; | |
781 | 1421 |
1422 public: | |
783 | 1423 VolumeImageReslicer(const boost::shared_ptr<DicomVolumeImage>& volume) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1424 volume_(volume) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1425 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1426 if (volume.get() == NULL) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1427 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1428 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1429 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1430 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1431 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1432 ImageInterpolation GetInterpolation() const |
781 | 1433 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1434 return reslicer_.GetInterpolation(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1435 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1436 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1437 void SetInterpolation(ImageInterpolation interpolation) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1438 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1439 reslicer_.SetInterpolation(interpolation); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1440 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1441 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1442 bool IsFastMode() const |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1443 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1444 return reslicer_.IsFastMode(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1445 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1446 |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1447 void SetFastMode(bool fast) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1448 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1449 reslicer_.EnableFastMode(fast); |
781 | 1450 } |
1451 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1452 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
781 | 1453 { |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1454 if (volume_->HasGeometry()) |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1455 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1456 return new Slice(*this, cuttingPlane); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1457 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1458 else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1459 { |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1460 return new IVolumeSlicer::InvalidSlice; |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1461 } |
781 | 1462 } |
1463 }; | |
1464 | |
1465 | |
1466 | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1467 class DicomStructureSetLoader : |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1468 public IObserver, |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1469 public IVolumeSlicer |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1470 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1471 private: |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1472 enum State |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1473 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1474 State_Setup, |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1475 State_Loading, |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1476 State_Ready |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1477 }; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1478 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1479 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1480 std::auto_ptr<DicomStructureSet> content_; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1481 IOracle& oracle_; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1482 State state_; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1483 std::string instanceId_; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1484 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1485 void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1486 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1487 if (state_ != State_Loading) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1488 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1489 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1490 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1491 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1492 const boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1493 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1494 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1495 OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer()); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1496 content_.reset(new DicomStructureSet(dicom)); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1497 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1498 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1499 const boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1500 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1501 printf("LOADED: %d\n", (end - start).total_milliseconds()); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1502 state_ = State_Ready; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1503 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1504 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1505 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1506 public: |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1507 DicomStructureSetLoader(IOracle& oracle, |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1508 IObservable& oracleObservable) : |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1509 IObserver(oracleObservable.GetBroker()), |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1510 oracle_(oracle), |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1511 state_(State_Setup) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1512 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1513 oracleObservable.RegisterObserverCallback( |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1514 new Callable<DicomStructureSetLoader, OrthancRestApiCommand::SuccessMessage> |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1515 (*this, &DicomStructureSetLoader::Handle)); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1516 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1517 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1518 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1519 void LoadInstance(const std::string& instanceId) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1520 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1521 if (state_ != State_Setup) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1522 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1523 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1524 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1525 else |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1526 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1527 state_ = State_Loading; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1528 instanceId_ = instanceId; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1529 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1530 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1531 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1532 command->SetHttpHeader("Accept-Encoding", "gzip"); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1533 command->SetUri("/instances/" + instanceId + "/tags?ignore-length=3006-0050"); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1534 oracle_.Schedule(*this, command.release()); |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1535 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1536 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1537 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1538 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1539 virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1540 { |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1541 return NULL; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1542 } |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1543 }; |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1544 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1545 |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1546 |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1547 class VolumeSceneLayerSource : public boost::noncopyable |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1548 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1549 private: |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1550 Scene2D& scene_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1551 int layerDepth_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1552 boost::shared_ptr<IVolumeSlicer> slicer_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1553 std::auto_ptr<ILayerStyleConfigurator> configurator_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1554 std::auto_ptr<CoordinateSystem3D> lastPlane_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1555 uint64_t lastRevision_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1556 uint64_t lastConfiguratorRevision_; |
691 | 1557 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1558 static bool IsSameCuttingPlane(const CoordinateSystem3D& a, |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1559 const CoordinateSystem3D& b) |
745 | 1560 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1561 // TODO - What if the normal is reversed? |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1562 double distance; |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1563 return (CoordinateSystem3D::ComputeDistance(distance, a, b) && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1564 LinearAlgebra::IsCloseToZero(distance)); |
745 | 1565 } |
1566 | |
783 | 1567 void ClearLayer() |
1568 { | |
1569 scene_.DeleteLayer(layerDepth_); | |
1570 lastPlane_.reset(NULL); | |
1571 } | |
1572 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1573 public: |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1574 VolumeSceneLayerSource(Scene2D& scene, |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1575 int layerDepth, |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1576 const boost::shared_ptr<IVolumeSlicer>& slicer) : |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1577 scene_(scene), |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1578 layerDepth_(layerDepth), |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1579 slicer_(slicer) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1580 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1581 if (slicer == NULL) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1582 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1583 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1584 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1585 } |
745 | 1586 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1587 const IVolumeSlicer& GetSlicer() const |
691 | 1588 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1589 return *slicer_; |
691 | 1590 } |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1591 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1592 void RemoveConfigurator() |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1593 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1594 configurator_.reset(); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1595 lastPlane_.reset(); |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1596 } |
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1597 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1598 void SetConfigurator(ILayerStyleConfigurator* configurator) // Takes ownership |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1599 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1600 if (configurator == NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1601 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1602 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1603 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1604 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1605 configurator_.reset(configurator); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1606 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1607 // Invalidate the layer |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1608 lastPlane_.reset(NULL); |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1609 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1610 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1611 bool HasConfigurator() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1612 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1613 return configurator_.get() != NULL; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1614 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1615 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1616 ILayerStyleConfigurator& GetConfigurator() const |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1617 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1618 if (configurator_.get() == NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1619 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1620 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1621 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1622 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1623 return *configurator_; |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1624 } |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1625 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1626 void Update(const CoordinateSystem3D& plane) |
691 | 1627 { |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1628 assert(slicer_.get() != NULL); |
781 | 1629 std::auto_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane)); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1630 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1631 if (slice.get() == NULL) |
691 | 1632 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1633 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
691 | 1634 } |
1635 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1636 if (!slice->IsValid()) |
691 | 1637 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1638 // The slicer cannot handle this cutting plane: Clear the layer |
783 | 1639 ClearLayer(); |
691 | 1640 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1641 else if (lastPlane_.get() != NULL && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1642 IsSameCuttingPlane(*lastPlane_, plane) && |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1643 lastRevision_ == slice->GetRevision()) |
691 | 1644 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1645 // The content of the slice has not changed: Don't update the |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1646 // layer content, but possibly update its style |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1647 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1648 if (configurator_.get() != NULL && |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1649 configurator_->GetRevision() != lastConfiguratorRevision_ && |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1650 scene_.HasLayer(layerDepth_)) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1651 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1652 configurator_->ApplyStyle(scene_.GetLayer(layerDepth_)); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1653 } |
691 | 1654 } |
1655 else | |
1656 { | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1657 // Content has changed: An update is needed |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1658 lastPlane_.reset(new CoordinateSystem3D(plane)); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1659 lastRevision_ = slice->GetRevision(); |
692
10910827f235
simplification in DicomVolumeSlicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
691
diff
changeset
|
1660 |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1661 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
|
1662 if (layer.get() == NULL) |
691 | 1663 { |
783 | 1664 ClearLayer(); |
712 | 1665 } |
783 | 1666 else |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1667 { |
783 | 1668 if (configurator_.get() != NULL) |
1669 { | |
1670 lastConfiguratorRevision_ = configurator_->GetRevision(); | |
1671 configurator_->ApplyStyle(*layer); | |
1672 } | |
1673 | |
1674 scene_.SetLayer(layerDepth_, layer.release()); | |
713
e63c8b9b7b02
setting texture geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
712
diff
changeset
|
1675 } |
691 | 1676 } |
1677 } | |
1678 }; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1679 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1680 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1681 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1682 |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1683 |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1684 class NativeApplicationContext : public IMessageEmitter |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1685 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1686 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1687 boost::shared_mutex mutex_; |
745 | 1688 MessageBroker broker_; |
1689 IObservable oracleObservable_; | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1690 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1691 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1692 NativeApplicationContext() : |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1693 oracleObservable_(broker_) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1694 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1695 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1696 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1697 |
745 | 1698 virtual void EmitMessage(const IObserver& observer, |
1699 const IMessage& message) | |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1700 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1701 try |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1702 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1703 boost::unique_lock<boost::shared_mutex> lock(mutex_); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1704 oracleObservable_.EmitMessage(observer, message); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1705 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1706 catch (Orthanc::OrthancException& e) |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1707 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1708 LOG(ERROR) << "Exception while emitting a message: " << e.What(); |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1709 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1710 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1711 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1712 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1713 class ReaderLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1714 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1715 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1716 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1717 boost::shared_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1718 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1719 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1720 ReaderLock(NativeApplicationContext& that) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1721 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1722 lock_(that.mutex_) |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1723 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1724 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1725 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1726 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1727 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1728 class WriterLock : public boost::noncopyable |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1729 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1730 private: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1731 NativeApplicationContext& that_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1732 boost::unique_lock<boost::shared_mutex> lock_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1733 |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1734 public: |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1735 WriterLock(NativeApplicationContext& that) : |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1736 that_(that), |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1737 lock_(that.mutex_) |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1738 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1739 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1740 |
745 | 1741 MessageBroker& GetBroker() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1742 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1743 return that_.broker_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1744 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1745 |
745 | 1746 IObservable& GetOracleObservable() |
681
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1747 { |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1748 return that_.oracleObservable_; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1749 } |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1750 }; |
9723fceccb9f
revision counters in DicomVolumeImage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
680
diff
changeset
|
1751 }; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1752 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1753 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1754 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1755 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1756 class Toto : public OrthancStone::IObserver |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1757 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1758 private: |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1759 OrthancStone::CoordinateSystem3D plane_; |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1760 OrthancStone::IOracle& oracle_; |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1761 OrthancStone::Scene2D scene_; |
766 | 1762 std::auto_ptr<OrthancStone::VolumeSceneLayerSource> source1_, source2_; |
1763 | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1764 |
779 | 1765 void Refresh() |
1766 { | |
1767 if (source1_.get() != NULL) | |
1768 { | |
1769 source1_->Update(plane_); | |
1770 } | |
1771 | |
1772 if (source2_.get() != NULL) | |
1773 { | |
1774 source2_->Update(plane_); | |
1775 } | |
1776 | |
1777 scene_.FitContent(1024, 768); | |
1778 | |
1779 { | |
1780 OrthancStone::CairoCompositor compositor(scene_, 1024, 768); | |
1781 compositor.Refresh(); | |
1782 | |
1783 Orthanc::ImageAccessor accessor; | |
1784 compositor.GetCanvas().GetReadOnlyAccessor(accessor); | |
1785 | |
1786 Orthanc::Image tmp(Orthanc::PixelFormat_RGB24, accessor.GetWidth(), accessor.GetHeight(), false); | |
1787 Orthanc::ImageProcessing::Convert(tmp, accessor); | |
1788 | |
1789 static unsigned int count = 0; | |
1790 char buf[64]; | |
1791 sprintf(buf, "scene-%06d.png", count++); | |
1792 | |
1793 Orthanc::PngWriter writer; | |
1794 writer.WriteToFile(buf, tmp); | |
1795 } | |
1796 } | |
1797 | |
1798 | |
783 | 1799 void Handle(const OrthancStone::DicomVolumeImage::GeometryReadyMessage& message) |
766 | 1800 { |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1801 printf("Geometry ready\n"); |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1802 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1803 //plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1804 //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1805 plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1806 plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); |
779 | 1807 |
1808 Refresh(); | |
766 | 1809 } |
1810 | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1811 |
745 | 1812 void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message) |
744 | 1813 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1814 if (message.GetOrigin().HasPayload()) |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1815 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1816 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
|
1817 } |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1818 else |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1819 { |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1820 printf("TIMEOUT\n"); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1821 |
779 | 1822 Refresh(); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1823 |
765 | 1824 /** |
1825 * The sleep() leads to a crash if the oracle is still running, | |
1826 * while this object is destroyed. Always stop the oracle before | |
1827 * destroying active objects. (*) | |
1828 **/ | |
1829 // boost::this_thread::sleep(boost::posix_time::seconds(2)); | |
1830 | |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1831 oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(message.GetOrigin().GetDelay())); |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1832 } |
744 | 1833 } |
1834 | |
745 | 1835 void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1836 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1837 Json::Value v; |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1838 message.ParseJsonBody(v); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1839 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1840 printf("ICI [%s]\n", v.toStyledString().c_str()); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1841 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1842 |
745 | 1843 void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1844 { |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1845 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
|
1846 } |
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1847 |
745 | 1848 void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1849 { |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1850 printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1851 } |
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1852 |
745 | 1853 void Handle(const OrthancStone::OracleCommandExceptionMessage& message) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1854 { |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1855 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
|
1856 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1857 switch (message.GetCommand().GetType()) |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1858 { |
745 | 1859 case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg: |
1860 printf("URI: [%s]\n", dynamic_cast<const OrthancStone::GetOrthancWebViewerJpegCommand&> | |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1861 (message.GetCommand()).GetUri().c_str()); |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1862 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1863 |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1864 default: |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1865 break; |
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1866 } |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1867 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1868 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1869 public: |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1870 Toto(OrthancStone::IOracle& oracle, |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1871 OrthancStone::IObservable& oracleObservable) : |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1872 IObserver(oracleObservable.GetBroker()), |
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1873 oracle_(oracle) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1874 { |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1875 oracleObservable.RegisterObserverCallback |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1876 (new OrthancStone::Callable |
745 | 1877 <Toto, OrthancStone::SleepOracleCommand::TimeoutMessage>(*this, &Toto::Handle)); |
744 | 1878 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1879 oracleObservable.RegisterObserverCallback |
744 | 1880 (new OrthancStone::Callable |
745 | 1881 <Toto, OrthancStone::OrthancRestApiCommand::SuccessMessage>(*this, &Toto::Handle)); |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1882 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1883 oracleObservable.RegisterObserverCallback |
637
afc91cdc5128
decoding of images by oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
636
diff
changeset
|
1884 (new OrthancStone::Callable |
745 | 1885 <Toto, OrthancStone::GetOrthancImageCommand::SuccessMessage>(*this, &Toto::Handle)); |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1886 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1887 oracleObservable.RegisterObserverCallback |
639
d1f4521b9bbb
OracleCommandExceptionMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
638
diff
changeset
|
1888 (new OrthancStone::Callable |
745 | 1889 <Toto, OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage>(*this, &Toto::Handle)); |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1890 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1891 oracleObservable.RegisterObserverCallback |
642
7ca8dc7ec17b
GetOrthancWebViewerJpegCommand::ProcessHttpHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
641
diff
changeset
|
1892 (new OrthancStone::Callable |
745 | 1893 <Toto, OrthancStone::OracleCommandExceptionMessage>(*this, &Toto::Handle)); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1894 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1895 |
783 | 1896 void SetReferenceLoader(OrthancStone::IObservable& loader) |
1897 { | |
1898 loader.RegisterObserverCallback | |
1899 (new OrthancStone::Callable | |
1900 <Toto, OrthancStone::DicomVolumeImage::GeometryReadyMessage>(*this, &Toto::Handle)); | |
1901 } | |
1902 | |
766 | 1903 void SetVolume1(int depth, |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1904 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume, |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1905 OrthancStone::ILayerStyleConfigurator* style) |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1906 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1907 source1_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1908 |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1909 if (style != NULL) |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1910 { |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1911 source1_->SetConfigurator(style); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1912 } |
766 | 1913 } |
1914 | |
1915 void SetVolume2(int depth, | |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1916 const boost::shared_ptr<OrthancStone::IVolumeSlicer>& volume, |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1917 OrthancStone::ILayerStyleConfigurator* style) |
766 | 1918 { |
776
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1919 source2_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); |
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 if (style != NULL) |
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 source2_->SetConfigurator(style); |
0387485f048b
ILayerStyleConfigurator
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
769
diff
changeset
|
1924 } |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1925 } |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1926 }; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1927 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1928 |
745 | 1929 void Run(OrthancStone::NativeApplicationContext& context, |
765 | 1930 OrthancStone::ThreadedOracle& oracle) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1931 { |
783 | 1932 boost::shared_ptr<OrthancStone::DicomVolumeImage> ct(new OrthancStone::DicomVolumeImage); |
1933 boost::shared_ptr<OrthancStone::DicomVolumeImage> dose(new OrthancStone::DicomVolumeImage); | |
1934 | |
1935 | |
762
26f4345e771e
creation of OrthancMultiframeVolumeLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
760
diff
changeset
|
1936 boost::shared_ptr<Toto> toto; |
783 | 1937 boost::shared_ptr<OrthancStone::OrthancSeriesVolumeProgressiveLoader> ctLoader; |
1938 boost::shared_ptr<OrthancStone::OrthancMultiframeVolumeLoader> doseLoader; | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1939 boost::shared_ptr<OrthancStone::DicomStructureSetLoader> rtstructLoader; |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1940 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1941 { |
745 | 1942 OrthancStone::NativeApplicationContext::WriterLock lock(context); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1943 toto.reset(new Toto(oracle, lock.GetOracleObservable())); |
783 | 1944 ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); |
1945 doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1946 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
|
1947 } |
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1948 |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1949 |
783 | 1950 toto->SetReferenceLoader(*ctLoader); |
1951 | |
1952 | |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1953 #if 1 |
783 | 1954 toto->SetVolume1(0, ctLoader, new OrthancStone::GrayscaleStyleConfigurator); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1955 #else |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1956 { |
783 | 1957 boost::shared_ptr<OrthancStone::IVolumeSlicer> reslicer(new OrthancStone::VolumeImageReslicer(ct)); |
782
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1958 toto->SetVolume1(0, reslicer, new OrthancStone::GrayscaleStyleConfigurator); |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1959 } |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1960 #endif |
b24c208fa953
VolumeImageReslicer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
781
diff
changeset
|
1961 |
780 | 1962 |
1963 { | |
1964 std::auto_ptr<OrthancStone::LookupTableStyleConfigurator> config(new OrthancStone::LookupTableStyleConfigurator); | |
1965 config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); | |
783 | 1966 toto->SetVolume2(1, doseLoader, config.release()); |
780 | 1967 } |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
1968 |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
1969 //oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100)); |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
1970 |
744 | 1971 if (0) |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1972 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1973 Json::Value v = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1974 v["Level"] = "Series"; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1975 v["Query"] = Json::objectValue; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1976 |
745 | 1977 std::auto_ptr<OrthancStone::OrthancRestApiCommand> command(new OrthancStone::OrthancRestApiCommand); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1978 command->SetMethod(Orthanc::HttpMethod_Post); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1979 command->SetUri("/tools/find"); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1980 command->SetBody(v); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1981 |
623
42dadae61fa9
renamed IObservable::EmitMessage() as BroadcastMessage()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
622
diff
changeset
|
1982 oracle.Schedule(*toto, command.release()); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1983 } |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
1984 |
744 | 1985 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1986 { |
745 | 1987 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1988 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1989 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1990 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1991 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1992 |
744 | 1993 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1994 { |
745 | 1995 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1996 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1997 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1998 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
1999 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2000 |
744 | 2001 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2002 { |
745 | 2003 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2004 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2005 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2006 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2007 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2008 |
744 | 2009 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2010 { |
745 | 2011 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2012 command->SetHttpHeader("Accept-Encoding", "gzip"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2013 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2014 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2015 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2016 } |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2017 |
744 | 2018 if (0) |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2019 { |
745 | 2020 std::auto_ptr<OrthancStone::GetOrthancImageCommand> command(new OrthancStone::GetOrthancImageCommand); |
636
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2021 command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2022 command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2023 oracle.Schedule(*toto, command.release()); |
fb00a8be03e2
starting DecodeOrthancImageCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
631
diff
changeset
|
2024 } |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2025 |
744 | 2026 if (0) |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2027 { |
745 | 2028 std::auto_ptr<OrthancStone::GetOrthancWebViewerJpegCommand> command(new OrthancStone::GetOrthancWebViewerJpegCommand); |
638
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2029 command->SetHttpHeader("Accept-Encoding", "gzip"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2030 command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e"); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2031 command->SetQuality(90); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2032 oracle.Schedule(*toto, command.release()); |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2033 } |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2034 |
e626f38c5512
DecodeOrthancWebViewerJpegCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
637
diff
changeset
|
2035 |
744 | 2036 if (0) |
2037 { | |
2038 for (unsigned int i = 0; i < 10; i++) | |
2039 { | |
745 | 2040 std::auto_ptr<OrthancStone::SleepOracleCommand> command(new OrthancStone::SleepOracleCommand(i * 1000)); |
744 | 2041 command->SetPayload(new Orthanc::SingleValueObject<unsigned int>(42 * i)); |
2042 oracle.Schedule(*toto, command.release()); | |
2043 } | |
2044 } | |
2045 | |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2046 |
625
2eeb5857eb43
DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
623
diff
changeset
|
2047 // 2017-11-17-Anonymized |
784
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2048 //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2049 //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE |
9f3b2027a4a9
DicomStructureSetLoader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
783
diff
changeset
|
2050 rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2051 |
764 | 2052 // 2015-01-28-Multiframe |
783 | 2053 //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT |
764 | 2054 |
661 | 2055 // Delphine |
783 | 2056 //ctLoader->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT |
2057 //ctLoader->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm | |
661 | 2058 |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2059 |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2060 { |
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2061 LOG(WARNING) << "...Waiting for Ctrl-C..."; |
760
1181e1ad98ec
progressive loading working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
759
diff
changeset
|
2062 |
765 | 2063 oracle.Start(); |
2064 | |
2065 Orthanc::SystemToolbox::ServerBarrier(); | |
2066 | |
2067 /** | |
2068 * WARNING => The oracle must be stopped BEFORE the objects using | |
2069 * it are destroyed!!! This forces to wait for the completion of | |
2070 * the running callback methods. Otherwise, the callbacks methods | |
2071 * might still be running while their parent object is destroyed, | |
2072 * resulting in crashes. This is very visible if adding a sleep(), | |
2073 * as in (*). | |
2074 **/ | |
2075 | |
2076 oracle.Stop(); | |
2077 } | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2078 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2079 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2080 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2081 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2082 /** |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2083 * IMPORTANT: The full arguments to "main()" are needed for SDL on |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2084 * Windows. Otherwise, one gets the linking error "undefined reference |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2085 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2086 **/ |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2087 int main(int argc, char* argv[]) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2088 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2089 OrthancStone::StoneInitialize(); |
778
78fcb907caf6
VolumeGeometryReadyMessage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
776
diff
changeset
|
2090 //Orthanc::Logging::EnableInfoLevel(true); |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2091 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2092 try |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2093 { |
745 | 2094 OrthancStone::NativeApplicationContext context; |
2095 | |
2096 OrthancStone::ThreadedOracle oracle(context); | |
767 | 2097 //oracle.SetThreadsCount(1); |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2098 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2099 { |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2100 Orthanc::WebServiceParameters p; |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2101 //p.SetUrl("http://localhost:8043/"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2102 p.SetCredentials("orthanc", "orthanc"); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2103 oracle.SetOrthancParameters(p); |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2104 } |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2105 |
765 | 2106 //oracle.Start(); |
680
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2107 |
0eb26f514ac5
loading of slice images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
678
diff
changeset
|
2108 Run(context, oracle); |
765 | 2109 |
2110 //oracle.Stop(); | |
619
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2111 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2112 catch (Orthanc::OrthancException& e) |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2113 { |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2114 LOG(ERROR) << "EXCEPTION: " << e.What(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2115 } |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2116 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2117 OrthancStone::StoneFinalize(); |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2118 |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2119 return 0; |
9cd19b28f011
test: refactoring oracle
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2120 } |