]> Creatis software - clitk.git/blobdiff - common/clitkDicomRT_Contour.cxx
Added HaveSameSize
[clitk.git] / common / clitkDicomRT_Contour.cxx
index 7df4cfe3f33e8a9c64b966c6476a4addba17b001..633064e18e578f7f80c72cbbf0e573e1645b34f8 100644 (file)
@@ -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
 #include "clitkDicomRT_Contour.h"
 #include <vtkCellArray.h>
 
+#if GDCM_MAJOR_VERSION == 2
+#include "gdcmAttribute.h"
+#include "gdcmItem.h"
+#endif
+
 //--------------------------------------------------------------------
 clitk::DicomRT_Contour::DicomRT_Contour()
 {
   mMeshIsUpToDate = false;
   mNbOfPoints = 0;
+  mZ = -1;
 }
 //--------------------------------------------------------------------
 
@@ -47,6 +53,63 @@ void clitk::DicomRT_Contour::Print(std::ostream & os) const
 
 
 //--------------------------------------------------------------------
+#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)
 {
 
@@ -58,7 +121,7 @@ bool clitk::DicomRT_Contour::Read(gdcm::SQItem * item)
     return false;
   }
   if (mType == "POINT ") {
-    std::cout << "Warning: POINT type not fully supported. (don't use GetMesh() with this!)"
+    std::cerr << "Warning: POINT type not fully supported. (don't use GetMesh() with this!)"
       << std::endl;
   }
 
@@ -71,28 +134,28 @@ bool clitk::DicomRT_Contour::Read(gdcm::SQItem * item)
   assert(points.size() == static_cast<unsigned int>(mNbOfPoints)*3);
 
   // Organize values
-  mData = vtkPoints::New();
+  mData = vtkSmartPointer<vtkPoints>::New();
   mData->SetDataTypeToDouble();
   mData->SetNumberOfPoints(mNbOfPoints);
-  double z = -1;
   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 (z == -1) z = p[2];
-    if (p[2] != z) {
+    if (mZ == -1) mZ = p[2];
+    if (p[2] != mZ) {
       DD(i);
       DD(p[2]);
-      DD(z);
+      DD(mZ);
       std::cout << "ERROR ! contour not in the same slice" << std::endl;
-      assert(p[2] == z);
+      assert(p[2] == mZ);
     }
   }
 
   return true;
 }
+#endif
 //--------------------------------------------------------------------
 
 
@@ -111,9 +174,10 @@ vtkPolyData * clitk::DicomRT_Contour::GetMesh()
 void clitk::DicomRT_Contour::ComputeMesh()
 {
 //  DD("ComputeMesh Contour");
-  mMesh = vtkPolyData::New();
+  mMesh = vtkSmartPointer<vtkPolyData>::New();
   mMesh->Allocate(); //for cell structures
-  mMesh->SetPoints(vtkPoints::New());
+  mPoints = vtkSmartPointer<vtkPoints>::New();
+  mMesh->SetPoints(mPoints);
   vtkIdType ids[2];
   for (unsigned int idx=0 ; idx<mNbOfPoints ; idx++) {
     mMesh->GetPoints()->InsertNextPoint(mData->GetPoint(idx)[0],