From 8427d8dc328ffb0f528df6ab1da1a45c6f5b6b59 Mon Sep 17 00:00:00 2001 From: David Sarrut Date: Wed, 27 Jul 2011 11:49:05 +0200 Subject: [PATCH] Change reading. Add possibility to update dicom info (before writing dicom) --- common/clitkDicomRT_ROI.cxx | 84 +++++++++++++++++++++++++++++-------- common/clitkDicomRT_ROI.h | 30 +++++++++---- 2 files changed, 88 insertions(+), 26 deletions(-) diff --git a/common/clitkDicomRT_ROI.cxx b/common/clitkDicomRT_ROI.cxx index 88bab72..73d25b9 100644 --- a/common/clitkDicomRT_ROI.cxx +++ b/common/clitkDicomRT_ROI.cxx @@ -36,6 +36,7 @@ clitk::DicomRT_ROI::DicomRT_ROI() mMeshIsUpToDate = false; mBackgroundValue = 0; mForegroundValue = 1; + SetDicomUptodateFlag(false); } //-------------------------------------------------------------------- @@ -134,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 + int nb2 = referencedroinumber.GetValue(); + + // Must never be different + if (nb1 != nb2) { + DD(nb2); + DD(nb1); + FATAL("nb1 must equal nb2" << std::endl); + } + mNumber = nb1; - // TODO - - // ROI number [Referenced ROI Number] - mNumber = referencedroinumber.GetValue(); - - // 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,7 +181,8 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item cons if( !nestedds.FindDataElement( tcsq ) ) { std::cerr << "Warning. Could not read contour for structure <" << mName << ">, number" << mNumber << " ? I ignore it" << std::endl; - return; + SetDicomUptodateFlag(true); + return false; } const gdcm::DataElement& csq = nestedds.GetDataElement( tcsq ); gdcm::SmartPointer sqi2 = csq.GetValueAsSQ(); @@ -181,15 +200,12 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item cons 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()); @@ -215,6 +231,7 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * else { std::cerr << "Warning. Could not read contour for structure <" << mName << ">, number" << mNumber << " ? I ignore it" << std::endl; } + SetDicomUptodateFlag(true); } #endif //-------------------------------------------------------------------- @@ -236,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() @@ -258,6 +280,34 @@ 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, diff --git a/common/clitkDicomRT_ROI.h b/common/clitkDicomRT_ROI.h index 0fb3076..8117352 100644 --- a/common/clitkDicomRT_ROI.h +++ b/common/clitkDicomRT_ROI.h @@ -35,11 +35,6 @@ public: itkNewMacro(Self); void Print(std::ostream & os = std::cout) const; -#if GDCM_MAJOR_VERSION == 2 - void Read(std::map & rois, gdcm::Item const & item); -#else - void Read(std::map & rois, gdcm::SQItem * item); -#endif void SetFromBinaryImage(vvImage * image, int n, std::string name, std::vector color, @@ -64,10 +59,23 @@ public: void SetImage(vvImage * im); DicomRT_Contour* GetContour(int n); - // double GetContourSpacing() const {return mZDelta;} + // Compute a vtk mesh from the dicom contours + void ComputeMesh(); + // Indicate if the mesh is uptodate according to the dicom + void SetDicomUptodateFlag(bool b) { m_DicomUptodateFlag = b; } + bool GetDicomUptoDateFlag() const { return m_DicomUptodateFlag; } + void SetName(std::string n) { mName = n; } + + // Read from DICOM RT STRUCT +#if GDCM_MAJOR_VERSION == 2 + bool Read(gdcm::Item * itemInfo, gdcm::Item * itemContour); + void UpdateDicomItem(); +#else + void Read(std::map & rois, gdcm::SQItem * item); +#endif + protected: - void ComputeMesh(); std::string mName; std::string mFilename; int mNumber; @@ -78,8 +86,12 @@ protected: vvImage::Pointer mImage; double mBackgroundValue; double mForegroundValue; - ///Spacing between two contours - // double mZDelta; + bool m_DicomUptodateFlag; + +#if GDCM_MAJOR_VERSION == 2 + gdcm::Item * mItemInfo; + gdcm::Item * mItemContour; +#endif private: DicomRT_ROI(); -- 2.47.1