- if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( exp.Current() )).second )
- edges.push_back( TopoDS::Edge( exp.Current() ));
+ {
+ const TopoDS_Edge & edge = TopoDS::Edge( exp.Current() );
+ if ( !SMESH_Algo::isDegenerated( edge ))
+ if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( edge )).second )
+ {
+ edges.push_back( edge );
+ if ( SMESHDS_SubMesh* eSM = tgtMesh->MeshElements( edge ))
+ {
+ typedef SMDS_StdIterator< const SMDS_MeshNode*, SMDS_NodeIteratorPtr > iterator;
+ existingNodes.insert( iterator( eSM->GetNodes() ), iterator() );
+ }
+ }
+ }
+ // octree to find existing nodes
+ SMESH_OctreeNode existingNodeOcTr( existingNodes );
+ std::map<double, const SMDS_MeshNode*> dist2foundNodes;