]> Creatis software - bbtk.git/blobdiff - packages/vtk/src/bbvtkSphereList.cxx
#3063 BBTK Feature New Normal - New box VectorFilterDouble in std package
[bbtk.git] / packages / vtk / src / bbvtkSphereList.cxx
index 8e552d7614300e3e8b1c31d86477f0e0b7b108e4..616f088d4b5093246a909ec71b00e15bcad69b65 100644 (file)
@@ -1,3 +1,30 @@
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
 #include "bbvtkSphereList.h"
 #include "bbvtkPackage.h"
 
@@ -11,95 +38,151 @@ namespace bbvtk
 BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,SphereList)
 BBTK_BLACK_BOX_IMPLEMENTATION(SphereList,bbtk::AtomicBlackBox);
 
-void SphereList::Process()
+double SphereList::GetRadio(int i)
 {
+    double radio;
+       if ( bbGetInputlstRadio().size()==0 )
+        {
+            radio = 1.0;
+        } else if ( i<bbGetInputlstRadio().size() )
+       {
+            radio = bbGetInputlstRadio()[i];
+        } else  
+        {
+            radio = bbGetInputlstRadio()[ bbGetInputlstRadio().size() - 1 ];
+        }  
 
-        int iMin, iMax;
-       double px = 0.0;
-       double py = 0.0;
-       double pz = 0.0;
-       double radio;
-       double spc[3];
+       return radio;
+}
 
-       if (bbGetInputRenderer()!=NULL)
+
+void SphereList::GetPoint(int i, double &px,double &py,double &pz)        
+ {
+      double spc[3];
+      if (bbGetInputSpacing().size()==3)
+      {
+               spc[0]=bbGetInputSpacing()[0];
+               spc[1]=bbGetInputSpacing()[1];
+               spc[2]=bbGetInputSpacing()[2];
+      } else {
+               spc[0]=spc[1]=spc[2]=1;
+       }
+
+       px = bbGetInputlstPointX()[i]*spc[0];
+       if (bbGetInputlstPointY().size() == bbGetInputlstPointX().size() )
+       {
+               py = bbGetInputlstPointY()[i]*spc[1];
+       }
+               if (bbGetInputlstPointZ().size() == bbGetInputlstPointX().size() )
+       {                       
+               pz = bbGetInputlstPointZ()[i]*spc[2];
+       }
+}  
+
+                       
+void SphereList::GetColor(int i, double &cr,double &cg,double &cb)        
+ {
+       unsigned int j = 3*i +2;
+       if (j < bbGetInputColour().size() )
        {
-               spc[0]=spc[1]=spc[2]=1;
+               cr=bbGetInputColour()[3*i+0];
+               cg=bbGetInputColour()[3*i+1];
+               cb=bbGetInputColour()[3*i+2];
+               
+       } else {
+               int lastValidColorIndex = (bbGetInputColour().size()-1)/3;
+               lastValidColorIndex     = lastValidColorIndex*3;
+               cr=bbGetInputColour()[ lastValidColorIndex+0 ];
+               cg=bbGetInputColour()[ lastValidColorIndex+1 ];
+               cb=bbGetInputColour()[ lastValidColorIndex+2 ];
+       }
+}  
 
-               iMin=0;
-               iMax=bbGetInputlstPointX().size();
-               printf("EED SphereList::Process   iMax=%d \n", iMax);
-               // If the vector Y or respectively the vector Z has a different size from the vector X, the position value py or respectively pz is set to 0.
-               for ( int i=iMin ; i<iMax ; i=i+1 )
+void SphereList::Process()
+{
+       if (bbGetInputRenderer()!=NULL)
+       {
+               int sizeLstX=bbGetInputlstPointX().size();      
+               int sizeLstY=bbGetInputlstPointY().size();
+               int sizeLstZ=bbGetInputlstPointZ().size();
+               int sizeLstActors=sphereActor.size();
+               if ((sizeLstX==sizeLstY) &&(sizeLstX==sizeLstZ))
                {
-                       px = bbGetInputlstPointX()[i]*spc[0];
-                       if (bbGetInputlstPointY().size() == bbGetInputlstPointX().size() )
-                         {
-                           py = bbGetInputlstPointY()[i]*spc[1];
-                         }
-                       if (bbGetInputlstPointZ().size() == bbGetInputlstPointX().size() )
-                         {                     
-                           pz = bbGetInputlstPointZ()[i]*spc[2];
-                         }
-
-                       // If the number of elements in the radio list is different from the number of X coordinates, the radio value is set to 1.
-                       if (bbGetInputlstRadio().size() == bbGetInputlstPointX().size() )
-                         {
-                           radio = bbGetInputlstRadio()[i];
-                         }
-                       else
-                         {
-                           if  (bbGetInputlstRadio().size()>=1){
-                              radio = bbGetInputlstRadio()[ bbGetInputlstRadio().size() - 1 ];
-                               } else {
-                                       radio = 1.0;
-                               }
-                         }
-
-                       // Sphere
-                       vtkSphereSource * newSphere =  vtkSphereSource::New();
-                       vtkSphere.push_back(newSphere);
-
-                       newSphere -> SetThetaResolution(20);
-                       newSphere -> SetPhiResolution(20);
-                       newSphere -> SetRadius(radio); 
-
-                       vtkPolyDataMapper * newMapper = vtkPolyDataMapper::New();
-                       sphereMapper.push_back(newMapper);
-                       newMapper -> SetInput( newSphere -> GetOutput() );
-       
-                       vtkActor * newActor = vtkActor::New();
-                       sphereActor.push_back(newActor);
-                       newActor -> SetMapper(newMapper);
-                       newActor -> SetOrigin(0, 0, 0);
-                       newActor -> GetProperty() -> SetColor( bbGetInputColour()[0] , bbGetInputColour()[1] , bbGetInputColour()[2] );
-                       newActor -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
-                       newActor -> SetPosition( px,py,pz );
-       
-                       if ( bbGetInputTransform()!=NULL )
+                       if (sizeLstActors>sizeLstX)
                        {
-                               newActor->SetUserTransform( bbGetInputTransform() );
-                       }
-       
-
-                       if (bbGetInputRenderer()!=NULL)
-                         {
-                           bbGetInputRenderer() -> AddActor( newActor );
-                         }
-
-               } // for
-
-               if (sphereActor.size() != 0)
-                 {
-                   // Sets the output.
-                   bbSetOutputActorList(sphereActor);
-                 }
-
-       } // if (bbGetInputRenderer()!=NULL)
+                               int i;
+                               int diff=sizeLstActors-sizeLstX;
+                               for (i=0;i<diff;i++)
+                               {
+                                       bbGetInputRenderer()->RemoveActor( sphereActor[0] );
+                                       vtkspheresourceLst[0]->Delete();
+                                       sphereActor[0]->Delete();
+                                       vtkspheresourceLst.erase( vtkspheresourceLst.begin() );
+                                       sphereActor.erase( sphereActor.begin() );
+                               } // for 
+                       } // if size
+
+                       if (sizeLstActors<sizeLstX)
+                       {
+                               int i;
+                               int diff=sizeLstX-sizeLstActors;
+                               for (i=0;i<diff;i++)
+                               {
+                                       // Sphere
+                                       vtkSphereSource * newSphere = vtkSphereSource::New();
+                                       vtkspheresourceLst.push_back(newSphere);
+                                       newSphere -> SetThetaResolution(20);
+                                       newSphere -> SetPhiResolution(20);
+                                       newSphere -> SetRadius( 1 ); 
+                                       vtkPolyDataMapper * newMapper = vtkPolyDataMapper::New();
+                                       newMapper -> SetInput( newSphere -> GetOutput() );      
+                                       vtkActor * newActor = vtkActor::New();
+                                       sphereActor.push_back(newActor);
+                                       newActor -> SetMapper(newMapper);
+                                       newActor -> SetOrigin(0, 0, 0);                         
+                                       if ( bbGetInputTransform()!=NULL )
+                                       {
+                                               newActor->SetUserTransform( bbGetInputTransform() );
+                                       }
+                                       bbGetInputRenderer()->AddActor( newActor );
+                               } // for
+                       } // if size
+
+                       // Refresh data
+               for (int i = 0; i < sphereActor.size() ; i++)
+               {
+                               double px = 0.0;
+                               double py = 0.0;
+                               double pz = 0.0;
+                               double cr = 0.0;
+                               double cg = 0.0;
+                               double cb = 0.0;
+                               GetPoint(i, px,py,pz);
+                               GetColor(i, cr,cg,cb);
+                               sphereActor[i] ->SetPosition( px,py,pz );
+                sphereActor[i] -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
+                sphereActor[i] -> GetProperty() -> SetColor( cr,cg,cb );
+                vtkspheresourceLst[i] -> SetRadius( GetRadio(i) ); 
+               } // for i
+
+               if (sphereActor.size() != 0)
+            {
+               // Sets the output.
+               bbSetOutputActorList(sphereActor);
+               }
+  
+               } else {
+                       printf("EED Warning!  SphereList::Process Lst XYZ are not of the same size.\n");
+               }// if sizeLst
+       } else {
+                       printf("EED Warning!  SphereList::Process Render not assigned.\n");             
+       }// if Renderer
 
+//====================================================================
 
 }
 
+
 void SphereList::bbUserSetDefaultValues()
 {
  
@@ -117,7 +200,14 @@ void SphereList::bbUserSetDefaultValues()
   colour.push_back(0.0);
   colour.push_back(0.0);
   bbSetInputColour(colour);
-  
+       
+       // Sets default spacing.
+       std::vector<double> spacing;
+       spacing.push_back(1.0);
+       spacing.push_back(1.0);
+       spacing.push_back(1.0);
+       bbSetInputSpacing(spacing);
+       
   bbSetInputOpacity(1.0);
 
 }