1 /*=========================================================================
4 Module: $RCSfile: wxSegmentationFM3DWidget.cxx,v $
6 Date: $Date: 2009/05/14 13:54:57 $
7 Version: $Revision: 1.1 $
9 Copyright: (c) 2002, 2003
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.
16 =========================================================================*/
21 #include <wx/splitter.h>
22 #include <wx/notebook.h>
23 #include <wx/colordlg.h>
25 #include "vtkMarchingCubes.h"
26 #include "vtkPolyDataMapper.h"
30 #include "wxSegmentationFM3DWidget.h"
33 //-------------------------------------------------------------------
34 //-------------------------------------------------------------------
35 //-------------------------------------------------------------------
37 BEGIN_EVENT_TABLE( wxSegmentationFM3DWidget, wxPanel )
38 EVT_MENU( 12121, wxSegmentationFM3DWidget::OnRefreshView )
39 // EVT_MENU( 12122, wxSegmentationFM3DWidget::OnDClickLeft )
43 wxSegmentationFM3DWidget::wxSegmentationFM3DWidget( wxWindow* parent,
44 marImageData *marimageData ,double voxelSize)
45 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
48 _voxelSize = voxelSize;
49 _marimageData = marimageData;
51 _wxvtk3Dbaseview_Clipping3D_C = NULL;
52 _wxvtkmpr3Dview_C = NULL;
53 _wxvtkclipping3Dview_C = NULL;
55 wxSplitterWindow* mainSplitter = new wxSplitterWindow(this,-1);
56 wxSplitterWindow *pnlSplitter = new wxSplitterWindow( mainSplitter , -1);
59 _MPRWidget2 = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
60 wxPanel * contour3DView = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
61 this->GetSize(&ww,&hh);
63 pnlSplitter -> SplitVertically( _MPRWidget2, contour3DView , 600);
69 //PANEL DE OPERACIONES
70 //------------------------------------------------------------------
72 wxPanel* panelOperaciones = new wxPanel(mainSplitter, -1);
74 wxFlexGridSizer *fgs = new wxFlexGridSizer(2);
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("")));
81 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Alpha")));
82 slAlpha = new wxSlider(panelOperaciones, -1, 50, 1, 400, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
85 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Beta")));
86 slBeta = new wxSlider(panelOperaciones, -1, 128, 0, 800, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
89 btnSegment = new wxButton(panelOperaciones, -1, _T("Segment"));
91 btnUndo = new wxButton(panelOperaciones, -1, _T("Undo"));
97 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
98 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
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("")));
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);
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);
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);
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);
123 panelOperaciones->SetSizer(fgs);
126 slSigmaLevel->Disable();
127 slVolumeOpacity->Disable();
128 slLaplacianConvergence->Disable();
129 slLaplacianIterations->Disable();
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 //-------------------------------------------------------------------
141 mainSplitter->SplitVertically(pnlSplitter, panelOperaciones, 600);
143 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL );
144 sizer->Add(mainSplitter,1, wxGROW,0);
145 pnlSplitter -> SetMinimumPaneSize( 50 );
146 this -> SetSizer(sizer);
150 //------------------------------------------------------------------
154 convergenceValue = 1;
155 iterationsValue = 100;
156 filtroSegmentacion = new itkFM3D();
157 //------------------------------------------------------------------
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 //------------------------------------------------------------------
179 //----------------------------------------------------------------------------
181 wxSegmentationFM3DWidget::~wxSegmentationFM3DWidget( )
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; }
189 //----------------------------------------------------------------------------
190 wxPanel* wxSegmentationFM3DWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
193 wxPanel *panel=new wxPanel(parent,-1);
195 wxSplitterWindow *panelClipping3D = new wxSplitterWindow( panel , -1);
196 _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
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);
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);
210 wxWindow *window3D = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
212 wxPanel *panelControl = new wxPanel(panelClipping3D,-1);
213 wxPanel *controlPanelMPR3D = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
214 wxPanel *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
216 // wxBoxSizer *sizerCtrol = new wxBoxSizer(wxVERTICAL);
217 wxFlexGridSizer *sizerCtrol = new wxFlexGridSizer(1);
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();
228 while (pp->GetParent()!=NULL) pp=pp->GetParent();
229 pp->GetSize(&ww,&hh);
232 // panelClipping3D -> SetMinimumPaneSize( -50 );
233 panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
234 wxwindow=panelClipping3D;
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);
244 // panel->FitInside();
251 //----------------------------------------------------------------------------
252 void wxSegmentationFM3DWidget::ConfigureVTK(){
253 _MPRWidget2->ConfigureVTK();
254 _wxvtk3Dbaseview_Clipping3D_C -> Configure();
255 _wxvtkmpr3Dview_C -> Configure();
256 _wxvtkclipping3Dview_C -> Configure();
258 vtkInteractorStyle3DView *vtkinteractorstyle3Dview = new vtkInteractorStyle3DView();
259 vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
260 vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
261 _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
265 //----------------------------------------------------------------------------
266 vtkMPRBaseData *wxSegmentationFM3DWidget::GetVtkMPRBaseData(){
267 return _MPRWidget2->GetVtkMPRBaseData();
269 //----------------------------------------------------------------------------
270 vtkPlane2DView *wxSegmentationFM3DWidget::GetVtkPlane2DView()
272 return _MPRWidget2->GetVtkPlane2DView();
274 //----------------------------------------------------------------------------
275 void wxSegmentationFM3DWidget::OnRefreshView(wxCommandEvent & event)
279 //----------------------------------------------------------------------------
280 void wxSegmentationFM3DWidget::RefreshView()
282 this->_MPRWidget2->RefreshView();
283 _wxvtkmpr3Dview_C -> RefreshView();
284 _wxvtkclipping3Dview_C -> Refresh();
285 _wxvtk3Dbaseview_Clipping3D_C -> Refresh();
293 * This method is invoked when the segmentation button is pressed
296 void wxSegmentationFM3DWidget::OnBtnSegment(wxCommandEvent& event){
301 double x =_MPRWidget2->GetVtkMPRBaseData()->GetX();
302 double y =_MPRWidget2->GetVtkMPRBaseData()->GetY();
303 double z = _MPRWidget2->GetVtkMPRBaseData()->GetZ();
305 filtroSegmentacion->AddSeed(x,y,z);
306 filtroSegmentacion->SetAlpha(this->alphaValue);
307 filtroSegmentacion->SetBeta(this->betaValue);
309 vtkImageData* resultado = filtroSegmentacion->segment(_MPRWidget2->GetVtkMPRBaseData()->GetImageData() );
312 f_gauss->SetInput(resultado);
313 f_gauss->SetStandardDeviation(this->sigmaValue);
315 f_laplace->SetNumberOfIterations(this->iterationsValue);
316 f_laplace->SetConvergence(this->convergenceValue);
319 f_actor->GetProperty()->SetOpacity(this->opacityValue);
321 vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
323 ren->AddActor(f_actor);
327 slVolumeOpacity->Enable();
328 slSigmaLevel->Enable();
329 slLaplacianConvergence->Enable();
330 slLaplacianIterations->Enable();
335 * This method is invoked when the slAlpha scroll change its value
338 void wxSegmentationFM3DWidget::OnChangeAlpha(wxScrollEvent& event){
339 alphaValue = ((double)slAlpha->GetValue());
340 alphaValue = alphaValue / 100;
344 * This method is invoked when the slBeta scroll change its value
347 void wxSegmentationFM3DWidget::OnChangeBeta(wxScrollEvent& event){
348 betaValue = ((double)slBeta->GetValue());
352 * Carga la imagen resultado de la segmentacion FM ITK
355 void wxSegmentationFM3DWidget::OnBtnUndo(wxCommandEvent& event){
357 if (f_actor != NULL){
358 vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
359 ren->RemoveActor(f_actor);
362 slSigmaLevel->Disable();
363 slVolumeOpacity->Disable();
364 slLaplacianConvergence->Disable();
365 slLaplacianIterations->Disable();
372 * Este metodo cambia la opacidad del actor que representa la segmentacion realizada
375 void wxSegmentationFM3DWidget::OnChangeOpacity(wxScrollEvent& event){
376 if (f_actor != NULL){
377 opacityValue = ((double)slVolumeOpacity->GetValue())/100.0;
378 f_actor->GetProperty()->SetOpacity(opacityValue);
384 * Cambia el valor de la desviacion estandar del filtro gaussiano aplicado al
385 * volumen resultado de la segmentacion
387 void wxSegmentationFM3DWidget::OnChangeSigmaLevel(wxScrollEvent& event){
389 this->sigmaValue = ((double)slSigmaLevel->GetValue())/300.0;
390 f_gauss->SetStandardDeviation(this->sigmaValue);
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
400 void wxSegmentationFM3DWidget::OnChangeLaplacianConvergence(wxScrollEvent& event){
402 this->convergenceValue = ((double)slLaplacianConvergence->GetValue())/3000.0;
403 f_laplace->SetConvergence(this->convergenceValue);
410 * Cambia el numero de iteraciones del filtro de suavizado laplaciano aplicado a la superficie
411 * que representa el volumen resultado de la segmentacion
413 void wxSegmentationFM3DWidget::OnChangeLaplacianIteration(wxScrollEvent& event){
415 this->iterationsValue = slLaplacianIterations->GetValue();
416 f_laplace->SetNumberOfIterations(this->iterationsValue);
422 // EOF - wxSegmentationFM3DWidget.cxx