-// 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
// 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
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;
* \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) {}
};
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);
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;
+}
// ============================================================
/*!
*/
// ============================================================
-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