-// Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
using namespace std;
-typedef map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::list< TopoDS_Edge > TWire;
#define smdsNode( elem ) static_cast<const SMDS_MeshNode*>( elem )
case '-': // real number
case '+':
case '.':
- isNumber = true;
+ isNumber = true; // fall through
default: // data
isNumber = isNumber || ( *theLineBeg >= '0' && *theLineBeg <= '9' );
if ( isNumber ) {
SMESH_MesherHelper helper( *theMesh );
helper.SetSubShape( theFace );
- int nbNodes = ( !fSubMesh ? 0 : fSubMesh->NbNodes() );
- int nbElems = ( !fSubMesh ? 0 : fSubMesh->NbElements() );
+ smIdType nbNodes = ( !fSubMesh ? 0 : fSubMesh->NbNodes() );
+ smIdType nbElems = ( !fSubMesh ? 0 : fSubMesh->NbElements() );
if ( nbElems == 0 && aMeshDS->NbFaces() == 0 )
{
MESSAGE( "No elements bound to the face");
// If there are several wires, define the order of edges of inner wires:
// compute UV of inner edge-points using 2 methods: the one for in-face points
// and the one for on-edge points and then choose the best edge order
- // by the best correspondence of the 2 results
+ // by the best correspondence of the 2 results.
+ // The wires are sorted by number of edges to correspond to wires of the pattern
if ( nbWires > 1 )
{
// compute UV of inner edge-points using the method for in-face points
// and divide eList into a list of separate wires
bool aBool;
- list< list< TopoDS_Edge > > wireList;
+ list< TWire > wireList;
list<TopoDS_Edge>::iterator eIt = elIt;
list<int>::iterator nbEIt = nbVertexInWires.begin();
for ( nbEIt++; nbEIt != nbVertexInWires.end(); nbEIt++ )
{
int nbEdges = *nbEIt;
wireList.push_back( list< TopoDS_Edge >() );
- list< TopoDS_Edge > & wire = wireList.back();
+ TWire & wire = wireList.back();
for ( iE = 0 ; iE < nbEdges; eIt++, iE++ )
{
list< TPoint* > & ePoints = getShapePoints( *eIt );
// find points - edge correspondence for wires of unique size,
// edge order within a wire should be defined only
- list< list< TopoDS_Edge > >::iterator wlIt = wireList.begin();
+ list< TWire >::iterator wlIt = wireList.begin();
while ( wlIt != wireList.end() )
{
- list< TopoDS_Edge >& wire = (*wlIt);
+ TWire& wire = (*wlIt);
size_t nbEdges = wire.size();
wlIt++;
- if ( wlIt != wireList.end() && (*wlIt).size() != nbEdges ) // a unique size wire
+ if ( wlIt == wireList.end() || (*wlIt).size() != nbEdges ) // a unique size wire
{
// choose the best first edge of a wire
setFirstEdge( wire, id1 );
edgesPoints->insert( edgesPoints->end(), ePoints.begin(), (--ePoints.end()));
}
}
+ else
+ {
+ // skip same size wires
+ while ( wlIt != wireList.end() && (*wlIt).size() == nbEdges )
+ wlIt++;
+ }
id1 += nbEdges;
}
while ( wlIt != wireList.end() )
{
size_t nbSameSize = 0, nbEdges = (*wlIt).size();
- list< list< TopoDS_Edge > >::iterator wlIt2 = wlIt;
+ list< TWire >::iterator wlIt2 = wlIt;
wlIt2++;
while ( wlIt2 != wireList.end() && (*wlIt2).size() == nbEdges ) { // a same size wire
nbSameSize++;
for ( wlIt = wireList.begin(); wlIt != wireList.end(); wlIt++ )
{
- list< TopoDS_Edge >& wire = (*wlIt);
+ TWire& wire = (*wlIt);
eList.splice( eList.end(), wire, wire.begin(), wire.end() );
}
return setErrorCode( ERR_LOADV_BAD_SHAPE );
// count nodes
- int nbNodes = 0, shapeID;
+ smIdType nbNodes = 0; int shapeID;
for ( shapeID = 1; shapeID <= myShapeIDMap.Extent(); shapeID++ )
{
const TopoDS_Shape& S = myShapeIDMap( shapeID );
elem = aMeshDS->AddFace (nodes[0], nodes[1], nodes[2], nodes[3],
nodes[4], nodes[5] ); break;
} // else do not break but create a polygon
+ // fall through
case 8:
if ( !onMeshElements ) {// create a quadratic face
elem = aMeshDS->AddFace (nodes[0], nodes[1], nodes[2], nodes[3],
nodes[4], nodes[5], nodes[6], nodes[7] ); break;
} // else do not break but create a polygon
+ // fall through
default:
elem = aMeshDS->AddPolygonalFace( nodes );
}
subMesh->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
}
if ( onMeshElements ) {
- list< int > elemIDs;
+ list< smIdType > elemIDs;
for ( size_t i = 0; i < theElements.size(); i++ )
{
subMesh = theMesh->GetSubMeshContaining( shapeIDs[ i ] );
SMESH_Pattern::TPoint::TPoint()
{
#ifdef _DEBUG_
- myInitXYZ.SetCoord(0,0,0);
- myInitUV.SetCoord(0.,0.);
- myInitU = 0;
- myXYZ.SetCoord(0,0,0);
- myUV.SetCoord(0.,0.);
- myU = 0;
+ myInitXYZ.SetCoord(7,7,7);
+ myInitUV.SetCoord(7.,7.);
+ myInitU = 7;
+ myXYZ.SetCoord(7,7,7);
+ myUV.SetCoord(7.,7.);
+ myU = 7;
#endif
}