Mercurial > hg > orthanc-wsi
comparison Applications/Dicomizer.cpp @ 83:0cb3ac4f9159
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 15 Dec 2016 11:51:58 +0100 |
parents | 7a3853d51c45 |
children | 727670c5c125 |
comparison
equal
deleted
inserted
replaced
82:5b127ab0080b | 83:0cb3ac4f9159 |
---|---|
258 static void SetupDimension(DcmDataset& dataset, | 258 static void SetupDimension(DcmDataset& dataset, |
259 const std::string& opticalPathId, | 259 const std::string& opticalPathId, |
260 const OrthancWSI::ITiledPyramid& source, | 260 const OrthancWSI::ITiledPyramid& source, |
261 const OrthancWSI::ImagedVolumeParameters& volume) | 261 const OrthancWSI::ImagedVolumeParameters& volume) |
262 { | 262 { |
263 std::string uid; | 263 // Extract the identifier of the Dimension Organization, if provided |
264 std::string organization; | |
264 DcmItem* previous = OrthancWSI::DicomToolbox::ExtractSingleSequenceItem(dataset, DCM_DimensionOrganizationSequence); | 265 DcmItem* previous = OrthancWSI::DicomToolbox::ExtractSingleSequenceItem(dataset, DCM_DimensionOrganizationSequence); |
265 | 266 |
266 if (previous != NULL) | 267 if (previous != NULL && |
267 { | 268 previous->tagExists(DCM_DimensionOrganizationUID)) |
268 const char* tmp = NULL; | 269 { |
269 if (previous->findAndGetString(DCM_DimensionOrganizationUID, tmp).good() && | 270 organization = OrthancWSI::DicomToolbox::GetStringTag(*previous, DCM_DimensionOrganizationUID); |
270 tmp != NULL) | 271 } |
271 { | 272 else |
272 uid.assign(tmp); | 273 { |
273 } | 274 // No Dimension Organization provided: Generate an unique identifier |
274 } | 275 organization = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance); |
275 | 276 } |
276 if (uid.empty()) | 277 |
277 { | 278 |
278 // Generate an unique identifier for the Dimension Organization | 279 { |
279 uid = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance); | 280 // Construct tag "Dimension Organization Sequence" (0020,9221) |
280 } | 281 std::auto_ptr<DcmItem> item(new DcmItem); |
281 | 282 OrthancWSI::DicomToolbox::SetStringTag(*item, DCM_DimensionOrganizationUID, organization); |
282 dataset.remove(DCM_DimensionIndexSequence); | 283 |
283 | 284 std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_DimensionOrganizationSequence)); |
284 std::auto_ptr<DcmItem> item(new DcmItem); | 285 |
285 std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_DimensionOrganizationSequence)); | 286 if (!sequence->insert(item.release(), false, false).good() || |
286 | 287 !dataset.insert(sequence.release(), true /* replace */, false).good()) |
287 if (!item->putAndInsertString(DCM_DimensionOrganizationUID, uid.c_str()).good() || | 288 { |
288 !sequence->insert(item.release(), false, false).good() || | 289 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
289 !dataset.insert(sequence.release(), true, false).good()) | 290 } |
290 { | 291 } |
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | 292 |
292 } | 293 |
293 | 294 { |
294 item.reset(new DcmItem); | 295 // Construct tag "Dimension Index Sequence" (0020,9222) |
295 sequence.reset(new DcmSequenceOfItems(DCM_DimensionIndexSequence)); | 296 std::auto_ptr<DcmItem> item(new DcmItem); |
296 | 297 OrthancWSI::DicomToolbox::SetStringTag(*item, DCM_DimensionOrganizationUID, organization); |
297 std::auto_ptr<DcmAttributeTag> a1(new DcmAttributeTag(DCM_FunctionalGroupPointer)); | 298 OrthancWSI::DicomToolbox::SetAttributeTag(*item, DCM_FunctionalGroupPointer, DCM_FrameContentSequence); |
298 std::auto_ptr<DcmAttributeTag> a2(new DcmAttributeTag(DCM_DimensionIndexPointer)); | 299 OrthancWSI::DicomToolbox::SetAttributeTag(*item, DCM_DimensionIndexPointer, DCM_DimensionIndexValues); |
299 | 300 |
300 if (!item->putAndInsertString(DCM_DimensionOrganizationUID, uid.c_str()).good() || | 301 std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_DimensionIndexSequence)); |
301 !a1->putTagVal(DCM_FrameContentSequence).good() || | 302 |
302 !a2->putTagVal(DCM_DimensionIndexValues).good() || | 303 if (!sequence->insert(item.release(), false, false).good() || |
303 !item->insert(a1.release()).good() || | 304 !dataset.insert(sequence.release(), true /* replace */, false).good()) |
304 !item->insert(a2.release()).good() || | 305 { |
305 !sequence->insert(item.release(), false, false).good() || | 306 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
306 !dataset.insert(sequence.release(), true, false).good()) | 307 } |
307 { | 308 } |
308 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | 309 |
309 } | 310 |
310 | 311 { |
311 float spacingX = volume.GetWidth() / static_cast<float>(source.GetLevelHeight(0)); // Remember to switch X/Y! | 312 // Construct tag "Shared Functional Groups Sequence" (5200,9229) |
312 float spacingY = volume.GetHeight() / static_cast<float>(source.GetLevelWidth(0)); // Remember to switch X/Y! | 313 |
313 std::string spacing = (boost::lexical_cast<std::string>(spacingX) + '\\' + | 314 // In the 2 lines below, remember to switch X/Y when going from physical to pixel coordinates! |
314 boost::lexical_cast<std::string>(spacingY)); | 315 float spacingX = volume.GetWidth() / static_cast<float>(source.GetLevelHeight(0)); |
315 | 316 float spacingY = volume.GetHeight() / static_cast<float>(source.GetLevelWidth(0)); |
316 item.reset(new DcmItem); | 317 |
317 sequence.reset(new DcmSequenceOfItems(DCM_SharedFunctionalGroupsSequence)); | 318 std::string spacing = (boost::lexical_cast<std::string>(spacingX) + '\\' + |
318 std::auto_ptr<DcmItem> item2(new DcmItem); | 319 boost::lexical_cast<std::string>(spacingY)); |
319 std::auto_ptr<DcmItem> item3(new DcmItem); | 320 |
320 std::auto_ptr<DcmSequenceOfItems> sequence2(new DcmSequenceOfItems(DCM_PixelMeasuresSequence)); | 321 std::auto_ptr<DcmItem> item(new DcmItem); |
321 std::auto_ptr<DcmSequenceOfItems> sequence3(new DcmSequenceOfItems(DCM_OpticalPathIdentificationSequence)); | 322 |
322 | 323 std::auto_ptr<DcmItem> item2(new DcmItem); |
323 OrthancWSI::DicomToolbox::SetStringTag(*item2, DCM_SliceThickness, boost::lexical_cast<std::string>(volume.GetDepth())); | 324 OrthancWSI::DicomToolbox::SetStringTag(*item2, DCM_SliceThickness, |
324 OrthancWSI::DicomToolbox::SetStringTag(*item2, DCM_PixelSpacing, spacing); | 325 boost::lexical_cast<std::string>(volume.GetDepth())); |
325 OrthancWSI::DicomToolbox::SetStringTag(*item3, DCM_OpticalPathIdentifier, opticalPathId); | 326 OrthancWSI::DicomToolbox::SetStringTag(*item2, DCM_PixelSpacing, spacing); |
326 | 327 |
327 if (!sequence2->insert(item2.release(), false, false).good() || | 328 std::auto_ptr<DcmItem> item3(new DcmItem); |
328 !sequence3->insert(item3.release(), false, false).good() || | 329 OrthancWSI::DicomToolbox::SetStringTag(*item3, DCM_OpticalPathIdentifier, opticalPathId); |
329 !item->insert(sequence2.release(), false, false).good() || | 330 |
330 !item->insert(sequence3.release(), false, false).good() || | 331 std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_SharedFunctionalGroupsSequence)); |
331 !sequence->insert(item.release(), false, false).good() || | 332 std::auto_ptr<DcmSequenceOfItems> sequence2(new DcmSequenceOfItems(DCM_PixelMeasuresSequence)); |
332 !dataset.insert(sequence.release(), true, false).good()) | 333 std::auto_ptr<DcmSequenceOfItems> sequence3(new DcmSequenceOfItems(DCM_OpticalPathIdentificationSequence)); |
333 { | 334 |
334 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | 335 if (!sequence2->insert(item2.release(), false, false).good() || |
336 !sequence3->insert(item3.release(), false, false).good() || | |
337 !item->insert(sequence2.release(), false, false).good() || | |
338 !item->insert(sequence3.release(), false, false).good() || | |
339 !sequence->insert(item.release(), false, false).good() || | |
340 !dataset.insert(sequence.release(), true /* replace */, false).good()) | |
341 { | |
342 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
343 } | |
335 } | 344 } |
336 } | 345 } |
337 | 346 |
338 | 347 |
339 static void EnrichDataset(DcmDataset& dataset, | 348 static void EnrichDataset(DcmDataset& dataset, |