]> Creatis software - clitk.git/blobdiff - vv/vvImageReader.cxx
added functionalities such as Reset a Transform, Save and view transformations etc.
[clitk.git] / vv / vvImageReader.cxx
index fde48ce89e5a7e99d462e833b30b5618472dee79..e3e01a3b72076634293edfb0fe473a701116be83 100644 (file)
@@ -1,7 +1,7 @@
 /*=========================================================================
   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Authors belong to: 
+  Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-======================================================================-====*/
-#ifndef vvImageReader_CXX
-#define vvImageReader_CXX
+  ======================================================================-====*/
+#ifndef VVIMAGEREADER_CXX
+#define VVIMAGEREADER_CXX
+
 #include <QApplication>
 #include <itkImageFileReader.h>
 #include "vvImageReader.h"
 #include "vvImageReader.txx"
 
-
-//====================================================================
+//------------------------------------------------------------------------------
 vvImageReader::vvImageReader()
 {
-    mImage = NULL;
-    mInputFilenames.resize(0);
-    mLastError = "";
-    mType = UNDEFINEDIMAGETYPE;
+  mImage = NULL;
+  mInputFilenames.resize(0);
+  mLastError = "";
+  mType = UNDEFINEDIMAGETYPE;
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 vvImageReader::~vvImageReader() { }
+//------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
 void vvImageReader::Update()
 {
-    Update(mType);
+  Update(mType);
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 void vvImageReader::Update(LoadedImageType type)
 {
-    itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(mInputFilenames[0].c_str(), itk::ImageIOFactory::ReadMode);
-    if (!reader) {
-        mLastError="Unable to read file.";
-    }
-    else {
-        reader->SetFileName(mInputFilenames[0]);
-        reader->ReadImageInformation();
-        if (mInputFilenames.size() > 1)
-            Update(reader->GetNumberOfDimensions()+1,reader->GetComponentTypeAsString(reader->GetComponentType()),type);
-        else
-            Update(reader->GetNumberOfDimensions(),reader->GetComponentTypeAsString(reader->GetComponentType()),type);
-    }
+  itk::ImageIOBase::Pointer reader = itk::ImageIOFactory::CreateImageIO(mInputFilenames[0].c_str(), itk::ImageIOFactory::ReadMode);
+  if (!reader) {
+    mLastError="Unable to read file.";
+  } else {
+    reader->SetFileName(mInputFilenames[0]);
+    reader->ReadImageInformation();
+    if (mInputFilenames.size() > 1)
+      Update(reader->GetNumberOfDimensions()+1,reader->GetComponentTypeAsString(reader->GetComponentType()),type);
+    else
+      Update(reader->GetNumberOfDimensions(),reader->GetComponentTypeAsString(reader->GetComponentType()),type);
+  }
 }
+//------------------------------------------------------------------------------
 
-//====================================================================
-void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType type) {
-    //CALL_FOR_ALL_DIMS(dim,UpdateWithDim,inputPixelType);
-    mType = type;
-    mDim = dim;
-    mInputPixelType=inputPixelType;
-    this->start(); //Start heavy read operation in a separate thread
-    while (this->isRunning())
-    {
-        qApp->processEvents();
-        this->wait(50);
-    }
+
+//------------------------------------------------------------------------------
+void vvImageReader::Update(int dim,std::string inputPixelType, LoadedImageType type)
+{
+  //CALL_FOR_ALL_DIMS(dim,UpdateWithDim,inputPixelType);
+  mType = type;
+  mDim = dim;
+  mInputPixelType=inputPixelType;
+  this->start(); //Start heavy read operation in a separate thread
+  while (this->isRunning()) {
+    qApp->processEvents();
+    this->wait(50);
+  }
 }
+//------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
 void vvImageReader::run()
 {
-    switch(mDim)
-    {
-        case 2:
-            UpdateWithDim<2>(mInputPixelType);
-            break;;
-        case 3:
-            UpdateWithDim<3>(mInputPixelType);
-            break;;
-        case 4:
-            UpdateWithDim<4>(mInputPixelType);
-            break;;
-        default:
-            std::cerr << "dimension unknown in Update ! " << std::endl;
-    }
+  switch(mDim)     {
+  case 2:
+    UpdateWithDim<2>(mInputPixelType);
+    break;;
+  case 3:
+    UpdateWithDim<3>(mInputPixelType);
+    break;;
+  case 4:
+    UpdateWithDim<4>(mInputPixelType);
+    break;;
+  default:
+    std::cerr << "dimension unknown in Update ! " << std::endl;
+  }
 }
-//====================================================================
+//------------------------------------------------------------------------------
+
 
-//====================================================================
-/*void vvImageReader::Extract(int dim, std::string inputPixelType, int slice) {
-  CALL_FOR_ALL_DIMS(dim, ExtractWithDim, inputPixelType, slice);
-}*/
-//====================================================================
+//------------------------------------------------------------------------------
 void vvImageReader::SetInputFilename(const std::string & filename)
 {
-    mInputFilenames.resize(0);
-    mInputFilenames.push_back(filename);
+  mInputFilenames.resize(0);
+  mInputFilenames.push_back(filename);
 }
+//------------------------------------------------------------------------------
 
-//====================================================================
-void vvImageReader::SetInputFilenames(const std::vector<std::string> & filenames) {
-    mInputFilenames = filenames;
+
+//------------------------------------------------------------------------------
+void vvImageReader::SetInputFilenames(const std::vector<std::string> & filenames)
+{
+  mInputFilenames = filenames;
 }
-//====================================================================
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+//Read transformation in NKI format (Xdr, transposed, cm)
+void vvImageReader::ReadNkiImageTransform()
+{
+  bool bRead=true;
+  typedef itk::ImageFileReader< itk::Image< double, 2 > > MatrixReaderType;
+  MatrixReaderType::Pointer readerTransfo = MatrixReaderType::New();
+  readerTransfo->SetFileName(mInputFilenames[0]+".MACHINEORIENTATION");
+  try {
+    readerTransfo->Update();
+  } catch( itk::ExceptionObject & err ) {
+    bRead=false;
+  }
 
+  if (bRead) {
+    double mat[16];
+
+    //Transpose matrix (NKI format)
+    for(int j=0; j<4; j++)
+      for(int i=0; i<4; i++)
+        mat[4*j+i]=readerTransfo->GetOutput()->GetBufferPointer()[4*i+j];
+
+    //From cm to mm
+    for(int i=0; i<3; i++)
+      mat[4*i+3]*=10;
+
+    //Set Transformation
+    vtkSmartPointer<vtkTransform> pt = vtkSmartPointer<vtkTransform>::New();
+    pt->SetMatrix( mat );
+    pt->Inverse();
+    mImage->SetTransform( pt );
+  }
+}
+//------------------------------------------------------------------------------
 #endif