Mercurial > hg > orthanc-stone
annotate Framework/Radiography/RadiographyScene.h @ 488:aede9b042cb7 am-touch-events
now using ImageProcessing::FillPolygon
author | am@osimis.io |
---|---|
date | Tue, 19 Feb 2019 11:40:14 +0100 |
parents | 7bf001b9d244 |
children | 64d90190a08c |
rev | line source |
---|---|
408 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
439 | 5 * Copyright (C) 2017-2019 Osimis S.A., Belgium |
408 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
24 #include "RadiographyLayer.h" |
408 | 25 #include "../Toolbox/OrthancApiClient.h" |
432
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
26 #include "Framework/StoneEnumerations.h" |
481
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
27 #include "Core/Images/Image.h" |
488 | 28 #include "Core/Images/ImageProcessing.h" |
408 | 29 |
30 namespace OrthancStone | |
31 { | |
475
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
32 class RadiographyDicomLayer; |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
33 |
408 | 34 class RadiographyScene : |
426 | 35 public IObserver, |
36 public IObservable | |
408 | 37 { |
38 public: | |
430 | 39 class GeometryChangedMessage : |
438 | 40 public OriginMessage<MessageType_Scene_GeometryChanged, RadiographyScene> |
430 | 41 { |
42 private: | |
43 RadiographyLayer& layer_; | |
44 | |
45 public: | |
46 GeometryChangedMessage(const RadiographyScene& origin, | |
47 RadiographyLayer& layer) : | |
48 OriginMessage(origin), | |
49 layer_(layer) | |
50 { | |
51 } | |
52 | |
53 RadiographyLayer& GetLayer() const | |
54 { | |
55 return layer_; | |
56 } | |
57 }; | |
58 | |
59 class ContentChangedMessage : | |
438 | 60 public OriginMessage<MessageType_Scene_ContentChanged, RadiographyScene> |
430 | 61 { |
62 private: | |
63 RadiographyLayer& layer_; | |
64 | |
65 public: | |
66 ContentChangedMessage(const RadiographyScene& origin, | |
438 | 67 RadiographyLayer& layer) : |
430 | 68 OriginMessage(origin), |
69 layer_(layer) | |
70 { | |
71 } | |
72 | |
73 RadiographyLayer& GetLayer() const | |
74 { | |
75 return layer_; | |
76 } | |
77 }; | |
78 | |
408 | 79 |
80 class LayerAccessor : public boost::noncopyable | |
81 { | |
82 private: | |
83 RadiographyScene& scene_; | |
84 size_t index_; | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
85 RadiographyLayer* layer_; |
408 | 86 |
87 public: | |
88 LayerAccessor(RadiographyScene& scene, | |
89 size_t index); | |
90 | |
91 LayerAccessor(RadiographyScene& scene, | |
92 double x, | |
93 double y); | |
94 | |
95 void Invalidate() | |
96 { | |
97 layer_ = NULL; | |
98 } | |
99 | |
100 bool IsValid() const | |
101 { | |
102 return layer_ != NULL; | |
103 } | |
104 | |
105 RadiographyScene& GetScene() const; | |
106 | |
107 size_t GetIndex() const; | |
108 | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
109 RadiographyLayer& GetLayer() const; |
408 | 110 }; |
111 | |
112 | |
452
9a8fe40acfff
improved inheritence of RadiographyScene
Alain Mazy <alain@mazy.be>
parents:
440
diff
changeset
|
113 protected: |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
114 typedef std::map<size_t, RadiographyLayer*> Layers; |
408 | 115 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
116 size_t countLayers_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
117 bool hasWindowing_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
118 float windowingCenter_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
119 float windowingWidth_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
120 Layers layers_; |
408 | 121 |
438 | 122 protected: |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
123 RadiographyLayer& RegisterLayer(RadiographyLayer* layer); |
408 | 124 |
125 void OnTagsReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
126 | |
127 void OnFrameReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
128 | |
129 void OnDicomExported(const OrthancApiClient::JsonResponseReadyMessage& message); | |
130 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
131 void OnDicomWebReceived(const IWebService::HttpRequestSuccessMessage& message); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
132 |
408 | 133 public: |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
134 RadiographyScene(MessageBroker& broker); |
408 | 135 |
136 virtual ~RadiographyScene(); | |
137 | |
138 bool GetWindowing(float& center, | |
139 float& width) const; | |
140 | |
141 void GetWindowingWithDefault(float& center, | |
142 float& width) const; | |
143 | |
144 void SetWindowing(float center, | |
145 float width); | |
146 | |
432
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
147 PhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const; |
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
148 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
149 RadiographyLayer& LoadText(const Orthanc::Font& font, |
430 | 150 const std::string& utf8, |
151 RadiographyLayer::Geometry* geometry); | |
408 | 152 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
153 RadiographyLayer& LoadTestBlock(unsigned int width, |
430 | 154 unsigned int height, |
155 RadiographyLayer::Geometry* geometry); | |
156 | |
488 | 157 RadiographyLayer& LoadMask(const std::vector<Orthanc::ImageProcessing::ImagePoint>& corners, |
475
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
158 const RadiographyDicomLayer& dicomLayer, |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
159 float foreground, |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
160 RadiographyLayer::Geometry* geometry); |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
161 |
430 | 162 RadiographyLayer& LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, // takes ownership |
163 RadiographyLayer::Geometry* geometry); | |
164 | |
438 | 165 virtual RadiographyLayer& LoadDicomFrame(OrthancApiClient& orthanc, |
166 const std::string& instance, | |
167 unsigned int frame, | |
168 bool httpCompression, | |
169 RadiographyLayer::Geometry* geometry); // pass NULL if you want default geometry | |
408 | 170 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
171 RadiographyLayer& LoadDicomWebFrame(IWebService& web); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
172 |
425 | 173 void RemoveLayer(size_t layerIndex); |
174 | |
430 | 175 const RadiographyLayer& GetLayer(size_t layerIndex) const; |
425 | 176 |
430 | 177 void GetLayersIndexes(std::vector<size_t>& output) const; |
425 | 178 |
408 | 179 Extent2D GetSceneExtent() const; |
180 | |
181 void Render(Orthanc::ImageAccessor& buffer, | |
409 | 182 const AffineTransform2D& viewTransform, |
408 | 183 ImageInterpolation interpolation) const; |
184 | |
185 bool LookupLayer(size_t& index /* out */, | |
186 double x, | |
187 double y) const; | |
188 | |
189 void DrawBorder(CairoContext& context, | |
190 unsigned int layer, | |
191 double zoom); | |
192 | |
193 void GetRange(float& minValue, | |
194 float& maxValue) const; | |
195 | |
196 // Export using PAM is faster than using PNG, but requires Orthanc | |
197 // core >= 1.4.3 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
198 void ExportDicom(OrthancApiClient& orthanc, |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
199 const Orthanc::DicomMap& dicom, |
426 | 200 const std::string& parentOrthancId, |
408 | 201 double pixelSpacingX, |
202 double pixelSpacingY, | |
203 bool invert, | |
204 ImageInterpolation interpolation, | |
205 bool usePam); | |
426 | 206 |
483 | 207 void ExportDicom(OrthancApiClient& orthanc, |
208 const Json::Value& dicomTags, | |
209 const std::string& parentOrthancId, | |
210 double pixelSpacingX, | |
211 double pixelSpacingY, | |
212 bool invert, | |
213 ImageInterpolation interpolation, | |
214 bool usePam); | |
215 | |
484
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
216 void ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
217 const Json::Value& dicomTags, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
218 const std::string& parentOrthancId, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
219 double pixelSpacingX, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
220 double pixelSpacingY, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
221 bool invert, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
222 ImageInterpolation interpolation, |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
223 bool usePam); |
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
224 |
481
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
225 Orthanc::Image* ExportToImage(double pixelSpacingX, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
226 double pixelSpacingY, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
227 ImageInterpolation interpolation) |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
228 { |
484
7bf001b9d244
re-added ExportToCreateDicomRequest
Alain Mazy <alain@mazy.be>
parents:
483
diff
changeset
|
229 return ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false, 0); |
481
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
230 } |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
231 |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
232 Orthanc::Image* ExportToImage(double pixelSpacingX, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
233 double pixelSpacingY, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
234 ImageInterpolation interpolation, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
235 bool invert, |
159a465e27bd
reworked RadiographyScene export to export to an Orthanc::Image too
am@osimis.io
parents:
475
diff
changeset
|
236 int64_t maxValue /* for inversion */); |
408 | 237 }; |
238 } |