X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshElement.hxx;h=d114c02da8f4e9ce6044210b9e6a30ab3376558f;hb=c7d720eb8a7192a3316c968df9451e3a6d0f3f8d;hp=ccb4373a92b5d6c542b0303f0d10f89009e66d7f;hpb=250c4f224450a7cbff5f30412f61ccfcc77c0e29;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx index ccb4373a9..d114c02da 100644 --- a/src/SMDS/SMDS_MeshElement.hxx +++ b/src/SMDS/SMDS_MeshElement.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -65,9 +65,12 @@ public: SMDS_ElemIteratorPtr edgesIterator() const; SMDS_ElemIteratorPtr facesIterator() const; virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; - virtual SMDS_ElemIteratorPtr nodesIteratorToUNV() const; virtual SMDS_ElemIteratorPtr interlacedNodesElemIterator() const; + virtual SMDS_NodeIteratorPtr nodeIterator() const; + virtual SMDS_NodeIteratorPtr interlacedNodesIterator() const; + virtual SMDS_NodeIteratorPtr nodesIteratorToUNV() const; + // std-like iteration on nodes typedef SMDS_StdIterator< const SMDS_MeshNode*, SMDS_ElemIteratorPtr > iterator; iterator begin_nodes() const { return iterator( nodesIterator() ); } @@ -76,16 +79,16 @@ public: virtual int NbNodes() const; virtual int NbEdges() const; virtual int NbFaces() const; - inline int GetID() const { return myID; }; + inline int GetID() const { return myID; } ///Return the type of the current element - virtual SMDSAbs_ElementType GetType() const = 0; - virtual SMDSAbs_EntityType GetEntityType() const = 0; + virtual SMDSAbs_ElementType GetType() const = 0; + virtual SMDSAbs_EntityType GetEntityType() const = 0; virtual SMDSAbs_GeometryType GetGeomType() const = 0; - virtual vtkIdType GetVtkType() const = 0; + virtual vtkIdType GetVtkType() const = 0; + virtual bool IsPoly() const { return false; } virtual bool IsQuadratic() const; - virtual bool IsMediumNode(const SMDS_MeshNode* node) const; virtual int NbCornerNodes() const; @@ -138,29 +141,42 @@ public: * \param node - the node to check * \retval int - node index within the element, -1 if not found */ - int GetNodeIndex( const SMDS_MeshNode* node ) const; + virtual int GetNodeIndex( const SMDS_MeshNode* node ) const; - inline ShortType getMeshId() const { return myMeshId; } - inline LongType getshapeId() const { return myShapeId; } - inline int getIdInShape() const { return myIdInShape; } - inline int getVtkId() const { return myVtkID; } + inline ShortType getMeshId() const { return myMeshId; } + inline LongType getshapeId() const { return myShapeId >> BITS_SHIFT; } + inline int getIdInShape() const { return myIdInShape; } + inline int getVtkId() const { return myVtkID; } + + // mark this element; to be used in algos + inline void setIsMarked( bool is ) const; + inline bool isMarked() const; /*! * \brief Filters of elements, to be used with SMDS_SetIterator */ - struct TypeFilter + struct Filter + { + virtual bool operator()(const SMDS_MeshElement* e) const = 0; + virtual ~Filter() {} + }; + struct NonNullFilter: public Filter + { + bool operator()(const SMDS_MeshElement* e) const { return e; } + }; + struct TypeFilter : public Filter { SMDSAbs_ElementType _type; TypeFilter( SMDSAbs_ElementType t = SMDSAbs_NbElementTypes ):_type(t) {} bool operator()(const SMDS_MeshElement* e) const { return e && e->GetType() == _type; } }; - struct EntityFilter + struct EntityFilter : public Filter { SMDSAbs_EntityType _type; EntityFilter( SMDSAbs_EntityType t = SMDSEntity_Last ):_type(t) {} bool operator()(const SMDS_MeshElement* e) const { return e && e->GetEntityType() == _type; } }; - struct GeomFilter + struct GeomFilter : public Filter { SMDSAbs_GeometryType _type; GeomFilter( SMDSAbs_GeometryType t = SMDSGeom_NONE ):_type(t) {} @@ -168,10 +184,10 @@ public: }; protected: - inline void setId(int id) {myID = id; } - inline void setShapeId(LongType shapeId) {myShapeId = shapeId; } - inline void setIdInShape(int id) { myIdInShape = id; } - inline void setVtkId(int vtkId) { myVtkID = vtkId; } + inline void setId(int id) { myID = id; } + inline void setVtkId(int vtkId) { myVtkID = vtkId; } + inline void setIdInShape(int id) { myIdInShape = id; } + inline void setShapeId(LongType shapeId) { myShapeId = ( shapeId << BITS_SHIFT ) | ( myShapeId & BIT_IS_MARKED ); } SMDS_MeshElement(int ID=-1); SMDS_MeshElement(int id, ShortType meshId, LongType shapeId = 0); virtual void init(int id = -1, ShortType meshId = -1, LongType shapeId = 0); @@ -183,12 +199,25 @@ protected: int myVtkID; //! SMDS_Mesh identification in SMESH ShortType myMeshId; - //! SubShape and SubMesh identification in SMESHDS + //! SubShape and SubMesh identification in SMESHDS; one bit is used to mark the element LongType myShapeId; //! Element index in SMESHDS_SubMesh vector int myIdInShape; + + enum Bits { // use the 1st right bit of myShapeId to set/unset a mark + BIT_IS_MARKED = 1, + BITS_SHIFT = 1 + }; }; +inline void SMDS_MeshElement::setIsMarked( bool is ) const +{ + const_cast< SMDS_MeshElement* >( this )->myShapeId = ( myShapeId & ~BIT_IS_MARKED ) | is; +} +inline bool SMDS_MeshElement::isMarked() const +{ + return myShapeId & BIT_IS_MARKED; +} // ============================================================ /*! @@ -196,9 +225,16 @@ protected: */ // ============================================================ -struct TIDCompare { +struct TIDTypeCompare { bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const { return e1->GetType() == e2->GetType() ? e1->GetID() < e2->GetID() : e1->GetType() < e2->GetType(); } }; +// WARNING: this comparator makes impossible to store both nodes and elements in the same set +// because there are nodes and elements with the same ID. Use TIDTypeCompare for such containers. +struct TIDCompare { + bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const + { return e1->GetID() < e2->GetID(); } +}; + #endif