]> Creatis software - cpPlugins.git/blob - appli/examples/example_Test_Memento.cxx
More tree visualization
[cpPlugins.git] / appli / examples / example_Test_Memento.cxx
1 #include <future>
2 #include <iostream>
3 #include <cpExtensions/IO/MementoState.h>
4
5 #include <vtkSmartPointer.h>
6 #include <vtkRenderWindow.h>
7 #include <vtkRenderWindowInteractor.h>
8 #include <vtkRenderer.h>
9
10 #include <vtkImageCast.h>
11 #include <vtkMetaImageWriter.h>
12 #include <vtkMetaImageReader.h>
13 #include <vtkImageMandelbrotSource.h>
14 #include <vtkImageActor.h>
15 #include <vtkRenderWindowInteractor.h>
16
17 #include <itkImage.h>
18 #include <itkBinaryErodeImageFilter.h>
19 #include <itkBinaryBallStructuringElement.h>
20 #include <itkImageFileReader.h>
21
22 #include <itkImageToVTKImageFilter.h>
23 #include <itkVTKImageToImageFilter.h>
24 #include <itkBinaryThresholdImageFilter.h>
25 #include <itkInvertIntensityImageFilter.h>
26
27 typedef itk::Image<unsigned char, 2>    ImageType;
28 typedef itk::ImageFileReader<ImageType> ReaderType;
29
30 typedef cpPlugins::Interface::Image            TPluginImage;
31
32 int main() {
33   auto memento = cpExtensions::IO::MementoState();
34   
35   //here goes the code
36   
37   
38   std::string filePath = "julia_mha.mhd";
39   std::string filePathRaw = "julia_mha.raw";
40   // Create an image
41   vtkSmartPointer<vtkImageMandelbrotSource> source =
42     vtkSmartPointer<vtkImageMandelbrotSource>::New();
43
44   vtkSmartPointer<vtkImageCast> castFilter =
45     vtkSmartPointer<vtkImageCast>::New();
46   castFilter->SetOutputScalarTypeToUnsignedChar();
47   castFilter->SetInputConnection(source->GetOutputPort());
48   castFilter->Update();
49
50   vtkSmartPointer<vtkMetaImageWriter> writer =
51     vtkSmartPointer<vtkMetaImageWriter>::New();
52   writer->SetInputConnection(castFilter->GetOutputPort());
53   writer->SetFileName(filePath.c_str());
54   writer->SetRAWFileName(filePathRaw.c_str());
55   writer->Write();
56
57   //ReaderType::Pointer reader = ReaderType::New();
58   vtkSmartPointer<vtkMetaImageReader> reader =
59     vtkSmartPointer<vtkMetaImageReader>::New();
60   reader->SetFileName(filePath.c_str());
61   reader->Update();
62   
63   //first memento
64  /* auto obj = TPluginImage::New();
65
66   auto oo = dynamic_cast<cpPlugins::Interface::Image *> (reader->GetOutput());
67   obj->SetSource(oo);
68   memento.SetToMemento(oo);*/
69
70   // filter 1 (state 2) ---------------------------------------------------------------
71   
72   typedef itk::BinaryBallStructuringElement<
73     ImageType::PixelType, 2>                  StructuringElementType;
74   StructuringElementType structuringElement;
75   structuringElement.SetRadius(10);
76   structuringElement.CreateStructuringElement();
77
78   typedef itk::VTKImageToImageFilter<ImageType>       imgToFilter;
79   imgToFilter::Pointer connectorimg = imgToFilter::New();
80   connectorimg->SetInput(reader->GetOutput());
81   connectorimg->Update();
82
83   typedef itk::BinaryErodeImageFilter<ImageType, ImageType, StructuringElementType>
84     BinaryErodeImageFilterType;
85   
86   BinaryErodeImageFilterType::Pointer erodeFilter
87     = BinaryErodeImageFilterType::New();
88   erodeFilter->SetInput(connectorimg->GetOutput());
89   erodeFilter->SetKernel(structuringElement);
90
91   // filter 2 (state 3) ---------------------------------------------------------------
92
93   typedef itk::BinaryThresholdImageFilter<ImageType, ImageType>
94     BinaryThresholdImageFilterType;
95
96   BinaryThresholdImageFilterType::Pointer thresholdFilter
97     = BinaryThresholdImageFilterType::New();
98   thresholdFilter->SetInput(erodeFilter->GetOutput());
99   thresholdFilter->SetLowerThreshold(10);
100   thresholdFilter->SetUpperThreshold(30);
101   thresholdFilter->SetInsideValue(255);
102   thresholdFilter->SetOutsideValue(0);
103
104
105   // filter 3 (state 4) ---------------------------------------------------------------
106
107   typedef itk::InvertIntensityImageFilter <ImageType>
108     InvertIntensityImageFilterType;
109
110   InvertIntensityImageFilterType::Pointer invertIntensityFilter
111     = InvertIntensityImageFilterType::New();
112   invertIntensityFilter->SetInput(thresholdFilter->GetOutput());
113   invertIntensityFilter->SetMaximum(255);
114
115   // undo (state 3) ---------------------------------------------------------------
116
117   // undo (state 2) ---------------------------------------------------------------
118
119   // redo (state 3) ---------------------------------------------------------------
120
121   // visualization -- just for test
122
123   typedef itk::ImageToVTKImageFilter<ImageType>       ConnectorType;
124   ConnectorType::Pointer connector = ConnectorType::New();
125   connector->SetInput(invertIntensityFilter->GetOutput());
126   connector->Update();
127
128   vtkSmartPointer<vtkImageActor> actor =
129     vtkSmartPointer<vtkImageActor>::New();
130   actor->GetMapper()->SetInputData(connector->GetOutput());
131
132   vtkSmartPointer<vtkRenderer> renderer =
133     vtkSmartPointer<vtkRenderer>::New();
134   vtkSmartPointer<vtkRenderWindow> renderWindow =
135     vtkSmartPointer<vtkRenderWindow>::New();
136   renderWindow->AddRenderer(renderer);
137   vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
138     vtkSmartPointer<vtkRenderWindowInteractor>::New();
139   renderWindowInteractor->SetRenderWindow(renderWindow);
140
141   renderer->AddActor(actor);
142   renderer->SetBackground(.2, .3, .4);
143
144   renderWindow->Render();
145   renderWindowInteractor->Start();
146
147
148
149 //#ifdef _DEBUG
150 //  auto i = 0;
151 //  std::cout << "wait for close";
152 //  std::cin >> i;
153 //#endif
154
155   return 0;
156
157 }