]> Creatis software - clitk.git/blobdiff - vv/vvToolImageArithm.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvToolImageArithm.cxx
index 107973085d921ad3f79dbc25501502749de2b250..7b62110d275ac4ab234b4baa36088653c6e10756 100644 (file)
@@ -1,29 +1,20 @@
 /*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Program:   vv
-  Module:    $RCSfile: vvToolImageArithm.cxx,v $
-  Language:  C++
-  Date:      $Date: 2010/03/24 13:02:59 $
-  Version:   $Revision: 1.1 $
-  Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
+  Authors belong to:
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
-  Copyright (C) 2010
-  Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
-  CREATIS                   http://www.creatis.insa-lyon.fr
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, version 3 of the License.
+  It is distributed under dual licence
 
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  =========================================================================*/
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+===========================================================================**/
 
 #include "vvToolImageArithm.h"
 #include "vvSlicer.h"
@@ -38,13 +29,14 @@ ADD_TOOL(vvToolImageArithm);
 
 //------------------------------------------------------------------------------
 vvToolImageArithm::vvToolImageArithm(vvMainWindowBase * parent, Qt::WindowFlags f)
-  :vvToolWidgetBase(parent, f), 
-   vvToolBase<vvToolImageArithm>(parent), 
-   Ui::vvToolImageArithm() {
+  :vvToolWidgetBase(parent, f),
+   vvToolBase<vvToolImageArithm>(parent),
+   Ui::vvToolImageArithm()
+{
   // Setup the UI
   Ui_vvToolImageArithm::setupUi(mToolWidget);
 
-  // Main filter 
+  // Main filter
   mFilter = new clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>;
 
   // Set how many inputs are needed for this tool
@@ -55,25 +47,29 @@ vvToolImageArithm::vvToolImageArithm(vvMainWindowBase * parent, Qt::WindowFlags
 
 
 //------------------------------------------------------------------------------
-vvToolImageArithm::~vvToolImageArithm() {
+vvToolImageArithm::~vvToolImageArithm()
+{
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolImageArithm::Initialize() {
+void vvToolImageArithm::Initialize()
+{
   SetToolName("ImageArithm");
   SetToolMenuName("ImageArithm");
-  SetToolIconFilename(":/new/prefix1/icons/cross.png");
+  SetToolIconFilename(":/common/icons/arithm.png");
   SetToolTip("Perform simple arithmetic operations on one or two images.");
+  SetToolExperimental(false);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvToolImageArithm::InputIsSelected(std::vector<vvSlicerManager *> & l) {
+void vvToolImageArithm::InputIsSelected(std::vector<vvSlicerManager *> & l)
+{
   mInput1 = l[0];
-  mInput2 = l[1];  
+  mInput2 = l[1];
   mTwoInputs = true;
   mGroupBoxOneInput->setEnabled(false);
   mGroupBoxTwoInputs->setEnabled(true);
@@ -82,10 +78,10 @@ void vvToolImageArithm::InputIsSelected(std::vector<vvSlicerManager *> & l) {
 
 
 //------------------------------------------------------------------------------
-void vvToolImageArithm::InputIsSelected(vvSlicerManager * l) {
+void vvToolImageArithm::InputIsSelected(vvSlicerManager * l)
+{
   mInput1 = l;
   mTwoInputs = false;
-  // DD("Single input");
   mGroupBoxTwoInputs->setEnabled(false);
   mGroupBoxOneInput->setEnabled(true);
 }
@@ -93,8 +89,8 @@ void vvToolImageArithm::InputIsSelected(vvSlicerManager * l) {
 
 
 //------------------------------------------------------------------------------
-void vvToolImageArithm::GetArgsInfoFromGUI() {
-  //  DD("GetArgsInfoFromGUI");
+void vvToolImageArithm::GetArgsInfoFromGUI()
+{
   mArgsInfo.input1_given = false;
   if (mTwoInputs) {
     mArgsInfo.input2_given = true;
@@ -107,9 +103,10 @@ void vvToolImageArithm::GetArgsInfoFromGUI() {
     if (radioButtonMin->isChecked()) mArgsInfo.operation_arg = 4;
     if (radioButtonAbsDiff->isChecked()) mArgsInfo.operation_arg = 5;
     if (radioButtonSquaredDiff->isChecked()) mArgsInfo.operation_arg = 6;
-  }
-  else {
-    mArgsInfo.input2_given = false;    
+    if (radioButtonDifference->isChecked()) mArgsInfo.operation_arg = 7;
+    if (radioButtonRelativeDiff->isChecked()) mArgsInfo.operation_arg = 8;
+  } else {
+    mArgsInfo.input2_given = false;
     mArgsInfo.scalar_given = true;
     if (radioButtonSumV->isChecked()) mArgsInfo.operation_arg = 0;
     if (radioButtonMultiplyV->isChecked()) mArgsInfo.operation_arg = 1;
@@ -118,14 +115,17 @@ void vvToolImageArithm::GetArgsInfoFromGUI() {
     if (radioButtonMinV->isChecked()) mArgsInfo.operation_arg = 4;
     if (radioButtonAbsDiffV->isChecked()) mArgsInfo.operation_arg = 5;
     if (radioButtonSquaredDiffV->isChecked()) mArgsInfo.operation_arg = 6;
-    if (radioButtonLogV->isChecked()) mArgsInfo.operation_arg = 7;
-    if (radioButtonExpV->isChecked()) mArgsInfo.operation_arg = 8;
+    if (radioButtonLogAlone->isChecked()) mArgsInfo.operation_arg = 7;
+    if (radioButtonExpAlone->isChecked()) mArgsInfo.operation_arg = 8;
     if (radioButtonSqrtV->isChecked()) mArgsInfo.operation_arg = 9;
+    if (radioButtonDivideV->isChecked()) mArgsInfo.operation_arg = 11;
+    if (radioButtonNormalize->isChecked()) mArgsInfo.operation_arg = 12;
+    if (radioButtonLogV->isChecked()) mArgsInfo.operation_arg = 13;
     mArgsInfo.scalar_given = true;
     mArgsInfo.scalar_arg = mValueSpinBox->value();
   }
   mArgsInfo.output_given = false;
-  mArgsInfo.verbose_flag = false;  
+  mArgsInfo.verbose_flag = false;
   mArgsInfo.setFloatOutput_flag = mCheckBoxUseFloatOutputType->isChecked();
   mArgsInfo.imagetypes_flag = false;
 }
@@ -133,7 +133,8 @@ void vvToolImageArithm::GetArgsInfoFromGUI() {
 
 
 //------------------------------------------------------------------------------
-void vvToolImageArithm::apply() {
+void vvToolImageArithm::apply()
+{
   if (!mCurrentSlicerManager) close();
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   GetArgsInfoFromGUI();
@@ -143,39 +144,46 @@ void vvToolImageArithm::apply() {
     // Input
     inputs.push_back(mInput1->GetImage());
     inputs.push_back(mInput2->GetImage());
-    
+
     // Check input type
-    if (inputs[0]->GetScalarTypeAsString() != inputs[1]->GetScalarTypeAsString()) {
+    if (inputs[0]->GetScalarTypeAsITKString() != inputs[1]->GetScalarTypeAsITKString()) {
       std::cerr << "Sorry inputs should have the same pixeltype." << std::endl;
-      std::cerr << "Input1 = " << inputs[0]->GetScalarTypeAsString() << std::endl;
-      std::cerr << "Input2 = " << inputs[1]->GetScalarTypeAsString() << std::endl;
+      std::cerr << "Input1 = " << inputs[0]->GetScalarTypeAsITKString() << std::endl;
+      std::cerr << "Input2 = " << inputs[1]->GetScalarTypeAsITKString() << std::endl;
+      QApplication::restoreOverrideCursor();
+      QMessageBox::information(this, "Wrong image type","Sorry, could not perform operation. Please select inputs with same pixel type.");
+      close();
+      return;
+    }
+    
+    // Check size
+    if (!mInput1->GetImage()->HaveSameSizeAndSpacingThan(mInput2->GetImage())) {
+      std::cerr << "Sorry inputs should have the same size and spacing." << std::endl;
       QApplication::restoreOverrideCursor();
-      QMessageBox::information(this, "Wrong image type","Sorry, could not perform operation. Please select inputs with same pixe type.");
+      QMessageBox::information(this, "Wrong images size","Sorry, could not perform operation. Please select inputs with same size and spacing.");
       close();
       return;
     }
-  }   
-  else {
+  } else {
     // Input
     inputs.push_back(mInput1->GetImage());
-    DD("Single input");
   }
-   
+
   // Main filter
-  clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>::Pointer filter = 
+  clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>::Pointer filter =
     clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>::New();
   filter->SetInputVVImages(inputs);
   filter->SetArgsInfo(mArgsInfo);
   filter->EnableReadOnDisk(false);
   filter->EnableOverwriteInputImage(false);
   filter->Update();
-    
+
   // Output
   vvImage::Pointer output = filter->GetOutputVVImage();
   std::ostringstream osstream;
-  osstream << "Arithm_" << mArgsInfo.operation_arg << "_ " 
+  osstream << "Arithm_" << mArgsInfo.operation_arg << "_ "
            << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
-  AddImage(output,osstream.str()); 
+  AddImage(output,osstream.str());
   QApplication::restoreOverrideCursor();
   close();
 }