00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <wx/wx.h>
00021 #include <wx/splitter.h>
00022 #include <wx/notebook.h>
00023 #include <wx/colordlg.h>
00024
00025 #include "vtkMarchingCubes.h"
00026 #include "vtkPolyDataMapper.h"
00027 #include "vtkActor.h"
00028
00029
00030 #include "wxSegmentationFM3DWidget.h"
00031
00032
00033
00034
00035
00036
00037 BEGIN_EVENT_TABLE( wxSegmentationFM3DWidget, wxPanel )
00038 EVT_MENU( 12121, wxSegmentationFM3DWidget::OnRefreshView )
00039
00040 END_EVENT_TABLE( );
00041
00042
00043 wxSegmentationFM3DWidget::wxSegmentationFM3DWidget( wxWindow* parent,
00044 marImageData *marimageData ,double voxelSize)
00045 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
00046 {
00047
00048 _voxelSize = voxelSize;
00049 _marimageData = marimageData;
00050
00051 _wxvtk3Dbaseview_Clipping3D_C = NULL;
00052 _wxvtkmpr3Dview_C = NULL;
00053 _wxvtkclipping3Dview_C = NULL;
00054
00055 wxSplitterWindow* mainSplitter = new wxSplitterWindow(this,-1);
00056 wxSplitterWindow *pnlSplitter = new wxSplitterWindow( mainSplitter , -1);
00057
00058 int ww,hh;
00059 _MPRWidget2 = new wxMPRWidget2(pnlSplitter,_marimageData,voxelSize);
00060 wxPanel * contour3DView = Create3DViewContour( pnlSplitter , _MPRWidget2->GetVtkMPRBaseData());
00061 this->GetSize(&ww,&hh);
00062
00063 pnlSplitter -> SplitVertically( _MPRWidget2, contour3DView , 600);
00064
00065
00066
00067
00068
00069
00070
00071
00072 wxPanel* panelOperaciones = new wxPanel(mainSplitter, -1);
00073
00074 wxFlexGridSizer *fgs = new wxFlexGridSizer(2);
00075
00076 fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Fast Marching Controls")));
00077 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00078 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00079 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00080
00081 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Alpha")));
00082 slAlpha = new wxSlider(panelOperaciones, -1, 50, 1, 400, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00083 fgs->Add(slAlpha);
00084
00085 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Beta")));
00086 slBeta = new wxSlider(panelOperaciones, -1, 128, 0, 800, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00087 fgs->Add(slBeta);
00088
00089 btnSegment = new wxButton(panelOperaciones, -1, _T("Segment"));
00090 fgs->Add(btnSegment);
00091 btnUndo = new wxButton(panelOperaciones, -1, _T("Undo"));
00092 fgs->Add(btnUndo);
00093
00094
00095
00096
00097 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00098 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00099
00100
00101
00102 fgs->Add( new wxStaticText(panelOperaciones, -1, _T("Mesh Controls")));
00103 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00104 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00105 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("")));
00106
00107 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Opacity")));
00108 slVolumeOpacity = new wxSlider(panelOperaciones, -1,50,1,100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00109 fgs->Add(slVolumeOpacity);
00110
00111 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Sigma")));
00112 slSigmaLevel = new wxSlider(panelOperaciones, -1,100,1,300, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00113 fgs->Add(slSigmaLevel);
00114
00115 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Convergence")));
00116 slLaplacianConvergence = new wxSlider(panelOperaciones, -1,3000,1,3000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00117 fgs->Add(slLaplacianConvergence);
00118
00119 fgs->Add(new wxStaticText(panelOperaciones, -1, _T("Iterations")));
00120 slLaplacianIterations = new wxSlider(panelOperaciones, -1,100,1,2000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS);
00121 fgs->Add(slLaplacianIterations);
00122
00123 panelOperaciones->SetSizer(fgs);
00124
00125 btnUndo->Disable();
00126 slSigmaLevel->Disable();
00127 slVolumeOpacity->Disable();
00128 slLaplacianConvergence->Disable();
00129 slLaplacianIterations->Disable();
00130
00131 Connect(slAlpha->GetId(), wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeAlpha);
00132 Connect(slBeta->GetId(), wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeBeta);
00133 Connect(btnSegment->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnSegment);
00134 Connect(btnUndo->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnBtnUndo);
00135 Connect(slVolumeOpacity->GetId(), wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeOpacity);
00136 Connect(slSigmaLevel->GetId(), wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeSigmaLevel);
00137 Connect(slLaplacianConvergence->GetId(),wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianConvergence);
00138 Connect(slLaplacianIterations->GetId(), wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) &wxSegmentationFM3DWidget::OnChangeLaplacianIteration);
00139
00140
00141 mainSplitter->SplitVertically(pnlSplitter, panelOperaciones, 600);
00142
00143 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL );
00144 sizer->Add(mainSplitter,1, wxGROW,0);
00145 pnlSplitter -> SetMinimumPaneSize( 50 );
00146 this -> SetSizer(sizer);
00147
00148
00149
00150
00151 alphaValue = 0.5;
00152 betaValue = 128;
00153 opacityValue = 0.5;
00154 convergenceValue = 1;
00155 iterationsValue = 100;
00156 filtroSegmentacion = new itkFM3D();
00157
00158
00159
00160
00161
00162 f_gauss = vtkImageGaussianSmooth::New();
00163 f_laplace = vtkSmoothPolyDataFilter::New();
00164 f_cubes = vtkMarchingCubes::New();
00165 f_mapper = vtkPolyDataMapper::New();
00166 f_cubes->SetInput(f_gauss->GetOutput());
00167 f_cubes->SetValue(0,128);
00168 f_laplace->SetInput(f_cubes->GetOutput());
00169 f_mapper->SetInput(f_laplace->GetOutput());
00170 f_mapper->ScalarVisibilityOff();
00171 f_actor = vtkActor::New();
00172 f_actor->SetMapper(f_mapper);
00173 f_actor->GetProperty()->SetColor(0.9,0.5,0.5);
00174
00175
00176
00177 }
00178
00179
00180
00181 wxSegmentationFM3DWidget::~wxSegmentationFM3DWidget( )
00182 {
00183 if (_wxvtk3Dbaseview_Clipping3D_C != NULL) { delete _wxvtk3Dbaseview_Clipping3D_C; }
00184 if (_wxvtkmpr3Dview_C != NULL) { delete _wxvtkmpr3Dview_C; }
00185 if (_wxvtkclipping3Dview_C != NULL) { delete _wxvtkclipping3Dview_C; }
00186 }
00187
00188
00189
00190 wxPanel* wxSegmentationFM3DWidget::Create3DViewContour( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
00191 {
00192 wxWindow *wxwindow;
00193 wxPanel *panel=new wxPanel(parent,-1);
00194
00195 wxSplitterWindow *panelClipping3D = new wxSplitterWindow( panel , -1);
00196 _wxvtk3Dbaseview_Clipping3D_C = new wxVtk3DBaseView( panelClipping3D );
00197
00198 _wxvtkclipping3Dview_C = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D_C);
00199 vtkClipping3DDataViewer *vtkclipping3Ddataviewer = new vtkClipping3DDataViewer();
00200 vtkclipping3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
00201 vtkclipping3Ddataviewer->Configure();
00202 _wxvtkclipping3Dview_C->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer);
00203
00204 _wxvtkmpr3Dview_C = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D_C );
00205 vtkMPR3DDataViewer *vtkmpr3Ddataviewer = new vtkMPR3DDataViewer();
00206 vtkmpr3Ddataviewer->SetVtkMPRBaseData(vtkmprbasedata);
00207 vtkmpr3Ddataviewer->Configure();
00208 _wxvtkmpr3Dview_C->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer);
00209
00210 wxWindow *window3D = _wxvtk3Dbaseview_Clipping3D_C->GetWxVTKRenderWindowInteractor();
00211
00212 wxPanel *panelControl = new wxPanel(panelClipping3D,-1);
00213 wxPanel *controlPanelMPR3D = _wxvtkmpr3Dview_C->CreateControlPanel(panelControl);
00214 wxPanel *controlPanelClipping3D = _wxvtkclipping3Dview_C->CreateControlPanel(panelControl);
00215
00216
00217 wxFlexGridSizer *sizerCtrol = new wxFlexGridSizer(1);
00218
00219 sizerCtrol->Add(controlPanelMPR3D , 1, wxALL|wxEXPAND, 2);
00220 sizerCtrol->Add(controlPanelClipping3D , 1, wxALL|wxEXPAND, 2);
00221 panelControl->SetAutoLayout(true);
00222 panelControl->SetSizer(sizerCtrol);
00223 panelControl->SetSize(400,350);
00224 panelControl->Layout();
00225
00226 int ww,hh;
00227 wxWindow *pp=this;
00228 while (pp->GetParent()!=NULL) pp=pp->GetParent();
00229 pp->GetSize(&ww,&hh);
00230
00231
00232
00233 panelClipping3D -> SplitHorizontally( panelControl,window3D, (int)(hh*0.20) );
00234 wxwindow=panelClipping3D;
00235
00236 wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
00237 sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
00238 panel->SetAutoLayout(true);
00239 panel->SetSizer(sizerH1);
00240 panel->SetSize(400,400);
00241 panel->Layout();
00242
00243
00244
00245
00246
00247 return panel;
00248 }
00249
00250
00251
00252 void wxSegmentationFM3DWidget::ConfigureVTK(){
00253 _MPRWidget2->ConfigureVTK();
00254 _wxvtk3Dbaseview_Clipping3D_C -> Configure();
00255 _wxvtkmpr3Dview_C -> Configure();
00256 _wxvtkclipping3Dview_C -> Configure();
00257
00258 vtkInteractorStyle3DView *vtkinteractorstyle3Dview = new vtkInteractorStyle3DView();
00259 vtkinteractorstyle3Dview->SetWxVtkMPR3DView(_wxvtkmpr3Dview_C);
00260 vtkinteractorstyle3Dview->SetWxVtkClipping3DView(_wxvtkclipping3Dview_C);
00261 _wxvtk3Dbaseview_Clipping3D_C->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview );
00262
00263 }
00264
00265
00266 vtkMPRBaseData *wxSegmentationFM3DWidget::GetVtkMPRBaseData(){
00267 return _MPRWidget2->GetVtkMPRBaseData();
00268 }
00269
00270 vtkPlane2DView *wxSegmentationFM3DWidget::GetVtkPlane2DView()
00271 {
00272 return _MPRWidget2->GetVtkPlane2DView();
00273 }
00274
00275 void wxSegmentationFM3DWidget::OnRefreshView(wxCommandEvent & event)
00276 {
00277 RefreshView();
00278 }
00279
00280 void wxSegmentationFM3DWidget::RefreshView()
00281 {
00282 this->_MPRWidget2->RefreshView();
00283 _wxvtkmpr3Dview_C -> RefreshView();
00284 _wxvtkclipping3Dview_C -> Refresh();
00285 _wxvtk3Dbaseview_Clipping3D_C -> Refresh();
00286 }
00287
00288
00289
00290
00291
00296 void wxSegmentationFM3DWidget::OnBtnSegment(wxCommandEvent& event){
00297
00298 wxBusyCursor wait;
00299
00300
00301 double x =_MPRWidget2->GetVtkMPRBaseData()->GetX();
00302 double y =_MPRWidget2->GetVtkMPRBaseData()->GetY();
00303 double z = _MPRWidget2->GetVtkMPRBaseData()->GetZ();
00304
00305 filtroSegmentacion->AddSeed(x,y,z);
00306 filtroSegmentacion->SetAlpha(this->alphaValue);
00307 filtroSegmentacion->SetBeta(this->betaValue);
00308
00309 vtkImageData* resultado = filtroSegmentacion->segment(_MPRWidget2->GetVtkMPRBaseData()->GetImageData() );
00310
00311
00312 f_gauss->SetInput(resultado);
00313 f_gauss->SetStandardDeviation(this->sigmaValue);
00314
00315 f_laplace->SetNumberOfIterations(this->iterationsValue);
00316 f_laplace->SetConvergence(this->convergenceValue);
00317 f_laplace->Update();
00318
00319 f_actor->GetProperty()->SetOpacity(this->opacityValue);
00320
00321 vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
00322
00323 ren->AddActor(f_actor);
00324 RefreshView();
00325
00326 btnUndo->Enable();
00327 slVolumeOpacity->Enable();
00328 slSigmaLevel->Enable();
00329 slLaplacianConvergence->Enable();
00330 slLaplacianIterations->Enable();
00331 }
00332
00333
00338 void wxSegmentationFM3DWidget::OnChangeAlpha(wxScrollEvent& event){
00339 alphaValue = ((double)slAlpha->GetValue());
00340 alphaValue = alphaValue / 100;
00341 }
00342
00347 void wxSegmentationFM3DWidget::OnChangeBeta(wxScrollEvent& event){
00348 betaValue = ((double)slBeta->GetValue());
00349 }
00350
00355 void wxSegmentationFM3DWidget::OnBtnUndo(wxCommandEvent& event){
00356
00357 if (f_actor != NULL){
00358 vtkRenderer *ren = _wxvtkmpr3Dview_C->GetWxvtk3Dbaseview()->GetRenderer();
00359 ren->RemoveActor(f_actor);
00360 RefreshView();
00361 btnUndo->Disable();
00362 slSigmaLevel->Disable();
00363 slVolumeOpacity->Disable();
00364 slLaplacianConvergence->Disable();
00365 slLaplacianIterations->Disable();
00366 }
00367
00368
00369 }
00370
00375 void wxSegmentationFM3DWidget::OnChangeOpacity(wxScrollEvent& event){
00376 if (f_actor != NULL){
00377 opacityValue = ((double)slVolumeOpacity->GetValue())/100.0;
00378 f_actor->GetProperty()->SetOpacity(opacityValue);
00379 RefreshView();
00380 }
00381 }
00382
00387 void wxSegmentationFM3DWidget::OnChangeSigmaLevel(wxScrollEvent& event){
00388 if(f_actor != NULL){
00389 this->sigmaValue = ((double)slSigmaLevel->GetValue())/300.0;
00390 f_gauss->SetStandardDeviation(this->sigmaValue);
00391 f_laplace->Update();
00392 RefreshView();
00393 }
00394 }
00395
00400 void wxSegmentationFM3DWidget::OnChangeLaplacianConvergence(wxScrollEvent& event){
00401 if(f_actor != NULL){
00402 this->convergenceValue = ((double)slLaplacianConvergence->GetValue())/3000.0;
00403 f_laplace->SetConvergence(this->convergenceValue);
00404 f_laplace->Update();
00405 RefreshView();
00406 }
00407 }
00408
00413 void wxSegmentationFM3DWidget::OnChangeLaplacianIteration(wxScrollEvent& event){
00414 if(f_actor != NULL){
00415 this->iterationsValue = slLaplacianIterations->GetValue();
00416 f_laplace->SetNumberOfIterations(this->iterationsValue);
00417 f_laplace->Update();
00418 RefreshView();
00419 }
00420 }
00421
00422
00423
00424
00425
00426