Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[modules/smesh.git] / src / Controls / SMESH_ControlsDef.hxx
index bc84ad4b1cfc8a1e69424b539b91340018290eab..1ce5f4da5e36ce6e2de8d4e3e04421bb482e4fe9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 
 #include "SMESH_Controls.hxx"
 
-#include "SMDS_MeshNode.hxx"
 #include "SMESH_TypeDefs.hxx"
 
-#include <BRepClass3d_SolidClassifier.hxx>
 #include <Bnd_B3d.hxx>
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <GeomAPI_ProjectPointOnSurf.hxx>
 #include <Quantity_Color.hxx>
 #include <TColStd_MapOfInteger.hxx>
-#include <TColStd_SequenceOfInteger.hxx>
 #include <TCollection_AsciiString.hxx>
+#include <NCollection_Map.hxx>
 #include <TopAbs.hxx>
 #include <TopoDS_Face.hxx>
 #include <gp_XYZ.hxx>
@@ -55,8 +53,14 @@ class SMESHDS_Mesh;
 class SMESHDS_SubMesh;
 class SMESHDS_GroupBase;
 
+class BRepClass3d_SolidClassifier;
+class ShapeAnalysis_Surface;
+class gp_Pln;
 class gp_Pnt;
 
+typedef NCollection_Map< smIdType, smIdHasher > TIDsMap;
+typedef NCollection_Sequence<smIdType> TIDsSeq;
+
 namespace SMESH{
   namespace Controls{
 
@@ -128,20 +132,22 @@ namespace SMESH{
       NumericalFunctor();
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual double GetValue( long theElementId );
-      virtual double GetValue(const TSequenceOfXYZ& thePoints) { return -1.0;};
-      void GetHistogram(int                     nbIntervals,
-                        std::vector<int>&       nbEvents,
-                        std::vector<double>&    funValues,
-                        const std::vector<int>& elements,
-                        const double*           minmax=0,
-                        const bool              isLogarithmic = false);
+      virtual double GetValue(const TSequenceOfXYZ& /*thePoints*/) { return -1.0;};
+      void GetHistogram(int                          nbIntervals,
+                        std::vector<int>&            nbEvents,
+                        std::vector<double>&         funValues,
+                        const std::vector<smIdType>& elements,
+                        const double*                minmax=0,
+                        const bool                   isLogarithmic = false);
+      bool IsApplicable( long theElementId ) const;
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
       virtual SMDSAbs_ElementType GetType() const = 0;
       virtual double GetBadRate( double Value, int nbNodes ) const = 0;
       long  GetPrecision() const;
       void  SetPrecision( const long thePrecision );
       double Round( const double & value );
       
-      bool GetPoints(const int theId, TSequenceOfXYZ& theRes) const;
+      bool GetPoints(const smIdType theId, TSequenceOfXYZ& theRes) const;
       static bool GetPoints(const SMDS_MeshElement* theElem, TSequenceOfXYZ& theRes);
     protected:
       const SMDS_Mesh*        myMesh;
@@ -175,8 +181,8 @@ namespace SMESH{
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
     };
-  
-  
+
+
     /*
       Class       : MaxElementLength3D
       Description : Functor calculating maximum length of 3D element
@@ -211,6 +217,7 @@ namespace SMESH{
       virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
     };
   
   
@@ -224,6 +231,7 @@ namespace SMESH{
       virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
     };
   
   
@@ -236,7 +244,8 @@ namespace SMESH{
       virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
-      
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
+
     private:
       double ComputeA( const gp_XYZ&, const gp_XYZ&, const gp_XYZ&, const gp_XYZ& ) const;
     };
@@ -251,6 +260,7 @@ namespace SMESH{
       virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
     };
 
     /*
@@ -262,6 +272,7 @@ namespace SMESH{
       virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
+      virtual bool IsApplicable( const SMDS_MeshElement* element ) const;
     };
 
 
@@ -290,11 +301,13 @@ namespace SMESH{
 
     /*
       Class       : Length2D
-      Description : Functor for calculating length of edge
+      Description : Functor for calculating minimal length of edges of element
     */
     class SMESHCONTROLS_EXPORT Length2D: public virtual NumericalFunctor{
     public:
-      virtual double GetValue( long theElementId );
+      Length2D( SMDSAbs_ElementType type = SMDSAbs_Face );
+      virtual bool   IsApplicable( const SMDS_MeshElement* element ) const;
+      virtual double GetValue( const TSequenceOfXYZ& thePoints );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
       struct Value{
@@ -305,9 +318,38 @@ namespace SMESH{
       };
       typedef std::set<Value> TValues;
       void GetValues(TValues& theValues);
+
+    private:
+      SMDSAbs_ElementType myType;
     };
     typedef boost::shared_ptr<Length2D> Length2DPtr;
 
+    /*
+      Class       : Length2D
+      Description : Functor for calculating minimal length of edges of 3D element
+    */
+    class SMESHCONTROLS_EXPORT Length3D: public virtual Length2D {
+    public:
+      Length3D();
+    };
+    typedef boost::shared_ptr<Length3D> Length3DPtr;
+
+    /*
+      Class       : Deflection2D
+      Description : Functor for calculating distance between a face and geometry
+    */
+    class SMESHCONTROLS_EXPORT Deflection2D: public virtual NumericalFunctor{
+    public:
+      virtual void   SetMesh( const SMDS_Mesh* theMesh );
+      virtual double GetValue( const TSequenceOfXYZ& thePoints );
+      virtual double GetBadRate( double Value, int nbNodes ) const;
+      virtual SMDSAbs_ElementType GetType() const;
+    private:
+      Handle(ShapeAnalysis_Surface) mySurface;
+      int                           myShapeIndex;
+      boost::shared_ptr<gp_Pln>     myPlane;
+    };
+
     /*
       Class       : MultiConnection
       Description : Functor for calculating number of faces connected to the edge
@@ -352,6 +394,17 @@ namespace SMESH{
       virtual SMDSAbs_ElementType GetType() const;
     };
     
+    /*
+      Class       : NodeConnectivityNumber
+      Description : Functor returning number of elements connected to a node
+    */
+    class SMESHCONTROLS_EXPORT NodeConnectivityNumber: public virtual NumericalFunctor{
+    public:
+      virtual double GetValue( long theNodeId );
+      virtual double GetBadRate( double Value, int nbNodes ) const;
+      virtual SMDSAbs_ElementType GetType() const;
+    };
+
 
     /*
       PREDICATES
@@ -364,17 +417,18 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT CoincidentNodes: public Predicate {
     public:
       CoincidentNodes();
+      //virtual Predicate* clone() const { return new CoincidentNodes( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
 
-      void SetTolerance (const double theToler)  { myToler = theToler; }
+      void SetTolerance (const double theToler);
       double GetTolerance () const { return myToler; }
 
     private:
-      double               myToler;
-      TColStd_MapOfInteger myCoincidentIDs;
-      TMeshModifTracer     myMeshModifTracer;
+      double           myToler;
+      TIDsMap          myCoincidentIDs;
+      TMeshModifTracer myMeshModifTracer;
     };
     typedef boost::shared_ptr<CoincidentNodes> CoincidentNodesPtr;
    
@@ -395,14 +449,17 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT CoincidentElements1D: public CoincidentElements {
     public:
       virtual SMDSAbs_ElementType GetType() const;
+      //virtual Predicate* clone() const { return new CoincidentElements1D( *this ); }
     };
     class SMESHCONTROLS_EXPORT CoincidentElements2D: public CoincidentElements {
     public:
       virtual SMDSAbs_ElementType GetType() const;
+      //virtual Predicate* clone() const { return new CoincidentElements2D( *this ); }
     };
     class SMESHCONTROLS_EXPORT CoincidentElements3D: public CoincidentElements {
     public:
       virtual SMDSAbs_ElementType GetType() const;
+      //virtual Predicate* clone() const { return new CoincidentElements3D( *this ); }
     };
 
     /*
@@ -412,6 +469,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT FreeBorders: public virtual Predicate{
     public:
       FreeBorders();
+      //virtual Predicate* clone() const { return new FreeBorders( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
@@ -428,6 +486,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT BadOrientedVolume: public virtual Predicate{
     public:
       BadOrientedVolume();
+      //virtual Predicate* clone() const { return new BadOrientedVolume( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
@@ -443,6 +502,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT ElemEntityType: public virtual Predicate{
       public:
       ElemEntityType();
+      //virtual Predicate*   clone() const { return new ElemEntityType( *this ); }
       virtual void         SetMesh( const SMDS_Mesh* theMesh );
       virtual bool         IsSatisfy( long theElementId );
       void                 SetType( SMDSAbs_ElementType theType );
@@ -465,6 +525,7 @@ namespace SMESH{
     {
     public:
       BareBorderVolume():myMesh(0) {}
+      virtual Predicate* clone() const { return new BareBorderVolume( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; }
       virtual SMDSAbs_ElementType GetType() const      { return SMDSAbs_Volume; }
       virtual bool IsSatisfy( long theElementId );
@@ -480,6 +541,7 @@ namespace SMESH{
     {
     public:
       BareBorderFace():myMesh(0) {}
+      //virtual Predicate* clone() const { return new BareBorderFace( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; }
       virtual SMDSAbs_ElementType GetType() const      { return SMDSAbs_Face; }
       virtual bool IsSatisfy( long theElementId );
@@ -496,6 +558,7 @@ namespace SMESH{
     {
     public:
       OverConstrainedVolume():myMesh(0) {}
+      virtual Predicate* clone() const { return new OverConstrainedVolume( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; }
       virtual SMDSAbs_ElementType GetType() const      { return SMDSAbs_Volume; }
       virtual bool IsSatisfy( long theElementId );
@@ -511,6 +574,7 @@ namespace SMESH{
     {
     public:
       OverConstrainedFace():myMesh(0) {}
+      //virtual Predicate* clone() const { return new OverConstrainedFace( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh ) { myMesh = theMesh; }
       virtual SMDSAbs_ElementType GetType() const      { return SMDSAbs_Face; }
       virtual bool IsSatisfy( long theElementId );
@@ -526,10 +590,11 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT FreeEdges: public virtual Predicate{
     public:
       FreeEdges();
+      //virtual Predicate* clone() const { return new FreeEdges( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
-      static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId  );
+      static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const smIdType theFaceId  );
       typedef long TElemId;
       struct Border{
         TElemId myElemId;
@@ -553,6 +618,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT FreeNodes: public virtual Predicate{
     public:
       FreeNodes();
+      //virtual Predicate* clone() const { return new FreeNodes( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theNodeId );
       virtual SMDSAbs_ElementType GetType() const;
@@ -573,7 +639,8 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT RangeOfIds: public virtual Predicate
     {
     public:
-                                    RangeOfIds();
+      RangeOfIds();
+      //virtual Predicate*            clone() const { return new RangeOfIds( *this ); }
       virtual void                  SetMesh( const SMDS_Mesh* theMesh );
       virtual bool                  IsSatisfy( long theNodeId );
       virtual SMDSAbs_ElementType   GetType() const;
@@ -586,9 +653,9 @@ namespace SMESH{
     protected:
       const SMDS_Mesh*              myMesh;
 
-      TColStd_SequenceOfInteger     myMin;
-      TColStd_SequenceOfInteger     myMax;
-      TColStd_MapOfInteger          myIds;
+      std::vector< smIdType >       myMin;
+      std::vector< smIdType >       myMax;
+      TIDsMap                       myIds;
 
       SMDSAbs_ElementType           myType;
     };
@@ -625,6 +692,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT LessThan: public virtual Comparator{
     public:
       virtual bool IsSatisfy( long theElementId );
+      //virtual Predicate* clone() const { return new LessThan( *this ); }
     };
   
   
@@ -635,6 +703,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT MoreThan: public virtual Comparator{
     public:
       virtual bool IsSatisfy( long theElementId );
+      //virtual Predicate* clone() const { return new MoreThan( *this ); }
     };
   
   
@@ -645,6 +714,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT EqualTo: public virtual Comparator{
     public:
       EqualTo();
+      //virtual Predicate* clone() const { return new EqualTo( *this ); }
       virtual bool IsSatisfy( long theElementId );
       virtual void SetTolerance( double theTol );
       virtual double GetTolerance();
@@ -662,6 +732,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT LogicalNOT: public virtual Predicate{
     public:
       LogicalNOT();
+      //virtual Predicate* clone() const { return new LogicalNOT( *this ); }
       virtual ~LogicalNOT();
       virtual bool IsSatisfy( long theElementId );
       virtual void SetMesh( const SMDS_Mesh* theMesh );
@@ -701,6 +772,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT LogicalAND: public virtual LogicalBinary{
     public:
       virtual bool IsSatisfy( long theElementId );
+      //virtual Predicate* clone() const { return new LogicalAND( *this ); }
     };
   
   
@@ -711,6 +783,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT LogicalOR: public virtual LogicalBinary{
     public:
       virtual bool IsSatisfy( long theElementId );
+      //virtual Predicate* clone() const { return new LogicalOR( *this ); }
     };
   
   
@@ -747,8 +820,9 @@ namespace SMESH{
       
       ManifoldPart();
       ~ManifoldPart();
+      //virtual Predicate* clone() const { return new ManifoldPart( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
-      // inoke when all parameters already set
+      // invoke when all parameters already set
       virtual bool IsSatisfy( long theElementId );
       virtual      SMDSAbs_ElementType GetType() const;
 
@@ -762,7 +836,7 @@ namespace SMESH{
       bool    findConnected( const TDataMapFacePtrInt& theAllFacePtrInt,
                              SMDS_MeshFace*            theStartFace,
                              TMapOfLink&               theNonManifold,
-                             TColStd_MapOfInteger&     theResFaces );
+                             TIDsMap&                  theResFaces );
       bool    isInPlane( const SMDS_MeshFace* theFace1,
                           const SMDS_MeshFace* theFace2 );
       void    expandBoundary( TMapOfLink&            theMapOfBoundary,
@@ -776,8 +850,8 @@ namespace SMESH{
 
     private:
       const SMDS_Mesh*      myMesh;
-      TColStd_MapOfInteger  myMapIds;
-      TColStd_MapOfInteger  myMapBadGeomIds;
+      TIDsMap               myMapIds;
+      TIDsMap               myMapBadGeomIds;
       TVectorOfFacePtr      myAllFacePtr;
       TDataMapFacePtrInt    myAllFacePtrIntDMap;
       double                myAngToler;
@@ -795,6 +869,7 @@ namespace SMESH{
     {
     public:
       BelongToMeshGroup();
+      //virtual Predicate* clone() const { return new BelongToMeshGroup( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
@@ -818,6 +893,7 @@ namespace SMESH{
     public:
       ElementsOnSurface();
       ~ElementsOnSurface();
+      //virtual Predicate* clone() const { return new ElementsOnSurface( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual      SMDSAbs_ElementType GetType() const;
@@ -836,7 +912,7 @@ namespace SMESH{
 
     private:
       TMeshModifTracer      myMeshModifTracer;
-      TColStd_MapOfInteger  myIds;
+      TIDsMap               myIds;
       SMDSAbs_ElementType   myType;
       TopoDS_Face           mySurf;
       double                myToler;
@@ -852,12 +928,13 @@ namespace SMESH{
       Description : Predicate elements that lying on indicated shape
                     (1D, 2D or 3D)
     */
-    class SMESHCONTROLS_EXPORT ElementsOnShape : public virtual Predicate
+    class SMESHCONTROLS_EXPORT ElementsOnShape : public Predicate
     {
     public:
       ElementsOnShape();
       ~ElementsOnShape();
 
+      virtual Predicate* clone() const;
       virtual void SetMesh (const SMDS_Mesh* theMesh);
       virtual bool IsSatisfy (long theElementId);
       virtual SMDSAbs_ElementType GetType() const;
@@ -868,6 +945,8 @@ namespace SMESH{
       bool    GetAllNodes() const { return myAllNodesFlag; }
       void    SetShape (const TopoDS_Shape& theShape,
                         const SMDSAbs_ElementType theType);
+      bool    IsSatisfy (const SMDS_MeshElement* elem);
+      bool    IsSatisfy (const SMDS_MeshNode* node, TopoDS_Shape* okShape=0);
 
     private:
 
@@ -878,16 +957,17 @@ namespace SMESH{
       bool getNodeIsOut( const SMDS_MeshNode* n, bool& isOut );
       void setNodeIsOut( const SMDS_MeshNode* n, bool  isOut );
 
-      std::vector< Classifier* >  myClassifiers, myWorkClassifiers;
-      OctreeClassifier*           myOctree;
-      SMDSAbs_ElementType         myType;
-      TopoDS_Shape                myShape;
-      double                      myToler;
-      bool                        myAllNodesFlag;
-
-      TMeshModifTracer            myMeshModifTracer;
-      std::vector<bool>           myNodeIsChecked;
-      std::vector<bool>           myNodeIsOut;
+      std::vector< Classifier >  myClassifiers;
+      std::vector< Classifier* > myWorkClassifiers;
+      OctreeClassifier*          myOctree;
+      SMDSAbs_ElementType        myType;
+      TopoDS_Shape               myShape;
+      double                     myToler;
+      bool                       myAllNodesFlag;
+
+      TMeshModifTracer           myMeshModifTracer;
+      std::vector<bool>          myNodeIsChecked;
+      std::vector<bool>          myNodeIsOut;
     };
 
     typedef boost::shared_ptr<ElementsOnShape> ElementsOnShapePtr;
@@ -902,6 +982,7 @@ namespace SMESH{
     {
     public:
       BelongToGeom();
+      virtual Predicate* clone() const;
 
       virtual void                    SetMesh( const SMDS_Mesh* theMesh );
       virtual void                    SetGeom( const TopoDS_Shape& theShape );
@@ -921,6 +1002,7 @@ namespace SMESH{
       virtual void                    init();
 
       TopoDS_Shape                    myShape;
+      TColStd_MapOfInteger            mySubShapesIDs;
       const SMESHDS_Mesh*             myMeshDS;
       SMDSAbs_ElementType             myType;
       bool                            myIsSubshape;
@@ -938,6 +1020,7 @@ namespace SMESH{
     {
     public:
       LyingOnGeom();
+      virtual Predicate* clone() const;
       
       virtual void                    SetMesh( const SMDS_Mesh* theMesh );
       virtual void                    SetGeom( const TopoDS_Shape& theShape );
@@ -953,12 +1036,7 @@ namespace SMESH{
       void                            SetTolerance( double );
       double                          GetTolerance();
       
-      virtual bool                    Contains( const SMESHDS_Mesh*     theMeshDS,
-                                                const TopoDS_Shape&     theShape,
-                                                const SMDS_MeshElement* theElem,
-                                                TopAbs_ShapeEnum        theFindShapeEnum,
-                                                TopAbs_ShapeEnum        theAvoidShapeEnum = TopAbs_SHAPE );
-    private:
+   private:
       virtual void                    init();
 
       TopoDS_Shape                    myShape;
@@ -978,6 +1056,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT FreeFaces: public virtual Predicate{
     public:
       FreeFaces();
+      //virtual Predicate* clone() const { return new FreeFaces( *this ); }
       virtual void SetMesh( const SMDS_Mesh* theMesh );
       virtual bool IsSatisfy( long theElementId );
       virtual SMDSAbs_ElementType GetType() const;
@@ -993,6 +1072,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT LinearOrQuadratic: public virtual Predicate{
     public:
       LinearOrQuadratic();
+      //virtual Predicate*  clone() const { return new LinearOrQuadratic( *this ); }
       virtual void        SetMesh( const SMDS_Mesh* theMesh );
       virtual bool        IsSatisfy( long theElementId );
       void                SetType( SMDSAbs_ElementType theType );
@@ -1006,11 +1086,12 @@ namespace SMESH{
 
     /*
       Class       : GroupColor
-      Description : Functor for check color of group to whic mesh element belongs to
+      Description : Functor for check color of group to which mesh element belongs to
     */
     class SMESHCONTROLS_EXPORT GroupColor: public virtual Predicate{
     public:
       GroupColor();
+      //virtual Predicate*  clone() const { return new GroupColor( *this ); }
       virtual void        SetMesh( const SMDS_Mesh* theMesh );
       virtual bool        IsSatisfy( long theElementId );
       void                SetType( SMDSAbs_ElementType theType );
@@ -1034,6 +1115,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT ElemGeomType: public virtual Predicate{
     public:
       ElemGeomType();
+      //virtual Predicate*   clone() const { return new ElemGeomType( *this ); }
       virtual void         SetMesh( const SMDS_Mesh* theMesh );
       virtual bool         IsSatisfy( long theElementId );
       void                 SetType( SMDSAbs_ElementType theType );
@@ -1056,6 +1138,7 @@ namespace SMESH{
     {
     public:
       CoplanarFaces();
+      //virtual Predicate*   clone() const { return new CoplanarFaces( *this ); }
       void                 SetFace( long theID )                   { myFaceID = theID; }
       long                 GetFace() const                         { return myFaceID; }
       void                 SetTolerance (const double theToler)    { myToler = theToler; }
@@ -1069,7 +1152,7 @@ namespace SMESH{
       TMeshModifTracer     myMeshModifTracer;
       long                 myFaceID;
       double               myToler;
-      TColStd_MapOfInteger myCoplanarIDs;
+      TIDsMap              myCoplanarIDs;
     };
     typedef boost::shared_ptr<CoplanarFaces> CoplanarFacesPtr;
 
@@ -1081,9 +1164,10 @@ namespace SMESH{
     {
     public:
       ConnectedElements();
-      void                 SetNode( int nodeID );
+      //virtual Predicate*   clone() const { return new ConnectedElements( *this ); }
+      void                 SetNode( smIdType nodeID );
       void                 SetPoint( double x, double y, double z );
-      int                  GetNode() const;
+      smIdType             GetNode() const;
       std::vector<double>  GetPoint() const;
 
       void                 SetType( SMDSAbs_ElementType theType );
@@ -1095,14 +1179,14 @@ namespace SMESH{
       //const std::set<long>& GetDomainIDs() const { return myOkIDs; }
 
     private:
-      int                 myNodeID;
+      smIdType            myNodeID;
       std::vector<double> myXYZ;
       SMDSAbs_ElementType myType;
       TMeshModifTracer    myMeshModifTracer;
 
       void                clearOkIDs();
       bool                myOkIDsReady;
-      std::set< int >     myOkIDs; // empty means that there is one domain
+      std::set<smIdType>  myOkIDs; // empty means that there is one domain
     };
     typedef boost::shared_ptr<ConnectedElements> ConnectedElementsPtr;
 
@@ -1119,20 +1203,22 @@ namespace SMESH{
 
       virtual
       void
-      GetElementsId( const SMDS_Mesh* theMesh,
-                     TIdSequence& theSequence );
+      GetElementsId( const SMDS_Mesh*     theMesh,
+                     TIdSequence&         theSequence,
+                     SMDS_ElemIteratorPtr theElements=0);
 
       static
       void
-      GetElementsId( const SMDS_Mesh* theMesh,
-                     PredicatePtr thePredicate,
-                     TIdSequence& theSequence );
+      GetElementsId( const SMDS_Mesh*     theMesh,
+                     PredicatePtr         thePredicate,
+                     TIdSequence&         theSequence,
+                     SMDS_ElemIteratorPtr theElements=0 );
       
     protected:
       PredicatePtr myPredicate;
     };
-  };
-};
+  }
+}
 
 
 #endif