ManualPaintModel::ManualPaintModel()
{
- _graylevel = 0.0;
- _brushsize = 1;
- _brushform = 0; // 0 rectangle-box , 1 circle-sphere
- _2D3D = 0; // 0 2D , 1 true 3D
- _brushtool = 0; // 0 pencil , 1 fill
-
- _minX=0;
- _minY=0;
- _minZ=0;
- _maxX=0;
- _maxY=0;
- _maxZ=0;
+ _graylevel = 0.0;
+ _brushsize = 1;
+ _brushform = 0; // 0 rectangle-box , 1 circle-sphere
+ _2D3D = 1; // 0 2D , 1 true 3D
+ _brushtool = 0; // 0 pencil , 1 fill
+ _direction = 0; // 1 XZ , 0 YZ , 2 XY
+ _tolerancefill = 50;
+ _distancefill = 500;
+ _limitRecursionFill = 100000;
+ _minX = 0;
+ _minY = 0;
+ _minZ = 0;
+ _maxX = 0;
+ _maxY = 0;
+ _maxZ = 0;
+ _auxImageFill = NULL;
}
//---------------------------------------------------------------------------
ManualPaintModel::~ManualPaintModel()
{
+ if (_auxImageFill!=NULL)
+ {
+ _auxImageFill->Delete();
+ }
}
+//---------------------------------------------------------------------------
void ManualPaintModel::SetImage(vtkImageData *image)
{
_image=image;
_maxX=ext[1]-ext[0];
_maxY=ext[3]-ext[2];
_maxZ=ext[5]-ext[4];
+
+
+ if (_auxImageFill!=NULL)
+ {
+ _auxImageFill->Delete();
+ }
+ _auxImageFill = vtkImageData::New();
+ _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
+ _auxImageFill->SetOrigin(0,0,0);
+ _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
+ _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
+ _auxImageFill->SetScalarTypeToUnsignedChar();
+ _auxImageFill->AllocateScalars();
+
}
+//---------------------------------------------------------------------------
void ManualPaintModel::PaintImage(int px,int py, int pz)
{
if (_brushtool==0)
}
+//---------------------------------------------------------------------------
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;
+ _graylevelbasefill = _image->GetScalarComponentAsDouble(px,py,pz, 0);
+ _pxfill = px;
+ _pyfill = py;
+ _pzfill = pz;
+ _distbasefill = _distancefill*_distancefill;
+ _countRecursiveFill = 0;
+ _countRecursiveFillProblem = 0;
+ _countProgressingFill = 0;
+ unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
+ _usingAuxImageFill=false;
+ memset ( pImage , 0 , _maxX*_maxY*_maxZ );
+
FillToolRecursive(px,py,pz);
+ printf("--\n");
+
+ int ii,jj,kk;
+ while (_countRecursiveFillProblem!=0)
+ {
+ _countRecursiveFillProblem = 0;
+ _usingAuxImageFill=true;
+ for(ii=0;ii<=_maxX;ii++)
+ {
+ for(jj=0;jj<=_maxY;jj++)
+ {
+ for(kk=0;kk<=_maxZ;kk++)
+ {
+ pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
+ if ( (*pImage)==1 )
+ {
+ FillToolRecursive(ii,jj,kk);
+ }
+ } // for kk
+ } // for jj
+ } //for ii
+ printf("-\n");
+ } // while
+
} //if _minX _maxX _minY _maxY _minZ _maxZ
}
+//---------------------------------------------------------------------------
void ManualPaintModel::FillToolRecursive(int px,int py, int pz)
{
+ _countRecursiveFill++;
- double dist=(px-_pxfill) * (px-_pxfill) + (py-_pyfill) * (py-_pyfill) + (pz-_pzfill) * (pz-_pzfill);
+ _countProgressingFill++;
+ if (_countProgressingFill>200000)
+ {
+ printf("R %ld \n", _countRecursiveFill );
+ _countProgressingFill=0;
+ }
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)
- )
+ if (_usingAuxImageFill==true)
{
-// _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);
+ _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
}
+ _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
+ _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
+
+ _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
+ (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
+ (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
+ (_tmpDistfill<=_distbasefill);
+
+ if ( _auxGrayLevelValidationFill==true )
+ {
+ _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
+
+ if (_countRecursiveFill< _limitRecursionFill)
+ {
+
+ if (_2D3D==0) //2D
+ {
+ if (_direction==0) // YZ
+ {
+ //FillToolRecursive(px+1,py,pz);
+ //FillToolRecursive(px-1,py,pz);
+ FillToolRecursive(px,py+1,pz);
+ FillToolRecursive(px,py-1,pz);
+ FillToolRecursive(px,py,pz-1);
+ FillToolRecursive(px,py,pz+1);
+ }
+ if (_direction==1) // XZ
+ {
+ FillToolRecursive(px+1,py,pz);
+ FillToolRecursive(px-1,py,pz);
+ //FillToolRecursive(px,py+1,pz);
+ //FillToolRecursive(px,py-1,pz);
+ FillToolRecursive(px,py,pz-1);
+ FillToolRecursive(px,py,pz+1);
+ }
+ if (_direction==2) // XY
+ {
+ 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);
+ }
+ } else { // 3D
+
+ FillToolRecursive(px+1,py,pz);
+ FillToolRecursive(px-1,py,pz);
+ FillToolRecursive(px,py+1,pz);
+ FillToolRecursive(px,py-1,pz);
+ FillToolRecursive(px,py,pz-1);
+ FillToolRecursive(px,py,pz+1);
+ } // 2D 3D
+
+ } //_countRecursiveFill
+ } // _graylevel
+
+
+ if ( (_auxGrayLevelValidationFill==true ) &&
+ (_countRecursiveFill>= _limitRecursionFill)
+ )
+ {
+ _countRecursiveFillProblem++;
+
+ if (_2D3D==0) //2D
+ {
+ if (_direction==0) // YZ
+ {
+ //SetAuxImageFill(px+1,py,pz);
+ //SetAuxImageFill(px-1,py,pz);
+ SetAuxImageFill(px,py+1,pz);
+ SetAuxImageFill(px,py-1,pz);
+ SetAuxImageFill(px,py,pz-1);
+ SetAuxImageFill(px,py,pz+1);
+ }
+ if (_direction==1) // XZ
+ {
+ SetAuxImageFill(px+1,py,pz);
+ SetAuxImageFill(px-1,py,pz);
+ //SetAuxImageFill(px,py+1,pz);
+ //SetAuxImageFill(px,py-1,pz);
+ SetAuxImageFill(px,py,pz-1);
+ SetAuxImageFill(px,py,pz+1);
+ }
+ if (_direction==2) // XY
+ {
+ SetAuxImageFill(px+1,py,pz);
+ SetAuxImageFill(px-1,py,pz);
+ SetAuxImageFill(px,py+1,pz);
+ SetAuxImageFill(px,py-1,pz);
+ //SetAuxImageFill(px,py,pz-1);
+ //SetAuxImageFill(px,py,pz+1);
+ }
+ } else { // 3D
+
+ SetAuxImageFill(px+1,py,pz);
+ SetAuxImageFill(px-1,py,pz);
+ SetAuxImageFill(px,py+1,pz);
+ SetAuxImageFill(px,py-1,pz);
+ SetAuxImageFill(px,py,pz-1);
+ SetAuxImageFill(px,py,pz+1);
+ } // 2D 3D
+
+ } // _graylevel //_limitRecursionFill
+
+
} //if _minX _maxX _minY _maxY _minZ _maxZ
+
+
+ _countRecursiveFill--;
+
}
-void ManualPaintModel::BrushTool(int px,int py, int pz)
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetAuxImageFill(int px,int py, int pz)
{
+ if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
+ {
+ _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
+ }
+}
- printf("EED ManualPaintModel::PaintImage %d %d %d\n", px,py,pz);
+//---------------------------------------------------------------------------
+void ManualPaintModel::BrushTool(int px,int py, int pz)
+{
if (_image!=NULL)
{
float value=(float)_graylevel;
int i,j,k;
int size = _brushsize-1;
- int minX=px-size;
- int maxX=px+size;
- int minY=py-size;
- int maxY=py+size;
- int minZ=pz-size;
- int maxZ=pz+size;
+
+ int minX = px-size;
+ int maxX = px+size;
+ int minY = py-size;
+ int maxY = py+size;
+ int minZ = pz-size;
+ int maxZ = pz+size;
+
+ if (_2D3D==0) //2D
+ {
+ if (_direction==0) // YZ
+ {
+ minX=px;
+ maxX=px;
+ }
+ if (_direction==1) // XZ
+ {
+ minY=py;
+ maxY=py;
+ }
+ if (_direction==2) // XY
+ {
+ minZ=pz;
+ maxZ=pz;
+ }
+ }
+
+ if (_2D3D==1) // 3D
+ {
+ }
+
double xx,yy,zz,rr=size*size;
- printf("EED bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage brushForm=%d\n",_brushform);
for (i=minX; i<=maxX; i++)
{
xx=px-i;
_distancefill = distancefill;
}
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetDirection(int direction)
+{
+ _direction = direction;
+}
// Widget interface
wxStaticText *tittleText = new wxStaticText(panel, -1, _T(" Manual Paint"));
- wxStaticText *txtBrushSize = new wxStaticText(panel, -1, wxString(_T(" Brush size ")));
+ _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);
_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") );
+ _sldDistanceFill = new wxSlider(panel, -1, 500, 1, 500, wxDefaultPosition, wxDefaultSize, wxSL_LABELS);
+ _distancefillCtrl = new wxTextCtrl(panel , -1,_T("500") );
wxString lst2D3D[2];
sizer1->Add(new wxStaticText(panel,-1,_T(" ")));
sizer1->Add(tittleText);
+ sizer1->Add(new wxStaticText(panel,-1,_T(" ")));
+ sizer1->Add(_rbBrushTool, 1, wxGROW );
+
sizer1->Add(new wxStaticText(panel,-1,_T(" ")));
sizer1->Add(txtGrayLevel);
sizer1->Add(_sldGrayLevel, 1, wxGROW );
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(_txtBrushSize);
sizer1->Add(_sldBrushSize, 1, wxGROW );
sizer1->Add(new wxStaticText(panel,-1,_T(" ")));
//---------------------------------------------------------------------------
void wxManualPaintPanel::DisableControls()
{
+ _txtBrushSize->Disable();
_sldBrushSize->Disable();
_rbBrushForm->Disable();
if (_rbBrushTool->GetSelection()==0) //Brush tool
{
+ _txtBrushSize->Enable();
_sldBrushSize->Enable();
_rbBrushForm->Enable();
}