wxSegmentationFM3DWidget.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   wxMaracas
00004   Module:    $RCSfile: wxSegmentationFM3DWidget.cxx,v $
00005   Language:  C++
00006   Date:      $Date: 2009/05/14 13:54:57 $
00007   Version:   $Revision: 1.1 $
00008 
00009   Copyright: (c) 2002, 2003
00010   License:
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notice for more information.
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 //      EVT_MENU( 12122, wxSegmentationFM3DWidget::OnDClickLeft  )
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         //PANEL DE OPERACIONES
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         // MODELO
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         // RENDERIZACION VTK
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 //      wxBoxSizer  *sizerCtrol             = new wxBoxSizer(wxVERTICAL);
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 //EEDxx2.4
00232 //              panelClipping3D -> SetMinimumPaneSize( -50 );
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 //EEDxx2.4
00244 //      panel->FitInside();
00245 //      FitInside();
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 // EOF - wxSegmentationFM3DWidget.cxx
00423 
00424 
00425 
00426 

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1