#include "SMDS_FaceOfNodes.hxx"
#include "SMDS_IteratorOfElements.hxx"
#include "SMDS_MeshNode.hxx"
+#include "SMDS_Mesh.hxx"
+
#include "utilities.h"
using namespace std;
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
{
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
#include "SMDS_IteratorOfElements.hxx"
#include "SMDS_SetIterator.hxx"
+#include "SMDS_Mesh.hxx"
+
#include "utilities.h"
using namespace std;
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
{
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
#include "SMDS_SetIterator.hxx"
#include "SMDS_IteratorOfElements.hxx"
#include "SMDS_MeshNode.hxx"
+#include "SMDS_Mesh.hxx"
#include "utilities.h"
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<const SMDS_MeshNode*>( 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
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
#include "SMDS_IteratorOfElements.hxx"
#include "SMDS_MeshNode.hxx"
#include "SMDS_SetIterator.hxx"
+#include "SMDS_VolumeTool.hxx"
#include "utilities.h"
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 :
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
#include "SMDS_VolumeOfNodes.hxx"
#include "SMDS_MeshNode.hxx"
#include "SMDS_SetIterator.hxx"
+#include "SMDS_VolumeTool.hxx"
#include "utilities.h"
+#include <vector>
+
using namespace std;
///////////////////////////////////////////////////////////////////////////////
return 0;
}
+/// ===================================================================
+/*!
+ * \brief Iterator on node of volume
+ */
+/// ===================================================================
+
class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
{
public:
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)
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);