X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshElement.hxx;h=620e4d82df2bc5e80ff00d21f3b8250bfc0475c5;hb=05a257d4f4e64a05ba8bb953efd5a2f1846e3fe1;hp=918ebb668efe33ac67a27d406d4447f14296d1f7;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx index 918ebb668..620e4d82d 100644 --- a/src/SMDS/SMDS_MeshElement.hxx +++ b/src/SMDS/SMDS_MeshElement.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 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: @@ -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 >> 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 */ - 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,6 +225,13 @@ protected: */ // ============================================================ +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(); }