]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxSegmentationFM3DWidget.cxx
creaMaracasVisu Library
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxSegmentationFM3DWidget.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: wxSegmentationFM3DWidget.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/10/31 16:32:43 $
7   Version:   $Revision: 1.1 $
8
9   Copyright: (c) 2002, 2003
10   License:
11
12      This software is distributed WITHOUT ANY WARRANTY; without even
13      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14      PURPOSE.  See the above copyright notice for more information.
15
16 =========================================================================*/
17
18
19
20 #include <wx/wx.h>
21 #include <wx/splitter.h>
22 #include <wx/notebook.h>
23 #include <wx/colordlg.h>
24
25 #include "vtkMarchingCubes.h"
26 #include "vtkPolyDataMapper.h"
27 #include "vtkActor.h"
28
29
30 #include "wxSegmentationFM3DWidget.h"
31
32
33 //-------------------------------------------------------------------
34 //-------------------------------------------------------------------
35 //-------------------------------------------------------------------
36
37 BEGIN_EVENT_TABLE( wxSegmentationFM3DWidget, wxPanel )
38         EVT_MENU( 12121, wxSegmentationFM3DWidget::OnRefreshView )
39 //      EVT_MENU( 12122, wxSegmentationFM3DWidget::OnDClickLeft  )
40 END_EVENT_TABLE( );
41
42
43 wxSegmentationFM3DWidget::wxSegmentationFM3DWidget( wxWindow* parent,
44                           marImageData *marimageData ,double voxelSize)
45 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
46 {
47
48         _voxelSize                                                      = voxelSize;
49         _marimageData                                                   = marimageData;
50
51         _wxvtk3Dbaseview_Clipping3D_C           = NULL;
52         _wxvtkmpr3Dview_C                                       = NULL;
53         _wxvtkclipping3Dview_C                          = NULL;
54
55         wxSplitterWindow* mainSplitter = new wxSplitterWindow(this,-1);
56     wxSplitterWindow    *pnlSplitter    = new wxSplitterWindow( mainSplitter , -1);
57         
58         int ww,hh;
59         _MPRWidget2                                     = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
60         wxPanel *       contour3DView   = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
61         this->GetSize(&ww,&hh);
62
63     pnlSplitter -> SplitVertically( _MPRWidget2, contour3DView , 600);
64
65
66
67
68
69         //PANEL DE OPERACIONES
70         //------------------------------------------------------------------
71         
72         wxPanel* panelOperaciones          = new wxPanel(mainSplitter, -1);
73
74         wxFlexGridSizer *fgs = new wxFlexGridSizer(2);
75
76         fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Fast Marching Controls")));
77         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
78         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
79         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
80
81         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Alpha")));
82         slAlpha = new wxSlider(panelOperaciones, -1, 50, 1, 400, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
83         fgs->Add(slAlpha);
84         
85         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Beta")));
86         slBeta = new wxSlider(panelOperaciones, -1, 128, 0, 800, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
87         fgs->Add(slBeta);
88                 
89         btnSegment = new wxButton(panelOperaciones, -1, _T("Segment"));
90         fgs->Add(btnSegment);
91         btnUndo = new wxButton(panelOperaciones, -1, _T("Undo"));
92         fgs->Add(btnUndo);
93         
94         
95
96         
97         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
98         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
99
100
101         
102         fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Mesh Controls")));
103         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
104         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
105         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
106
107         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Opacity")));
108         slVolumeOpacity = new wxSlider(panelOperaciones, -1,50,1,100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
109         fgs->Add(slVolumeOpacity);
110
111         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Sigma")));
112         slSigmaLevel = new wxSlider(panelOperaciones, -1,100,1,300, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
113         fgs->Add(slSigmaLevel);
114
115         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Convergence")));
116         slLaplacianConvergence = new wxSlider(panelOperaciones, -1,3000,1,3000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
117         fgs->Add(slLaplacianConvergence);
118
119         fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Iterations")));
120         slLaplacianIterations = new wxSlider(panelOperaciones, -1,100,1,2000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
121         fgs->Add(slLaplacianIterations);
122         
123         panelOperaciones->SetSizer(fgs);
124
125         btnUndo->Disable();
126         slSigmaLevel->Disable();
127         slVolumeOpacity->Disable();
128         slLaplacianConvergence->Disable();
129         slLaplacianIterations->Disable();
130
131         Connect(slAlpha->GetId(),                               wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeAlpha);
132         Connect(slBeta->GetId(),                                wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeBeta);
133         Connect(btnSegment->GetId(),                    wxEVT_COMMAND_BUTTON_CLICKED,   (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnSegment);
134         Connect(btnUndo->GetId(),                               wxEVT_COMMAND_BUTTON_CLICKED,   (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnUndo);
135         Connect(slVolumeOpacity->GetId(),               wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeOpacity);
136         Connect(slSigmaLevel->GetId(),                  wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeSigmaLevel);
137         Connect(slLaplacianConvergence->GetId(),wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianConvergence);
138         Connect(slLaplacianIterations->GetId(), wxEVT_SCROLL_THUMBRELEASE,              (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianIteration);
139         //-------------------------------------------------------------------
140
141         mainSplitter->SplitVertically(pnlSplitter, panelOperaciones, 600);
142
143         wxBoxSizer      *sizer  = new wxBoxSizer(wxVERTICAL  );
144         sizer->Add(mainSplitter,1, wxGROW,0);
145         pnlSplitter     -> SetMinimumPaneSize( 50 );
146         this            -> SetSizer(sizer);
147
148
149         // MODELO
150         //------------------------------------------------------------------
151         alphaValue = 0.5;
152         betaValue = 128;
153         opacityValue = 0.5;
154         convergenceValue = 1;
155         iterationsValue = 100;
156         filtroSegmentacion = new itkFM3D();
157         //------------------------------------------------------------------
158
159
160         // RENDERIZACION VTK
161         //------------------------------------------------------------------
162         f_gauss = vtkImageGaussianSmooth::New();
163         f_laplace = vtkSmoothPolyDataFilter::New();
164         f_cubes = vtkMarchingCubes::New();
165         f_mapper = vtkPolyDataMapper::New();
166         f_cubes->SetInput(f_gauss->GetOutput());
167         f_cubes->SetValue(0,128);
168         f_laplace->SetInput(f_cubes->GetOutput());
169         f_mapper->SetInput(f_laplace->GetOutput());
170         f_mapper->ScalarVisibilityOff();
171         f_actor = vtkActor::New();
172         f_actor->SetMapper(f_mapper);
173         f_actor->GetProperty()->SetColor(0.9,0.5,0.5);
174         //------------------------------------------------------------------
175
176         
177 }
178
179 //----------------------------------------------------------------------------
180
181 wxSegmentationFM3DWidget::~wxSegmentationFM3DWidget( )
182 {
183         if (_wxvtk3Dbaseview_Clipping3D_C       != NULL) { delete       _wxvtk3Dbaseview_Clipping3D_C;  }
184         if (_wxvtkmpr3Dview_C                           != NULL) { delete       _wxvtkmpr3Dview_C;                              }
185         if (_wxvtkclipping3Dview_C                      != NULL) { delete       _wxvtkclipping3Dview_C;                 }
186 }
187
188
189 //----------------------------------------------------------------------------
190 wxPanel* wxSegmentationFM3DWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
191 {
192         wxWindow *wxwindow;
193         wxPanel *panel=new wxPanel(parent,-1);
194
195         wxSplitterWindow        *panelClipping3D        = new wxSplitterWindow( panel , -1);
196         _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
197
198         _wxvtkclipping3Dview_C = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_C);
199         vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer(); 
200         vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
201         vtkclipping3Ddataviewer->Configure();
202         _wxvtkclipping3Dview_C->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
203
204         _wxvtkmpr3Dview_C = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_C );
205         vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer(); 
206         vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
207         vtkmpr3Ddataviewer->Configure();
208         _wxvtkmpr3Dview_C->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
209
210         wxWindow        *window3D                               = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
211
212         wxPanel         *panelControl                   = new wxPanel(panelClipping3D,-1);      
213         wxPanel         *controlPanelMPR3D              = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
214         wxPanel         *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
215
216 //      wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
217         wxFlexGridSizer  *sizerCtrol        = new wxFlexGridSizer(1);
218
219         sizerCtrol->Add(controlPanelMPR3D , 1, wxALL|wxEXPAND, 2);
220         sizerCtrol->Add(controlPanelClipping3D , 1, wxALL|wxEXPAND, 2);
221         panelControl->SetAutoLayout(true);
222         panelControl->SetSizer(sizerCtrol);
223         panelControl->SetSize(400,350);
224         panelControl->Layout();
225
226         int ww,hh;
227         wxWindow *pp=this;
228         while (pp->GetParent()!=NULL) pp=pp->GetParent();
229         pp->GetSize(&ww,&hh);
230
231 //EEDxx2.4
232 //              panelClipping3D -> SetMinimumPaneSize( -50 );
233         panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
234         wxwindow=panelClipping3D;
235
236     wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
237         sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
238         panel->SetAutoLayout(true);
239         panel->SetSizer(sizerH1);
240         panel->SetSize(400,400);
241         panel->Layout();
242
243 //EEDxx2.4
244 //      panel->FitInside();
245 //      FitInside();
246
247         return panel;
248 }
249
250
251 //----------------------------------------------------------------------------
252 void wxSegmentationFM3DWidget::ConfigureVTK(){
253         _MPRWidget2->ConfigureVTK();
254         _wxvtk3Dbaseview_Clipping3D_C   ->  Configure();
255         _wxvtkmpr3Dview_C                               ->      Configure();
256         _wxvtkclipping3Dview_C                  ->      Configure();
257
258         vtkInteractorStyle3DView *vtkinteractorstyle3Dview      = new vtkInteractorStyle3DView();
259         vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
260         vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
261         _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
262
263 }
264
265 //----------------------------------------------------------------------------
266 vtkMPRBaseData  *wxSegmentationFM3DWidget::GetVtkMPRBaseData(){
267         return _MPRWidget2->GetVtkMPRBaseData();
268 }
269 //----------------------------------------------------------------------------
270 vtkPlane2DView *wxSegmentationFM3DWidget::GetVtkPlane2DView()
271 {
272         return _MPRWidget2->GetVtkPlane2DView();
273 }
274 //----------------------------------------------------------------------------
275 void wxSegmentationFM3DWidget::OnRefreshView(wxCommandEvent & event)
276 {
277         RefreshView();
278 }
279 //----------------------------------------------------------------------------
280 void wxSegmentationFM3DWidget::RefreshView()
281 {
282         this->_MPRWidget2->RefreshView();
283         _wxvtkmpr3Dview_C                               -> RefreshView();
284         _wxvtkclipping3Dview_C                  -> Refresh();
285         _wxvtk3Dbaseview_Clipping3D_C   -> Refresh();
286 }
287
288
289
290
291
292 /**
293 * This method is invoked when the segmentation button is pressed
294
295 */
296 void wxSegmentationFM3DWidget::OnBtnSegment(wxCommandEvent& event){
297
298         wxBusyCursor wait;
299         
300
301         double x =_MPRWidget2->GetVtkMPRBaseData()->GetX();
302         double y =_MPRWidget2->GetVtkMPRBaseData()->GetY();
303         double z = _MPRWidget2->GetVtkMPRBaseData()->GetZ();
304
305         filtroSegmentacion->AddSeed(x,y,z);
306         filtroSegmentacion->SetAlpha(this->alphaValue);
307         filtroSegmentacion->SetBeta(this->betaValue);
308
309         vtkImageData* resultado = filtroSegmentacion->segment(_MPRWidget2->GetVtkMPRBaseData()->GetImageData() );
310
311                 
312         f_gauss->SetInput(resultado);
313         f_gauss->SetStandardDeviation(this->sigmaValue);
314         
315     f_laplace->SetNumberOfIterations(this->iterationsValue);
316         f_laplace->SetConvergence(this->convergenceValue);
317         f_laplace->Update();
318
319         f_actor->GetProperty()->SetOpacity(this->opacityValue);
320         
321         vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
322         
323         ren->AddActor(f_actor);
324         RefreshView();
325         
326         btnUndo->Enable();
327         slVolumeOpacity->Enable();
328         slSigmaLevel->Enable();
329         slLaplacianConvergence->Enable();
330         slLaplacianIterations->Enable();
331 }
332
333
334 /**
335 * This method is invoked when the slAlpha scroll change its value
336 *
337 */
338 void wxSegmentationFM3DWidget::OnChangeAlpha(wxScrollEvent& event){
339         alphaValue = ((double)slAlpha->GetValue());
340         alphaValue = alphaValue / 100;
341 }
342
343 /**
344 * This method is invoked when the slBeta scroll change its value
345 *
346 */
347 void wxSegmentationFM3DWidget::OnChangeBeta(wxScrollEvent& event){
348         betaValue = ((double)slBeta->GetValue());
349 }
350
351 /**
352 *       Carga la imagen resultado de la segmentacion FM ITK
353 *
354 */
355 void wxSegmentationFM3DWidget::OnBtnUndo(wxCommandEvent& event){
356
357         if (f_actor != NULL){
358                 vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
359                 ren->RemoveActor(f_actor);
360                 RefreshView();
361                 btnUndo->Disable();
362                 slSigmaLevel->Disable();
363                 slVolumeOpacity->Disable();
364                 slLaplacianConvergence->Disable();
365                 slLaplacianIterations->Disable();
366         }
367
368
369 }
370
371 /**
372 * Este metodo cambia la opacidad del actor que representa la segmentacion realizada
373 *
374 */
375 void wxSegmentationFM3DWidget::OnChangeOpacity(wxScrollEvent& event){
376         if (f_actor != NULL){
377                 opacityValue = ((double)slVolumeOpacity->GetValue())/100.0;
378                 f_actor->GetProperty()->SetOpacity(opacityValue);
379                 RefreshView();
380         }
381 }
382
383 /**
384 * Cambia el valor de la desviacion estandar del filtro gaussiano aplicado al 
385 * volumen resultado de la segmentacion
386 */
387 void wxSegmentationFM3DWidget::OnChangeSigmaLevel(wxScrollEvent& event){
388         if(f_actor != NULL){
389                 this->sigmaValue = ((double)slSigmaLevel->GetValue())/300.0;
390                 f_gauss->SetStandardDeviation(this->sigmaValue);
391                 f_laplace->Update();
392                 RefreshView();
393         }
394 }
395
396 /**
397 * Cambia el valor de la convergencia del filtro de suavizado laplaciano aplicado
398 * a la superficie que representa el volumen resultado de la segmentacion
399 */
400 void wxSegmentationFM3DWidget::OnChangeLaplacianConvergence(wxScrollEvent& event){
401         if(f_actor != NULL){
402                 this->convergenceValue = ((double)slLaplacianConvergence->GetValue())/3000.0;
403                 f_laplace->SetConvergence(this->convergenceValue);
404                 f_laplace->Update();
405                 RefreshView();
406         }
407 }
408
409 /**
410 * Cambia el numero de iteraciones del filtro de suavizado laplaciano aplicado a la superficie
411 * que representa el volumen resultado de la segmentacion
412 */
413 void wxSegmentationFM3DWidget::OnChangeLaplacianIteration(wxScrollEvent& event){
414         if(f_actor != NULL){
415                 this->iterationsValue = slLaplacianIterations->GetValue();
416                 f_laplace->SetNumberOfIterations(this->iterationsValue);
417                 f_laplace->Update();
418                 RefreshView();
419         }
420 }
421
422 // EOF - wxSegmentationFM3DWidget.cxx
423
424
425
426