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