const bool toCheckOri = (helper.NbAncestors( geomFace, theMesh, TopAbs_SOLID ) == 1 );
Handle(Geom_Surface) surface = BRep_Tool::Surface( geomFace );
- if ( helper.GetSubShapeOri( tgtMesh->ShapeToMesh(), geomFace) == TopAbs_REVERSED )
- surface->UReverse();
+ const bool reverse =
+ ( helper.GetSubShapeOri( tgtMesh->ShapeToMesh(), geomFace) == TopAbs_REVERSED );
gp_Pnt p; gp_Vec du, dv;
set<int> subShapeIDs;
StdMeshers_Import_1D::getMaps( srcMesh, &theMesh, n2n, e2e );
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
- SMDS_MeshNode tmpNode(0,0,0);
+ SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
gp_XY uv;
while ( srcElems->more() ) // loop on group contents
{
TNodeNodeMap::iterator n2nIt = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )).first;
if ( n2nIt->second )
{
- if ( !subShapeIDs.count( n2nIt->second->GetPosition()->GetShapeId() ))
+ if ( !subShapeIDs.count( n2nIt->second->getshapeId() ))
break;
}
else
if ( !n2nIt->second )
{
// find out if node lies on theShape
- tmpNode.setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
- if ( helper.CheckNodeUV( geomFace, &tmpNode, uv, 10 * faceTol, /*force=*/true ))
+ tmpNode->setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
+ if ( helper.CheckNodeUV( geomFace, tmpNode, uv, 10 * faceTol, /*force=*/true ))
{
SMDS_MeshNode* newNode = tgtMesh->AddNode( (*node)->X(), (*node)->Y(), (*node)->Z());
n2nIt->second = newNode;
{
uv = helper.GetNodeUV( geomFace, newNodes[++iNode] );
surface->D1( uv.X(),uv.Y(), p, du,dv );
- geomNorm = du ^ dv;
+ geomNorm = reverse ? dv^du : du^dv;
}
while ( geomNorm.SquareMagnitude() < 1e-6 && iNode+1 < face->NbCornerNodes());
++link2Nb->second;
}
}
+ helper.GetMeshDS()->RemoveNode(tmpNode);
}
// ==========================================================
int nbFaces = link2Nb->second;
if ( nbFaces == 1 )
{
- // check if the link lie on face boundary
+ // check if a not shared link lie on face boundary
bool nodesOnBoundary = true;
list< TopoDS_Shape > bndShapes;
for ( int is1stN = 0; is1stN < 2 && nodesOnBoundary; ++is1stN )
{
const SMDS_MeshNode* n = is1stN ? link.node1() : link.node2();
- if ( !subShapeIDs.count( n->GetPosition()->GetShapeId() ))
+ if ( !subShapeIDs.count( n->getshapeId() ))
{
for ( unsigned iE = 0; iE < edges.size(); ++iE )
if ( helper.CheckNodeU( edges[iE], n, u, 10 * faceTol, /*force=*/true ))
if ( Abs(u-f) < 2 * faceTol || Abs(u-l) < 2 * faceTol )
// duplicated node on vertex
return error("Source elements overlap one another");
+ tgtSM->RemoveNode( n, /*isNodeDeleted=*/false );
tgtMesh->SetNodeOnEdge( (SMDS_MeshNode*)n, edges[iE], u );
break;
}
- nodesOnBoundary = subShapeIDs.count( n->GetPosition()->GetShapeId());
+ nodesOnBoundary = subShapeIDs.count( n->getshapeId());
}
if ( nodesOnBoundary )
{
}
}
if ( !nodesOnBoundary )
- break; // free internal link
+ break; // error: free internal link
if ( bndShapes.front().ShapeType() == TopAbs_EDGE &&
bndShapes.front() != bndShapes.back() )
- break; // link nodes on different geom edges
+ break; // error: link nodes on different geom edges
// find geom edge the link is on
if ( bndShapes.back().ShapeType() != TopAbs_EDGE )
geomEdge.Nullify();
}
if ( geomEdge.IsNull() )
- break; // vertices belong to different edges -> free internal link
+ break; // vertices belong to different edges -> error: free internal link
bndShapes.push_back( geomEdge );
}
TopoDS_Edge geomEdge = TopoDS::Edge(bndShapes.back());
helper.CheckNodeU( geomEdge, link._medium, u, 10*faceTol, /*force=*/true );
+ tgtSM->RemoveNode( link._medium, /*isNodeDeleted=*/false );
tgtMesh->SetNodeOnEdge( (SMDS_MeshNode*)link._medium, geomEdge, u );
}
else
{
edge = tgtMesh->AddEdge( newNodes[0], newNodes[1]);
}
- // remove nodes from submesh of theShape
- for ( unsigned i = 0; i < newNodes.size(); ++i )
- tgtSM->RemoveNode( newNodes[i], /*isNodeDeleted=*/false );
if ( !edge )
return false;
{
const SMESHDS_GroupBase* srcGroup = srcGroups[iG]->GetGroupDS();
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
- SMDS_MeshNode tmpNode(0,0,0);
+ SMDS_MeshNode *tmpNode =helper.AddNode(0,0,0);
while ( srcElems->more() ) // loop on group contents
{
const SMDS_MeshElement* face = srcElems->next();
// a gravity center of face to geomFace
gp_XYZ gc(0,0,0);
gc = accumulate( TXyzIterator(face->nodesIterator()), TXyzIterator(), gc)/face->NbNodes();
- tmpNode.setXYZ( gc.X(), gc.Y(), gc.Z());
- if ( helper.CheckNodeUV( geomFace, &tmpNode, uv, 10 * faceTol, /*force=*/true ))
+ tmpNode->setXYZ( gc.X(), gc.Y(), gc.Z());
+ if ( helper.CheckNodeUV( geomFace, tmpNode, uv, 10 * faceTol, /*force=*/true ))
{
++aVec[ face->GetEntityType() ];
}
}
}
+ helper.GetMeshDS()->RemoveNode(tmpNode);
}
int nbNodes = allNodes.size();