]> Creatis software - cpPlugins.git/blob - appli/examples/example_Test_Memento.cxx
f5deefd7cc88f34a88df5c6142376c013de5a25a
[cpPlugins.git] / appli / examples / example_Test_Memento.cxx
1 #include <future>
2 #include <iostream>
3 #include <cpExtensions/IO/MementoState.h>
4 #include <cpPlugins/Plugins/BasicFilters/BinaryErodeImageFilter.h>
5
6 #include <vtkRenderWindow.h>
7 #include <vtkRenderWindowInteractor.h>
8 #include <vtkRenderer.h>
9
10 #include <itkImageToVTKImageFilter.h>
11
12 #ifdef WIN32
13 #define myWait Sleep(10000);
14 #else
15 #define myWait usleep(10000);
16 #endif
17
18
19 // -------------------------------------------------------------------------
20 // type definiftions
21
22 typedef cpPlugins::Interface::Interface     TInterface;
23 typedef cpPlugins::Interface::ProcessObject TProcessObject;
24 typedef cpPlugins::Interface::DataObject    TDataObject;
25 typedef cpPlugins::Interface::Image         TImage;
26 typedef cpPlugins::Interface::Parameters    TParameters;
27 typedef TInterface::TClasses                TClasses;
28
29 typedef cpExtensions::Visualization::ImageSliceActors TSliceActors;
30
31 typedef cpExtensions::IO::MementoState TMemento;
32 typedef cpPlugins::BasicFilters::BinaryErodeImageFilter TBinaryErodeFilter;
33 // -------------------------------------------------------------------------
34
35 std::string _pathIOplugin = "C://dev//creatis//cpPlugins//build//Debug//cpPluginsIO.dll";
36 std::string _pathBasicFiltersPlugin= "C://dev//creatis//cpPlugins//build//Debug//cpPluginsBasicFilters.dll";
37 std::string _img = "C://img//SphereVolume.mhd";
38
39 int main(int argc, char* argv[])
40 {
41   if (argc >= 3)
42   {   
43     _img = argv[1];
44     _pathIOplugin = argv[2];
45     _pathBasicFiltersPlugin = argv[3];
46   }
47
48   // Create interface
49    TInterface plugins;
50   if (!plugins.Load(_pathIOplugin) ||
51       !plugins.Load(_pathBasicFiltersPlugin))
52   {
53     std::cerr << "Failed to load plugins." << std::endl;
54     return(1);
55   }
56
57   // Create reader
58   TProcessObject::Pointer reader;
59   reader = plugins.CreateObject("cpPlugins::IO::ImageReader");
60   if (reader.IsNull())
61   {
62     std::cerr
63       << "No suitable reader found in plugins." << std::endl
64       << "Reader: " << reader.GetPointer() << std::endl
65       << std::endl;
66     return(1);
67   }
68
69   // Configure reader
70   TParameters* reader_params = reader->GetParameters();
71   reader_params->AddToStringList("FileNames", _img);
72
73   // Execute pipeline
74   std::string err = reader->Update();
75   if (err != "")
76   {
77     std::cerr << "ERROR: " << err << std::endl;
78     return(1);
79
80   }
81
82   TImage* image = reader->GetOutput< TImage >("Output");
83
84   //first memento
85   TMemento* _memento = new TMemento();
86   _memento->SetToMemento(image);
87   
88  /* auto retrievedImage = _memento->GetFromMemento(1);
89   image->SetVTK(retrievedImage);
90 */
91   // filter 1 (state 2) ---------------------------------------------------------------
92
93   TProcessObject::Pointer binaryFilter;
94   binaryFilter = plugins.CreateObject("cpPlugins::BasicFilters::BinaryErodeImageFilter");
95   if (binaryFilter.IsNull())
96   {
97     std::cerr
98       << "No suitable reader found in plugins." << std::endl
99       << "Reader: " << binaryFilter.GetPointer() << std::endl
100       << std::endl;
101     return(1);
102   }
103
104   // filter 1
105   TDataObject * readerOut = reader->GetOutput< TDataObject >("Output");
106   binaryFilter->SetInput("Input", readerOut);
107   binaryFilter->Update();
108   _memento->SetToMemento(binaryFilter->GetOutput< TImage >("Output"));
109
110   myWait;
111
112   vtkSmartPointer<vtkImageData> retrievedImage = _memento->MementoUndo();
113   
114   // the retrieved image could not be ready if this happens the function returns null
115   // for the test we made the example wait before try to read but this is the way 
116   // to handle this
117   if (retrievedImage == nullptr)
118   {
119     return (1);
120   }
121   
122   //image->SetVTK(retrievedImage.Get()); // this metohd is not implemented yet
123
124   // Configure visualization objects
125   vtkSmartPointer< vtkRenderer > renderer =
126     vtkSmartPointer< vtkRenderer >::New();
127   renderer->SetBackground(0.1, 0.1, 0.1);
128
129   vtkSmartPointer< vtkRenderWindow > window =
130     vtkSmartPointer< vtkRenderWindow >::New();
131   window->AddRenderer(renderer);
132   window->SetSize(600, 600);
133
134   // Set up the interaction
135   vtkSmartPointer< vtkRenderWindowInteractor > interactor =
136     vtkSmartPointer< vtkRenderWindowInteractor >::New();
137   window->SetInteractor(interactor);
138
139   // Create slice actors
140   vtkSmartPointer< TSliceActors > image_actors =
141     vtkSmartPointer< TSliceActors >::New();
142   //image_actors->SetInputImage(image->GetVTK< vtkImageData >(), 2);
143   image_actors->SetInputImage(retrievedImage);
144   image_actors->SetAxis(2);
145   image_actors->PushActorsInto(window);
146
147   // Begin interaction
148   renderer->ResetCamera();
149   window->Render();
150   interactor->Start();
151
152   return 0;
153
154 }