]> Creatis software - clitk.git/blobdiff - vv/vvLandmarks.cxx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / vv / vvLandmarks.cxx
index d9dfa65ed47f13b55eac96de6b1699c463817b33..94fb9756b93918ca20349a1eb1ce96baf6b35406 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong 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
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+  ===========================================================================**/
 #include "vvLandmarks.h"
 
 #include <ios>
@@ -28,6 +28,7 @@
 #include "vtkFloatArray.h"
 #include "vtkPointData.h"
 #include "clitkCommon.h"
+#include <itksys/SystemTools.hxx>
 
 //--------------------------------------------------------------------
 vvLandmarks::vvLandmarks(int size)
@@ -41,6 +42,8 @@ vvLandmarks::vvLandmarks(int size)
   }
   mPolyData = vtkPolyData::New();
   mIds = vtkFloatArray::New();
+  mLabels = vtkStringArray::New();
+  mLabels->SetName("labels");
 }
 //--------------------------------------------------------------------
 
@@ -58,6 +61,8 @@ vvLandmarks::~vvLandmarks()
     mIds->Delete();
   if (mPolyData)
     mPolyData->Delete();
+  if (mLabels)
+    mLabels->Delete();
 }
 //--------------------------------------------------------------------
 
@@ -66,20 +71,31 @@ vvLandmarks::~vvLandmarks()
 void vvLandmarks::AddLandmark(float x,float y,float z,float t,double value)
 {
   vvLandmark point;
+  vtkIdType idPoint;
   point.coordinates[0] = x;
   point.coordinates[1] = y;
   point.coordinates[2] = z;
   point.coordinates[3] = t;
   point.pixel_value=value;
   mLandmarks.push_back(point);
-  mPoints[int(t)]->InsertNextPoint(x,y,z);
-
-  /*std::stringstream numberVal;
-    numberVal << (mLandmarks.size()-1);
-    vvLandmarksGlyph *number = vvLandmarksGlyph::New();
-    number->SetText(numberVal.str().c_str());
-    number->BackingOff();
-    mText.push_back(number);*/
+
+  idPoint = mPoints[int(t)]->InsertNextPoint(x,y,z);
+  std::string str_vtkIdType;       // string which will contain the result
+  std::ostringstream convert;      // stream used for the conversion
+  convert << idPoint;                  // insert the textual representation of 'idPoint' in the characters in the stream
+  str_vtkIdType = convert.str();    // set 'str_vtkIdType' to the contents of the stream
+  mLabels->InsertNextValue(str_vtkIdType.c_str());
+
+  std::stringstream numberVal;
+  numberVal << (mLandmarks.size()-1);
+  /*
+  vvLandmarksGlyph *number = vvLandmarksGlyph::New();
+  number->SetText(numberVal.str().c_str());
+  number->BackingOff();
+  DD(numberVal.str().c_str());
+  mText.push_back(number);
+  */
+
   mIds->InsertNextTuple1(0.55);
   //mIds->InsertTuple1(mLandmarks.size(),mLandmarks.size());
   SetTime(int(t));
@@ -92,10 +108,39 @@ void vvLandmarks::RemoveLastLandmark()
 {
   mPoints[mLandmarks.back().coordinates[3]]->SetNumberOfPoints(
                                                                mPoints[mLandmarks.back().coordinates[3]]->GetNumberOfPoints()-1);
-  mPolyData->Modified();
-  //mText.pop_back();
+  //  mText.pop_back();
   mLandmarks.pop_back();
   mIds->RemoveLastTuple();
+  mLabels->SetNumberOfValues(mLabels->GetNumberOfValues()-1);
+  mLabels->Modified();
+  mPolyData->Modified();
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+void vvLandmarks::RemoveLandmark(int index)
+{
+  // erase a vtkPoint by shifiting the array .
+  // not a problem here because there are no 
+  // pologyons linking the points
+  int npoints = mPoints[mLandmarks[index].coordinates[3]]->GetNumberOfPoints();
+  int t = mLandmarks[index].coordinates[3];
+  for (int i = index; i < npoints - 1; i++) {
+    mPoints[t]->InsertPoint(i, mPoints[t]->GetPoint(i+1));
+       std::string str_i;                   // string which will contain the result
+       std::ostringstream convert;      // stream used for the conversion
+       convert << i;                        // insert the textual representation of 'i' in the characters in the stream
+       str_i = convert.str();           // set 'str_i' to the contents of the stream
+       mLabels->SetValue(i,str_i.c_str());
+    }
+  mPoints[t]->SetNumberOfPoints(npoints-1);
+  mLabels->SetNumberOfValues(npoints-1);
+  mLabels->Modified();
+  mPolyData->Modified();
+
+  mLandmarks.erase(mLandmarks.begin() + index);
+  mIds->RemoveLastTuple();
 }
 //--------------------------------------------------------------------
 
@@ -133,15 +178,28 @@ std::string vvLandmarks::GetComments(int index)
 
 
 //--------------------------------------------------------------------
-void vvLandmarks::LoadFile(std::string filename)
+bool vvLandmarks::LoadFile(std::string filename)
+{
+  std::string extension = itksys::SystemTools::GetFilenameExtension(filename);
+  if (extension == ".txt")
+    return LoadTxtFile(filename);
+  else if (extension == ".pts")
+    return LoadPtsFile(filename);
+
+  return false;
+}
+
+//--------------------------------------------------------------------
+bool vvLandmarks::LoadTxtFile(std::string filename)
 {
   std::ifstream fp(filename.c_str(), std::ios::in|std::ios::binary);
   if (!fp.is_open()) {
     std::cerr <<"Unable to open file " << filename << std::endl;
-    return;
+    return false;
   }
   mFilename = filename;
   mLandmarks.clear();
+  vtkIdType idPoint;
   char line[255];
   for (unsigned int i = 0; i < mPoints.size(); i++)
     mPoints[i]->SetNumberOfPoints(0);
@@ -223,14 +281,112 @@ void vvLandmarks::LoadFile(std::string filename)
       //      DD(point.comments);
       mLandmarks.push_back(point);
       mIds->InsertNextTuple1(0.55);
-      mPoints[int(point.coordinates[3])]->InsertNextPoint(
+     idPoint = mPoints[int(point.coordinates[3])]->InsertNextPoint(
                                                           point.coordinates[0],point.coordinates[1],point.coordinates[2]);
+     std::string str_vtkIdType;            // string which will contain the result
+     std::ostringstream convert;       // stream used for the conversion
+     convert << idPoint;                   // insert the textual representation of 'idPoint' in the characters in the stream
+     str_vtkIdType = convert.str(); // set 'str_vtkIdType' to the contents of the stream
+     mLabels->InsertNextValue(str_vtkIdType.c_str());
     }
   }
   SetTime(0);
+  
+  return true;
 }
 //--------------------------------------------------------------------
 
+//--------------------------------------------------------------------
+bool vvLandmarks::LoadPtsFile(std::string filename)
+{
+  std::ifstream fp(filename.c_str(), std::ios::in|std::ios::binary);
+  if (!fp.is_open()) {
+    std::cerr <<"Unable to open file " << filename << std::endl;
+    return false;
+  }
+  mFilename = filename;
+  mLandmarks.clear();
+  vtkIdType idPoint;
+  char line[255];
+  for (unsigned int i = 0; i < mPoints.size(); i++)
+    mPoints[i]->SetNumberOfPoints(0);
+  bool first_line=true;
+  while (fp.getline(line,255)) {
+    //    DD(line);
+    std::string stringline = line;
+    if (stringline.size() > 1) {
+      vvLandmark point;
+      int previousSpace = 0;
+      int space=0;
+      
+      if (stringline[0] == '#') // comments
+        continue;
+      
+      space = stringline.find("\t", previousSpace+1);
+      if (space < -1 || space > (int)stringline.size()) {
+        ErrorMsg(mLandmarks.size(),"x position");
+        continue;
+      }
+      point.coordinates[0] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
+      //      DD(point.coordinates[0]);
+      previousSpace = space;
+      space = stringline.find("\t", previousSpace+1);
+      if (space < -1 || space > (int)stringline.size()) {
+        ErrorMsg(mLandmarks.size(),"y position");
+        continue;
+      }
+      point.coordinates[1] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
+      //      DD(point.coordinates[1]);
+      previousSpace = space;
+      space = stringline.find("\t", previousSpace+1);
+      if (space < -1 || space > (int)stringline.size()) {
+        ErrorMsg(mLandmarks.size(),"z position");
+        continue;
+      }
+      point.coordinates[2] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
+      previousSpace = space;
+      if (mFormatVersion>0) {
+        space = stringline.find("\t", previousSpace+1);
+        if (space < -1 || space > (int)stringline.size()) {
+          ErrorMsg(mLandmarks.size(),"t position");
+          continue;
+        }
+        point.coordinates[3] = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
+        previousSpace = space;
+        space = stringline.find("\t", previousSpace+1);
+        if (space < -1 || space > (int)stringline.size()) {
+          ErrorMsg(mLandmarks.size(),"pixel value");
+          continue;
+        }
+        point.pixel_value = atof(replace_dots(stringline.substr(previousSpace,space - previousSpace)).c_str());
+        //        DD(point.pixel_value);
+      } else {
+        point.pixel_value=0.; //Not in file
+        point.coordinates[3]=0.;
+      }
+      previousSpace = space;
+      //this is the maximum size of comments
+      space = (stringline.find("\n", previousSpace+1) < 254 ? stringline.find("\n", previousSpace+1) : 254);
+      if (previousSpace != -1) {
+        point.comments = stringline.substr(previousSpace,space - (previousSpace)).c_str();
+      }
+      //      DD(point.comments);
+      mLandmarks.push_back(point);
+      mIds->InsertNextTuple1(0.55);
+     idPoint = mPoints[int(point.coordinates[3])]->InsertNextPoint(
+                                                          point.coordinates[0],point.coordinates[1],point.coordinates[2]);
+     std::string str_vtkIdType;     // string which will contain the result
+     std::ostringstream convert;  // stream used for the conversion
+     convert << idPoint;        // insert the textual representation of 'idPoint' in the characters in the stream
+     str_vtkIdType = convert.str(); // set 'str_vtkIdType' to the contents of the stream
+     mLabels->InsertNextValue(str_vtkIdType.c_str());
+    }
+  }
+  SetTime(0);
+  
+  return true;
+}
+//--------------------------------------------------------------------
 
 //--------------------------------------------------------------------
 bool vvLandmarks::ErrorMsg(int num,const char * text)
@@ -278,6 +434,7 @@ void vvLandmarks::SetTime(int time)
   if (time >= 0 && time <= ((int)mPoints.size() -1)) {
     mPolyData->SetPoints(mPoints[time]);
     mPolyData->GetPointData()->SetScalars(mIds);
+    mPolyData->GetPointData()->AddArray(mLabels);
     mPolyData->Modified();
     mPolyData->Update();
   }