comparison OrthancServer/Sources/ServerJobs/SplitStudyJob.cpp @ 4712:bad8935cd5f2

"/studies/{id}/split" accepts "Instances" parameter to split instances instead of series
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 23 Jun 2021 14:33:20 +0200
parents 8f9090b137f1
children 783f8a048035 94616af363ec
comparison
equal deleted inserted replaced
4707:81ad9d8a0fa6 4712:bad8935cd5f2
190 { 190 {
191 SetOrigin(DicomInstanceOrigin::FromRest(call)); 191 SetOrigin(DicomInstanceOrigin::FromRest(call));
192 } 192 }
193 193
194 194
195 static void RegisterSeries(std::map<std::string, std::string>& target,
196 const std::string& series)
197 {
198 // Generate a target SeriesInstanceUID for this series
199 if (target.find(series) == target.end())
200 {
201 target[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
202 }
203 }
204
205
195 void SplitStudyJob::AddSourceSeries(const std::string& series) 206 void SplitStudyJob::AddSourceSeries(const std::string& series)
196 { 207 {
197 std::string parent; 208 std::string parent;
198 209
199 if (IsStarted()) 210 if (IsStarted())
206 throw OrthancException(ErrorCode_UnknownResource, 217 throw OrthancException(ErrorCode_UnknownResource,
207 "This series does not belong to the study to be split: " + series); 218 "This series does not belong to the study to be split: " + series);
208 } 219 }
209 else 220 else
210 { 221 {
211 // Generate a target SeriesInstanceUID for this series 222 RegisterSeries(seriesUidMap_, series);
212 seriesUidMap_[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
213 223
214 // Add all the instances of the series as to be processed 224 // Add all the instances of the series as to be processed
215 std::list<std::string> instances; 225 std::list<std::string> instances;
216 GetContext().GetIndex().GetChildren(instances, series); 226 GetContext().GetIndex().GetChildren(instances, series);
217 227
218 for (std::list<std::string>::const_iterator 228 for (std::list<std::string>::const_iterator
219 it = instances.begin(); it != instances.end(); ++it) 229 it = instances.begin(); it != instances.end(); ++it)
220 { 230 {
221 AddInstance(*it); 231 AddInstance(*it);
222 } 232 }
233 }
234 }
235
236
237 void SplitStudyJob::AddSourceInstance(const std::string& instance)
238 {
239 std::string study, series;
240
241 if (IsStarted())
242 {
243 throw OrthancException(ErrorCode_BadSequenceOfCalls);
244 }
245 else if (!GetContext().GetIndex().LookupParent(series, instance, ResourceType_Series) ||
246 !GetContext().GetIndex().LookupParent(study, series, ResourceType_Study) ||
247 study != sourceStudy_)
248 {
249 throw OrthancException(ErrorCode_UnknownResource,
250 "This instance does not belong to the study to be split: " + instance);
251 }
252 else
253 {
254 RegisterSeries(seriesUidMap_, series);
255 AddInstance(instance);
223 } 256 }
224 } 257 }
225 258
226 259
227 bool SplitStudyJob::LookupTargetSeriesUid(std::string& uid, 260 bool SplitStudyJob::LookupTargetSeriesUid(std::string& uid,