X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=inline;f=common%2FclitkDicomRT_ROI.cxx;h=25a2f4322548a1de065c220654352490d7368219;hb=573d80d0f7a17607d2ee883c21c940c0ba020282;hp=119b63890323c4dc2fdf6f50c6eba546a2547d39;hpb=1e034c70105f0926939acaaa27ddb46e904ae8bf;p=clitk.git diff --git a/common/clitkDicomRT_ROI.cxx b/common/clitkDicomRT_ROI.cxx index 119b638..25a2f43 100644 --- a/common/clitkDicomRT_ROI.cxx +++ b/common/clitkDicomRT_ROI.cxx @@ -4,7 +4,7 @@ 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 @@ -21,6 +21,11 @@ #include #include +#if GDCM_MAJOR_VERSION == 2 +#include "gdcmAttribute.h" +#include "gdcmItem.h" +#endif + //-------------------------------------------------------------------- clitk::DicomRT_ROI::DicomRT_ROI() { @@ -29,6 +34,9 @@ clitk::DicomRT_ROI::DicomRT_ROI() mColor.resize(3); mColor[0] = mColor[1] = mColor[2] = 0; mMeshIsUpToDate = false; + mBackgroundValue = 0; + mForegroundValue = 1; + mZDelta = 0; } //-------------------------------------------------------------------- @@ -36,7 +44,6 @@ clitk::DicomRT_ROI::DicomRT_ROI() //-------------------------------------------------------------------- clitk::DicomRT_ROI::~DicomRT_ROI() { - } //-------------------------------------------------------------------- @@ -68,6 +75,14 @@ const std::string & clitk::DicomRT_ROI::GetName() const //-------------------------------------------------------------------- +//-------------------------------------------------------------------- +const std::string & clitk::DicomRT_ROI::GetFilename() const +{ + return mFilename; +} +//-------------------------------------------------------------------- + + //-------------------------------------------------------------------- const std::vector & clitk::DicomRT_ROI::GetDisplayColor() const { @@ -103,6 +118,83 @@ double clitk::DicomRT_ROI::GetBackgroundValueLabelImage() const //-------------------------------------------------------------------- +void clitk::DicomRT_ROI::SetForegroundValueLabelImage(double bg) +{ + mForegroundValue = bg; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +double clitk::DicomRT_ROI::GetForegroundValueLabelImage() const +{ + return mForegroundValue; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +#if GDCM_MAJOR_VERSION == 2 +void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::Item const & item) +{ + const gdcm::DataSet& nestedds = item.GetNestedDataSet(); + + gdcm::Attribute<0x3006,0x0084> referencedroinumber; + referencedroinumber.SetFromDataSet( nestedds ); + // Change number if needed + + // TODO + + // ROI number [Referenced ROI Number] + mNumber = referencedroinumber.GetValue(); + + // Retrieve ROI Name + mName = rois[mNumber]; + + // 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 ) ) + { + } + const gdcm::DataElement& csq = nestedds.GetDataElement( tcsq ); + gdcm::SmartPointer sqi2 = csq.GetValueAsSQ(); + if( !sqi2 || !sqi2->GetNumberOfItems() ) + { + } + 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(); + } + } + +} +#else void clitk::DicomRT_ROI::Read(std::map & rois, gdcm::SQItem * item) { @@ -121,12 +213,35 @@ 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 * c = new DicomRT_Contour; + DicomRT_Contour::Pointer c = DicomRT_Contour::New(); bool b = c->Read(j); - if (b) mListOfContours.push_back(c); + 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(); + } } } +#endif +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI::SetImage(vvImage * image) +{ + mImage = image; +} //-------------------------------------------------------------------- @@ -139,26 +254,32 @@ vtkPolyData * clitk::DicomRT_ROI::GetMesh() return mMesh; } //-------------------------------------------------------------------- - +clitk::DicomRT_Contour * clitk::DicomRT_ROI::GetContour(int n) +{ + return mListOfContours[n]; +} //-------------------------------------------------------------------- void clitk::DicomRT_ROI::ComputeMesh() { - vtkAppendPolyData * append = vtkAppendPolyData::New(); + 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; } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage::Pointer image, int n, - std::string name, - std::vector color) +void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage * image, int n, + std::string name, + std::vector color, + std::string filename) { // ROI number [Referenced ROI Number] @@ -166,6 +287,7 @@ void clitk::DicomRT_ROI::SetFromBinaryImage(vvImage::Pointer image, int n, // ROI Name mName = name; + mFilename = filename; // ROI Color [ROI Display Color] mColor = color; @@ -180,7 +302,7 @@ 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; }