Mercurial > hg > orthanc-stone
annotate Framework/Layers/OrthancFrameLayerSource.cpp @ 77:f5f54ed8d307 wasm
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 24 May 2017 21:13:29 +0200 |
parents | 298f375dcb68 |
children | bd48431ac285 |
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 |
77 | 51 if (observer2_ != NULL) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 { |
77 | 53 ParallelSlices slices; |
54 | |
55 for (size_t i = 0; i < loader.GetSliceCount(); i++) | |
56 { | |
57 slices.AddSlice(loader.GetSlice(i).GetGeometry()); | |
58 } | |
59 | |
60 observer2_->NotifySlicesAvailable(slices); | |
61 } | |
62 | |
63 LayerSourceBase::NotifyGeometryReady(); | |
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 { | |
94 } | |
95 | |
96 | |
97 void OrthancFrameLayerSource::StartInternal() | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 { |
77 | 99 loader_.ScheduleLoadInstance(instanceId_, frame_); |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 } |
66 | 101 |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 |
66 | 103 void OrthancFrameLayerSource::SetObserver(IVolumeSlicesObserver& observer) |
104 { | |
105 if (IsStarted()) | |
106 { | |
107 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
108 } | |
109 | |
110 if (observer2_ == NULL) | |
111 { | |
112 observer2_ = &observer; | |
113 } | |
114 else | |
115 { | |
116 // Cannot add more than one observer | |
117 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
118 } | |
119 } | |
120 | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 bool OrthancFrameLayerSource::GetExtent(double& x1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
123 double& y1, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
124 double& x2, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
125 double& y2, |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
126 const SliceGeometry& viewportSlice /* ignored */) |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 { |
77 | 128 bool ok = false; |
129 | |
130 if (IsStarted() && | |
131 loader_.IsGeometryReady()) | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 { |
77 | 133 double tx1, ty1, tx2, ty2; |
134 | |
135 for (size_t i = 0; i < loader_.GetSliceCount(); i++) | |
136 { | |
137 if (FrameRenderer::ComputeFrameExtent(tx1, ty1, tx2, ty2, viewportSlice, loader_.GetSlice(i))) | |
138 { | |
139 if (ok) | |
140 { | |
141 x1 = std::min(x1, tx1); | |
142 y1 = std::min(y1, ty1); | |
143 x2 = std::min(x2, tx2); | |
144 y2 = std::min(y2, ty2); | |
145 } | |
146 else | |
147 { | |
148 // This is the first slice parallel to the viewport | |
149 x1 = tx1; | |
150 y1 = ty1; | |
151 x2 = tx2; | |
152 y2 = ty2; | |
153 ok = true; | |
154 } | |
155 } | |
156 } | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
157 } |
77 | 158 |
159 return ok; | |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
160 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
161 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
162 |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
163 void OrthancFrameLayerSource::ScheduleLayerCreation(const SliceGeometry& viewportSlice) |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
164 { |
77 | 165 size_t index; |
166 | |
167 if (!IsStarted() || | |
168 !loader_.IsGeometryReady()) | |
66 | 169 { |
170 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
171 } | |
77 | 172 else if (loader_.LookupSlice(index, viewportSlice)) |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
173 { |
77 | 174 loader_.ScheduleLoadSliceImage(index); |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
175 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
176 else |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
177 { |
77 | 178 LayerSourceBase::NotifyLayerError(viewportSlice); |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
179 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
180 } |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
181 } |