]> Creatis software - creaMaracasVisu.git/commitdiff
*** empty log message ***
authorEduardo Davila <Eduardo.Davila@creatis.insa-lyon.fr>
Tue, 26 Oct 2010 16:44:35 +0000 (16:44 +0000)
committerEduardo Davila <Eduardo.Davila@creatis.insa-lyon.fr>
Tue, 26 Oct 2010 16:44:35 +0000 (16:44 +0000)
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.h
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintPanel.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintPanel.h
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/wxManualPaintPanel.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/wxManualPaintPanel.h

index d6b0d5ba1f2eb8b6e004e261a56147df45330240..ab44d0afe8d0c856963e233c53edad95f827a9ce 100644 (file)
@@ -8,7 +8,14 @@ ManualPaintModel::ManualPaintModel()
     _brushsize  =   1;
     _brushform  =   0;      // 0 rectangle-box  ,   1 circle-sphere
     _2D3D       =   0;      // 0 2D             ,   1 true 3D
-    _brushtool  =   0;      // 0 pensil         ,   1 fill
+    _brushtool  =   0;      // 0 pencil         ,   1 fill
+
+    _minX=0;
+    _minY=0;
+    _minZ=0;
+    _maxX=0;
+    _maxY=0;
+    _maxZ=0;
 }
 
 //---------------------------------------------------------------------------
@@ -19,9 +26,72 @@ ManualPaintModel::~ManualPaintModel()
 void ManualPaintModel::SetImage(vtkImageData *image)
 {
     _image=image;
+
+    int ext[6];
+    _image->GetWholeExtent(ext);
+    _minX=0;
+    _minY=0;
+    _minZ=0;
+    _maxX=ext[1]-ext[0];
+    _maxY=ext[3]-ext[2];
+    _maxZ=ext[5]-ext[4];
 }
 
 void ManualPaintModel::PaintImage(int px,int py, int pz)
+{
+    if (_brushtool==0)
+    {
+        BrushTool(px,py,pz);
+    }
+    if (_brushtool==1)
+    {
+        FillTool(px,py,pz);
+    }
+}
+
+
+void ManualPaintModel::FillTool(int px,int py, int pz)
+{
+    if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
+    {
+        _graylevelbasefill  = _image->GetScalarComponentAsDouble(px,py,pz, 0);
+        _pxfill             = px;
+        _pyfill             = py;
+        _pzfill             = pz;
+        _distbasefill       = _distancefill*_distancefill;
+        FillToolRecursive(px,py,pz);
+    } //if _minX _maxX _minY _maxY _minZ _maxZ
+}
+
+
+void ManualPaintModel::FillToolRecursive(int px,int py, int pz)
+{
+
+    double dist=(px-_pxfill) * (px-_pxfill)  + (py-_pyfill) * (py-_pyfill)   + (pz-_pzfill) * (pz-_pzfill);
+
+    if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
+    {
+        float value=(float)_graylevel;
+        double igl=_image->GetScalarComponentAsDouble(px,py,pz, 0);
+        if (  (igl!=_graylevel) &&
+              (igl>=_graylevelbasefill-_tolerancefill) &&
+              (igl<=_graylevelbasefill+_tolerancefill) &&
+              (dist<=_distbasefill)
+            )
+        {
+//            _image->SetScalarComponentFromFloat (px,py,pz, 0, dist+500 );
+            _image->SetScalarComponentFromFloat (px,py,pz, 0, value );
+            FillToolRecursive(px+1,py,pz);
+            FillToolRecursive(px,py+1,pz);
+            FillToolRecursive(px-1,py,pz);
+            FillToolRecursive(px,py-1,pz);
+//        FillToolRecursive(px,py,pz-1);
+//        FillToolRecursive(px,py,pz+1);
+        }
+    } //if _minX _maxX _minY _maxY _minZ _maxZ
+}
+
+void ManualPaintModel::BrushTool(int px,int py, int pz)
 {
 
     printf("EED ManualPaintModel::PaintImage %d %d %d\n", px,py,pz);
@@ -50,18 +120,22 @@ void ManualPaintModel::PaintImage(int px,int py, int pz)
                 yy=yy*yy;
                 for (k=minZ; k<=maxZ; k++)
                 {
-                    zz=pz-k;
-                    zz=zz*zz;
-                    if (_brushform==0)
+                    if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
                     {
-                        _image->SetScalarComponentFromFloat (i,j,k, 0, value );
-                    } else if (_brushform==1)
-                    {
-                        if ((xx+yy+zz)<=rr)
+                        zz=pz-k;
+                        zz=zz*zz;
+                        if (_brushform==0)
                         {
                             _image->SetScalarComponentFromFloat (i,j,k, 0, value );
-                        }
-                    } // _brushform
+                        } else if (_brushform==1)
+                        {
+                            if ((xx+yy+zz)<=rr)
+                            {
+                                _image->SetScalarComponentFromFloat (i,j,k, 0, value );
+                            }
+                        } // _brushform
+
+                    } //if _minX _maxX _minY _maxY _minZ _maxZ
 
                 }//k
             }//j
@@ -103,3 +177,15 @@ void ManualPaintModel::Set2D3D( int dim2D3D )
     _2D3D = dim2D3D;
 }
 
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetToleranceFill(double tolerancefill)
+{
+    _tolerancefill = tolerancefill;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetDistanceFill(int distancefill)
+{
+    _distancefill = distancefill;
+}
+
index e7996f139823d1dee4a0ab3cb4af0b294c891290..75dd16e04ea7540717c9c71e0b4b7ac5acd0b862 100644 (file)
@@ -17,16 +17,34 @@ public:
     void Set2D3D( int dim2D3D );
     void SetGrayLevel( double graylevel );
 
+    void FillTool(int px,int py, int pz);
+    void FillToolRecursive(int px,int py, int pz);
 
+    void BrushTool(int px,int py, int pz);
+    void SetToleranceFill(double tolerancefill);
+    void SetDistanceFill(int distancefill);
 
 private:
     vtkImageData    *_image;
+    int             _minX;
+    int             _maxX;
+    int             _minY;
+    int             _maxY;
+    int             _minZ;
+    int             _maxZ;
     int             _brushsize;
     int             _brushform;
     int             _brushtool;
     bool            _2D3D;
     double          _graylevel;
-
+    double          _tolerancefill;
+    int             _distancefill;
+    double          _graylevelbasefill;
+
+    int             _pxfill;
+    int             _pyfill;
+    int             _pzfill;
+    double          _distbasefill;
 
 protected:
 
index ecb7243e42430733a42ac77f48a932532ccce2f3..c2e57a128c43a7f3009e46de605492ae50db1799 100644 (file)
@@ -76,4 +76,25 @@ void ManualPaintPanel::SetBrushForm(int brushform)
     }
 }
 
+//---------------------------------------------------------------------------
+void ManualPaintPanel::SetToleranceFill(double tolerancefill)
+{
+    if (_manualPaintModel!=NULL)
+    {
+        _manualPaintModel->SetToleranceFill( tolerancefill );
+    } else {
+       printf("ERROR  in  ManualPaintPanel  _manualPaintModel not set.\n");
+    }
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintPanel::SetDistanceFill(int distancefill)
+{
+    if (_manualPaintModel!=NULL)
+    {
+        _manualPaintModel->SetDistanceFill( distancefill );
+    } else {
+       printf("ERROR  in  ManualPaintPanel  _manualPaintModel not set.\n");
+    }
+}
 
index 817ecf7d16ad81a6b2f628815ceaaa6694b0dfcf..b581bad5b57d628b8ccf122345e709ae5d6bb33d 100644 (file)
@@ -14,7 +14,8 @@ public:
     void SetBrushTool(int brushtool);
     void Set2D3D(int dim2D3D);
     void SetBrushForm(int brushform);
-
+    void SetToleranceFill(double tolerancefill);
+    void SetDistanceFill(int distancefill);
 
 private:
        ManualPaintModel        *_manualPaintModel;
index babf7276dfef429f63c92c171ab0ae140b19196b..3170c69e8f8087ddbc4590e844a0e197ed899d4b 100644 (file)
@@ -6,66 +6,105 @@ wxManualPaintPanel::wxManualPaintPanel(wxWindow * parent)
  : wxPanel(parent, -1)
 {
 
-    wxPanel    *panel                  = this;
-    wxSizer *sizer                     = NULL;
+    wxPanel    *panel                              = this;
+    wxSizer *sizer                                 = NULL;
 
        // Widget interface
-       wxStaticText    *tittleText             = new wxStaticText(panel, -1, _T("             Manual Paint"));
-       wxStaticText    *txtBrushSize   = new wxStaticText(panel, -1, wxString(_T("  Brush size  ")));
-                     _sldBrushSize  = new wxSlider(panel, -1, 1, 1, 20, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
-       wxStaticText    *txtGrayLevel   = new wxStaticText(panel, -1, wxString(_T("  Gray Level  ")));
-                     _sldGrayLevel  = new wxSlider(panel, -1, 0, 0, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
-                     _graylevelCtrl = new wxTextCtrl(panel , -1);
+       wxStaticText    *tittleText                 = new wxStaticText(panel, -1, _T("             Manual Paint"));
+       wxStaticText    *txtBrushSize       = new wxStaticText(panel, -1, wxString(_T("  Brush size  ")));
+                     _sldBrushSize      = new wxSlider(panel, -1, 1, 1, 20, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
+       wxStaticText    *txtGrayLevel       = new wxStaticText(panel, -1, wxString(_T("  Gray Level  ")));
+                     _sldGrayLevel      = new wxSlider(panel, -1, 0, 0, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
+                     _graylevelCtrl     = new wxTextCtrl(panel , -1);
+                     _txtToleranceFill  = new wxStaticText(panel, -1, wxString(_T("  Tolerance fill  ")));
+                     _sldToleranceFill  = new wxSlider(panel, -1, 50, 0, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
+                     _tolerancefillCtrl = new wxTextCtrl(panel , -1,_T("50") );
+                     _txtDistanceFill   = new wxStaticText(panel, -1, wxString(_T("  Distance fill  ")));
+                     _sldDistanceFill   = new wxSlider(panel, -1, 50, 1, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
+                     _distancefillCtrl  = new wxTextCtrl(panel , -1,_T("50") );
+
 
        wxString lst2D3D[2];
        lst2D3D[0]=_T("2D circle");
        lst2D3D[1]=_T("3D sphere");
                     _rb2D3D         = new wxRadioBox(panel, -1, _T("2D / 3D"), wxDefaultPosition, wxSize(270,45), 2 , lst2D3D,  2, wxRA_SPECIFY_COLS);
     _rb2D3D->SetSelection(1);
-    _rb2D3D->Disable();
 
        wxString lstBrushForm[2];
        lstBrushForm[0]=_T("rectangle/cube");
        lstBrushForm[1]=_T("circle/sphere");
                     _rbBrushForm    = new wxRadioBox(panel, -1, _T("Brush form"), wxDefaultPosition, wxSize(270,45), 2 , lstBrushForm,  2, wxRA_SPECIFY_COLS);
 
+    _txtToleranceFill->Disable();
+    _sldToleranceFill->Disable();
+    _tolerancefillCtrl->Disable();
+
+    _txtDistanceFill->Disable();
+    _sldDistanceFill->Disable();
+    _distancefillCtrl->Disable();
+
        wxString lstBrushTool[2];
-       lstBrushTool[0]=_T("Pensil");
+       lstBrushTool[0]=_T("Brush");
        lstBrushTool[1]=_T("Fill");
                     _rbBrushTool    = new wxRadioBox(panel, -1, _T("Brush tool"), wxDefaultPosition, wxSize(270,45), 2 , lstBrushTool,  2, wxRA_SPECIFY_COLS);
-    _rbBrushTool->Disable();
 
        wxButton     *btnCopy           = new wxButton( panel, -1, _T("Copy"));
     btnCopy->Disable();
        wxButton     *btnUndo           = new wxButton( panel, -1, _T("Undo"));
     btnUndo->Disable();
 
-    Connect(_sldBrushSize->GetId()  , wxEVT_SCROLL_THUMBRELEASE                , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushSize);
-    Connect(_sldGrayLevel->GetId()  , wxEVT_SCROLL_THUMBRELEASE                , (wxObjectEventFunction) &wxManualPaintPanel::OnSldGrayLevel);
-    Connect(_graylevelCtrl->GetId() , wxEVT_COMMAND_TEXT_UPDATED           , (wxObjectEventFunction) &wxManualPaintPanel::OnCtrTxtGrayLevel);
+    Connect(_sldBrushSize->GetId()      , wxEVT_SCROLL_THUMBRELEASE            , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushSize);
+
+    Connect(_sldGrayLevel->GetId()      , wxEVT_SCROLL_THUMBRELEASE            , (wxObjectEventFunction) &wxManualPaintPanel::OnSldGrayLevel);
+    Connect(_graylevelCtrl->GetId()     , wxEVT_COMMAND_TEXT_UPDATED       , (wxObjectEventFunction) &wxManualPaintPanel::OnCtrTxtGrayLevel);
 
-    Connect(_rb2D3D->GetId()        , wxEVT_COMMAND_RADIOBOX_SELECTED  , (wxObjectEventFunction) &wxManualPaintPanel::On2D3D);
-    Connect(_rbBrushForm->GetId()   , wxEVT_COMMAND_RADIOBOX_SELECTED  , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushForm);
-    Connect(_rbBrushTool->GetId()   , wxEVT_COMMAND_RADIOBOX_SELECTED  , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushTool);
-       Connect(btnCopy->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED      , (wxObjectEventFunction) &wxManualPaintPanel::OnCopy);
-       Connect(btnUndo->GetId()            , wxEVT_COMMAND_BUTTON_CLICKED      , (wxObjectEventFunction) &wxManualPaintPanel::OnUndo);
+    Connect(_sldToleranceFill->GetId()  , wxEVT_SCROLL_THUMBRELEASE            , (wxObjectEventFunction) &wxManualPaintPanel::OnSldToleranceFill);
+    Connect(_tolerancefillCtrl->GetId() , wxEVT_COMMAND_TEXT_UPDATED       , (wxObjectEventFunction) &wxManualPaintPanel::OnCtrTxtToleranceFill);
+
+    Connect(_sldDistanceFill->GetId()   , wxEVT_SCROLL_THUMBRELEASE            , (wxObjectEventFunction) &wxManualPaintPanel::OnSldDistanceFill);
+    Connect(_distancefillCtrl->GetId()  , wxEVT_COMMAND_TEXT_UPDATED       , (wxObjectEventFunction) &wxManualPaintPanel::OnCtrTxtDistanceFill);
+
+    Connect(_rb2D3D->GetId()            , wxEVT_COMMAND_RADIOBOX_SELECTED      , (wxObjectEventFunction) &wxManualPaintPanel::On2D3D);
+    Connect(_rbBrushForm->GetId()       , wxEVT_COMMAND_RADIOBOX_SELECTED      , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushForm);
+    Connect(_rbBrushTool->GetId()       , wxEVT_COMMAND_RADIOBOX_SELECTED      , (wxObjectEventFunction) &wxManualPaintPanel::OnBrushTool);
+       Connect(btnCopy->GetId()                , wxEVT_COMMAND_BUTTON_CLICKED      , (wxObjectEventFunction) &wxManualPaintPanel::OnCopy);
+       Connect(btnUndo->GetId()                , wxEVT_COMMAND_BUTTON_CLICKED      , (wxObjectEventFunction) &wxManualPaintPanel::OnUndo);
 
        wxFlexGridSizer *sizer1         = new wxFlexGridSizer(1);
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
     sizer1->Add(tittleText);
-    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
-    sizer1->Add(txtBrushSize);
-    sizer1->Add(_sldBrushSize, 1, wxGROW );
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
     sizer1->Add(txtGrayLevel);
     sizer1->Add(_sldGrayLevel, 1, wxGROW );
     sizer1->Add(_graylevelCtrl);
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
     sizer1->Add(_rb2D3D, 1, wxGROW );
+
+    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer1->Add(_rbBrushTool, 1, wxGROW );
+
+    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer1->Add(txtBrushSize);
+    sizer1->Add(_sldBrushSize, 1, wxGROW );
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
     sizer1->Add(_rbBrushForm, 1, wxGROW );
+
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
-    sizer1->Add(_rbBrushTool, 1, wxGROW );
+    sizer1->Add(_txtToleranceFill);
+    sizer1->Add(_sldToleranceFill, 1, wxGROW );
+    sizer1->Add(_tolerancefillCtrl);
+
+    sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
+    sizer1->Add(_txtDistanceFill);
+    sizer1->Add(_sldDistanceFill, 1, wxGROW );
+    sizer1->Add(_distancefillCtrl);
+
+
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
     sizer1->Add(btnCopy, 1, wxGROW );
     sizer1->Add(new wxStaticText(panel,-1,_T("  ")));
@@ -109,7 +148,64 @@ void wxManualPaintPanel::OnCtrTxtGrayLevel(wxCommandEvent &event)
     }
 }
 
+//---------------------------------------------------------------------------
+void wxManualPaintPanel::OnSldDistanceFill(wxScrollEvent& event)
+{
+    SetDistanceFill( (double)(_sldDistanceFill->GetValue()) );
+
+    wxString text;
+    text.Printf( wxT("%d"), _sldDistanceFill->GetValue() );
+    _distancefillCtrl->SetValue(text);
+}
+
+//---------------------------------------------------------------------------
+void wxManualPaintPanel::OnCtrTxtDistanceFill(wxCommandEvent &event)
+{
+    double distancefill;
+    wxString text=_distancefillCtrl->GetValue();
+    if (text.ToDouble(&distancefill))
+    {
+        SetDistanceFill( distancefill );
+    }
+}
+
+//---------------------------------------------------------------------------
+void wxManualPaintPanel::OnSldToleranceFill(wxScrollEvent& event)
+{
+    SetToleranceFill( (double)(_sldToleranceFill->GetValue()) );
+
+    wxString text;
+    text.Printf( wxT("%d"), _sldToleranceFill->GetValue() );
+    _tolerancefillCtrl->SetValue(text);
+}
+
+//---------------------------------------------------------------------------
+void wxManualPaintPanel::OnCtrTxtToleranceFill(wxCommandEvent &event)
+{
+    double tolerance;
+    wxString text=_tolerancefillCtrl->GetValue();
+    if (text.ToDouble(&tolerance))
+    {
+        SetToleranceFill( tolerance );
+    }
+}
+
+
+
+//---------------------------------------------------------------------------
+void wxManualPaintPanel::DisableControls()
+{
+    _sldBrushSize->Disable();
+    _rbBrushForm->Disable();
+
+    _txtToleranceFill->Disable();
+    _sldToleranceFill->Disable();
+    _tolerancefillCtrl->Disable();
 
+    _txtDistanceFill->Disable();
+    _sldDistanceFill->Disable();
+    _distancefillCtrl->Disable();
+}
 
 //---------------------------------------------------------------------------
 void wxManualPaintPanel::On2D3D(wxCommandEvent &event)
@@ -127,7 +223,25 @@ void wxManualPaintPanel::OnBrushForm(wxCommandEvent &event)
 //---------------------------------------------------------------------------
 void wxManualPaintPanel::OnBrushTool(wxCommandEvent &event)
 {
+    DisableControls();
     SetBrushTool( _rbBrushTool->GetSelection() );
+
+    if (_rbBrushTool->GetSelection()==0)  //Brush tool
+    {
+        _sldBrushSize->Enable();
+        _rbBrushForm->Enable();
+    }
+
+    if (_rbBrushTool->GetSelection()==1)  //Fill tool
+    {
+        _txtToleranceFill->Enable();
+        _sldToleranceFill->Enable();
+        _tolerancefillCtrl->Enable();
+
+        _txtDistanceFill->Enable();
+        _sldDistanceFill->Enable();
+        _distancefillCtrl->Enable();
+    }
 }
 
 //---------------------------------------------------------------------------
index e52f412dbab4b4d6b992724303767fe29f236b47..79f053db2c75021b37d3bdb7dfd0e306be44cdab 100644 (file)
@@ -17,7 +17,11 @@ public:
     void OnBrushTool(wxCommandEvent &event);
     void OnCopy(wxCommandEvent &event);
     void OnUndo(wxCommandEvent &event);
-
+    void DisableControls();
+    void OnSldToleranceFill(wxScrollEvent& event);
+    void OnCtrTxtToleranceFill(wxCommandEvent &event);
+    void OnSldDistanceFill(wxScrollEvent& event);
+    void OnCtrTxtDistanceFill(wxCommandEvent &event);
 
 private:
     wxSlider        *_sldBrushSize;
@@ -27,6 +31,18 @@ private:
     wxRadioBox      *_rb2D3D;
     wxRadioBox      *_rbBrushTool;
 
+    wxStaticText    *_txtToleranceFill;
+    wxSlider        *_sldToleranceFill;
+    wxTextCtrl      *_tolerancefillCtrl;
+
+       wxStaticText    *_txtDistanceFill;
+    wxSlider        *_sldDistanceFill;
+    wxTextCtrl      *_distancefillCtrl;
+
+
+
+
+
 protected:
 
 };