1 #include "vvToolImageArithm.h"
3 #include "clitkImageArithmGenericFilter.h"
6 //------------------------------------------------------------------------------
7 // Create the tool and automagically (I like this word) insert it in
8 // the main window menu.
9 ADD_TOOL(vvToolImageArithm);
10 //------------------------------------------------------------------------------
12 //------------------------------------------------------------------------------
13 vvToolImageArithm::vvToolImageArithm(vvMainWindowBase * parent, Qt::WindowFlags f)
14 :vvToolWidgetBase(parent, f),
15 vvToolBase<vvToolImageArithm>(parent),
16 Ui::vvToolImageArithm() {
18 Ui_vvToolImageArithm::setupUi(mToolWidget);
21 mFilter = new clitk::ImageArithmGenericFilter<args_info_clitkImageArithm>;
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);
27 //------------------------------------------------------------------------------
30 //------------------------------------------------------------------------------
31 vvToolImageArithm::~vvToolImageArithm() {
33 //------------------------------------------------------------------------------
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);
44 //------------------------------------------------------------------------------
47 //------------------------------------------------------------------------------
48 void vvToolImageArithm::InputIsSelected(std::vector<vvSlicerManager *> & l) {
52 mGroupBoxOneInput->setEnabled(false);
53 mGroupBoxTwoInputs->setEnabled(true);
55 //------------------------------------------------------------------------------
58 //------------------------------------------------------------------------------
59 void vvToolImageArithm::InputIsSelected(vvSlicerManager * l) {
62 // DD("Single input");
63 mGroupBoxTwoInputs->setEnabled(false);
64 mGroupBoxOneInput->setEnabled(true);
66 //------------------------------------------------------------------------------
69 //------------------------------------------------------------------------------
70 void vvToolImageArithm::GetArgsInfoFromGUI() {
71 // DD("GetArgsInfoFromGUI");
72 mArgsInfo.input1_given = false;
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;
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();
101 mArgsInfo.output_given = false;
102 mArgsInfo.verbose_flag = false;
103 mArgsInfo.setFloatOutput_flag = mCheckBoxUseFloatOutputType->isChecked();
104 mArgsInfo.imagetypes_flag = false;
106 //------------------------------------------------------------------------------
109 //------------------------------------------------------------------------------
110 void vvToolImageArithm::apply() {
111 if (!mCurrentSlicerManager) close();
112 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
113 GetArgsInfoFromGUI();
115 std::vector<vvImage::Pointer> inputs;
118 inputs.push_back(mInput1->GetImage());
119 inputs.push_back(mInput2->GetImage());
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.");
134 inputs.push_back(mInput1->GetImage());
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);
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();
156 //------------------------------------------------------------------------------