comparison OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 1834:126522623e20

replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 10 Jun 2021 12:07:04 +0200
parents 34ab7f643327
children 80e029f8ec91
comparison
equal deleted inserted replaced
1833:3c0996f028a1 1834:126522623e20
168 } 168 }
169 } 169 }
170 170
171 171
172 static bool FastParseVector(Vector& target, 172 static bool FastParseVector(Vector& target,
173 const IDicomDataset& dataset, 173 const IDicomDataset& dataset,
174 const DicomPath& tag) 174 const Orthanc::DicomPath& tag)
175 { 175 {
176 std::string value; 176 std::string value;
177 return (dataset.GetStringValue(value, tag) && 177 return (dataset.GetStringValue(value, tag) &&
178 GenericToolbox::FastParseVector(target, value)); 178 GenericToolbox::FastParseVector(target, value));
179 } 179 }
479 #endif 479 #endif
480 480
481 DicomDatasetReader reader(tags); 481 DicomDatasetReader reader(tags);
482 482
483 size_t count, tmp; 483 size_t count, tmp;
484 if (!tags.GetSequenceSize(count, DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE)) || 484 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE)) ||
485 !tags.GetSequenceSize(tmp, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE)) || 485 !tags.GetSequenceSize(tmp, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE)) ||
486 tmp != count || 486 tmp != count ||
487 !tags.GetSequenceSize(tmp, DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE)) || 487 !tags.GetSequenceSize(tmp, Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE)) ||
488 tmp != count) 488 tmp != count)
489 { 489 {
490 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); 490 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
491 } 491 }
492 492
493 structures_.resize(count); 493 structures_.resize(count);
494 for (size_t i = 0; i < count; i++) 494 for (size_t i = 0; i < count; i++)
495 { 495 {
496 structures_[i].interpretation_ = reader.GetStringValue 496 structures_[i].interpretation_ = reader.GetStringValue
497 (DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, 497 (Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i,
498 DICOM_TAG_RT_ROI_INTERPRETED_TYPE), 498 DICOM_TAG_RT_ROI_INTERPRETED_TYPE),
499 "No interpretation"); 499 "No interpretation");
500 500
501 structures_[i].name_ = reader.GetStringValue 501 structures_[i].name_ = reader.GetStringValue
502 (DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, 502 (Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i,
503 DICOM_TAG_ROI_NAME), 503 DICOM_TAG_ROI_NAME),
504 "No name"); 504 "No name");
505 505
506 Vector color; 506 Vector color;
507 if (FastParseVector(color, tags, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 507 if (FastParseVector(color, tags, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
508 DICOM_TAG_ROI_DISPLAY_COLOR)) && 508 DICOM_TAG_ROI_DISPLAY_COLOR)) &&
509 color.size() == 3) 509 color.size() == 3)
510 { 510 {
511 structures_[i].red_ = ConvertColor(color[0]); 511 structures_[i].red_ = ConvertColor(color[0]);
512 structures_[i].green_ = ConvertColor(color[1]); 512 structures_[i].green_ = ConvertColor(color[1]);
513 structures_[i].blue_ = ConvertColor(color[2]); 513 structures_[i].blue_ = ConvertColor(color[2]);
518 structures_[i].green_ = 0; 518 structures_[i].green_ = 0;
519 structures_[i].blue_ = 0; 519 structures_[i].blue_ = 0;
520 } 520 }
521 521
522 size_t countSlices; 522 size_t countSlices;
523 if (!tags.GetSequenceSize(countSlices, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 523 if (!tags.GetSequenceSize(countSlices, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
524 DICOM_TAG_CONTOUR_SEQUENCE))) 524 DICOM_TAG_CONTOUR_SEQUENCE)))
525 { 525 {
526 countSlices = 0; 526 countSlices = 0;
527 } 527 }
528 528
529 LOG(INFO) << "New RT structure: \"" << structures_[i].name_ 529 LOG(INFO) << "New RT structure: \"" << structures_[i].name_
531 << "\" containing " << countSlices << " slices (color: " 531 << "\" containing " << countSlices << " slices (color: "
532 << static_cast<int>(structures_[i].red_) << "," 532 << static_cast<int>(structures_[i].red_) << ","
533 << static_cast<int>(structures_[i].green_) << "," 533 << static_cast<int>(structures_[i].green_) << ","
534 << static_cast<int>(structures_[i].blue_) << ")"; 534 << static_cast<int>(structures_[i].blue_) << ")";
535 535
536 // These temporary variables avoid allocating many vectors in the loop below 536 /**
537 DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 537 * These temporary variables avoid allocating many vectors in
538 DICOM_TAG_CONTOUR_SEQUENCE, 0, 538 * the loop below (indeed, "Orthanc::DicomPath" handles a
539 DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); 539 * "std::vector<PrefixItem>")
540 540 **/
541 DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 541 Orthanc::DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
542 DICOM_TAG_CONTOUR_SEQUENCE, 0, 542 DICOM_TAG_CONTOUR_SEQUENCE, 0,
543 DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); 543 DICOM_TAG_NUMBER_OF_CONTOUR_POINTS);
544
545 Orthanc::DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
546 DICOM_TAG_CONTOUR_SEQUENCE, 0,
547 DICOM_TAG_CONTOUR_GEOMETRIC_TYPE);
544 548
545 DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 549 Orthanc::DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
546 DICOM_TAG_CONTOUR_SEQUENCE, 0, 550 DICOM_TAG_CONTOUR_SEQUENCE, 0,
547 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); 551 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE);
548 552
549 // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) 553 // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)
550 DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 554 Orthanc::DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
551 DICOM_TAG_CONTOUR_SEQUENCE, 0, 555 DICOM_TAG_CONTOUR_SEQUENCE, 0,
552 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, 556 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0,
553 DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); 557 DICOM_TAG_REFERENCED_SOP_INSTANCE_UID);
554 558
555 DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, 559 Orthanc::DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i,
556 DICOM_TAG_CONTOUR_SEQUENCE, 0, 560 DICOM_TAG_CONTOUR_SEQUENCE, 0,
557 DICOM_TAG_CONTOUR_DATA); 561 DICOM_TAG_CONTOUR_DATA);
558 562
559 for (size_t j = 0; j < countSlices; j++) 563 for (size_t j = 0; j < countSlices; j++)
560 { 564 {
561 unsigned int countPoints; 565 unsigned int countPoints;
562 566