]> Creatis software - clitk.git/blob - vv/vvToolImageArithm.cxx
removed headers
[clitk.git] / vv / vvToolImageArithm.cxx
1 #include "vvToolImageArithm.h"
2 #include "vvSlicer.h"
3 #include "clitkImageArithmGenericFilter.h"
4 #include <QMessageBox>
5
6 //------------------------------------------------------------------------------
7 // Create the tool and automagically (I like this word) insert it in
8 // the main window menu.
9 ADD_TOOL(vvToolImageArithm);
10 //------------------------------------------------------------------------------
11
12 //------------------------------------------------------------------------------
13 vvToolImageArithm::vvToolImageArithm(vvMainWindowBase * parent, Qt::WindowFlags f)
14   :vvToolWidgetBase(parent, f), 
15    vvToolBase<vvToolImageArithm>(parent), 
16    Ui::vvToolImageArithm() {
17   // Setup the UI
18   Ui_vvToolImageArithm::setupUi(mToolWidget);
19
20   // Main filter 
21   mFilter = new clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>;
22
23   // Set how many inputs are needed for this tool
24   AddInputSelector("Select first image (A)", mFilter);
25   AddInputSelector("Select second image (B)", mFilter, true);
26 }
27 //------------------------------------------------------------------------------
28
29
30 //------------------------------------------------------------------------------
31 vvToolImageArithm::~vvToolImageArithm() {
32 }
33 //------------------------------------------------------------------------------
34
35
36 //------------------------------------------------------------------------------
37 void vvToolImageArithm::Initialize() {
38   SetToolName("ImageArithm");
39   SetToolMenuName("ImageArithm");
40   SetToolIconFilename(":/new/prefix1/icons/cross.png");
41   SetToolTip("Perform simple arithmetic operations on one or two images.");
42   SetToolExperimental(true);
43 }
44 //------------------------------------------------------------------------------
45
46
47 //------------------------------------------------------------------------------
48 void vvToolImageArithm::InputIsSelected(std::vector<vvSlicerManager *> & l) {
49   mInput1 = l[0];
50   mInput2 = l[1];  
51   mTwoInputs = true;
52   mGroupBoxOneInput->setEnabled(false);
53   mGroupBoxTwoInputs->setEnabled(true);
54 }
55 //------------------------------------------------------------------------------
56
57
58 //------------------------------------------------------------------------------
59 void vvToolImageArithm::InputIsSelected(vvSlicerManager * l) {
60   mInput1 = l;
61   mTwoInputs = false;
62   // DD("Single input");
63   mGroupBoxTwoInputs->setEnabled(false);
64   mGroupBoxOneInput->setEnabled(true);
65 }
66 //------------------------------------------------------------------------------
67
68
69 //------------------------------------------------------------------------------
70 void vvToolImageArithm::GetArgsInfoFromGUI() {
71   //  DD("GetArgsInfoFromGUI");
72   mArgsInfo.input1_given = false;
73   if (mTwoInputs) {
74     mArgsInfo.input2_given = true;
75     mArgsInfo.input2_arg = new char; // need to indicate that there are two inputs
76     mArgsInfo.scalar_given = false;
77     if (radioButtonSum->isChecked()) mArgsInfo.operation_arg = 0;
78     if (radioButtonMultiply->isChecked()) mArgsInfo.operation_arg = 1;
79     if (radioButtonDivide->isChecked()) mArgsInfo.operation_arg = 2;
80     if (radioButtonMax->isChecked()) mArgsInfo.operation_arg = 3;
81     if (radioButtonMin->isChecked()) mArgsInfo.operation_arg = 4;
82     if (radioButtonAbsDiff->isChecked()) mArgsInfo.operation_arg = 5;
83     if (radioButtonSquaredDiff->isChecked()) mArgsInfo.operation_arg = 6;
84   }
85   else {
86     mArgsInfo.input2_given = false;    
87     mArgsInfo.scalar_given = true;
88     if (radioButtonSumV->isChecked()) mArgsInfo.operation_arg = 0;
89     if (radioButtonMultiplyV->isChecked()) mArgsInfo.operation_arg = 1;
90     if (radioButtonInverseV->isChecked()) mArgsInfo.operation_arg = 2;
91     if (radioButtonMaxV->isChecked()) mArgsInfo.operation_arg = 3;
92     if (radioButtonMinV->isChecked()) mArgsInfo.operation_arg = 4;
93     if (radioButtonAbsDiffV->isChecked()) mArgsInfo.operation_arg = 5;
94     if (radioButtonSquaredDiffV->isChecked()) mArgsInfo.operation_arg = 6;
95     if (radioButtonLogV->isChecked()) mArgsInfo.operation_arg = 7;
96     if (radioButtonExpV->isChecked()) mArgsInfo.operation_arg = 8;
97     if (radioButtonSqrtV->isChecked()) mArgsInfo.operation_arg = 9;
98     mArgsInfo.scalar_given = true;
99     mArgsInfo.scalar_arg = mValueSpinBox->value();
100   }
101   mArgsInfo.output_given = false;
102   mArgsInfo.verbose_flag = false;  
103   mArgsInfo.setFloatOutput_flag = mCheckBoxUseFloatOutputType->isChecked();
104   mArgsInfo.imagetypes_flag = false;
105 }
106 //------------------------------------------------------------------------------
107
108
109 //------------------------------------------------------------------------------
110 void vvToolImageArithm::apply() {
111   if (!mCurrentSlicerManager) close();
112   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
113   GetArgsInfoFromGUI();
114
115   std::vector<vvImage::Pointer> inputs;
116   if (mTwoInputs) {
117     // Input
118     inputs.push_back(mInput1->GetImage());
119     inputs.push_back(mInput2->GetImage());
120     
121     // Check input type
122     if (inputs[0]->GetScalarTypeAsString() != inputs[1]->GetScalarTypeAsString()) {
123       std::cerr << "Sorry inputs should have the same pixeltype." << std::endl;
124       std::cerr << "Input1 = " << inputs[0]->GetScalarTypeAsString() << std::endl;
125       std::cerr << "Input2 = " << inputs[1]->GetScalarTypeAsString() << std::endl;
126       QApplication::restoreOverrideCursor();
127       QMessageBox::information(this, "Wrong image type","Sorry, could not perform operation. Please select inputs with same pixe type.");
128       close();
129       return;
130     }
131   }   
132   else {
133     // Input
134     inputs.push_back(mInput1->GetImage());
135     DD("Single input");
136   }
137    
138   // Main filter
139   clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>::Pointer filter = 
140     clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>::New();
141   filter->SetInputVVImages(inputs);
142   filter->SetArgsInfo(mArgsInfo);
143   filter->EnableReadOnDisk(false);
144   filter->EnableOverwriteInputImage(false);
145   filter->Update();
146     
147   // Output
148   vvImage::Pointer output = filter->GetOutputVVImage();
149   std::ostringstream osstream;
150   osstream << "Arithm_" << mArgsInfo.operation_arg << "_ " 
151            << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
152   AddImage(output,osstream.str()); 
153   QApplication::restoreOverrideCursor();
154   close();
155 }
156 //------------------------------------------------------------------------------