Mercurial > hg > orthanc-stone
annotate Framework/Loaders/DicomStructureSetLoader.cpp @ 977:262a0244e9b2 toa2019090201
Added missing Unregister for objects that register by the broker + logs + guard in FetchContext
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Mon, 02 Sep 2019 17:29:26 +0200 |
parents | 48710d53086f |
children | c20dbaab360c |
rev | line source |
---|---|
815 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
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 #include "DicomStructureSetLoader.h" | |
23 | |
24 #include "../Scene2D/PolylineSceneLayer.h" | |
25 #include "../Toolbox/GeometryToolbox.h" | |
26 | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
27 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
28 bool logbgo233 = false; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
29 bool logbgo115 = false; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
30 #endif |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
31 |
815 | 32 namespace OrthancStone |
33 { | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
34 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
35 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
36 void DumpDicomMap(std::ostream& o, const Orthanc::DicomMap& dicomMap) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
37 { |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
38 using namespace std; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
39 //ios_base::fmtflags state = o.flags(); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
40 //o.flags(ios::right | ios::hex); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
41 //o << "(" << setfill('0') << setw(4) << tag.GetGroup() |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
42 // << "," << setw(4) << tag.GetElement() << ")"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
43 //o.flags(state); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
44 Json::Value val; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
45 dicomMap.Serialize(val); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
46 o << val; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
47 //return o; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
48 } |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
49 #endif |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
50 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
51 |
815 | 52 class DicomStructureSetLoader::AddReferencedInstance : public LoaderStateMachine::State |
53 { | |
54 private: | |
55 std::string instanceId_; | |
56 | |
57 public: | |
58 AddReferencedInstance(DicomStructureSetLoader& that, | |
59 const std::string& instanceId) : | |
60 State(that), | |
61 instanceId_(instanceId) | |
62 { | |
63 } | |
64 | |
65 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
66 { | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
67 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
68 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
69 LOG(TRACE) << "DicomStructureSetLoader::AddReferencedInstance::Handle() (SUCCESS)"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
70 #endif |
815 | 71 Json::Value tags; |
72 message.ParseJsonBody(tags); | |
73 | |
74 Orthanc::DicomMap dicom; | |
75 dicom.FromDicomAsJson(tags); | |
76 | |
77 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
78 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
79 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
80 { |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
81 std::stringstream ss; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
82 //DumpDicomMap(ss, dicom); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
83 std::string dicomMapStr = ss.str(); |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
84 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
85 LOG(TRACE) << " DicomStructureSetLoader::AddReferencedInstance::Handle() about to call AddReferencedSlice on dicom = " << dicomMapStr; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
86 } |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
87 #endif |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
88 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
89 |
815 | 90 loader.content_->AddReferencedSlice(dicom); |
91 | |
92 loader.countProcessedInstances_ ++; | |
93 assert(loader.countProcessedInstances_ <= loader.countReferencedInstances_); | |
94 | |
95 if (loader.countProcessedInstances_ == loader.countReferencedInstances_) | |
96 { | |
97 // All the referenced instances have been loaded, finalize the RT-STRUCT | |
98 loader.content_->CheckReferencedSlices(); | |
99 loader.revision_++; | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
100 loader.SetStructuresReady(); |
815 | 101 } |
102 } | |
103 }; | |
104 | |
105 | |
106 // State that converts a "SOP Instance UID" to an Orthanc identifier | |
107 class DicomStructureSetLoader::LookupInstance : public LoaderStateMachine::State | |
108 { | |
109 private: | |
110 std::string sopInstanceUid_; | |
111 | |
112 public: | |
113 LookupInstance(DicomStructureSetLoader& that, | |
114 const std::string& sopInstanceUid) : | |
115 State(that), | |
116 sopInstanceUid_(sopInstanceUid) | |
117 { | |
118 } | |
119 | |
120 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) | |
121 { | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
122 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
123 LOG(TRACE) << "DicomStructureSetLoader::LookupInstance::Handle() (SUCCESS)"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
124 #endif |
815 | 125 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); |
126 | |
127 Json::Value lookup; | |
128 message.ParseJsonBody(lookup); | |
129 | |
130 if (lookup.type() != Json::arrayValue || | |
131 lookup.size() != 1 || | |
132 !lookup[0].isMember("Type") || | |
133 !lookup[0].isMember("Path") || | |
134 lookup[0]["Type"].type() != Json::stringValue || | |
135 lookup[0]["ID"].type() != Json::stringValue || | |
136 lookup[0]["Type"].asString() != "Instance") | |
137 { | |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
138 std::stringstream msg; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
139 msg << "Unknown resource! message.GetAnswer() = " << message.GetAnswer() << " message.GetAnswerHeaders() = "; |
842
2b245953b44b
removed some c++11 for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
841
diff
changeset
|
140 for (OrthancRestApiCommand::HttpHeaders::const_iterator it = message.GetAnswerHeaders().begin(); |
2b245953b44b
removed some c++11 for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
841
diff
changeset
|
141 it != message.GetAnswerHeaders().end(); ++it) |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
142 { |
842
2b245953b44b
removed some c++11 for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
841
diff
changeset
|
143 msg << "\nkey: \"" << it->first << "\" value: \"" << it->second << "\"\n"; |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
144 } |
842
2b245953b44b
removed some c++11 for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
841
diff
changeset
|
145 const std::string msgStr = msg.str(); |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
146 LOG(ERROR) << msgStr; |
815 | 147 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); |
148 } | |
149 | |
150 const std::string instanceId = lookup[0]["ID"].asString(); | |
151 | |
152 { | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
153 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
154 if(logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
155 LOG(TRACE) << "DicomStructureSetLoader::LookupInstance::Handle() (SUCCESS)"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
156 #endif |
815 | 157 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); |
158 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
159 std::string uri = "/instances/" + instanceId + "/tags"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
160 command->SetUri(uri); |
815 | 161 command->SetPayload(new AddReferencedInstance(loader, instanceId)); |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
162 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
163 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
164 LOG(TRACE) << " DicomStructureSetLoader::LookupInstance::Handle() about to schedule request with AddReferencedInstance subsequent command on uri \"" << uri << "\""; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
165 #endif |
815 | 166 Schedule(command.release()); |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
167 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
168 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
169 LOG(TRACE) << " DicomStructureSetLoader::LookupInstance::Handle() request+command scheduled"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
170 #endif |
815 | 171 } |
172 } | |
173 }; | |
174 | |
175 | |
176 class DicomStructureSetLoader::LoadStructure : public LoaderStateMachine::State | |
177 { | |
178 public: | |
179 LoadStructure(DicomStructureSetLoader& that) : | |
180 State(that) | |
181 { | |
182 } | |
183 | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
184 |
815 | 185 virtual void Handle(const OrthancRestApiCommand::SuccessMessage& message) |
186 { | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
187 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
188 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
189 LOG(TRACE) << "DicomStructureSetLoader::LoadStructure::Handle() (SUCCESS)"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
190 #endif |
815 | 191 DicomStructureSetLoader& loader = GetLoader<DicomStructureSetLoader>(); |
192 | |
193 { | |
194 OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer()); | |
195 loader.content_.reset(new DicomStructureSet(dicom)); | |
196 } | |
197 | |
198 std::set<std::string> instances; | |
199 loader.content_->GetReferencedInstances(instances); | |
200 | |
828 | 201 loader.countReferencedInstances_ = static_cast<unsigned int>(instances.size()); |
815 | 202 |
203 for (std::set<std::string>::const_iterator | |
204 it = instances.begin(); it != instances.end(); ++it) | |
205 { | |
206 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
207 command->SetUri("/tools/lookup"); | |
208 command->SetMethod(Orthanc::HttpMethod_Post); | |
209 command->SetBody(*it); | |
969
48710d53086f
Removed Cache-Control header from POST request
Benjamin Golinvaux <bgo@osimis.io>
parents:
967
diff
changeset
|
210 |
48710d53086f
Removed Cache-Control header from POST request
Benjamin Golinvaux <bgo@osimis.io>
parents:
967
diff
changeset
|
211 // The following headers have been commented out because |
48710d53086f
Removed Cache-Control header from POST request
Benjamin Golinvaux <bgo@osimis.io>
parents:
967
diff
changeset
|
212 // they were causing issues in the reverse proxy in a dev scenario. |
48710d53086f
Removed Cache-Control header from POST request
Benjamin Golinvaux <bgo@osimis.io>
parents:
967
diff
changeset
|
213 // They should NOT be required for POST requests |
967
e3234630df9c
Removed pragma-no-cache header that seems to be useless (and even nefarious)
Benjamin Golinvaux <bgo@osimis.io>
parents:
964
diff
changeset
|
214 //command->SetHttpHeader("pragma", "no-cache"); |
969
48710d53086f
Removed Cache-Control header from POST request
Benjamin Golinvaux <bgo@osimis.io>
parents:
967
diff
changeset
|
215 //command->SetHttpHeader("cache-control", "no-cache"); |
977
262a0244e9b2
Added missing Unregister for objects that register by the broker + logs + guard in FetchContext
Benjamin Golinvaux <bgo@osimis.io>
parents:
969
diff
changeset
|
216 |
815 | 217 command->SetPayload(new LookupInstance(loader, *it)); |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
828
diff
changeset
|
218 //LOG(TRACE) << "About to schedule a /tools/lookup POST request. URI = " << command->GetUri() << " Body size = " << (*it).size() << " Body = " << (*it) << "\n"; |
815 | 219 Schedule(command.release()); |
220 } | |
221 } | |
222 }; | |
223 | |
224 | |
225 class DicomStructureSetLoader::Slice : public IExtractedSlice | |
226 { | |
227 private: | |
228 const DicomStructureSet& content_; | |
229 uint64_t revision_; | |
230 bool isValid_; | |
231 | |
232 public: | |
233 Slice(const DicomStructureSet& content, | |
234 uint64_t revision, | |
235 const CoordinateSystem3D& cuttingPlane) : | |
236 content_(content), | |
237 revision_(revision) | |
238 { | |
239 bool opposite; | |
240 | |
241 const Vector normal = content.GetNormal(); | |
242 isValid_ = ( | |
243 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || | |
244 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || | |
245 GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); | |
246 } | |
247 | |
248 virtual bool IsValid() | |
249 { | |
250 return isValid_; | |
251 } | |
252 | |
253 virtual uint64_t GetRevision() | |
254 { | |
255 return revision_; | |
256 } | |
257 | |
258 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, | |
259 const CoordinateSystem3D& cuttingPlane) | |
260 { | |
261 assert(isValid_); | |
262 | |
263 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); | |
264 layer->SetThickness(2); | |
265 | |
266 for (size_t i = 0; i < content_.GetStructuresCount(); i++) | |
267 { | |
268 const Color& color = content_.GetStructureColor(i); | |
269 | |
270 std::vector< std::vector<DicomStructureSet::PolygonPoint> > polygons; | |
271 | |
272 if (content_.ProjectStructure(polygons, i, cuttingPlane)) | |
273 { | |
274 for (size_t j = 0; j < polygons.size(); j++) | |
275 { | |
276 PolylineSceneLayer::Chain chain; | |
277 chain.resize(polygons[j].size()); | |
278 | |
279 for (size_t k = 0; k < polygons[j].size(); k++) | |
280 { | |
281 chain[k] = ScenePoint2D(polygons[j][k].first, polygons[j][k].second); | |
282 } | |
283 | |
284 layer->AddChain(chain, true /* closed */, color); | |
285 } | |
286 } | |
287 } | |
288 | |
289 return layer.release(); | |
290 } | |
291 }; | |
292 | |
293 | |
294 DicomStructureSetLoader::DicomStructureSetLoader(IOracle& oracle, | |
295 IObservable& oracleObservable) : | |
954 | 296 LoaderStateMachine(oracle, oracleObservable), |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
297 IObservable(oracleObservable.GetBroker()), |
815 | 298 revision_(0), |
299 countProcessedInstances_(0), | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
300 countReferencedInstances_(0), |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
301 structuresReady_(false) |
815 | 302 { |
303 } | |
304 | |
305 | |
935
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
842
diff
changeset
|
306 DicomStructureSetLoader::~DicomStructureSetLoader() |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
842
diff
changeset
|
307 { |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
842
diff
changeset
|
308 LOG(TRACE) << "DicomStructureSetLoader::~DicomStructureSetLoader()"; |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
842
diff
changeset
|
309 } |
401808e7ff2e
Added traces in LoaderCache objects dtors + fuse to prevent dead weak ptrs to be calleds in VisitWdigets (in GuiAdapter.h)
Benjamin Golinvaux <bgo@osimis.io>
parents:
842
diff
changeset
|
310 |
815 | 311 void DicomStructureSetLoader::LoadInstance(const std::string& instanceId) |
312 { | |
313 Start(); | |
314 | |
315 instanceId_ = instanceId; | |
316 | |
317 { | |
318 std::auto_ptr<OrthancRestApiCommand> command(new OrthancRestApiCommand); | |
319 command->SetHttpHeader("Accept-Encoding", "gzip"); | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
320 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
321 std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
322 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
323 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
324 LOG(TRACE) << "DicomStructureSetLoader::LoadInstance() instanceId = " << instanceId << " | uri = \"" << uri << "\""; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
325 #endif |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
326 command->SetUri(uri); |
815 | 327 command->SetPayload(new LoadStructure(*this)); |
328 Schedule(command.release()); | |
964
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
329 #if 0 |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
330 if (logbgo115) |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
331 LOG(TRACE) << "DicomStructureSetLoader::LoadInstance() command (with LoadStructure) scheduled."; |
91f827272c1f
Added cache-control headers for POST requests + #ifdef'd tracing logs + trace on context restored
Benjamin Golinvaux <bgo@osimis.io>
parents:
954
diff
changeset
|
332 #endif |
815 | 333 } |
334 } | |
335 | |
336 | |
337 IVolumeSlicer::IExtractedSlice* DicomStructureSetLoader::ExtractSlice(const CoordinateSystem3D& cuttingPlane) | |
338 { | |
339 if (content_.get() == NULL) | |
340 { | |
341 // Geometry is not available yet | |
342 return new IVolumeSlicer::InvalidSlice; | |
343 } | |
344 else | |
345 { | |
346 return new Slice(*content_, revision_, cuttingPlane); | |
347 } | |
348 } | |
937
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
349 |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
350 void DicomStructureSetLoader::SetStructuresReady() |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
351 { |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
352 ORTHANC_ASSERT(!structuresReady_); |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
353 structuresReady_ = true; |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
354 BroadcastMessage(DicomStructureSetLoader::StructuresReady(*this)); |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
355 } |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
356 |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
357 bool DicomStructureSetLoader::AreStructuresReady() const |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
358 { |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
359 return structuresReady_; |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
360 } |
86ac61a040c9
Added getters and notifications to allow clients of the loaders (DicomStructureSetLoader, OrthancSeriesVolumeProgressiveLoader and OrthancMultiframeVolumeLoader) to know when the loading is finished + added ability for SDL event loop to execute a callback repeatedly (used to check the view loading state)
Benjamin Golinvaux <bgo@osimis.io>
parents:
935
diff
changeset
|
361 |
815 | 362 } |