]> Creatis software - clitk.git/blobdiff - tools/clitkTransformLandmarks.cxx
Debug vvMainWinsow.ui
[clitk.git] / tools / clitkTransformLandmarks.cxx
index ea84d18674c8712845468accfffb6707d6a28913..df5dbe8e390521e8705019f14dea0defd66db44c 100644 (file)
 #include <iostream>
 #include <fstream>
 
+#include <vtkSmartPointer.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include "vtkPolyDataReader.h"
+#include "vtkPolyDataWriter.h"
+#include <vtkTransform.h>
+#include <vtkTransformFilter.h>
+
 typedef itk::Matrix<double, 4, 4> MatrixType;
 typedef itk::Point<double, 4> PointType;
 typedef std::vector<PointType> PointArrayType;
@@ -36,6 +44,7 @@ void write_points_txt(const std::string& fileName, const PointArrayType& points,
 void read_points_pts(const std::string& fileName, PointArrayType& points);
 void write_points_pts(const std::string& fileName, const PointArrayType& points);
 
+void apply_spacing(const PointArrayType& input, const double* spacing, PointArrayType& output);
 void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output);
 
 
@@ -46,25 +55,65 @@ int main(int argc, char** argv)
   GGO(clitkTransformLandmarks, args_info);
   verbose = args_info.verbose_flag;
 
-  MatrixType matrix = clitk::ReadMatrix3D(args_info.matrix_arg);
-
   TxtDataArrayType data;
   PointArrayType inputPoints;
   if (strcmp(args_info.type_arg, "txt") == 0) {
     read_points_txt(args_info.input_arg, inputPoints, data);
   }
+  else if (strcmp(args_info.type_arg, "vtk") == 0) {
+    vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New();
+    reader->SetFileName(args_info.input_arg);
+    reader->Update();
+    vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
+    writer->SetFileName( args_info.output_arg );
+
+    if (args_info.matrix_given) {
+      vtkSmartPointer<vtkTransformFilter> transformFilter = vtkSmartPointer<vtkTransformFilter>::New();
+      vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
+      vtkMatrix4x4* matrix = clitk::ReadVTKMatrix3D(args_info.matrix_arg);
+      vtkSmartPointer<vtkMatrix4x4> matrixT = vtkSmartPointer<vtkMatrix4x4>::New();
+      vtkMatrix4x4::Invert(matrix, matrixT); //not sure why, but this seems necessary for using the same .mat as when loading file with vv (probably due to the inversion trick performed in the vv reader...)
+      transform->SetMatrix(matrixT);
+      transformFilter->SetInputConnection(reader->GetOutputPort());
+      transformFilter->SetTransform(transform);
+      writer->SetInputConnection(transformFilter->GetOutputPort());
+
+    }
+    else { //just write the output
+      writer->SetInputConnection( reader->GetOutputPort() );
+    }
+
+    writer->Write();
+    return 0;
+  }
   else {
     read_points_pts(args_info.input_arg, inputPoints);
   }
   
   PointArrayType outputPoints;
-  transform_points(inputPoints, matrix, outputPoints);
+  PointArrayType spacingPoints;
+  PointArrayType* workingInputPoints = &inputPoints;
+  PointArrayType* workingOutputPoints = &outputPoints;
+  if (args_info.spacing_given) {
+    if (verbose) std::cout << "Processing spacing..." << std::endl;
+    
+    apply_spacing(*workingInputPoints, args_info.spacing_arg, spacingPoints);
+    workingInputPoints = &spacingPoints;
+    workingOutputPoints = &spacingPoints;
+  }
+
+  MatrixType matrix;
+  if (args_info.matrix_given) {
+    matrix = clitk::ReadMatrix3D(args_info.matrix_arg);
+    transform_points(*workingInputPoints, matrix, outputPoints);
+    workingOutputPoints = &outputPoints;
+  }
 
   if (strcmp(args_info.type_arg, "txt") == 0) {
-    write_points_txt(args_info.output_arg, outputPoints, data);
+    write_points_txt(args_info.output_arg, *workingOutputPoints, data);
   }
   else {
-    write_points_pts(args_info.output_arg, outputPoints);
+    write_points_pts(args_info.output_arg, *workingOutputPoints);
   }
   
   return 0;
@@ -74,14 +123,14 @@ void read_points_txt(const std::string& fileName, PointArrayType& points, TxtDat
 {
   std::ifstream landmarksFile(fileName.c_str());
   if (landmarksFile.fail()) {
-    std::cout << "ERROR: could not open '" << fileName << "'" << std::endl;
+    std::cerr << "ERROR: could not open '" << fileName << "'" << std::endl;
     exit(-2);
   }
   
   std::string line;
   std::getline(landmarksFile, line);
   if (line.find("LANDMARKS") == std::string::npos) {
-    std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
+    std::cerr << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
     exit(-3);
   }
   
@@ -119,14 +168,14 @@ void read_points_pts(const std::string& fileName, PointArrayType& points)
 {
   std::ifstream landmarksFile(fileName.c_str());
   if (landmarksFile.fail()) {
-    std::cout << "ERROR: could not open '" << fileName << "'" << std::endl;
+    std::cerr << "ERROR: could not open '" << fileName << "'" << std::endl;
     exit(-2);
   }
   
   std::string line;
   std::getline(landmarksFile, line);
   if (line.find("#X") != 0) {
-    std::cout << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
+    std::cerr << "ERROR: invalid landmarks file '" << fileName << "'" << std::endl;
     exit(-3);
   }
   
@@ -156,6 +205,22 @@ void write_points_pts(const std::string& fileName, const PointArrayType& points)
     landmarksFile << points[i][0] << "\t" << points[i][1] << "\t" << points[i][2] << "\t" << std::endl;
 }
 
+void apply_spacing(const PointArrayType& input, const double* spacing, PointArrayType& output)
+{
+  PointType out;
+  out.Fill(1);
+  
+  for (size_t i = 0; i < input.size(); i++) {
+    out[0] = input[i][0] * spacing[0];
+    out[1] = input[i][1] * spacing[1];
+    out[2] = input[i][2] * spacing[2];
+    if (verbose){
+      std::cout << "output " << out << std::endl;
+    }
+    output.push_back(out);
+  }
+}
+
 void transform_points(const PointArrayType& input, const MatrixType& matrix, PointArrayType& output)
 {
   for (size_t i = 0; i < input.size(); i++) {