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