X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_MeshElement.cxx;h=8d4d9b75dc2e0bb913603c73ac5a5fefb72f9887;hp=10432de1d96eb973e7a042d287be346f50e3b338;hb=ebc64f68bf3d4005762eebc43354d101670dcaed;hpb=007c0191337598a9431229b2d3dec7fde25d4c4e diff --git a/src/SMDS/SMDS_MeshElement.cxx b/src/SMDS/SMDS_MeshElement.cxx index 10432de1d..8d4d9b75d 100644 --- a/src/SMDS/SMDS_MeshElement.cxx +++ b/src/SMDS/SMDS_MeshElement.cxx @@ -18,181 +18,177 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshElement.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -using namespace std; -#include "SMDS_MeshElement.ixx" -//======================================================================= -//function : SMDS_MeshElement -//purpose : -//======================================================================= +#ifdef _MSC_VER +#pragma warning(disable:4786) +#endif -SMDS_MeshElement::SMDS_MeshElement(const Standard_Integer ID, const Standard_Integer nb,const SMDSAbs_ElementType Type) - :myID(ID),myNbNodes(nb),myType(Type) -{ -} +#include "SMDS_MeshElement.hxx" +#include "SMDS_MeshNode.hxx" +#include "SMDS_MeshEdge.hxx" +#include "SMDS_MeshFace.hxx" +#include "SMDS_MeshVolume.hxx" +#include "utilities.h" -//======================================================================= -//function : GetConnections -//purpose : -//======================================================================= +using namespace std; -Standard_Address SMDS_MeshElement::GetConnections() const +SMDS_MeshElement::SMDS_MeshElement(int ID):myID(ID) { - return (Standard_Address)&myID; } - -//======================================================================= -//function : GetConnection -//purpose : -//======================================================================= - -Standard_Integer SMDS_MeshElement::GetConnection(const Standard_Integer rank) const +void SMDS_MeshElement::Print(ostream & OS) const { - return myID; + OS << "dump of mesh element" << endl; } - -//======================================================================= -//function : InverseElements -//purpose : -//======================================================================= - -const SMDS_ListOfMeshElement& SMDS_MeshElement::InverseElements() const +ostream & operator <<(ostream & OS, const SMDS_MeshElement * ME) { - static SMDS_ListOfMeshElement empty; - return empty; + ME->Print(OS); + return OS; } -//======================================================================= -//function : ClearInverseElements -//purpose : -//======================================================================= - -void SMDS_MeshElement::ClearInverseElements() +/////////////////////////////////////////////////////////////////////////////// +/// Create an iterator which iterate on nodes owned by the element. +/// This method call elementsIterator(). +/////////////////////////////////////////////////////////////////////////////// +SMDS_ElemIteratorPtr SMDS_MeshElement::nodesIterator() const { + return elementsIterator(SMDSAbs_Node); } -//======================================================================= -//function : AddInverseElement -//purpose : -//======================================================================= - -void SMDS_MeshElement::AddInverseElement(const Handle(SMDS_MeshElement)& elem) +/////////////////////////////////////////////////////////////////////////////// +/// Create an iterator which iterate on edges linked with or owned by the element. +/// This method call elementsIterator(). +/////////////////////////////////////////////////////////////////////////////// +SMDS_ElemIteratorPtr SMDS_MeshElement::edgesIterator() const { + return elementsIterator(SMDSAbs_Edge); } -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= - -Standard_Integer SMDS_MeshElement::NbEdges() const +/////////////////////////////////////////////////////////////////////////////// +/// Create an iterator which iterate on faces linked with or owned by the element. +/// This method call elementsIterator(). +/////////////////////////////////////////////////////////////////////////////// +SMDS_ElemIteratorPtr SMDS_MeshElement::facesIterator() const { - return 0; + return elementsIterator(SMDSAbs_Face); } -//======================================================================= -//function : NbFaces -//purpose : -//======================================================================= - -Standard_Integer SMDS_MeshElement::NbFaces() const +/////////////////////////////////////////////////////////////////////////////// +///Return The number of nodes owned by the current element +/////////////////////////////////////////////////////////////////////////////// +int SMDS_MeshElement::NbNodes() const { - return 0; + int nbnodes=0; + SMDS_ElemIteratorPtr it=nodesIterator(); + while(it->more()) + { + it->next(); + nbnodes++; + } + return nbnodes; } - -//======================================================================= -//function : GetEdgeDefinedByNodes -//purpose : -//======================================================================= - -void SMDS_MeshElement::GetEdgeDefinedByNodes(const Standard_Integer rank, - Standard_Integer& idnode1, - Standard_Integer& idnode2) const +/////////////////////////////////////////////////////////////////////////////// +///Return the number of edges owned by or linked with the current element +/////////////////////////////////////////////////////////////////////////////// +int SMDS_MeshElement::NbEdges() const { - idnode1 = 0; - idnode2 = 0; + int nbedges=0; + SMDS_ElemIteratorPtr it=edgesIterator(); + while(it->more()) + { + it->next(); + nbedges++; + } + return nbedges; } -//======================================================================= -//function : GetFaceDefinedByNodes -//purpose : -//======================================================================= - -void SMDS_MeshElement::GetFaceDefinedByNodes(const Standard_Integer rank, - const Standard_Address idnode, - Standard_Integer& nb) const +/////////////////////////////////////////////////////////////////////////////// +///Return the number of faces owned by or linked with the current element +/////////////////////////////////////////////////////////////////////////////// +int SMDS_MeshElement::NbFaces() const { - nb = 0; + int nbfaces=0; + SMDS_ElemIteratorPtr it=facesIterator(); + while(it->more()) + { + it->next(); + nbfaces++; + } + return nbfaces; } -//======================================================================= -//function : SetNormal -//purpose : -//======================================================================= - -void SMDS_MeshElement::SetNormal(const Standard_Integer rank, - const Standard_Real vx, - const Standard_Real vy, - const Standard_Real vz) - +/////////////////////////////////////////////////////////////////////////////// +///Create an iterator which iterate on elements linked with the current element. +///@param type The of elements on which you want to iterate +///@return A smart pointer to iterator, you are not to take care of freeing memory +/////////////////////////////////////////////////////////////////////////////// +class SMDS_MeshElement_MyIterator:public SMDS_ElemIterator { - if (myNormals.IsNull()) { - myNormals = new TColgp_HArray1OfDir(1,NbNodes()); + const SMDS_MeshElement * myElement; + bool myMore; + public: + SMDS_MeshElement_MyIterator(const SMDS_MeshElement * element): + myElement(element),myMore(true) {} + + bool more() + { + return myMore; } - myNormals->SetValue(rank, gp_Dir(vx,vy,vz)); -} -//======================================================================= -//function : SetNormal -//purpose : -//======================================================================= - -void SMDS_MeshElement::SetNormal(const Standard_Integer rank, - const gp_Vec& V) + const SMDS_MeshElement* next() + { + myMore=false; + return myElement; + } +}; +SMDS_ElemIteratorPtr SMDS_MeshElement:: + elementsIterator(SMDSAbs_ElementType type) const { - if (myNormals.IsNull()) { - myNormals = new TColgp_HArray1OfDir(1,NbNodes()); - } - myNormals->SetValue(rank, gp_Dir(V)); + /** @todo Check that iterator in the child classes return elements + in the same order for each different implementation (i.e: SMDS_VolumeOfNodes + and SMDS_VolumeOfFaces */ + + if(type==GetType()) + return SMDS_ElemIteratorPtr(new SMDS_MeshElement_MyIterator(this)); + else + { + MESSAGE("Iterator not implemented"); + return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); + } } -//======================================================================= -//function : GetNormal -//purpose : -//======================================================================= - -gp_Dir SMDS_MeshElement::GetNormal(const Standard_Integer rank) +/////////////////////////////////////////////////////////////////////////////// +///Return the ID of the element +/////////////////////////////////////////////////////////////////////////////// +int SMDS_MeshElement::GetID() const { - if (myNormals.IsNull()) { - myNormals = new TColgp_HArray1OfDir(1,NbNodes()); - } - return myNormals->Value(rank); + return myID; } -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_MeshElement::Print(Standard_OStream& OS) const -{ - OS << "dump of mesh element" << endl; -} - - -Standard_OStream& operator << (Standard_OStream& OS - ,const Handle(SMDS_MeshElement)& ME) +bool operator<(const SMDS_MeshElement& e1, const SMDS_MeshElement& e2) { - ME->Print(OS); - return OS; + if(e1.GetType()!=e2.GetType()) return false; + switch(e1.GetType()) + { + case SMDSAbs_Node: + return static_cast(e1) < + static_cast(e2); + + case SMDSAbs_Edge: + return static_cast(e1) < + static_cast(e2); + + case SMDSAbs_Face: + return static_cast(e1) < + static_cast(e2); + + case SMDSAbs_Volume: + return static_cast(e1) < + static_cast(e2); + + default : MESSAGE("Internal Error"); + } + return false; }