Mercurial > hg > orthanc-stone
annotate Framework/Radiography/RadiographyScene.h @ 475:3c28542229a3 am-touch-events
added a mask layer in the RadiographyWidget (to be cleaned)
author | am@osimis.io |
---|---|
date | Tue, 12 Feb 2019 12:22:13 +0100 |
parents | 9a8fe40acfff |
children | 159a465e27bd |
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" |
408 | 27 |
28 namespace OrthancStone | |
29 { | |
475
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
30 struct MaskPoint; |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
31 class RadiographyDicomLayer; |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
32 |
408 | 33 class RadiographyScene : |
426 | 34 public IObserver, |
35 public IObservable | |
408 | 36 { |
37 public: | |
430 | 38 class GeometryChangedMessage : |
438 | 39 public OriginMessage<MessageType_Scene_GeometryChanged, RadiographyScene> |
430 | 40 { |
41 private: | |
42 RadiographyLayer& layer_; | |
43 | |
44 public: | |
45 GeometryChangedMessage(const RadiographyScene& origin, | |
46 RadiographyLayer& layer) : | |
47 OriginMessage(origin), | |
48 layer_(layer) | |
49 { | |
50 } | |
51 | |
52 RadiographyLayer& GetLayer() const | |
53 { | |
54 return layer_; | |
55 } | |
56 }; | |
57 | |
58 class ContentChangedMessage : | |
438 | 59 public OriginMessage<MessageType_Scene_ContentChanged, RadiographyScene> |
430 | 60 { |
61 private: | |
62 RadiographyLayer& layer_; | |
63 | |
64 public: | |
65 ContentChangedMessage(const RadiographyScene& origin, | |
438 | 66 RadiographyLayer& layer) : |
430 | 67 OriginMessage(origin), |
68 layer_(layer) | |
69 { | |
70 } | |
71 | |
72 RadiographyLayer& GetLayer() const | |
73 { | |
74 return layer_; | |
75 } | |
76 }; | |
77 | |
408 | 78 |
79 class LayerAccessor : public boost::noncopyable | |
80 { | |
81 private: | |
82 RadiographyScene& scene_; | |
83 size_t index_; | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
84 RadiographyLayer* layer_; |
408 | 85 |
86 public: | |
87 LayerAccessor(RadiographyScene& scene, | |
88 size_t index); | |
89 | |
90 LayerAccessor(RadiographyScene& scene, | |
91 double x, | |
92 double y); | |
93 | |
94 void Invalidate() | |
95 { | |
96 layer_ = NULL; | |
97 } | |
98 | |
99 bool IsValid() const | |
100 { | |
101 return layer_ != NULL; | |
102 } | |
103 | |
104 RadiographyScene& GetScene() const; | |
105 | |
106 size_t GetIndex() const; | |
107 | |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
108 RadiographyLayer& GetLayer() const; |
408 | 109 }; |
110 | |
111 | |
452
9a8fe40acfff
improved inheritence of RadiographyScene
Alain Mazy <alain@mazy.be>
parents:
440
diff
changeset
|
112 protected: |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
113 typedef std::map<size_t, RadiographyLayer*> Layers; |
408 | 114 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
115 size_t countLayers_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
116 bool hasWindowing_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
117 float windowingCenter_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
118 float windowingWidth_; |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
119 Layers layers_; |
408 | 120 |
438 | 121 protected: |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
122 RadiographyLayer& RegisterLayer(RadiographyLayer* layer); |
408 | 123 |
124 void OnTagsReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
125 | |
126 void OnFrameReceived(const OrthancApiClient::BinaryResponseReadyMessage& message); | |
127 | |
128 void OnDicomExported(const OrthancApiClient::JsonResponseReadyMessage& message); | |
129 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
130 void OnDicomWebReceived(const IWebService::HttpRequestSuccessMessage& message); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
131 |
408 | 132 public: |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
133 RadiographyScene(MessageBroker& broker); |
408 | 134 |
135 virtual ~RadiographyScene(); | |
136 | |
137 bool GetWindowing(float& center, | |
138 float& width) const; | |
139 | |
140 void GetWindowingWithDefault(float& center, | |
141 float& width) const; | |
142 | |
143 void SetWindowing(float center, | |
144 float width); | |
145 | |
432
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
146 PhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const; |
4eb96c6b4e96
improved handling of MONOCHROME1, background and invertion
am@osimis.io
parents:
430
diff
changeset
|
147 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
148 RadiographyLayer& LoadText(const Orthanc::Font& font, |
430 | 149 const std::string& utf8, |
150 RadiographyLayer::Geometry* geometry); | |
408 | 151 |
410
6decc0ba9da5
rename RadiographyScene::Layer as RadiographyLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
409
diff
changeset
|
152 RadiographyLayer& LoadTestBlock(unsigned int width, |
430 | 153 unsigned int height, |
154 RadiographyLayer::Geometry* geometry); | |
155 | |
475
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
156 RadiographyLayer& LoadMask(const std::vector<MaskPoint>& corners, |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
157 const RadiographyDicomLayer& dicomLayer, |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
158 float foreground, |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
159 RadiographyLayer::Geometry* geometry); |
3c28542229a3
added a mask layer in the RadiographyWidget (to be cleaned)
am@osimis.io
parents:
452
diff
changeset
|
160 |
430 | 161 RadiographyLayer& LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, // takes ownership |
162 RadiographyLayer::Geometry* geometry); | |
163 | |
438 | 164 virtual RadiographyLayer& LoadDicomFrame(OrthancApiClient& orthanc, |
165 const std::string& instance, | |
166 unsigned int frame, | |
167 bool httpCompression, | |
168 RadiographyLayer::Geometry* geometry); // pass NULL if you want default geometry | |
408 | 169 |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
170 RadiographyLayer& LoadDicomWebFrame(IWebService& web); |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
171 |
425 | 172 void RemoveLayer(size_t layerIndex); |
173 | |
430 | 174 const RadiographyLayer& GetLayer(size_t layerIndex) const; |
425 | 175 |
430 | 176 void GetLayersIndexes(std::vector<size_t>& output) const; |
425 | 177 |
408 | 178 Extent2D GetSceneExtent() const; |
179 | |
180 void Render(Orthanc::ImageAccessor& buffer, | |
409 | 181 const AffineTransform2D& viewTransform, |
408 | 182 ImageInterpolation interpolation) const; |
183 | |
184 bool LookupLayer(size_t& index /* out */, | |
185 double x, | |
186 double y) const; | |
187 | |
188 void DrawBorder(CairoContext& context, | |
189 unsigned int layer, | |
190 double zoom); | |
191 | |
192 void GetRange(float& minValue, | |
193 float& maxValue) const; | |
194 | |
195 // Export using PAM is faster than using PNG, but requires Orthanc | |
196 // core >= 1.4.3 | |
417
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
197 void ExportDicom(OrthancApiClient& orthanc, |
aee3d7941c9b
preparing to load images using DICOMweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
410
diff
changeset
|
198 const Orthanc::DicomMap& dicom, |
426 | 199 const std::string& parentOrthancId, |
408 | 200 double pixelSpacingX, |
201 double pixelSpacingY, | |
202 bool invert, | |
203 ImageInterpolation interpolation, | |
204 bool usePam); | |
426 | 205 |
206 // temporary version used by VSOL because we need to send the same request at another url | |
427 | 207 void ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, |
438 | 208 const Orthanc::DicomMap& dicom, |
209 double pixelSpacingX, | |
210 double pixelSpacingY, | |
211 bool invert, | |
212 ImageInterpolation interpolation, | |
213 bool usePam); | |
408 | 214 }; |
215 } |