X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkDicomRT_ROI.cxx;h=73d25b99cf038934b5479b61edca6237e74e9075;hb=6c46b5b1d02d65fdb3fdccc8174346b49a05a32f;hp=7aca4be0ae911cb65d3d92c68b52dada4b0dc4ea;hpb=85fa943b3ae5ae15297f3469817f98a930977bfb;p=clitk.git diff --git a/common/clitkDicomRT_ROI.cxx b/common/clitkDicomRT_ROI.cxx index 7aca4be..73d25b9 100644 --- a/common/clitkDicomRT_ROI.cxx +++ b/common/clitkDicomRT_ROI.cxx @@ -2,9 +2,9 @@ Program: vv http://www.creatis.insa-lyon.fr/rio/vv Main authors : XX XX XX - Authors belongs to: + Authors belongs to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -17,30 +17,40 @@ =========================================================================*/ -#include "clitkDicomRT_ROI.h" +#include "clitkDicomRT_ROI.h" #include #include +#if GDCM_MAJOR_VERSION == 2 +#include "gdcmAttribute.h" +#include "gdcmItem.h" +#endif + //-------------------------------------------------------------------- -clitk::DicomRT_ROI::DicomRT_ROI() { +clitk::DicomRT_ROI::DicomRT_ROI() +{ mName = "NoName"; mNumber = -1; mColor.resize(3); mColor[0] = mColor[1] = mColor[2] = 0; mMeshIsUpToDate = false; + mBackgroundValue = 0; + mForegroundValue = 1; + SetDicomUptodateFlag(false); } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -clitk::DicomRT_ROI::~DicomRT_ROI() { - +clitk::DicomRT_ROI::~DicomRT_ROI() +{ } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::SetDisplayColor(double r, double v, double b) { +void clitk::DicomRT_ROI::SetDisplayColor(double r, double v, double b) +{ mColor.resize(3); mColor[0] = r; mColor[1] = v; @@ -50,30 +60,41 @@ void clitk::DicomRT_ROI::SetDisplayColor(double r, double v, double b) { //-------------------------------------------------------------------- -int clitk::DicomRT_ROI::GetROINumber() const { +int clitk::DicomRT_ROI::GetROINumber() const +{ return mNumber; } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -const std::string & clitk::DicomRT_ROI::GetName() const { +const std::string & clitk::DicomRT_ROI::GetName() const +{ return mName; } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -const std::vector & clitk::DicomRT_ROI::GetDisplayColor() const { +const std::string & clitk::DicomRT_ROI::GetFilename() const +{ + return mFilename; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +const std::vector & clitk::DicomRT_ROI::GetDisplayColor() const +{ return mColor; } //-------------------------------------------------------------------- - //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::Print(std::ostream & os) const { - os << "ROI " << mNumber << "\t" << mName +void clitk::DicomRT_ROI::Print(std::ostream & os) const +{ + os << "ROI " << mNumber << "\t" << mName << "\t(" << mColor[0] << " " << mColor[1] << " " << mColor[2] << ")" << "\t Contours = " << mListOfContours.size() << std::endl; } @@ -81,15 +102,113 @@ void clitk::DicomRT_ROI::Print(std::ostream & os) const { //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * item) { +void clitk::DicomRT_ROI::SetBackgroundValueLabelImage(double bg) +{ + mBackgroundValue = bg; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +double clitk::DicomRT_ROI::GetBackgroundValueLabelImage() const +{ + return mBackgroundValue; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI::SetForegroundValueLabelImage(double bg) +{ + mForegroundValue = bg; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +double clitk::DicomRT_ROI::GetForegroundValueLabelImage() const +{ + return mForegroundValue; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +#if GDCM_MAJOR_VERSION == 2 +bool clitk::DicomRT_ROI::Read(gdcm::Item * itemInfo, gdcm::Item * itemContour) +{ + // Keep dicom item + mItemInfo = itemInfo; + mItemContour = itemContour; + // DD(mItemInfo); - // Change number if needed + // 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 ); + int nb2 = referencedroinumber.GetValue(); - // TODO + // Must never be different + if (nb1 != nb2) { + DD(nb2); + DD(nb1); + FATAL("nb1 must equal nb2" << std::endl); + } + mNumber = nb1; + // 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 = {}; + color.SetFromDataSet( nestedds ); + assert( color.GetNumberOfValues() == 3 ); + mColor[0] = color.GetValue(0); + mColor[1] = color.GetValue(1); + mColor[2] = color.GetValue(2); + + // Read contours [Contour Sequence] + 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(); + if( !sqi2 || !sqi2->GetNumberOfItems() ) + { + } + unsigned int nitems = sqi2->GetNumberOfItems(); + + 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); + } + } + SetDicomUptodateFlag(true); + return true; +} +#else +void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * item) +{ // ROI number [Referenced ROI Number] mNumber = atoi(item->GetEntryValue(0x3006,0x0084).c_str()); - + // Retrieve ROI Name mName = rois[mNumber]; @@ -98,17 +217,37 @@ void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * // Read contours [Contour Sequence] gdcm::SeqEntry * contours=item->GetSeqEntry(0x3006,0x0040); - for(gdcm::SQItem* j=contours->GetFirstSQItem();j!=0;j=contours->GetNextSQItem()) { - DicomRT_Contour * c = new DicomRT_Contour; - bool b = c->Read(j); - if (b) mListOfContours.push_back(c); + 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 //-------------------------------------------------------------------- //-------------------------------------------------------------------- -vtkPolyData * clitk::DicomRT_ROI::GetMesh() { +void clitk::DicomRT_ROI::SetImage(vvImage * image) +{ + mImage = image; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +vtkPolyData * clitk::DicomRT_ROI::GetMesh() +{ if (!mMeshIsUpToDate) { ComputeMesh(); } @@ -118,29 +257,71 @@ vtkPolyData * clitk::DicomRT_ROI::GetMesh() { //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::ComputeMesh() { - vtkAppendPolyData * append = vtkAppendPolyData::New(); +clitk::DicomRT_Contour * clitk::DicomRT_ROI::GetContour(int n) +{ + return mListOfContours[n]; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI::ComputeMesh() +{ + vtkSmartPointer append = vtkSmartPointer::New(); for(unsigned int i=0; iAddInput(mListOfContours[i]->GetMesh()); } append->Update(); - mMesh = append->GetOutput(); + + mMesh = vtkSmartPointer::New(); + mMesh->DeepCopy(append->GetOutput()); mMeshIsUpToDate = true; } //-------------------------------------------------------------------- +#if GDCM_MAJOR_VERSION == 2 + //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage::Pointer image, int n, - std::string name, - std::vector color) { - +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) +{ + // ROI number [Referenced ROI Number] mNumber = n; - + // ROI Name mName = name; - + mFilename = filename; + // ROI Color [ROI Display Color] mColor = color; @@ -154,7 +335,8 @@ void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage::Pointer image, int n, //-------------------------------------------------------------------- -const vvImage::Pointer clitk::DicomRT_ROI::GetImage() const { +vvImage * clitk::DicomRT_ROI::GetImage() const +{ return mImage; } //--------------------------------------------------------------------