mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-30 19:30: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_FaceOfNodes.hxx"
|
||||||
#include "SMDS_IteratorOfElements.hxx"
|
#include "SMDS_IteratorOfElements.hxx"
|
||||||
#include "SMDS_MeshNode.hxx"
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDS_Mesh.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -76,6 +78,33 @@ class SMDS_FaceOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
|
|||||||
SMDS_NodeArrayElemIterator( s, & s[ l ] ) {}
|
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
|
SMDS_ElemIteratorPtr SMDS_FaceOfNodes::elementsIterator
|
||||||
(SMDSAbs_ElementType type) const
|
(SMDSAbs_ElementType type) const
|
||||||
{
|
{
|
||||||
@ -86,7 +115,7 @@ SMDS_ElemIteratorPtr SMDS_FaceOfNodes::elementsIterator
|
|||||||
case SMDSAbs_Node:
|
case SMDSAbs_Node:
|
||||||
return SMDS_ElemIteratorPtr(new SMDS_FaceOfNodes_MyIterator(myNodes,myNbNodes));
|
return SMDS_ElemIteratorPtr(new SMDS_FaceOfNodes_MyIterator(myNodes,myNbNodes));
|
||||||
case SMDSAbs_Edge:
|
case SMDSAbs_Edge:
|
||||||
MESSAGE("Error : edge iterator for SMDS_FaceOfNodes not implemented");
|
return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this ));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SMDS_ElemIteratorPtr
|
return SMDS_ElemIteratorPtr
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
#include "SMDS_IteratorOfElements.hxx"
|
#include "SMDS_IteratorOfElements.hxx"
|
||||||
#include "SMDS_SetIterator.hxx"
|
#include "SMDS_SetIterator.hxx"
|
||||||
|
#include "SMDS_Mesh.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -135,6 +137,33 @@ class SMDS_PolygonalFaceOfNodes_MyIterator:public SMDS_NodeVectorElemIterator
|
|||||||
SMDS_NodeVectorElemIterator( s.begin(), s.end() ) {}
|
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
|
SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator
|
||||||
(SMDSAbs_ElementType type) const
|
(SMDSAbs_ElementType type) const
|
||||||
{
|
{
|
||||||
@ -145,7 +174,7 @@ SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator
|
|||||||
case SMDSAbs_Node:
|
case SMDSAbs_Node:
|
||||||
return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes));
|
return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes));
|
||||||
case SMDSAbs_Edge:
|
case SMDSAbs_Edge:
|
||||||
MESSAGE("Error : edge iterator for SMDS_PolygonalFaceOfNodes not implemented");
|
return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this ));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SMDS_ElemIteratorPtr
|
return SMDS_ElemIteratorPtr
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "SMDS_SetIterator.hxx"
|
#include "SMDS_SetIterator.hxx"
|
||||||
#include "SMDS_IteratorOfElements.hxx"
|
#include "SMDS_IteratorOfElements.hxx"
|
||||||
#include "SMDS_MeshNode.hxx"
|
#include "SMDS_MeshNode.hxx"
|
||||||
|
#include "SMDS_Mesh.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
@ -241,6 +242,35 @@ SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::interlacedNodesElemIterator() co
|
|||||||
return SMDS_ElemIteratorPtr
|
return SMDS_ElemIteratorPtr
|
||||||
(new _MyInterlacedNodeElemIterator ( interlacedNodesIterator() ));
|
(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
|
//function : elementsIterator
|
||||||
@ -257,7 +287,7 @@ SMDS_ElemIteratorPtr SMDS_QuadraticFaceOfNodes::elementsIterator
|
|||||||
case SMDSAbs_Node:
|
case SMDSAbs_Node:
|
||||||
return SMDS_ElemIteratorPtr(new _MyNodeIterator(myNodes));
|
return SMDS_ElemIteratorPtr(new _MyNodeIterator(myNodes));
|
||||||
case SMDSAbs_Edge:
|
case SMDSAbs_Edge:
|
||||||
MESSAGE("Error : edge iterator for SMDS_QuadraticFaceOfNodes not implemented");
|
return SMDS_ElemIteratorPtr(new _MyEdgeIterator( this ));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SMDS_ElemIteratorPtr
|
return SMDS_ElemIteratorPtr
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "SMDS_IteratorOfElements.hxx"
|
#include "SMDS_IteratorOfElements.hxx"
|
||||||
#include "SMDS_MeshNode.hxx"
|
#include "SMDS_MeshNode.hxx"
|
||||||
#include "SMDS_SetIterator.hxx"
|
#include "SMDS_SetIterator.hxx"
|
||||||
|
#include "SMDS_VolumeTool.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
@ -304,6 +305,31 @@ public:
|
|||||||
SMDS_NodeVectorElemIterator( s.begin(), s.end() ) {}
|
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
|
//function : elementsIterator
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -319,10 +345,10 @@ SMDS_ElemIteratorPtr SMDS_QuadraticVolumeOfNodes::elementsIterator
|
|||||||
case SMDSAbs_Node:
|
case SMDSAbs_Node:
|
||||||
return SMDS_ElemIteratorPtr(new SMDS_QuadraticVolumeOfNodes_MyIterator(myNodes));
|
return SMDS_ElemIteratorPtr(new SMDS_QuadraticVolumeOfNodes_MyIterator(myNodes));
|
||||||
case SMDSAbs_Edge:
|
case SMDSAbs_Edge:
|
||||||
MESSAGE("Error : edge iterator for SMDS_QuadraticVolumeOfNodes not implemented");
|
return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Edge));
|
||||||
break;
|
break;
|
||||||
case SMDSAbs_Face:
|
case SMDSAbs_Face:
|
||||||
MESSAGE("Error : face iterator for SMDS_QuadraticVolumeOfNodes not implemented");
|
return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Face));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return SMDS_ElemIteratorPtr
|
return SMDS_ElemIteratorPtr
|
||||||
|
@ -26,8 +26,11 @@
|
|||||||
#include "SMDS_VolumeOfNodes.hxx"
|
#include "SMDS_VolumeOfNodes.hxx"
|
||||||
#include "SMDS_MeshNode.hxx"
|
#include "SMDS_MeshNode.hxx"
|
||||||
#include "SMDS_SetIterator.hxx"
|
#include "SMDS_SetIterator.hxx"
|
||||||
|
#include "SMDS_VolumeTool.hxx"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -171,6 +174,12 @@ int SMDS_VolumeOfNodes::NbEdges() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ===================================================================
|
||||||
|
/*!
|
||||||
|
* \brief Iterator on node of volume
|
||||||
|
*/
|
||||||
|
/// ===================================================================
|
||||||
|
|
||||||
class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
|
class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -178,6 +187,31 @@ class SMDS_VolumeOfNodes_MyIterator:public SMDS_NodeArrayElemIterator
|
|||||||
SMDS_NodeArrayElemIterator( s, & s[ l ]) {}
|
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
|
SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType type) const
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
@ -186,6 +220,10 @@ SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType ty
|
|||||||
return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
|
return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
|
||||||
case SMDSAbs_Node:
|
case SMDSAbs_Node:
|
||||||
return SMDS_ElemIteratorPtr(new SMDS_VolumeOfNodes_MyIterator(myNodes,myNbNodes));
|
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:
|
default:
|
||||||
MESSAGE("ERROR : Iterator not implemented");
|
MESSAGE("ERROR : Iterator not implemented");
|
||||||
return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
|
return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user