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,