#include "clitkDicomRT_Contour.h"
#include <vtkCellArray.h>
+#if GDCM_MAJOR_VERSION == 2
+#include "gdcmAttribute.h"
+#include "gdcmItem.h"
+#endif
+
//--------------------------------------------------------------------
clitk::DicomRT_Contour::DicomRT_Contour()
{
//--------------------------------------------------------------------
#if GDCM_MAJOR_VERSION == 2
+bool clitk::DicomRT_Contour::Read(gdcm::Item const & item)
+{
+ const gdcm::DataSet& nestedds2 = item.GetNestedDataSet();
+
+ // Contour type [Contour Geometric Type]
+ gdcm::Attribute<0x3006,0x0042> contgeotype;
+ contgeotype.SetFromDataSet( nestedds2 );
+
+ if (contgeotype.GetValue() != "CLOSED_PLANAR " && contgeotype.GetValue() != "POINT ") { ///WARNING to the space after the name ...
+ //std::cerr << "Skip this contour : type=" << mType << std::endl;
+ return false;
+ }
+ if (contgeotype.GetValue() == "POINT ") {
+ std::cerr << "Warning: POINT type not fully supported. (don't use GetMesh() with this!)"
+ << std::endl;
+ }
+
+ gdcm::Attribute<0x3006,0x0046> numcontpoints;
+ numcontpoints.SetFromDataSet( nestedds2 );
+ // Number of points [Number of Contour Points]
+ mNbOfPoints = numcontpoints.GetValue();
+ // DD(mNbOfPoints);
+
+ gdcm::Attribute<0x3006,0x0050> at;
+ gdcm::Tag tcontourdata(0x3006,0x0050);
+ const gdcm::DataElement & contourdata = nestedds2.GetDataElement( tcontourdata );
+ at.SetFromDataElement( contourdata );
+ const double* points = at.GetValues();
+ unsigned int npts = at.GetNumberOfValues() / 3;
+
+ assert(at.GetNumberOfValues() == static_cast<unsigned int>(mNbOfPoints)*3);
+
+ // Organize values
+ mData = vtkSmartPointer<vtkPoints>::New();
+ mData->SetDataTypeToDouble();
+ mData->SetNumberOfPoints(mNbOfPoints);
+ for(unsigned int i=0; i<mNbOfPoints; i++) {
+ double p[3];
+ p[0] = points[i*3];
+ p[1] = points[i*3+1];
+ p[2] = points[i*3+2];
+ mData->SetPoint(i, p);
+ if (mZ == -1) mZ = p[2];
+ if (p[2] != mZ) {
+ DD(i);
+ DD(p[2]);
+ DD(mZ);
+ std::cout << "ERROR ! contour not in the same slice" << std::endl;
+ assert(p[2] == mZ);
+ }
+ }
+
+ return true;
+
+}
#else
bool clitk::DicomRT_Contour::Read(gdcm::SQItem * item)
{
void Print(std::ostream & os = std::cout) const;
#if GDCM_MAJOR_VERSION == 2
+ bool Read(gdcm::Item const & item);
#else
bool Read(gdcm::SQItem * item);
#endif
#include <vtkSmartPointer.h>
#include <vtkAppendPolyData.h>
+#if GDCM_MAJOR_VERSION == 2
+#include "gdcmAttribute.h"
+#include "gdcmItem.h"
+#endif
+
//--------------------------------------------------------------------
clitk::DicomRT_ROI::DicomRT_ROI()
{
//--------------------------------------------------------------------
#if GDCM_MAJOR_VERSION == 2
+void clitk::DicomRT_ROI::Read(std::map<int, std::string> & 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<gdcm::SequenceOfItems> 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<int, std::string> & rois, gdcm::SQItem * item)
{
void Print(std::ostream & os = std::cout) const;
#if GDCM_MAJOR_VERSION == 2
+ void Read(std::map<int, std::string> & rois, gdcm::Item const & item);
#else
void Read(std::map<int, std::string> & rois, gdcm::SQItem * item);
#endif