From d51efe3933ce3964d4051357e81c2c2f5148fd3c Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 14 Nov 2013 09:15:23 +0000 Subject: [PATCH] Move BelongToGeom and LyingOnGeom classes to src/Controls/SMESH_Controls* --- src/SMESH_I/SMESH_Filter_i.cxx | 355 --------------------------------- src/SMESH_I/SMESH_Filter_i.hxx | 86 -------- 2 files changed, 441 deletions(-) diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index e52d29b55..61d8faa5a 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -55,12 +55,9 @@ #include #include #include -#include #include #include -#include #include -#include using namespace SMESH; using namespace SMESH::Controls; @@ -75,358 +72,6 @@ namespace SMESH } } - -/* - Class : BelongToGeom - Description : Predicate for verifying whether entity belongs to - specified geometrical support -*/ - -Controls::BelongToGeom::BelongToGeom() - : myMeshDS(NULL), - myType(SMDSAbs_All), - myIsSubshape(false), - myTolerance(Precision::Confusion()) -{} - -void Controls::BelongToGeom::SetMesh( const SMDS_Mesh* theMesh ) -{ - myMeshDS = dynamic_cast(theMesh); - init(); -} - -void Controls::BelongToGeom::SetGeom( const TopoDS_Shape& theShape ) -{ - myShape = theShape; - init(); -} - -static bool IsSubShape (const TopTools_IndexedMapOfShape& theMap, - const TopoDS_Shape& theShape) -{ - if (theMap.Contains(theShape)) return true; - - if (theShape.ShapeType() == TopAbs_COMPOUND || - theShape.ShapeType() == TopAbs_COMPSOLID) - { - TopoDS_Iterator anIt (theShape, Standard_True, Standard_True); - for (; anIt.More(); anIt.Next()) - { - if (!IsSubShape(theMap, anIt.Value())) { - return false; - } - } - return true; - } - - return false; -} - -void Controls::BelongToGeom::init() -{ - if (!myMeshDS || myShape.IsNull()) return; - - // is sub-shape of main shape? - TopoDS_Shape aMainShape = myMeshDS->ShapeToMesh(); - if (aMainShape.IsNull()) { - myIsSubshape = false; - } - else { - TopTools_IndexedMapOfShape aMap; - TopExp::MapShapes(aMainShape, aMap); - myIsSubshape = IsSubShape(aMap, myShape); - } - - if (!myIsSubshape) - { - myElementsOnShapePtr.reset(new Controls::ElementsOnShape()); - myElementsOnShapePtr->SetTolerance(myTolerance); - myElementsOnShapePtr->SetAllNodes(true); // belong, while false means "lays on" - myElementsOnShapePtr->SetMesh(myMeshDS); - myElementsOnShapePtr->SetShape(myShape, myType); - } -} - -static bool IsContains( const SMESHDS_Mesh* theMeshDS, - const TopoDS_Shape& theShape, - const SMDS_MeshElement* theElem, - TopAbs_ShapeEnum theFindShapeEnum, - TopAbs_ShapeEnum theAvoidShapeEnum = TopAbs_SHAPE ) -{ - TopExp_Explorer anExp( theShape,theFindShapeEnum,theAvoidShapeEnum ); - - while( anExp.More() ) - { - const TopoDS_Shape& aShape = anExp.Current(); - if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){ - if( aSubMesh->Contains( theElem ) ) - return true; - } - anExp.Next(); - } - return false; -} - -bool Controls::BelongToGeom::IsSatisfy (long theId) -{ - if (myMeshDS == 0 || myShape.IsNull()) - return false; - - if (!myIsSubshape) - { - return myElementsOnShapePtr->IsSatisfy(theId); - } - - // Case of submesh - if (myType == SMDSAbs_Node) - { - if( const SMDS_MeshNode* aNode = myMeshDS->FindNode( theId ) ) - { - const SMDS_PositionPtr& aPosition = aNode->GetPosition(); - SMDS_TypeOfPosition aTypeOfPosition = aPosition->GetTypeOfPosition(); - switch( aTypeOfPosition ) - { - case SMDS_TOP_VERTEX : return IsContains( myMeshDS,myShape,aNode,TopAbs_VERTEX ); - case SMDS_TOP_EDGE : return IsContains( myMeshDS,myShape,aNode,TopAbs_EDGE ); - case SMDS_TOP_FACE : return IsContains( myMeshDS,myShape,aNode,TopAbs_FACE ); - case SMDS_TOP_3DSPACE: return IsContains( myMeshDS,myShape,aNode,TopAbs_SHELL ); - } - } - } - else - { - if( const SMDS_MeshElement* anElem = myMeshDS->FindElement( theId ) ) - { - if( myType == SMDSAbs_All ) - { - return IsContains( myMeshDS,myShape,anElem,TopAbs_EDGE ) || - IsContains( myMeshDS,myShape,anElem,TopAbs_FACE ) || - IsContains( myMeshDS,myShape,anElem,TopAbs_SHELL )|| - IsContains( myMeshDS,myShape,anElem,TopAbs_SOLID ); - } - else if( myType == anElem->GetType() ) - { - switch( myType ) - { - case SMDSAbs_Edge : return IsContains( myMeshDS,myShape,anElem,TopAbs_EDGE ); - case SMDSAbs_Face : return IsContains( myMeshDS,myShape,anElem,TopAbs_FACE ); - case SMDSAbs_Volume: return IsContains( myMeshDS,myShape,anElem,TopAbs_SHELL )|| - IsContains( myMeshDS,myShape,anElem,TopAbs_SOLID ); - } - } - } - } - - return false; -} - -void Controls::BelongToGeom::SetType (SMDSAbs_ElementType theType) -{ - myType = theType; - init(); -} - -SMDSAbs_ElementType Controls::BelongToGeom::GetType() const -{ - return myType; -} - -TopoDS_Shape Controls::BelongToGeom::GetShape() -{ - return myShape; -} - -const SMESHDS_Mesh* Controls::BelongToGeom::GetMeshDS() const -{ - return myMeshDS; -} - -void Controls::BelongToGeom::SetTolerance (double theTolerance) -{ - myTolerance = theTolerance; - if (!myIsSubshape) - init(); -} - -double Controls::BelongToGeom::GetTolerance() -{ - return myTolerance; -} - -/* - Class : LyingOnGeom - Description : Predicate for verifying whether entiy lying or partially lying on - specified geometrical support -*/ - -Controls::LyingOnGeom::LyingOnGeom() - : myMeshDS(NULL), - myType(SMDSAbs_All), - myIsSubshape(false), - myTolerance(Precision::Confusion()) -{} - -void Controls::LyingOnGeom::SetMesh( const SMDS_Mesh* theMesh ) -{ - myMeshDS = dynamic_cast(theMesh); - init(); -} - -void Controls::LyingOnGeom::SetGeom( const TopoDS_Shape& theShape ) -{ - myShape = theShape; - init(); -} - -void Controls::LyingOnGeom::init() -{ - if (!myMeshDS || myShape.IsNull()) return; - - // is sub-shape of main shape? - TopoDS_Shape aMainShape = myMeshDS->ShapeToMesh(); - if (aMainShape.IsNull()) { - myIsSubshape = false; - } - else { - TopTools_IndexedMapOfShape aMap; - TopExp::MapShapes(aMainShape, aMap); - myIsSubshape = IsSubShape(aMap, myShape); - } - - if (!myIsSubshape) - { - myElementsOnShapePtr.reset(new Controls::ElementsOnShape()); - myElementsOnShapePtr->SetTolerance(myTolerance); - myElementsOnShapePtr->SetAllNodes(false); // lays on, while true means "belong" - myElementsOnShapePtr->SetMesh(myMeshDS); - myElementsOnShapePtr->SetShape(myShape, myType); - } -} - -bool Controls::LyingOnGeom::IsSatisfy( long theId ) -{ - if ( myMeshDS == 0 || myShape.IsNull() ) - return false; - - if (!myIsSubshape) - { - return myElementsOnShapePtr->IsSatisfy(theId); - } - - // Case of submesh - if( myType == SMDSAbs_Node ) - { - if( const SMDS_MeshNode* aNode = myMeshDS->FindNode( theId ) ) - { - const SMDS_PositionPtr& aPosition = aNode->GetPosition(); - SMDS_TypeOfPosition aTypeOfPosition = aPosition->GetTypeOfPosition(); - switch( aTypeOfPosition ) - { - case SMDS_TOP_VERTEX : return IsContains( myMeshDS,myShape,aNode,TopAbs_VERTEX ); - case SMDS_TOP_EDGE : return IsContains( myMeshDS,myShape,aNode,TopAbs_EDGE ); - case SMDS_TOP_FACE : return IsContains( myMeshDS,myShape,aNode,TopAbs_FACE ); - case SMDS_TOP_3DSPACE: return IsContains( myMeshDS,myShape,aNode,TopAbs_SHELL ); - } - } - } - else - { - if( const SMDS_MeshElement* anElem = myMeshDS->FindElement( theId ) ) - { - if( myType == SMDSAbs_All ) - { - return Contains( myMeshDS,myShape,anElem,TopAbs_EDGE ) || - Contains( myMeshDS,myShape,anElem,TopAbs_FACE ) || - Contains( myMeshDS,myShape,anElem,TopAbs_SHELL )|| - Contains( myMeshDS,myShape,anElem,TopAbs_SOLID ); - } - else if( myType == anElem->GetType() ) - { - switch( myType ) - { - case SMDSAbs_Edge : return Contains( myMeshDS,myShape,anElem,TopAbs_EDGE ); - case SMDSAbs_Face : return Contains( myMeshDS,myShape,anElem,TopAbs_FACE ); - case SMDSAbs_Volume: return Contains( myMeshDS,myShape,anElem,TopAbs_SHELL )|| - Contains( myMeshDS,myShape,anElem,TopAbs_SOLID ); - } - } - } - } - - return false; -} - -void Controls::LyingOnGeom::SetType( SMDSAbs_ElementType theType ) -{ - myType = theType; - init(); -} - -SMDSAbs_ElementType Controls::LyingOnGeom::GetType() const -{ - return myType; -} - -TopoDS_Shape Controls::LyingOnGeom::GetShape() -{ - return myShape; -} - -const SMESHDS_Mesh* Controls::LyingOnGeom::GetMeshDS() const -{ - return myMeshDS; -} - -void Controls::LyingOnGeom::SetTolerance (double theTolerance) -{ - myTolerance = theTolerance; - if (!myIsSubshape) - init(); -} - -double Controls::LyingOnGeom::GetTolerance() -{ - return myTolerance; -} - -bool Controls::LyingOnGeom::Contains( const SMESHDS_Mesh* theMeshDS, - const TopoDS_Shape& theShape, - const SMDS_MeshElement* theElem, - TopAbs_ShapeEnum theFindShapeEnum, - TopAbs_ShapeEnum theAvoidShapeEnum ) -{ - if (IsContains(theMeshDS, theShape, theElem, theFindShapeEnum, theAvoidShapeEnum)) - return true; - - TopTools_IndexedMapOfShape aSubShapes; - TopExp::MapShapes( theShape, aSubShapes ); - - for (int i = 1; i <= aSubShapes.Extent(); i++) - { - const TopoDS_Shape& aShape = aSubShapes.FindKey(i); - - if( SMESHDS_SubMesh* aSubMesh = theMeshDS->MeshElements( aShape ) ){ - if( aSubMesh->Contains( theElem ) ) - return true; - - SMDS_NodeIteratorPtr aNodeIt = aSubMesh->GetNodes(); - while ( aNodeIt->more() ) - { - const SMDS_MeshNode* aNode = static_cast(aNodeIt->next()); - SMDS_ElemIteratorPtr anElemIt = aNode->GetInverseElementIterator(); - while ( anElemIt->more() ) - { - const SMDS_MeshElement* anElement = static_cast(anElemIt->next()); - if (anElement == theElem) - return true; - } - } - } - } - return false; -} - - /* AUXILIARY METHODS */ diff --git a/src/SMESH_I/SMESH_Filter_i.hxx b/src/SMESH_I/SMESH_Filter_i.hxx index b6036a13d..87684f257 100644 --- a/src/SMESH_I/SMESH_Filter_i.hxx +++ b/src/SMESH_I/SMESH_Filter_i.hxx @@ -41,94 +41,8 @@ #include -class SMESHDS_Mesh; - namespace SMESH { - - // ================================================================================ - namespace Controls - { - - /* - Class : BelongToGeom - Description : Predicate for verifying whether entiy belong to - specified geometrical support - */ - class SMESH_I_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 BelongToGeomPtr; - - /* - Class : LyingOnGeom - Description : Predicate for verifying whether entiy lying or partially lying on - specified geometrical support - */ - class SMESH_I_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; - 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 LyingOnGeomPtr; - - } // namespace Controls - // ================================================================================ /* FUNCTORS