X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkDicomRT_ROI.cxx;h=73d25b99cf038934b5479b61edca6237e74e9075;hb=6c46b5b1d02d65fdb3fdccc8174346b49a05a32f;hp=25a2f4322548a1de065c220654352490d7368219;hpb=765020625fbc092d283e221e36c83e60a1844cb7;p=clitk.git diff --git a/common/clitkDicomRT_ROI.cxx b/common/clitkDicomRT_ROI.cxx index 25a2f43..73d25b9 100644 --- a/common/clitkDicomRT_ROI.cxx +++ b/common/clitkDicomRT_ROI.cxx @@ -36,7 +36,7 @@ clitk::DicomRT_ROI::DicomRT_ROI() mMeshIsUpToDate = false; mBackgroundValue = 0; mForegroundValue = 1; - mZDelta = 0; + SetDicomUptodateFlag(false); } //-------------------------------------------------------------------- @@ -135,21 +135,38 @@ double clitk::DicomRT_ROI::GetForegroundValueLabelImage() const //-------------------------------------------------------------------- #if GDCM_MAJOR_VERSION == 2 -void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item const & item) +bool clitk::DicomRT_ROI::Read(gdcm::Item * itemInfo, gdcm::Item * itemContour) { - const gdcm::DataSet& nestedds = item.GetNestedDataSet(); - + // Keep dicom item + mItemInfo = itemInfo; + mItemContour = itemContour; + // DD(mItemInfo); + + // ROI number [Referenced ROI Number] + const gdcm::DataSet & nesteddsInfo = mItemInfo->GetNestedDataSet(); + gdcm::Attribute<0x3006,0x0022> roinumber; + roinumber.SetFromDataSet( nesteddsInfo ); + int nb1 = roinumber.GetValue(); + + // Check this is the same with the other item + const gdcm::DataSet & nestedds = mItemContour->GetNestedDataSet(); gdcm::Attribute<0x3006,0x0084> referencedroinumber; referencedroinumber.SetFromDataSet( nestedds ); - // Change number if needed - - // TODO - - // ROI number [Referenced ROI Number] - mNumber = referencedroinumber.GetValue(); + int nb2 = referencedroinumber.GetValue(); + + // Must never be different + if (nb1 != nb2) { + DD(nb2); + DD(nb1); + FATAL("nb1 must equal nb2" << std::endl); + } + mNumber = nb1; - // Retrieve ROI Name - mName = rois[mNumber]; + // Retrieve ROI Name (in the info item) + gdcm::Attribute<0x3006,0x26> roiname; + roiname.SetFromDataSet( nesteddsInfo ); + mName = roiname.GetValue(); + // DD(mName); // ROI Color [ROI Display Color] gdcm::Attribute<0x3006,0x002a> color = {}; @@ -163,6 +180,9 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item cons gdcm::Tag tcsq(0x3006,0x0040); if( !nestedds.FindDataElement( tcsq ) ) { + std::cerr << "Warning. Could not read contour for structure <" << mName << ">, number" << mNumber << " ? I ignore it" << std::endl; + SetDicomUptodateFlag(true); + return false; } const gdcm::DataElement& csq = nestedds.GetDataElement( tcsq ); gdcm::SmartPointer sqi2 = csq.GetValueAsSQ(); @@ -171,37 +191,21 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item cons } unsigned int nitems = sqi2->GetNumberOfItems(); - bool contour_processed=false; - bool delta_computed=false; - double last_z=0; for(unsigned int i = 0; i < nitems; ++i) { - const gdcm::Item & j = sqi2->GetItem(i+1); // Item start at #1 - DicomRT_Contour::Pointer c = DicomRT_Contour::New(); - bool b = c->Read(j); - if (b) { - mListOfContours.push_back(c); - if (contour_processed) { - double delta=c->GetZ() - last_z; - if (delta_computed) - assert(mZDelta == delta); - else - mZDelta = delta; - } else - contour_processed=true; - last_z=c->GetZ(); + const gdcm::Item & j = sqi2->GetItem(i+1); // Item start at #1 + DicomRT_Contour::Pointer c = DicomRT_Contour::New(); + bool b = c->Read(j); + if (b) { + mListOfContours.push_back(c); + } } - } - + SetDicomUptodateFlag(true); + return true; } #else void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * item) { - - // Change number if needed - - // TODO - // ROI number [Referenced ROI Number] mNumber = atoi(item->GetEntryValue(0x3006,0x0084).c_str()); @@ -213,25 +217,21 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * // Read contours [Contour Sequence] gdcm::SeqEntry * contours=item->GetSeqEntry(0x3006,0x0040); - bool contour_processed=false; - bool delta_computed=false; - double last_z=0; - for(gdcm::SQItem* j=contours->GetFirstSQItem(); j!=0; j=contours->GetNextSQItem()) { - DicomRT_Contour::Pointer c = DicomRT_Contour::New(); - bool b = c->Read(j); - if (b) { - mListOfContours.push_back(c); - if (contour_processed) { - double delta=c->GetZ() - last_z; - if (delta_computed) - assert(mZDelta == delta); - else - mZDelta = delta; - } else - contour_processed=true; - last_z=c->GetZ(); + if (contours) { + int i=0; + for(gdcm::SQItem* j=contours->GetFirstSQItem(); j!=0; j=contours->GetNextSQItem()) { + DicomRT_Contour::Pointer c = DicomRT_Contour::New(); + bool b = c->Read(j); + if (b) { + mListOfContours.push_back(c); + } + ++i; } } + else { + std::cerr << "Warning. Could not read contour for structure <" << mName << ">, number" << mNumber << " ? I ignore it" << std::endl; + } + SetDicomUptodateFlag(true); } #endif //-------------------------------------------------------------------- @@ -253,11 +253,16 @@ vtkPolyData * clitk::DicomRT_ROI::GetMesh() } return mMesh; } +//-------------------------------------------------------------------- + + //-------------------------------------------------------------------- clitk::DicomRT_Contour * clitk::DicomRT_ROI::GetContour(int n) { return mListOfContours[n]; } +//-------------------------------------------------------------------- + //-------------------------------------------------------------------- void clitk::DicomRT_ROI::ComputeMesh() @@ -275,11 +280,39 @@ void clitk::DicomRT_ROI::ComputeMesh() //-------------------------------------------------------------------- +#if GDCM_MAJOR_VERSION == 2 + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI::UpdateDicomItem() +{ + if (GetDicomUptoDateFlag()) return; + DD("ROI::UpdateDicomItem"); + DD(GetName()); + + // From now, only some item can be modified + + // Set ROI Name 0x3006,0x26> + gdcm::Attribute<0x3006,0x26> roiname; + roiname.SetValue(GetName()); + gdcm::DataElement de = roiname.GetAsDataElement(); + gdcm::DataSet & ds = mItemInfo->GetNestedDataSet(); + ds.Replace(de); + + // Update contours + for(uint i=0; iUpdateDicomItem(mItemContour); + } +} +//-------------------------------------------------------------------- +#endif + //-------------------------------------------------------------------- void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage * image, int n, - std::string name, - std::vector color, - std::string filename) + std::string name, + std::vector color, + std::string filename) { // ROI number [Referenced ROI Number]