Salome HOME
Merge branch 'hydro/imps_2015' into V7_dev
[modules/smesh.git] / src / Controls / SMESH_ControlsDef.hxx
index 9b9c26525d83d93f511e8a3c853444cec46c4c80..c7398b0ef4d0364f7d49480b2e8e5aa3924a85f7 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015  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
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #ifndef _SMESH_CONTROLSDEF_HXX_
 #define _SMESH_CONTROLSDEF_HXX_
 
-#include <set>
-#include <map>
-#include <vector>
+#include "SMESH_Controls.hxx"
 
-#include <boost/shared_ptr.hpp>
+#include "SMDS_MeshNode.hxx"
+#include "SMESH_TypeDefs.hxx"
 
-#include <gp_XYZ.hxx>
-#include <GeomAPI_ProjectPointOnSurf.hxx>
+#include <BRepClass3d_SolidClassifier.hxx>
+#include <Bnd_B3d.hxx>
 #include <GeomAPI_ProjectPointOnCurve.hxx>
-#include <TColStd_SequenceOfInteger.hxx>
+#include <GeomAPI_ProjectPointOnSurf.hxx>
+#include <Quantity_Color.hxx>
 #include <TColStd_MapOfInteger.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TopAbs.hxx>
 #include <TopoDS_Face.hxx>
-#include <TopTools_MapOfShape.hxx>
-#include <BRepClass3d_SolidClassifier.hxx>
-#include <Quantity_Color.hxx>
+#include <gp_XYZ.hxx>
 
-#include "SMDSAbs_ElementType.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMESH_TypeDefs.hxx"
+#include <set>
+#include <map>
+#include <vector>
 
-#include "SMESH_Controls.hxx"
+#include <boost/shared_ptr.hpp>
 
 class SMDS_MeshElement;
 class SMDS_MeshFace;
@@ -54,6 +53,7 @@ class SMDS_Mesh;
 
 class SMESHDS_Mesh;
 class SMESHDS_SubMesh;
+class SMESHDS_GroupBase;
 
 class gp_Pnt;
 
@@ -67,7 +67,7 @@ namespace SMESH{
     public:
       TSequenceOfXYZ();
 
-      TSequenceOfXYZ(size_type n);
+      explicit TSequenceOfXYZ(size_type n);
 
       TSequenceOfXYZ(size_type n, const gp_XYZ& t);
 
@@ -92,8 +92,16 @@ namespace SMESH{
 
       size_type size() const;
 
+
+      void setElement(const SMDS_MeshElement* e) { myElem = e; }
+
+      const SMDS_MeshElement* getElement() const { return myElem; }
+
+      SMDSAbs_EntityType getElementEntity() const;
+
     private:
-      std::vector<gp_XYZ> myArray;
+      std::vector<gp_XYZ>     myArray;
+      const SMDS_MeshElement* myElem;
     };
 
     /*!
@@ -245,7 +253,6 @@ namespace SMESH{
       virtual SMDSAbs_ElementType GetType() const;
     };
 
-
     /*
       Class       : Skew
       Description : Functor for calculating skew in degrees
@@ -303,7 +310,7 @@ namespace SMESH{
 
     /*
       Class       : MultiConnection
-      Description : Functor for calculating number of faces conneted to the edge
+      Description : Functor for calculating number of faces connected to the edge
     */
     class SMESHCONTROLS_EXPORT MultiConnection: public virtual NumericalFunctor{
     public:
@@ -315,7 +322,7 @@ namespace SMESH{
     
     /*
       Class       : MultiConnection2D
-      Description : Functor for calculating number of faces conneted to the edge
+      Description : Functor for calculating number of faces connected to the edge
     */
     class SMESHCONTROLS_EXPORT MultiConnection2D: public virtual NumericalFunctor{
     public:
@@ -429,6 +436,28 @@ namespace SMESH{
       const SMDS_Mesh* myMesh;
     };
 
+    /*
+      Class       : ElemEntityType
+      Description : Functor for calculating entity type
+    */
+    class SMESHCONTROLS_EXPORT ElemEntityType: public virtual Predicate{
+      public:
+      ElemEntityType();
+      virtual void         SetMesh( const SMDS_Mesh* theMesh );
+      virtual bool         IsSatisfy( long theElementId );
+      void                 SetType( SMDSAbs_ElementType theType );
+      virtual              SMDSAbs_ElementType GetType() const;
+      void                 SetElemEntityType( SMDSAbs_EntityType theEntityType );
+      SMDSAbs_EntityType   GetElemEntityType() const;
+
+    private:
+      const SMDS_Mesh*     myMesh;
+      SMDSAbs_ElementType  myType;
+      SMDSAbs_EntityType   myEntityType;
+    };
+    typedef boost::shared_ptr<ElemEntityType> ElemEntityTypePtr;
+
+
     /*
       BareBorderVolume
     */
@@ -742,8 +771,8 @@ namespace SMESH{
                               TMapOfLink&            theNonManifold,
                               SMDS_MeshFace*         theNextFace ) const;
 
-     void     getFacesByLink( const Link& theLink,
-                              TVectorOfFacePtr& theFaces ) const;
+      void     getFacesByLink( const Link& theLink,
+                               TVectorOfFacePtr& theFaces ) const;
 
     private:
       const SMDS_Mesh*      myMesh;
@@ -758,6 +787,27 @@ namespace SMESH{
     };
     typedef boost::shared_ptr<ManifoldPart> ManifoldPartPtr;
 
+    /*
+      Class       : BelongToMeshGroup
+      Description : Verify whether a mesh element is included into a mesh group
+    */
+    class SMESHCONTROLS_EXPORT BelongToMeshGroup : public virtual Predicate
+    {
+    public:
+      BelongToMeshGroup();
+      virtual void SetMesh( const SMDS_Mesh* theMesh );
+      virtual bool IsSatisfy( long theElementId );
+      virtual SMDSAbs_ElementType GetType() const;
+
+      void SetGroup( SMESHDS_GroupBase* g );
+      void SetStoreName( const std::string& sn );
+      const SMESHDS_GroupBase* GetGroup() const { return myGroup; }
+
+    private:
+      SMESHDS_GroupBase* myGroup;
+      std::string        myStoreName;
+    };
+    typedef boost::shared_ptr<BelongToMeshGroup> BelongToMeshGroupPtr;
 
     /*
       Class       : ElementsOnSurface
@@ -788,7 +838,6 @@ namespace SMESH{
       TMeshModifTracer      myMeshModifTracer;
       TColStd_MapOfInteger  myIds;
       SMDSAbs_ElementType   myType;
-      //Handle(Geom_Surface)  mySurf;
       TopoDS_Face           mySurf;
       double                myToler;
       bool                  myUseBoundaries;
@@ -830,12 +879,15 @@ namespace SMESH{
         TopAbs_ShapeEnum ShapeType() const;
       private:
         bool isOutOfSolid (const gp_Pnt& p);
+        bool isOutOfBox   (const gp_Pnt& p);
         bool isOutOfFace  (const gp_Pnt& p);
         bool isOutOfEdge  (const gp_Pnt& p);
         bool isOutOfVertex(const gp_Pnt& p);
+        bool isBox        (const TopoDS_Shape& s);
 
         bool (TClassifier::* myIsOutFun)(const gp_Pnt& p);
         BRepClass3d_SolidClassifier mySolidClfr;
+        Bnd_B3d                     myBox;
         GeomAPI_ProjectPointOnSurf  myProjFace;
         GeomAPI_ProjectPointOnCurve myProjEdge;
         gp_Pnt                      myVertexXYZ;
@@ -843,19 +895,101 @@ namespace SMESH{
         double                      myTol;
       };
       void clearClassifiers();
+      bool getNodeIsOut( const SMDS_MeshNode* n, bool& isOut );
+      void setNodeIsOut( const SMDS_MeshNode* n, bool  isOut );
 
       std::vector< TClassifier* > myClassifiers;
-      const SMDS_Mesh*            myMesh;
       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;
 
 
+    /*
+      Class       : BelongToGeom
+      Description : Predicate for verifying whether entiy belong to
+      specified geometrical support
+    */
+    class SMESHCONTROLS_EXPORT BelongToGeom: public virtual Predicate
+    {
+    public:
+      BelongToGeom();
+
+      virtual void                    SetMesh( const SMDS_Mesh* theMesh );
+      virtual void                    SetGeom( const TopoDS_Shape& theShape );
+
+      virtual bool                    IsSatisfy( long theElementId );
+
+      virtual void                    SetType( SMDSAbs_ElementType theType );
+      virtual                         SMDSAbs_ElementType GetType() const;
+
+      TopoDS_Shape                    GetShape();
+      const SMESHDS_Mesh*             GetMeshDS() const;
+
+      void                            SetTolerance( double );
+      double                          GetTolerance();
+
+    private:
+      virtual void                    init();
+
+      TopoDS_Shape                    myShape;
+      const SMESHDS_Mesh*             myMeshDS;
+      SMDSAbs_ElementType             myType;
+      bool                            myIsSubshape;
+      double                          myTolerance;          // only if myIsSubshape == false
+      Controls::ElementsOnShapePtr    myElementsOnShapePtr; // only if myIsSubshape == false
+    };
+    typedef boost::shared_ptr<BelongToGeom> BelongToGeomPtr;
+
+    /*
+      Class       : LyingOnGeom
+      Description : Predicate for verifying whether entiy lying or partially lying on
+      specified geometrical support
+    */
+    class SMESHCONTROLS_EXPORT LyingOnGeom: public virtual Predicate
+    {
+    public:
+      LyingOnGeom();
+      
+      virtual void                    SetMesh( const SMDS_Mesh* theMesh );
+      virtual void                    SetGeom( const TopoDS_Shape& theShape );
+      
+      virtual bool                    IsSatisfy( long theElementId );
+      
+      virtual void                    SetType( SMDSAbs_ElementType theType );
+      virtual                         SMDSAbs_ElementType GetType() const;
+      
+      TopoDS_Shape                    GetShape();
+      const SMESHDS_Mesh*             GetMeshDS() const;
+
+      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:
+      virtual void                    init();
+
+      TopoDS_Shape                    myShape;
+      TColStd_MapOfInteger            mySubShapesIDs;
+      const SMESHDS_Mesh*             myMeshDS;
+      SMDSAbs_ElementType             myType;
+      bool                            myIsSubshape;
+      double                          myTolerance;          // only if myIsSubshape == false
+      Controls::ElementsOnShapePtr    myElementsOnShapePtr; // only if myIsSubshape == false
+    };
+    typedef boost::shared_ptr<LyingOnGeom> LyingOnGeomPtr;
+
     /*
       Class       : FreeFaces
       Description : Predicate for free faces
@@ -924,7 +1058,7 @@ namespace SMESH{
       void                 SetType( SMDSAbs_ElementType theType );
       virtual              SMDSAbs_ElementType GetType() const;
       void                 SetGeomType( SMDSAbs_GeometryType theType );
-      virtual SMDSAbs_GeometryType GetGeomType() const;
+      SMDSAbs_GeometryType GetGeomType() const;
 
     private:
       const SMDS_Mesh*     myMesh;
@@ -954,14 +1088,47 @@ namespace SMESH{
       TMeshModifTracer     myMeshModifTracer;
       long                 myFaceID;
       double               myToler;
-      std::set< long >     myCoplanarIDs;
+      TColStd_MapOfInteger myCoplanarIDs;
     };
     typedef boost::shared_ptr<CoplanarFaces> CoplanarFacesPtr;
 
+    /*
+      Class       : ConnectedElements
+      Description : Predicate to get elements of one domain
+    */
+    class SMESHCONTROLS_EXPORT ConnectedElements: public virtual Predicate
+    {
+    public:
+      ConnectedElements();
+      void                 SetNode( int nodeID );
+      void                 SetPoint( double x, double y, double z );
+      int                  GetNode() const;
+      std::vector<double>  GetPoint() const;
+
+      void                 SetType( SMDSAbs_ElementType theType );
+      virtual              SMDSAbs_ElementType GetType() const;
+
+      virtual void         SetMesh( const SMDS_Mesh* theMesh );
+      virtual bool         IsSatisfy( long theElementId );
+
+      //const std::set<long>& GetDomainIDs() const { return myOkIDs; }
+
+    private:
+      int                 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
+    };
+    typedef boost::shared_ptr<ConnectedElements> ConnectedElementsPtr;
+
     /*
       FILTER
     */
-    class SMESHCONTROLS_EXPORT Filter{
+    class SMESHCONTROLS_EXPORT Filter {
     public:
       Filter();
       virtual ~Filter();