X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshElement.hxx;h=620e4d82df2bc5e80ff00d21f3b8250bfc0475c5;hp=78238dcea1eb24053e6e1ffe52a31853f643012c;hb=c80762b0a1cdba101aec4aa2b1cae281331a162e;hpb=c25ddc7d49ed09f1b5719ce68292ee3694876462 diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx index 78238dcea..620e4d82d 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 @@ -57,7 +57,7 @@ class SMDS_Mesh; // ============================================================ -class SMDS_EXPORT SMDS_MeshElement:public SMDS_MeshObject +class SMDS_EXPORT SMDS_MeshElement : public SMDS_MeshObject { public: @@ -79,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; @@ -141,12 +141,16 @@ 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 >> BITS_SHIFT; } + inline int getIdInShape() const { return myIdInShape; } + inline int getVtkId() const { return myVtkID; } - inline ShortType getMeshId() const { return myMeshId; } - inline LongType getshapeId() const { return myShapeId; } - 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 @@ -154,7 +158,7 @@ public: struct Filter { virtual bool operator()(const SMDS_MeshElement* e) const = 0; - ~Filter() {} + virtual ~Filter() {} }; struct NonNullFilter: public Filter { @@ -180,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); @@ -195,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; +} // ============================================================ /*! @@ -208,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