Salome HOME
Updated copyright comment
[modules/gui.git] / src / VTKViewer / VTKViewer_Algorithm.h
1 // Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SALOME VTKViewer : build VTK viewer into Salome desktop
24 //  File   : VTKViewer_ViewFrame.h
25 //  Author : Nicolas REJNERI
26
27 #ifndef VTKViewer_Algorithm_H
28 #define VTKViewer_Algorithm_H
29
30 #include "VTKViewer.h"
31
32 #include <vtkActorCollection.h>
33
34 class vtkActor;
35
36 namespace VTK
37 {
38   /*!
39    * This object should be used to avoid problems with recurring calls of GetActors() method of the vtkRenderer class.
40    *
41    * Instead of the following instructions:
42    *
43    * vtkRenderer* aRenderer = ...;
44    * vtkActorCollection* anActorCollection = aRenderer->GetActors();
45    * DoSomething( anActorCollection ); // where GetActors() could be called again
46    *
47    * A code like the following should be used:
48    *
49    * vtkRenderer* aRenderer = ...;
50    * vtkActorCollection* anActorCollection = aRenderer->GetActors();
51    * ActorCollectionCopy aCopy( anActorCollection );
52    * DoSomething( aCopy.GetActors() );
53    */
54   struct VTKVIEWER_EXPORT ActorCollectionCopy
55   {
56     vtkActorCollection* myActorCollection;
57
58     ActorCollectionCopy( vtkActorCollection* theActorCollection );
59     ~ActorCollectionCopy();
60
61     vtkActorCollection* GetActors() const;
62   };
63
64   /*!For each actor(for ex: someActor) from \a theCollection(that can be dynamic cast to type TActor)\n
65    * Call method \a theFun(someActor)
66    */
67     template<typename TActor, typename TFunction>
68       TFunction ForEach(vtkActorCollection *theCollection, TFunction theFun)
69       {
70         if(theCollection){
71           theCollection->InitTraversal();
72           while(vtkActor *anAct = theCollection->GetNextActor())
73             if(TActor *anActor = dynamic_cast<TActor*>(anAct))
74               theFun(anActor);
75         }
76         return theFun;
77       }
78   
79     /*!For each actor(for ex: someActor) from \a theCollection(that can be dynamic cast to type TActor and \n
80      * method \a thePredicate(someActor) return true) \n
81      * Call method \a theFun(someActor)
82      */
83     template<typename TActor, typename TPredicate, typename TFunction>
84       TFunction ForEachIf(vtkActorCollection *theCollection, 
85                           TPredicate thePredicate,
86                           TFunction theFun)
87       {
88         if(theCollection){
89           theCollection->InitTraversal();
90           while(vtkActor *anAct = theCollection->GetNextActor())
91             if(TActor *anActor = dynamic_cast<TActor*>(anAct))
92               if(thePredicate(anActor))
93                 theFun(anActor);
94         }
95         return theFun;
96       }
97   
98     /*!Find actor from collection, that can be dynamicaly cast to \a TActor, \n
99      *and method \a thePredicate(someActor) return true) \n
100      *\retval someActor
101      */
102     template<typename TActor, typename TPredicate>
103       TActor* Find(vtkActorCollection *theCollection, TPredicate thePredicate)
104       {
105         if(theCollection){
106           theCollection->InitTraversal();
107           while(vtkActor *anAct = theCollection->GetNextActor())
108             if(TActor *anActor = dynamic_cast<TActor*>(anAct))
109               if(thePredicate(anActor))
110                 return anActor;
111         }
112         return NULL;
113       }
114
115 }
116
117 #endif