]> Creatis software - bbtk.git/blobdiff - packages/vtk/src/bbvtkSphereList.cxx
#3059 BBTK Bug New Normal - Update of SphereList box in vtk package
[bbtk.git] / packages / vtk / src / bbvtkSphereList.cxx
index 8d5cfe7069f7604a2069db6f0957d108a9daa25a..88537a23097e0fda36d0e3c6626b7d2cf9f10e2e 100644 (file)
@@ -38,6 +38,69 @@ namespace bbvtk
 BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,SphereList)
 BBTK_BLACK_BOX_IMPLEMENTATION(SphereList,bbtk::AtomicBlackBox);
 
+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 ];
+        }  
+
+       return radio;
+}
+
+
+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];
+       }
+printf("EED SphereList::GetPoint() %f %f %f\n",px,py,pz);
+}  
+
+                       
+void SphereList::GetColor(int i, double &cr,double &cg,double &cb)        
+ {
+       unsigned int j = 3*i +2;
+       if (j < bbGetInputColour().size() )
+       {
+               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 ];
+       }
+}  
+
+
+
 void SphereList::Process()
 {
 
@@ -45,122 +108,82 @@ void SphereList::Process()
        double px = 0.0;
        double py = 0.0;
        double pz = 0.0;
-       double radio;
-       double spc[3];
-       int last_valid_color_index = 0;
-
 
+       double cr = 0.0;
+       double cg = 0.0;
+       double cb = 0.0;
+       
        if (bbGetInputRenderer()!=NULL)
        {
-                // If it is not the first time Process is executed, the actors have already been created. The only thing to do is to update the opacity. 
+// If it is not the first time Process is executed, the actors have already been created. The only thing to do is to update the opacity. 
                if (sphereActor.size() != 0)
-                {
-                  for (int i = 0; i < sphereActor.size(); i++)
-                    sphereActor[i] -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
-               }
-                else
-                {
-                    if (bbGetInputSpacing().size()==3)
-                    {
-                       spc[0]=bbGetInputSpacing()[0];
-                       spc[1]=bbGetInputSpacing()[1];
-                       spc[2]=bbGetInputSpacing()[2];
-                    }
-                    else
-                    {
-                       spc[0]=spc[1]=spc[2]=1;
-                    }
-
-                    iMin=0;
-                    iMax=bbGetInputlstPointX().size();
-                    printf("EED SphereList::Process   iMax=%d \n", iMax);
-                    for (int i = 0; i < iMax; i++)
-                      {
-                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointX()[i]=" << bbGetInputlstPointX()[i] << std::endl;
-                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointY()[i]=" << bbGetInputlstPointY()[i] << std::endl;
-                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointZ()[i]=" << bbGetInputlstPointZ()[i] << std::endl;
-                      }
-                    // 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.
-                    // Stops at iMax - 1 because of a bug of the box stdReadColumnsDouble creating an extra line at the end of the file.
-                    for ( int i=iMin ; i<iMax-1; i=i+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];
-                       }
-
-                       // 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();
-
-                       newSphere -> SetThetaResolution(20);
-                       newSphere -> SetPhiResolution(20);
-                       newSphere -> SetRadius(radio); 
-
-                       vtkPolyDataMapper * newMapper = vtkPolyDataMapper::New();
-                       newMapper -> SetInput( newSphere -> GetOutput() );
+               {
+               for (int i = 0; i < sphereActor.size(); i++)
+               {
+                               GetPoint(i, px,py,pz);
+                               GetColor(i, cr,cg,cb);
+                               sphereActor[i] ->SetPosition( px,py,pz );
+printf("EED SphereList::Process() %f %f %f\n",px,py,pz);
+                sphereActor[i] -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
+                sphereActor[i] -> GetProperty() -> SetColor( cr,cg,cb );
+                vtkspheresourceLst[i] -> SetRadius( GetRadio(i) ); 
+               } // for i
+               } else {
+                       iMin=0;
+            iMax=bbGetInputlstPointX().size();
+//                    printf("EED SphereList::Process   iMax=%d \n", iMax);
+//                    for (int i = 0; i < iMax; i++)
+//                      {
+//                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointX()[i]=" << bbGetInputlstPointX()[i] << std::endl;
+//                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointY()[i]=" << bbGetInputlstPointY()[i] << std::endl;
+//                        std::cout << "CM SphereList::Process i=" <<  i  << " bbGetInputlstPointZ()[i]=" << bbGetInputlstPointZ()[i] << std::endl;
+//                      } // for i
+                   // 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 )
+               {
+               GetPoint(i, px,py,pz);
+                               GetColor(i, cr,cg,cb);
+                               // Sphere
+                               vtkSphereSource * newSphere = vtkSphereSource::New();
+                               vtkspheresourceLst.push_back(newSphere);
+
+                               newSphere -> SetThetaResolution(20);
+                               newSphere -> SetPhiResolution(20);
+                               newSphere -> SetRadius( GetRadio(i) ); 
+
+                               vtkPolyDataMapper * newMapper = vtkPolyDataMapper::New();
+                               newMapper -> SetInput( newSphere -> GetOutput() );
        
-                       vtkActor * newActor = vtkActor::New();
-                       sphereActor.push_back(newActor);
-                       newActor -> SetMapper(newMapper);
-                       newActor -> SetOrigin(0, 0, 0);
-                       
-                       unsigned int j = 3*i +2;
-                       if (j < bbGetInputColour().size() )
-                       {
-                           newActor -> GetProperty() -> SetColor( bbGetInputColour()[3*i] , bbGetInputColour()[3*i + 1] , bbGetInputColour()[3*i + 2] );
-                           last_valid_color_index = 3*i;
-                       }
-                       else
-                         newActor -> GetProperty() -> SetColor( bbGetInputColour()[last_valid_color_index] , bbGetInputColour()[last_valid_color_index + 1] , bbGetInputColour()[last_valid_color_index + 2] );
-
-                       newActor -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
-                       newActor -> SetPosition( px,py,pz );
+                               vtkActor * newActor = vtkActor::New();
+                               sphereActor.push_back(newActor);
+                               newActor -> SetMapper(newMapper);
+                               newActor -> SetOrigin(0, 0, 0);                 
+                               newActor -> GetProperty() -> SetColor(cr,cg,cb);
+                               newActor -> GetProperty() -> SetOpacity( bbGetInputOpacity() );
+                               newActor -> SetPosition( px,py,pz );
        
-                       if ( bbGetInputTransform()!=NULL )
-                       {
-                               newActor->SetUserTransform( bbGetInputTransform() );
-                       }
+                               if ( bbGetInputTransform()!=NULL )
+                               {
+                                       newActor->SetUserTransform( bbGetInputTransform() );
+                               }
        
-
-                       if (bbGetInputRenderer()!=NULL)
-                       {
-                           bbGetInputRenderer() -> AddActor( newActor );
-                       }
-
-                    } // for
-
-                    if (sphereActor.size() != 0)
-                    {
-                        // Sets the output.
-                        bbSetOutputActorList(sphereActor);
-                    }
+                               if (bbGetInputRenderer()!=NULL)
+                               {
+                                   bbGetInputRenderer() -> AddActor( newActor );
+                               }
+
+                       } // for
+
+            if (sphereActor.size() != 0)
+            {
+               // Sets the output.
+               bbSetOutputActorList(sphereActor);
+               }
                     
-                } // if (bbGetInputRenderer()!=NULL)
+               } // if (sphereActor.size() != 0)
+       } // if (bbGetInputRenderer()!=NULL)
 
-        } // if (sphereActor.size() != 0)
 }
 
 void SphereList::bbUserSetDefaultValues()