mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-29 02:40:35 +05:00
NPAL14335 (EDF 344 SMESH : "ERROR : Iterator not implemented " when loading a script)
Implement iterator on faces and edges
This commit is contained in:
parent
cec6b2940b
commit
8c74c25d2c
@ -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
|
||||
|
@ -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
|
||||
|
@ -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<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
|
||||
@ -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
|
||||
|
@ -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
|
||||
|
@ -26,8 +26,11 @@
|
||||
#include "SMDS_VolumeOfNodes.hxx"
|
||||
#include "SMDS_MeshNode.hxx"
|
||||
#include "SMDS_SetIterator.hxx"
|
||||
#include "SMDS_VolumeTool.hxx"
|
||||
#include "utilities.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user