Mercurial > hg > orthanc-stone
annotate Framework/Layers/OrthancFrameLayerSource.cpp @ 90:64e60018943f wasm
fix and observer refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 29 May 2017 11:04:18 +0200 |
parents | f244018a4e4b |
children | 5945e81734a3 |
rev | line source |
---|---|
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017 Osimis, Belgium |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 #include "OrthancFrameLayerSource.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "FrameRenderer.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #include "../../Resources/Orthanc/Core/Images/PngReader.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 #include "../../Resources/Orthanc/Core/Logging.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 #include "../../Resources/Orthanc/Core/OrthancException.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 #include "../Toolbox/DicomFrameConverter.h" |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 #include <boost/lexical_cast.hpp> |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 |
89
f244018a4e4b
BUGGY- trying to remove IVolumeSlicesObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
33 // TODO REMOVE THIS |
f244018a4e4b
BUGGY- trying to remove IVolumeSlicesObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
34 #include "../Widgets/LayerWidget.h" |
f244018a4e4b
BUGGY- trying to remove IVolumeSlicesObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
35 |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 namespace OrthancStone |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 { |
77 | 38 void OrthancFrameLayerSource::NotifyGeometryReady(const OrthancSlicesLoader& loader) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 { |
77 | 40 if (loader.GetSliceCount() > 0) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
77 | 42 // Make sure all the slices are parallel. TODO Alleviate this constraint |
43 for (size_t i = 1; i < loader.GetSliceCount(); i++) | |
44 { | |
45 if (!GeometryToolbox::IsParallel(loader.GetSlice(i).GetGeometry().GetNormal(), | |
46 loader.GetSlice(0).GetGeometry().GetNormal())) | |
47 { | |
48 LayerSourceBase::NotifyGeometryError(); | |
49 return; | |
50 } | |
51 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
53 |
85 | 54 LayerSourceBase::NotifyGeometryReady(); |
77 | 55 } |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 |
77 | 57 void OrthancFrameLayerSource::NotifyGeometryError(const OrthancSlicesLoader& loader) |
58 { | |
59 LayerSourceBase::NotifyGeometryError(); | |
60 } | |
61 | |
62 void OrthancFrameLayerSource::NotifySliceImageReady(const OrthancSlicesLoader& loader, | |
63 unsigned int sliceIndex, | |
64 const Slice& slice, | |
65 Orthanc::ImageAccessor* image) | |
66 { | |
67 LayerSourceBase::NotifyLayerReady(FrameRenderer::CreateRenderer(image, slice, true), slice); | |
68 } | |
69 | |
70 void OrthancFrameLayerSource::NotifySliceImageError(const OrthancSlicesLoader& loader, | |
71 unsigned int sliceIndex, | |
72 const Slice& slice) | |
73 { | |
74 LayerSourceBase::NotifyLayerError(slice.GetGeometry()); | |
75 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
76 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 OrthancFrameLayerSource::OrthancFrameLayerSource(IWebService& orthanc, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 const std::string& instanceId, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 unsigned int frame) : |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 instanceId_(instanceId), |
66 | 81 frame_(frame), |
89
f244018a4e4b
BUGGY- trying to remove IVolumeSlicesObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
86
diff
changeset
|
82 loader_(*this, orthanc) |
66 | 83 { |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
84 loader_.ScheduleLoadInstance(instanceId_, frame_); |
66 | 85 } |
86 | |
87 | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 bool OrthancFrameLayerSource::GetExtent(double& x1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 double& y1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 double& x2, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 double& y2, |
85 | 92 const SliceGeometry& viewportSlice) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 { |
77 | 94 bool ok = false; |
95 | |
85 | 96 if (loader_.IsGeometryReady()) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 { |
77 | 98 double tx1, ty1, tx2, ty2; |
99 | |
100 for (size_t i = 0; i < loader_.GetSliceCount(); i++) | |
101 { | |
102 if (FrameRenderer::ComputeFrameExtent(tx1, ty1, tx2, ty2, viewportSlice, loader_.GetSlice(i))) | |
103 { | |
104 if (ok) | |
105 { | |
106 x1 = std::min(x1, tx1); | |
107 y1 = std::min(y1, ty1); | |
108 x2 = std::min(x2, tx2); | |
109 y2 = std::min(y2, ty2); | |
110 } | |
111 else | |
112 { | |
113 // This is the first slice parallel to the viewport | |
114 x1 = tx1; | |
115 y1 = ty1; | |
116 x2 = tx2; | |
117 y2 = ty2; | |
118 ok = true; | |
119 } | |
120 } | |
121 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 } |
77 | 123 |
124 return ok; | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
128 void OrthancFrameLayerSource::ScheduleLayerCreation(const SliceGeometry& viewportSlice) |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 { |
77 | 130 size_t index; |
131 | |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
132 if (loader_.IsGeometryReady()) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 { |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
134 if (loader_.LookupSlice(index, viewportSlice)) |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
135 { |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
136 loader_.ScheduleLoadSliceImage(index); |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
137 } |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
138 else |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
139 { |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
140 LayerSourceBase::NotifyLayerError(viewportSlice); |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
141 } |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
142 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 } |