- const TopoDS_Shape & srcE = srcMeshDS->IndexToShape( srcNode->getshapeId() );
- const TopoDS_Shape & tgtE = shape2ShapeMap( srcE, /*isSrc=*/true );
- double srcU = srcHelper.GetNodeU( TopoDS::Edge( srcE ), srcNode );
- tgtMeshDS->SetNodeOnEdge( n, TopoDS::Edge( tgtE ), srcU );
+ const TopoDS_Edge& srcE = TopoDS::Edge( srcMeshDS->IndexToShape( srcNode->getshapeId()));
+ const TopoDS_Edge& tgtE = TopoDS::Edge( shape2ShapeMap( srcE, /*isSrc=*/true ));
+ double srcU = srcHelper.GetNodeU( srcE, srcNode );
+ tgtMeshDS->SetNodeOnEdge( n, tgtE, srcU );
+ if ( !tgtFace.IsPartner( srcFace ))
+ {
+ bool isOk = true;
+ edgeHelper.SetSubShape( tgtE );
+ edgeHelper.GetNodeU( tgtE, n, 0, &isOk );
+ if ( !isOk ) // projection of n to tgtE failed (23395)
+ {
+ double sF, sL, tF, tL;
+ BRep_Tool::Range( srcE, sF, sL );
+ BRep_Tool::Range( tgtE, tF, tL );
+ double srcR = ( srcU - sF ) / ( sL - sF );
+ double tgtU = tF + srcR * ( tL - tF );
+ tgtMeshDS->SetNodeOnEdge( n, tgtE, tgtU );
+ gp_Pnt newP = BRepAdaptor_Curve( tgtE ).Value( tgtU );
+ double dist = newP.Distance( tgtP );
+ double tol = BRep_Tool::Tolerance( tgtE );
+ if ( tol < dist && dist < 1000*tol )
+ tgtMeshDS->MoveNode( n, newP.X(), newP.Y(), newP.Z() );
+ }
+ }