From 8c74c25d2c962763a44ecce9da0ab97d766a7eee Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 29 Dec 2006 14:25:10 +0000 Subject: [PATCH] NPAL14335 (EDF 344 SMESH : "ERROR : Iterator not implemented " when loading a script) Implement iterator on faces and edges --- src/SMDS/SMDS_FaceOfNodes.cxx | 31 ++++++++++++++++++- src/SMDS/SMDS_PolygonalFaceOfNodes.cxx | 31 ++++++++++++++++++- src/SMDS/SMDS_QuadraticFaceOfNodes.cxx | 32 +++++++++++++++++++- src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx | 30 +++++++++++++++++-- src/SMDS/SMDS_VolumeOfNodes.cxx | 38 ++++++++++++++++++++++++ 5 files changed, 157 insertions(+), 5 deletions(-) diff --git a/src/SMDS/SMDS_FaceOfNodes.cxx b/src/SMDS/SMDS_FaceOfNodes.cxx index 0ad564ef7..45ee55ba9 100644 --- a/src/SMDS/SMDS_FaceOfNodes.cxx +++ b/src/SMDS/SMDS_FaceOfNodes.cxx @@ -27,6 +27,8 @@ #include "SMDS_FaceOfNodes.hxx" #include "SMDS_IteratorOfElements.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_Mesh.hxx" + #include "utilities.h" using namespace std; @@ -76,6 +78,33 @@ class SMDS_FaceOfNodes_MyIterator:public SMDS_NodeArrayElemIterator SMDS_NodeArrayElemIterator( s, & s[ l ] ) {} }; +/// =================================================================== +/*! + * \brief Iterator on edges of face + */ +/// =================================================================== + +class _MyEdgeIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MyEdgeIterator(const SMDS_FaceOfNodes* face):myIndex(0) { + myElems.reserve( face->NbNodes() ); + for ( int i = 0; i < face->NbNodes(); ++i ) { + const SMDS_MeshElement* edge = + SMDS_Mesh::FindEdge( face->GetNode( i ), face->GetNode( i + 1 )); + if ( edge ) + myElems.push_back( edge ); + } + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; + SMDS_ElemIteratorPtr SMDS_FaceOfNodes::elementsIterator (SMDSAbs_ElementType type) const { @@ -86,7 +115,7 @@ SMDS_ElemIteratorPtr SMDS_FaceOfNodes::elementsIterator case SMDSAbs_Node: return SMDS_ElemIteratorPtr(new SMDS_FaceOfNodes_MyIterator(myNodes,myNbNodes)); case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_FaceOfNodes not implemented"); + return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this )); break; default: return SMDS_ElemIteratorPtr diff --git a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx b/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx index 897cd6993..67d6160ce 100644 --- a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx +++ b/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx @@ -27,6 +27,8 @@ #include "SMDS_IteratorOfElements.hxx" #include "SMDS_SetIterator.hxx" +#include "SMDS_Mesh.hxx" + #include "utilities.h" using namespace std; @@ -135,6 +137,33 @@ class SMDS_PolygonalFaceOfNodes_MyIterator:public SMDS_NodeVectorElemIterator SMDS_NodeVectorElemIterator( s.begin(), s.end() ) {} }; +/// =================================================================== +/*! + * \brief Iterator on edges of face + */ +/// =================================================================== + +class _MyEdgeIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MyEdgeIterator(const SMDS_MeshFace* face):myIndex(0) { + myElems.reserve( face->NbNodes() ); + for ( int i = 0; i < face->NbNodes(); ++i ) { + const SMDS_MeshElement* edge = + SMDS_Mesh::FindEdge( face->GetNode( i ), face->GetNode( i + 1 )); + if ( edge ) + myElems.push_back( edge ); + } + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; + SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator (SMDSAbs_ElementType type) const { @@ -145,7 +174,7 @@ SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator case SMDSAbs_Node: return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes)); case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_PolygonalFaceOfNodes not implemented"); + return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this )); break; default: return SMDS_ElemIteratorPtr diff --git a/src/SMDS/SMDS_QuadraticFaceOfNodes.cxx b/src/SMDS/SMDS_QuadraticFaceOfNodes.cxx index fa4249e66..3421c7412 100644 --- a/src/SMDS/SMDS_QuadraticFaceOfNodes.cxx +++ b/src/SMDS/SMDS_QuadraticFaceOfNodes.cxx @@ -30,6 +30,7 @@ #include "SMDS_SetIterator.hxx" #include "SMDS_IteratorOfElements.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_Mesh.hxx" #include "utilities.h" @@ -241,6 +242,35 @@ SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::interlacedNodesElemIterator() co return SMDS_ElemIteratorPtr (new _MyInterlacedNodeElemIterator ( interlacedNodesIterator() )); } +/// =================================================================== +/*! + * \brief Iterator on edges of face + */ +/// =================================================================== + +class _MyEdgeIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MyEdgeIterator(const SMDS_QuadraticFaceOfNodes* face):myIndex(0) { + myElems.reserve( face->NbNodes() ); + SMDS_ElemIteratorPtr nIt = face->interlacedNodesElemIterator(); + const SMDS_MeshNode* n0 = face->GetNode( -1 ); + while ( nIt->more() ) { + const SMDS_MeshNode* n1 = static_cast( nIt->next() ); + const SMDS_MeshElement* edge = SMDS_Mesh::FindEdge( n0, n1 ); + if ( edge ) + myElems.push_back( edge ); + n0 = n1; + } + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; //======================================================================= //function : elementsIterator @@ -257,7 +287,7 @@ SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::elementsIterator case SMDSAbs_Node: return SMDS_ElemIteratorPtr(new _MyNodeIterator(myNodes)); case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_QuadraticFaceOfNodes not implemented"); + return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this )); break; default: return SMDS_ElemIteratorPtr diff --git a/src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx b/src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx index ce14eccd0..3709b1f3f 100644 --- a/src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx +++ b/src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx @@ -30,6 +30,7 @@ #include "SMDS_IteratorOfElements.hxx" #include "SMDS_MeshNode.hxx" #include "SMDS_SetIterator.hxx" +#include "SMDS_VolumeTool.hxx" #include "utilities.h" @@ -304,6 +305,31 @@ public: SMDS_NodeVectorElemIterator( s.begin(), s.end() ) {} }; +/// =================================================================== +/*! + * \brief Iterator on faces or edges of volume + */ +/// =================================================================== + +class _MySubIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MySubIterator(const SMDS_MeshVolume* vol, SMDSAbs_ElementType type):myIndex(0) { + SMDS_VolumeTool vTool(vol); + if (type == SMDSAbs_Face) + vTool.GetAllExistingFaces( myElems ); + else + vTool.GetAllExistingFaces( myElems ); + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; + //======================================================================= //function : elementsIterator //purpose : @@ -319,10 +345,10 @@ SMDS_ElemIteratorPtr SMDS_QuadraticVolumeOfNodes::elementsIterator case SMDSAbs_Node: return SMDS_ElemIteratorPtr(new SMDS_QuadraticVolumeOfNodes_MyIterator(myNodes)); case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_QuadraticVolumeOfNodes not implemented"); + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Edge)); break; case SMDSAbs_Face: - MESSAGE("Error : face iterator for SMDS_QuadraticVolumeOfNodes not implemented"); + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Face)); break; default: return SMDS_ElemIteratorPtr diff --git a/src/SMDS/SMDS_VolumeOfNodes.cxx b/src/SMDS/SMDS_VolumeOfNodes.cxx index 0428095da..af3c64cf5 100644 --- a/src/SMDS/SMDS_VolumeOfNodes.cxx +++ b/src/SMDS/SMDS_VolumeOfNodes.cxx @@ -26,8 +26,11 @@ #include "SMDS_VolumeOfNodes.hxx" #include "SMDS_MeshNode.hxx" #include "SMDS_SetIterator.hxx" +#include "SMDS_VolumeTool.hxx" #include "utilities.h" +#include + using namespace std; /////////////////////////////////////////////////////////////////////////////// @@ -171,6 +174,12 @@ int SMDS_VolumeOfNodes::NbEdges() const return 0; } +/// =================================================================== +/*! + * \brief Iterator on node of volume + */ +/// =================================================================== + class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator { public: @@ -178,6 +187,31 @@ class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator SMDS_NodeArrayElemIterator( s, & s[ l ]) {} }; +/// =================================================================== +/*! + * \brief Iterator on faces or edges of volume + */ +/// =================================================================== + +class _MySubIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MySubIterator(const SMDS_VolumeOfNodes* vol, SMDSAbs_ElementType type):myIndex(0) { + SMDS_VolumeTool vTool(vol); + if (type == SMDSAbs_Face) + vTool.GetAllExistingFaces( myElems ); + else + vTool.GetAllExistingFaces( myElems ); + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; + SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType type) const { switch(type) @@ -186,6 +220,10 @@ SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType ty return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume); case SMDSAbs_Node: return SMDS_ElemIteratorPtr(new SMDS_VolumeOfNodes_MyIterator(myNodes,myNbNodes)); + case SMDSAbs_Face: + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Face)); + case SMDSAbs_Edge: + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Edge)); default: MESSAGE("ERROR : Iterator not implemented"); return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); -- 2.39.2