]> Creatis software - creaMaracasVisu.git/commitdiff
#3418 creaMaracasVisu Feature New Normal - ManualPaint_model with openmp
authorEduardo DAVILA <davila@localhost.localdomain>
Wed, 29 Apr 2020 15:58:09 +0000 (17:58 +0200)
committerEduardo DAVILA <davila@localhost.localdomain>
Wed, 29 Apr 2020 15:58:09 +0000 (17:58 +0200)
bbtk/src/bbcreaMaracasVisuManualPaint_Model.cxx
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.h
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/baseFilterManualPaint.cpp
lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/baseFilterManualPaint.h

index 7167f6cbff873cc17cbff82fe8ac9cde70301e3f..2a64b94278b5d122d0180a0ac6c7663b13ac0ab2 100644 (file)
@@ -81,7 +81,7 @@ long int k3omp=(double)(size2-1)*0.4;
 long int k4omp=(double)(size2-1)*0.6;
 long int k5omp=(double)(size2-1)*0.8;
 long int k6omp=(double)(size2-1)*1.0;
-printf("EED ManualPaint_Model::LstPointOMPAnalice (with openmp)\n");
+printf("EED ManualPaint_Model::LstPointOMPAnalice (with openmp)  size=%ld\n",size2);
 #pragma omp parallel for 
                for (i2=0;i2<size2;i2++)
                {
@@ -141,12 +141,12 @@ void ManualPaint_Model::Process()
                        manualpaintmodel->SetTool( bbGetInputTool() );
                        manualpaintmodel->Set2D3D( bbGetInput2D3D() );
                        manualpaintmodel->SetImages( bbGetInputImage(),bbGetInputImage2() );
-                       manualpaintmodel->SetGrayLevel( bbGetInputGrayLevel() );
+                       manualpaintmodel->SetGrayLevel( bbGetInputGrayLevel() );                                        
                        manualpaintmodel->SetDirection( bbGetInputDirection() );
                        manualpaintmodel->SetBrushSize( bbGetInputBrushSize() );
                        manualpaintmodel->SetBrushForm( bbGetInputBrushForm() );
                        manualpaintmodel->SetToleranceFill( bbGetInputToleranceFill() );
-                       manualpaintmodel->SetDistanceFill( bbGetInputDistanceFill() );          
+                       manualpaintmodel->SetDistanceFill( bbGetInputDistanceFill() );                          
                        manualpaintmodel->SetRangeMin( bbGetInputRange()[0] );
                        manualpaintmodel->SetRangeMax( bbGetInputRange()[1] );
                        if (bbGetInputPoint().size()==3)
@@ -159,11 +159,13 @@ void ManualPaint_Model::Process()
                                //-- Alternativa con openmp --
                                LstPointOMPAnalice();
 
-/* -- Original ByLstPoints sin openmp --
+  /* -- Original ByLstPoints sin openmp --
                                int i,size = bbGetInputByLstPointsX().size();
                                for (i=0;i<size;i++)
                                {
-                                       manualpaintmodel->PaintImage( bbGetInputByLstPointsX()[i] , bbGetInputByLstPointsY()[i] , bbGetInputByLstPointsZ()[i] );
+                                       manualpaintmodel->PaintImage(   bbGetInputByLstPointsX()[i] , 
+                                                                                                       bbGetInputByLstPointsY()[i] , 
+                                                                                                       bbGetInputByLstPointsZ()[i] );
                                        //_manualPaintModel->SetUndoImage();     // Probably needed.   Here is ok.
                                } // for
  -- Original ByLstPoints sin openmp --*/
index f7feac9fc4e6c81e533e115fcc8b1d605d148360..0f359e6c9f3e0f16a61bedb5566929d51fbf95f2 100644 (file)
@@ -72,11 +72,11 @@ void BrushFilter::FindMinMaxBrush(int &minX, int &maxX, int &minY, int &maxY,
 
        if (minX < _minX) { minX = _minX; }
        if (minY < _minY) { minY = _minY; }
-
        if (minZ < _minZ) { minZ = _minZ; }
-       if (maxX > _maxX) { maxX = _maxX; }
-       if (maxY > _maxY) { maxY = _maxY; }
-       if (maxZ > _maxZ) { maxZ = _maxZ; }
+
+       if (maxX >= _dimX) { maxX = _dimX-1; }
+       if (maxY >= _dimY) { maxY = _dimY-1; }
+       if (maxZ >= _dimZ) { maxZ = _dimZ-1; }
 
        //--
        SetGeneralMinMax(minX, maxX, minY, maxY, minZ, maxZ);
index 0bf97b99bc0540d496687ac483454882364674d5..e76dc6cf0391e0fce8f387d08e96f5fa267090f0 100644 (file)
 FillFilter::FillFilter() 
 {
        _tolerancefill          = 125;
-       _distancefill           = 5;
-       _auxImageFill           = NULL;
-       _maxXback                       = 0;
-       _maxYback                       = 0;
-       _maxZback                       = 0;
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     _auxImageFill           = NULL;
+//     _maxXback                       = 0;
+//     _maxYback                       = 0;
+//     _maxZback                       = 0;
+       SetDistanceFill(5);
 }
 
 //---------------------------------------------------------------------------
 FillFilter::~FillFilter() 
 {
+/*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
        if (_auxImageFill != NULL)
        {
                _auxImageFill->Delete();
        }//_auxImageFill
+*/
 }
 
 //---------------------------------------------------------------------------
 void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
 {      
        baseFilterManualPaint::SetImages(image,image2); 
+
+/* //EED 2020-04-28  BORRAME Change to local variables to use with openmp
        if ((_maxX!=_maxXback) || (_maxY!=_maxYback) || (_maxZ!=_maxZback)) 
        {
                if (_auxImageFill != NULL)
@@ -74,9 +80,11 @@ void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
        }
        unsigned char   * ptrAuxImageFill = (unsigned char      *)_auxImageFill->GetScalarPointer();
        memset(ptrAuxImageFill, 0, (_maxX+1) * (_maxY+1) * (_maxZ+1) );
-       _maxXback=_maxX;
-       _maxYback=_maxY;
-       _maxZback=_maxZ;        
+       _maxXback = _maxX;
+       _maxYback = _maxY;
+       _maxZback = _maxZ;      
+*/
+
 }
 
 
@@ -86,29 +94,91 @@ void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
 void FillFilter::Run() // virtual
 {
        long int ivi;
-       if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
-                       && (_pz >= _minZ) && (_pz <= _maxZ)) 
+       if ((_px >= _minX) && (_px < _dimX) && (_py >= _minY) && (_py < _dimY)
+                       && (_pz >= _minZ) && (_pz < _dimZ)) 
        {
                this->_IMManager->BaseInitialPoint(_px, _py ,_pz);
-               _graylevelbasefill                      = _image->GetScalarComponentAsDouble(_px, _py, _pz,0);
-               _distbasefill                           = _distancefill * _distancefill;
-               ivi                                             = _px + _py*(_maxX+1) + _pz*(_maxX+1)*(_maxY+1);  // index vector image
-               FillToolLoop(_px, _py, _pz, ivi);
+               FillToolLoop(_px, _py, _pz);
        } //if _minX _maxX _minY _maxY _minZ _maxZ
 }
 
+
 //---------------------------------------------------------------------------
-void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA) 
+vtkImageData* FillFilter::GenerateAuxImageFill(        long int &OneColumnAux, long int &OneLineAux , long int &OnePlaneAux, 
+                                                                                               int px,int py,int pz, 
+                                                                                               int &pxAux, int &pyAux, int &pzAux )
 {
+       // _2D3D = 1     3D
+
+       int minXAux = px-_distancefill;  if (minXAux>=0) { pxAux=px-minXAux; } else { pxAux=px; minXAux=0; }
+       int minYAux = py-_distancefill;  if (minYAux>=0) { pyAux=py-minYAux; } else { pyAux=py; minYAux=0; }
+       int minZAux = pz-_distancefill;  if (minZAux>=0) { pzAux=pz-minZAux; } else { pzAux=pz; minZAux=0; }
+
+       int maxXAux = px+_distancefill;  if (maxXAux>_dimX) { maxXAux=_dimX; }
+       int maxYAux = py+_distancefill;  if (maxYAux>_dimY) { maxYAux=_dimY; }
+       int maxZAux = pz+_distancefill;  if (maxZAux>_dimZ) { maxZAux=_dimZ; }
+
+
+       int auxDimX = maxXAux-minXAux+1;
+       int auxDimY = maxYAux-minYAux+1;
+       int auxDimZ = maxZAux-minZAux+1;
+
+       // new vtkImageData
+       if (_2D3D==0)  // 2D
+       {       
+               if (_direction==0) // YZ
+               {
+                       auxDimX = 1;
+               }
+               if (_direction==1) // XZ
+               {
+                       auxDimY = 1;
+               }
+               if (_direction==2) // XY
+               {
+                       auxDimZ = 1;
+               }
+       } // if 2D
+
+       OneColumnAux    = 1;
+       OneLineAux              = auxDimX;
+       OnePlaneAux             = auxDimX*auxDimY;
+
+       vtkImageData *auxImageFill;
+       auxImageFill = vtkImageData::New();
+       auxImageFill->SetDimensions(auxDimX, auxDimY, auxDimZ);
+       auxImageFill->SetOrigin(0, 0, 0);
+       auxImageFill->SetExtent(0, auxDimX, 0, auxDimY, 0, auxDimZ);
+       auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
+       unsigned char   * ptrAuxImageFill = (unsigned char      *)auxImageFill->GetScalarPointer();
+       memset( ptrAuxImageFill, 0, auxDimX*auxDimY*auxDimZ );
+       return auxImageFill;
+}
+
+
+
+//---------------------------------------------------------------------------
+void FillFilter::FillToolLoop(int px, int py, int pz) 
+{
+       _distbasefill                           = _distancefill * _distancefill;
        double difX,difY,difZ,_tmpDistfill;
        std::vector<int> lstX;
        std::vector<int> lstY;
        std::vector<int> lstZ;
-       std::vector<long long int> lstivi;
        lstX.push_back(px);
        lstY.push_back(py);
        lstZ.push_back(pz);
-       lstivi.push_back( iviA );
+       std::vector<long long int> lstivi;
+       lstivi.push_back( px + py*_OneLine+ pz*_OnePlane );
+
+       long int OneColumnAux, OneLineAux, OnePlaneAux;
+       int pxAux, pyAux, pzAux;
+       vtkImageData* auxImageFill = GenerateAuxImageFill(      OneColumnAux,OneLineAux,OnePlaneAux,
+                                                                                                               px,py,pz,
+                                                                                                               pxAux,pyAux,pzAux );
+       std::vector<long long int> lstiviAux;
+       lstiviAux.push_back( pxAux + pyAux*OneLineAux + pzAux*OnePlaneAux );
+
 
        DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
        if (_image2!=NULL)
@@ -116,11 +186,16 @@ void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
                DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
        } // if _image2
 
-       DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
+       GETVALUE2_VTK_CREA(_graylevelbasefill,p_image,st_image,lstivi[0])       
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
+       DEF_POINTER_IMAGE_VTK_CREA(vAuxImageFill,ssAuxImageFill,pAuxImageFill,stAuxImageFill,auxImageFill)
+
        while ( lstX.size()!=0 )
        {
                // if point inside image
-               if ((lstX[0] >= _minX) && (lstX[0] <= _maxX) && (lstY[0] >= _minY) && (lstY[0] <= _maxY) && (lstZ[0] >= _minZ) && (lstZ[0] <= _maxZ)) 
+               if ((lstX[0] >= _minX) && (lstX[0] < _dimX) && (lstY[0] >= _minY) && (lstY[0] < _dimY) && (lstZ[0] >= _minZ) && (lstZ[0] < _dimZ)) 
                {   
                        difX = px-lstX[0];
                        difY = py-lstY[0];
@@ -130,8 +205,8 @@ void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
                        if (_tmpDistfill<=_distbasefill)
                        {
                                // if point not visited
-                               GETVALUE2_VTK_CREA(v_auxImageFill,p_auxImageFill,st_auxImageFill,lstivi[0] );   
-                               if (v_auxImageFill==0)
+                               GETVALUE2_VTK_CREA(vAuxImageFill,pAuxImageFill,stAuxImageFill,lstiviAux[0] );   
+                               if (vAuxImageFill==0)
                                { 
                                        // If Gray Level valid
 
@@ -171,20 +246,18 @@ void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
 
                                        if (isInRange) 
                                        {
-                                               _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
-                                                               && (_tmpiglfill2 != _graylevel)
-                                                               && (_tmpiglfill  >= grayLBFMTOL)
-                                                               && (_tmpiglfill  <= grayLBFPTOL)
-                                                               && (_tmpDistfill <= _distbasefill); //DFCH
+                                               _auxGrayLevelValidationFill =   (_tmpiglfill  != _graylevel)    && 
+                                                                                                               (_tmpiglfill2 != _graylevel)    && 
+                                                                                                               (_tmpiglfill  >= grayLBFMTOL)   && 
+                                                                                                               (_tmpiglfill  <= grayLBFPTOL)   && 
+                                                                                                               (_tmpDistfill <= _distbasefill) ; //DFCH
                                        } else {
                                                _auxGrayLevelValidationFill = false;
                                        } // if isInRange
 
-                                       if (_auxGrayLevelValidationFill)  
+                                       if (_auxGrayLevelValidationFill==true)  
                                        {
-
                                                this->_IMManager->AddModifiedPixel(lstX[0], lstY[0], lstZ[0]); //DFCH
-
                                                // Modifie image
                                                if (_image2!=NULL)
                                                {
@@ -196,47 +269,49 @@ void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
                                                } // if _image2
 
                                                // Add neighborhood points in the list 
+
+                               // Add point to already visited
+                               SETVALUE2_VTK_CREA(1,pAuxImageFill,stAuxImageFill,lstiviAux[0]);
+
                                                if (_2D3D == 0) //2D
                                                {
                                                        if (_direction == 0) // YZ
                                                        {
-                                                               //lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
-                                                               //lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
+//lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
+//lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
                                                        }
                                                        if (_direction == 1) // XZ
                                                        {
-                                                               lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
-                                                               lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
-                                                               // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
-                                                               // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
+  lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
+  lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
+//  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
+//  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
                                                        }
                                                        if (_direction == 2) // XY
                                                        {
-                                                               lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
-                                                               lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
-                                                               lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
-                                                               //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
-                                                               //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
+lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
+lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
+//lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
+//lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
                                                        }
                                                } else { // 3D
-                                                       lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
-                                                       lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
-                                                       lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
-                                                       lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
-                                                       lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
-                                                       lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
+  lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
+  lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
+  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
                                                } // 2D 3D
                                        } // if gray level valid      _auxGrayLevelValidationFill
                                } // if point not visited
-                               // Add point to already visited
-                               SETVALUE2_VTK_CREA(1,p_auxImageFill,st_auxImageFill,lstivi[0]);
                        } // if distance of center point
                } // if point inside image
                // Remove point from the list
@@ -244,7 +319,9 @@ void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
                lstY.erase( lstY.begin() );
                lstZ.erase( lstZ.begin() );
                lstivi.erase( lstivi.begin() );
+               lstiviAux.erase( lstiviAux.begin() );
        } // while _lstX.size
+       auxImageFill->Delete();
 }
 
 //---------------------------------------------------------------------------
@@ -259,11 +336,11 @@ void FillFilter::SetDistanceFill(int distancefill)
        _distancefill = distancefill;
 }
 
+/*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
 //---------------------------------------------------------------------------
 vtkImageData* FillFilter::GetAuxImageFill() 
 {
        return _auxImageFill;
 }
-
-
+*/
 
index 03ac7a3a7e6d0a193a1dca961bf03a748b10b6f4..0be4fd8d23cce53066303d8ab8a5ca96fdb19a1f 100644 (file)
@@ -34,11 +34,11 @@ public:
        FillFilter();
        virtual ~FillFilter();
     void                       Run();
-       void                    FillToolLoop(int px, int py, int pz,long int iviA) ;
+       void                    FillToolLoop(int px, int py, int pz);
     void                       SetToleranceFill(double tolerancefill);
     void                       SetDistanceFill(int distancefill);
     virtual void       SetImages(vtkImageData *image,vtkImageData *image2);
-       vtkImageData*   GetAuxImageFill();
+//     vtkImageData*   GetAuxImageFill();
 private:
     double          _tolerancefill;
     int             _distancefill;
@@ -46,21 +46,31 @@ private:
     double          _distbasefill;
     double          _tmpiglfill;
     double          _tmpiglfill2;
-    vtkImageData    *_auxImageFill;
     bool            _auxGrayLevelValidationFill;
-       int                     _maxXback;
-       int                     _maxYback;
-       int                     _maxZback;
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//   vtkImageData    *_auxImageFill;
+//     int                     _maxXback;
+//     int                     _maxYback;
+//     int                     _maxZback;
+
+vtkImageData* GenerateAuxImageFill(    long int &OneColumnAux, long int &OneLineAux , long int &OnePlaneAux, 
+                                                                       int px,int py,int pz, 
+                                                                       int &pxAux, int &pyAux, int &pzAux );
+
+
 protected:
 
-//DEF_POINTER_IMAGE_VTK_CREA_definition( v_image , ss_image , p_image , st_image )             
+
+//Change to local variables to use with openmp
+// DEF_POINTER_IMAGE_VTK_CREA_definition( v_image , ss_image , p_image , st_image )            
        double                  v_image;
        int                     ss_image;
        char                    *p_image;
        int                             st_image;
 
-//macro not working ???    
-//   DEF_POINTER_IMAGE_VTK_CREA_definition(v_image2,ss_image2,p_image2,st_image2)              
+// //macro not working ???    
+// DEF_POINTER_IMAGE_VTK_CREA_definition(v_image2,ss_image2,p_image2,st_image2)                
        double                  v_image2;
        int                     ss_image2;
        char                    *p_image2;
index e57d3eb61dc21c8314a8f12a483f1eec17d79238..868583ab83d2408dda9fdf1b30eec4c46cff8b4a 100644 (file)
@@ -32,7 +32,8 @@ ManualPaintModel::ManualPaintModel()
        _brushfilter                    = new BrushFilter();
        _fillfilter                     = new FillFilter();
        _imageUndoRedo                  = new ImageUndoRedo();
-       _imageUndoRedo_visited  = new ImageUndoRedo();
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     _imageUndoRedo_visited  = new ImageUndoRedo();
 }
 
 //---------------------------------------------------------------------------
@@ -93,7 +94,8 @@ void ManualPaintModel::SetImages(vtkImageData *image,vtkImageData *image2)
                } else {
                        _imageUndoRedo->SetImage(image);
                }
-               _imageUndoRedo_visited->SetImage( _fillfilter->GetAuxImageFill() );
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//             _imageUndoRedo_visited->SetImage( _fillfilter->GetAuxImageFill() );
        } else {
                printf("EED Warning image=NULL in ManualPaintModel::SetImage(image)\n ");
        }
@@ -170,7 +172,8 @@ void ManualPaintModel::SetUndoImage()
                imMManager = this->_fillfilter->GetImageMManager();
        } // if 1
        this->_imageUndoRedo                    -> SetURImages(imMManager);
-       this->_imageUndoRedo_visited    -> SetURImages(imMManager);
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     this->_imageUndoRedo_visited    -> SetURImages(imMManager);
        this->_brushfilter                              -> CleanImageMManager();
        this->_fillfilter                               -> CleanImageMManager();
 }
@@ -179,13 +182,15 @@ void ManualPaintModel::SetUndoImage()
 void ManualPaintModel::Undo() 
 {
        this->_imageUndoRedo->Undo();
-       this->_imageUndoRedo_visited->Undo();
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     this->_imageUndoRedo_visited->Undo();
 }
 
 void ManualPaintModel::Redo() 
 {
        this->_imageUndoRedo->Redo();
-       this->_imageUndoRedo_visited->Redo();
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     this->_imageUndoRedo_visited->Redo();
 }
 
 
index 909db02c41aac42a13866dfa0ae4dc6c1570361c..2db1c0f46a83c61182b34ad83b795b0c738e9232 100644 (file)
@@ -37,15 +37,21 @@ baseFilterManualPaint::baseFilterManualPaint()
        _minX           = 0;
        _minY           = 0;
        _minZ           = 0;
-       _maxX           = 0;
-       _maxY           = 0;
-       _maxZ           = 0;
-       _pMinX          = 0;
-       _pMinY          = 0;
-       _pMinZ          = 0;
-       _pMaxX          = 0;
-       _pMaxY          = 0;
-       _pMaxZ          = 0;
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     _maxX           = 0;
+//     _maxY           = 0;
+//     _maxZ           = 0;
+//     _pMinX          = 0;
+//     _pMinY          = 0;
+//     _pMinZ          = 0;
+//     _pMaxX          = 0;
+//     _pMaxY          = 0;
+//     _pMaxZ          = 0;
+
+       _dimX           = 0;
+       _dimY           = 0;
+       _dimZ           = 0;
        _RangeMin       = 0;
        _RangeMax       = 6000;
 }
@@ -112,21 +118,24 @@ void baseFilterManualPaint::SetImages(vtkImageData *image, vtkImageData *image2)
                _image2->GetExtent(extB);
 #endif
 
-               _maxX = std::min( ext[1]-ext[0] , extB[1]-extB[0] );
-               _maxY = std::min( ext[3]-ext[2] , extB[3]-extB[2] );
-               _maxZ = std::min( ext[5]-ext[4] , extB[5]-extB[4] );
+               _dimX = std::min( ext[1]-ext[0]+1 , extB[1]-extB[0]+1 );
+               _dimY = std::min( ext[3]-ext[2]+1 , extB[3]-extB[2]+1 );
+               _dimZ = std::min( ext[5]-ext[4]+1 , extB[5]-extB[4]+1 );
        } else {
-               _maxX = ext[1]-ext[0];
-               _maxY = ext[3]-ext[2];
-               _maxZ = ext[5]-ext[4];
+               _dimX = ext[1]-ext[0]+1;
+               _dimY = ext[3]-ext[2]+1;
+               _dimZ = ext[5]-ext[4]+1;
        } // if
 
        _OneColumn      = 1;
-       _OneLine        = _maxX+1;
-       _OnePlane       = (_maxX+1)*(_maxY+1);
+       _OneLine        = _dimX;
+       _OnePlane       = _dimX*_dimY;
 }
 
 
+
+/*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+
 //---------------------------------------------------------------------------
 void baseFilterManualPaint::ResetGeneralMinMax() 
 {
@@ -149,6 +158,8 @@ void baseFilterManualPaint::SetGeneralMinMax(int minX, int maxX, int minY,
        if (_pMaxY < maxY) { _pMaxY = maxY; }
        if (_pMaxZ < maxZ) { _pMaxZ = maxZ; }
 }
+*/
+
 
 //---------------------------------------------------------------------------
 void baseFilterManualPaint::GetScalarRange(double * range) 
index 4bd2c34312d1923a0f72825395d6c5c4119db3a9..76afc3fced5085b8eb93f19a61c5d2cfe95cb30d 100644 (file)
@@ -62,25 +62,35 @@ protected:
        int                     _px; // start point of the brush
        int                     _py;
        int                     _pz;
-       int                     _pMinX; // General min max of many brush actions
-       int                     _pMinY;
-       int                     _pMinZ;
-       int                     _pMaxX;
-       int                     _pMaxY;
-       int                     _pMaxZ;
        int                     _minX; // min max of the image
-       int                     _maxX;
        int                     _minY;
-       int                     _maxY;
        int                     _minZ;
-       int                     _maxZ;
-       long int                _OneColumn;
-       long int                _OneLine;
-       long int                _OnePlane;
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+//     int                     _maxX;
+//     int                     _maxY;
+//     int                     _maxZ;
+//     int                     _pMinX; // General min max of many brush actions
+//     int                     _pMinY;
+//     int                     _pMinZ;
+//     int                     _pMaxX;
+//     int                     _pMaxY;
+//     int                     _pMaxZ;
+
+       int                     _dimX;
+       int                     _dimY;
+       int                     _dimZ;
        bool                    _2D3D;
        double                  _graylevel;
     int                        _RangeMin;
     int                        _RangeMax;
+
+//EED 2020-04-28  BORRAME Change to local variables to use with openmp
+       long int                _OneColumn;
+       long int                _OneLine;
+       long int                _OnePlane;
+
+
 };
 
 #endif // _BASE_FILTER_MANUAL_PAINT_H_