-// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 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
// find corresponding point on target shape
pOK = false;
gp_Pnt tgtP;
- const TopoDS_Shape& tgtShape = shape2ShapeMap( srcSM->GetSubShape() );
+ const TopoDS_Shape& tgtShape = shape2ShapeMap( srcSM->GetSubShape(), /*isSrc=*/true );
if ( tgtShape.ShapeType() == TopAbs_VERTEX )
{
tgtP = BRep_Tool::Pnt( TopoDS::Vertex( tgtShape ));
for ( TopExp_Explorer srcEdge( srcFace, TopAbs_EDGE); srcEdge.More(); srcEdge.Next() )
{
- const TopoDS_Shape& tgtEdge = shape2ShapeMap( srcEdge.Current() );
+ const TopoDS_Shape& tgtEdge = shape2ShapeMap( srcEdge.Current(), /*isSrc=*/true );
map< double, const SMDS_MeshNode* > srcNodes, tgtNodes;
if ( !SMESH_Algo::GetSortedNodesOnEdge( srcMesh->GetMeshDS(),
{
list< TopoDS_Edge > tgtEdges;
StdMeshers_FaceSidePtr srcWire = srcWires[iW];
+ TopTools_IndexedMapOfShape edgeMap; // to detect seam edges
for ( int iE = 0; iE < srcWire->NbEdges(); ++iE )
- tgtEdges.push_back( TopoDS::Edge( shape2ShapeMap( srcWire->Edge( iE ))));
-
+ {
+ tgtEdges.push_back( TopoDS::Edge( shape2ShapeMap( srcWire->Edge( iE ), /*isSrc=*/true)));
+ // reverse a seam edge encountered for the second time
+ const int oldExtent = edgeMap.Extent();
+ edgeMap.Add( tgtEdges.back() );
+ if ( oldExtent == edgeMap.Extent() )
+ tgtEdges.back().Reverse();
+ }
tgtWires[ iW ].reset( new StdMeshers_FaceSide( tgtFace, tgtEdges, tgtMesh,
/*theIsForward = */ true,
/*theIgnoreMediumNodes = */false));
}
case SMDS_TOP_EDGE: {
TopoDS_Shape srcEdge = srcHelper.GetSubShapeByNode( srcNode, srcHelper.GetMeshDS() );
- TopoDS_Shape tgtEdge = shape2ShapeMap( srcEdge );
+ TopoDS_Edge tgtEdge = TopoDS::Edge( shape2ShapeMap( srcEdge, /*isSrc=*/true ));
+ tgtMeshDS->SetNodeOnEdge( n, TopoDS::Edge( tgtEdge ));
double U = srcHelper.GetNodeU( TopoDS::Edge( srcEdge ), srcNode );
- tgtMeshDS->SetNodeOnEdge( n, TopoDS::Edge( tgtEdge ), U);
+ helper.CheckNodeU( tgtEdge, n, U, Precision::PConfusion());
+ n->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition( U )));
break;
}
case SMDS_TOP_VERTEX: {
TopoDS_Shape srcV = srcHelper.GetSubShapeByNode( srcNode, srcHelper.GetMeshDS() );
- TopoDS_Shape tgtV = shape2ShapeMap( srcV );
+ TopoDS_Shape tgtV = shape2ShapeMap( srcV, /*isSrc=*/true );
tgtMeshDS->SetNodeOnVertex( n, TopoDS::Vertex( tgtV ));
break;
}
TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD);
TAssocTool::TShapeShapeMap shape2ShapeMap;
- TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap, tgtFace );
+ TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap );
if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh,
shape2ShapeMap) ||
!shape2ShapeMap.IsBound( tgtFace ))
TopoDS_Vertex srcV1 = TopoDS::Vertex( mapper.GetSubShape( 1 ));
if ( srcV1.IsNull() )
RETURN_BAD_RESULT("Mesh is not bound to the face");
- if ( !shape2ShapeMap.IsBound( srcV1 ))
+ if ( !shape2ShapeMap.IsBound( srcV1, /*isSrc=*/true ))
RETURN_BAD_RESULT("Not associated vertices, srcV1 " << srcV1.TShape().operator->() );
- TopoDS_Vertex tgtV1 = TopoDS::Vertex( shape2ShapeMap( srcV1 ));
+ TopoDS_Vertex tgtV1 = TopoDS::Vertex( shape2ShapeMap( srcV1, /*isSrc=*/true ));
if ( !SMESH_MesherHelper::IsSubShape( srcV1, srcFace ))
RETURN_BAD_RESULT("Wrong srcV1 " << srcV1.TShape().operator->());
{
SMESH_subMesh* sm = smIt->next();
SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
- if ( !sm->IsMeshComputed() )
- break;
+ if ( !smDS || smDS->NbNodes() == 0 )
+ continue;
//if ( !is1DComputed && sm->GetSubShape().ShapeType() == TopAbs_EDGE )
//break;
bool isOld = isOldNode( node );
if ( !isOld && isSeam ) { // new node on a seam edge
- if ( seamNodes.find( node ) != seamNodes.end())
+ if ( seamNodes.count( node ) )
continue; // node is already in the map
}
node->GetPosition()->GetTypeOfPosition());
}
}
- if ( u2nodesMaps[ NEW_NODES ].size() != u2nodesMaps[ OLD_NODES ].size() )
+ const bool mergeNewToOld =
+ ( u2nodesMaps[ NEW_NODES ].size() == u2nodesMaps[ OLD_NODES ].size() );
+ const bool mergeSeamToNew =
+ ( u2nodesMaps[ NEW_NODES ].size() == u2nodesOnSeam.size() );
+
+ if ( !mergeNewToOld )
{
- if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
- sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
- helper.IsDegenShape( sm->GetId() ) )
- // NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that
- // does not make segments/nodes on degenerated edges
- continue;
-
- if ( u2nodesMaps[ OLD_NODES ].size() == 0 &&
- sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
- // old nodes are optional on vertices in the case of 1D-2D projection
- continue;
-
- RETURN_BAD_RESULT("Different nb of old and new nodes on shape #"<< sm->GetId() <<" "<<
- u2nodesMaps[ OLD_NODES ].size() << " != " <<
- u2nodesMaps[ NEW_NODES ].size());
+ // if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
+ // sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
+ // helper.IsDegenShape( sm->GetId() ) )
+ // // NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that
+ // // does not make segments/nodes on degenerated edges
+ // continue;
+
+ // if ( u2nodesMaps[ OLD_NODES ].size() == 0 &&
+ // sm->GetSubShape().ShapeType() == TopAbs_VERTEX )
+ // // old nodes are optional on vertices in the case of 1D-2D projection
+ // continue;
+
+ //RETURN_BAD_RESULT
+ MESSAGE("Different nb of old and new nodes on shape #"<< sm->GetId() <<" "<<
+ u2nodesMaps[ OLD_NODES ].size() << " != " <<
+ u2nodesMaps[ NEW_NODES ].size());
}
- if ( isSeam && u2nodesMaps[ OLD_NODES ].size() != u2nodesOnSeam.size() ) {
- RETURN_BAD_RESULT("Different nb of old and seam nodes " <<
- u2nodesMaps[ OLD_NODES ].size() << " != " << u2nodesOnSeam.size());
+ if ( isSeam && !mergeSeamToNew ) {
+ //RETURN_BAD_RESULT
+ MESSAGE("Different nb of old and seam nodes " <<
+ u2nodesMaps[ OLD_NODES ].size() << " != " << u2nodesOnSeam.size());
}
// Make groups of nodes to merge
u_oldNode = u2nodesMaps[ OLD_NODES ].begin();
u_newNode = u2nodesMaps[ NEW_NODES ].begin();
newEnd = u2nodesMaps[ NEW_NODES ].end();
u_newOnSeam = u2nodesOnSeam.begin();
- for ( ; u_newNode != newEnd; ++u_newNode, ++u_oldNode ) {
- groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
- groupsOfNodes.back().push_back( u_oldNode->second );
- groupsOfNodes.back().push_back( u_newNode->second );
- if ( isSeam )
- groupsOfNodes.back().push_back( (u_newOnSeam++)->second );
- }
+ if ( mergeNewToOld )
+ for ( ; u_newNode != newEnd; ++u_newNode, ++u_oldNode )
+ {
+ groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
+ groupsOfNodes.back().push_back( u_oldNode->second );
+ groupsOfNodes.back().push_back( u_newNode->second );
+ if ( mergeSeamToNew )
+ groupsOfNodes.back().push_back( (u_newOnSeam++)->second );
+ }
+ else if ( mergeSeamToNew )
+ for ( ; u_newNode != newEnd; ++u_newNode, ++u_newOnSeam )
+ {
+ groupsOfNodes.push_back( list< const SMDS_MeshNode* >() );
+ groupsOfNodes.back().push_back( u_newNode->second );
+ groupsOfNodes.back().push_back( u_newOnSeam->second );
+ }
}
// Merge
// Check elements orientation
// ---------------------------
- TopoDS_Face face = tgtFace;
+ TopoDS_Face face = TopoDS::Face( theShape );
if ( !theMesh.IsMainShape( tgtFace ))
{
// find the main shape
TopoDS_Shape srcShape = _sourceHypo->GetSourceFace().Oriented(TopAbs_FORWARD);
TAssocTool::TShapeShapeMap shape2ShapeMap;
- TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap, tgtFace );
+ TAssocTool::InitVertexAssociation( _sourceHypo, shape2ShapeMap );
if ( !TAssocTool::FindSubShapeAssociation( tgtFace, tgtMesh, srcShape, srcMesh,
shape2ShapeMap) ||
!shape2ShapeMap.IsBound( tgtFace ))