Mercurial > hg > orthanc-stone
annotate Framework/Layers/OrthancFrameLayerSource.cpp @ 86:02c3a7a4938f wasm
removing of the Start() mechanism
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 26 May 2017 13:42:50 +0200 |
parents | bd48431ac285 |
children | f244018a4e4b |
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 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 namespace OrthancStone |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 { |
77 | 35 void OrthancFrameLayerSource::NotifyGeometryReady(const OrthancSlicesLoader& loader) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 { |
77 | 37 if (loader.GetSliceCount() > 0) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 { |
77 | 39 // Make sure all the slices are parallel. TODO Alleviate this constraint |
40 for (size_t i = 1; i < loader.GetSliceCount(); i++) | |
41 { | |
42 if (!GeometryToolbox::IsParallel(loader.GetSlice(i).GetGeometry().GetNormal(), | |
43 loader.GetSlice(0).GetGeometry().GetNormal())) | |
44 { | |
45 LayerSourceBase::NotifyGeometryError(); | |
46 return; | |
47 } | |
48 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 |
85 | 51 LayerSourceBase::NotifyGeometryReady(); |
52 | |
77 | 53 if (observer2_ != NULL) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
54 { |
77 | 55 ParallelSlices slices; |
56 | |
57 for (size_t i = 0; i < loader.GetSliceCount(); i++) | |
58 { | |
59 slices.AddSlice(loader.GetSlice(i).GetGeometry()); | |
60 } | |
61 | |
62 observer2_->NotifySlicesAvailable(slices); | |
63 } | |
64 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 |
77 | 66 void OrthancFrameLayerSource::NotifyGeometryError(const OrthancSlicesLoader& loader) |
67 { | |
68 LayerSourceBase::NotifyGeometryError(); | |
69 } | |
70 | |
71 void OrthancFrameLayerSource::NotifySliceImageReady(const OrthancSlicesLoader& loader, | |
72 unsigned int sliceIndex, | |
73 const Slice& slice, | |
74 Orthanc::ImageAccessor* image) | |
75 { | |
76 LayerSourceBase::NotifyLayerReady(FrameRenderer::CreateRenderer(image, slice, true), slice); | |
77 } | |
78 | |
79 void OrthancFrameLayerSource::NotifySliceImageError(const OrthancSlicesLoader& loader, | |
80 unsigned int sliceIndex, | |
81 const Slice& slice) | |
82 { | |
83 LayerSourceBase::NotifyLayerError(slice.GetGeometry()); | |
84 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 OrthancFrameLayerSource::OrthancFrameLayerSource(IWebService& orthanc, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 const std::string& instanceId, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 unsigned int frame) : |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 instanceId_(instanceId), |
66 | 90 frame_(frame), |
77 | 91 loader_(*this, orthanc), |
66 | 92 observer2_(NULL) |
93 { | |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
94 loader_.ScheduleLoadInstance(instanceId_, frame_); |
66 | 95 } |
96 | |
97 | |
98 void OrthancFrameLayerSource::SetObserver(IVolumeSlicesObserver& observer) | |
99 { | |
100 if (observer2_ == NULL) | |
101 { | |
102 observer2_ = &observer; | |
103 } | |
104 else | |
105 { | |
106 // Cannot add more than one observer | |
107 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
108 } | |
109 } | |
110 | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 bool OrthancFrameLayerSource::GetExtent(double& x1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 double& y1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
114 double& x2, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 double& y2, |
85 | 116 const SliceGeometry& viewportSlice) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 { |
77 | 118 bool ok = false; |
119 | |
85 | 120 if (loader_.IsGeometryReady()) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 { |
77 | 122 double tx1, ty1, tx2, ty2; |
123 | |
124 for (size_t i = 0; i < loader_.GetSliceCount(); i++) | |
125 { | |
126 if (FrameRenderer::ComputeFrameExtent(tx1, ty1, tx2, ty2, viewportSlice, loader_.GetSlice(i))) | |
127 { | |
128 if (ok) | |
129 { | |
130 x1 = std::min(x1, tx1); | |
131 y1 = std::min(y1, ty1); | |
132 x2 = std::min(x2, tx2); | |
133 y2 = std::min(y2, ty2); | |
134 } | |
135 else | |
136 { | |
137 // This is the first slice parallel to the viewport | |
138 x1 = tx1; | |
139 y1 = ty1; | |
140 x2 = tx2; | |
141 y2 = ty2; | |
142 ok = true; | |
143 } | |
144 } | |
145 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
146 } |
77 | 147 |
148 return ok; | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
150 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
151 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
152 void OrthancFrameLayerSource::ScheduleLayerCreation(const SliceGeometry& viewportSlice) |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
153 { |
77 | 154 size_t index; |
155 | |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
156 if (loader_.IsGeometryReady()) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 { |
86
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
158 if (loader_.LookupSlice(index, viewportSlice)) |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
159 { |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
160 loader_.ScheduleLoadSliceImage(index); |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
161 } |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
162 else |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
163 { |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
164 LayerSourceBase::NotifyLayerError(viewportSlice); |
02c3a7a4938f
removing of the Start() mechanism
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
85
diff
changeset
|
165 } |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
166 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
167 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
168 } |