void OCC_Connect::MergeEdges(TopoDS_Shape &shape1, TopoDS_Shape &shape2) const { TopTools_IndexedMapOfShape imap, omap; TopExp::MapShapes(shape1,TopAbs_EDGE,imap); TopExp::MapShapes(shape2,TopAbs_EDGE,imap); BRepTools_ReShape replacer; for(int i=0;i<imap.Extent();i++) { for(int j=0;j<omap.Extent();j++) { TopoDS_Edge orig=TopoDS::Edge(imap(i+1)); TopoDS_Edge repl=TopoDS::Edge(omap(j+1)); TopoDS_Vertex o1, o2, r1, r2; TopExp::Vertices(orig,o1,o2,true); TopExp::Vertices(repl,r1,r2,true); if(o1.IsSame(o2)) { if(!BRep_Tool::Degenerated(orig)) { if(verbose&Cutting) { cout << "Same vertex in edge\n"; BRepTools::Dump(orig,cout); } replacer.Remove(orig); goto skip; } else if(o1.IsSame(r1) && o1.IsSame(r2) && CanMergeCurve(orig,repl) ) { if(verbose&Cutting) { cout << "Degenerated edge, replace " << i+1 << " with " << j+1 << '\n'; BRepTools::Dump(orig,cout); BRepTools::Dump(repl,cout); } // FIXME, update tolerance BRepTools::Dump(repl.Complemented(),cout); replacer.Replace(orig,repl.Complemented()); goto skip; } cout << i+1 << " Degenerated\n"; } if(o1.IsSame(r1) && o2.IsSame(r2) && CanMergeCurve(orig,repl)) { if(verbose&Cutting) { cout << "Same order of vertices, replace " << i+1 << " with " << j+1 << '\n'; BRepTools::Dump(orig,cout); BRepTools::Dump(repl,cout); } // FIXME, update tolerance replacer.Replace(orig,repl); goto skip; } if(o1.IsSame(r2) && o2.IsSame(r1) && CanMergeCurve(orig,repl)) { if(verbose&Cutting) { cout << "Reversed order of vertices, replace " << i+1 << " with " << j+1 << '\n'; BRepTools::Dump(orig,cout); BRepTools::Dump(repl,cout); } // FIXME, update tolerance replacer.Replace(orig,repl.Complemented()); goto skip; } } if(verbose&Cutting) cout << "Adding " << i+1 << " as " << omap.Extent()+1<<" to keep map\n"; omap.Add(imap(i+1)); skip:; } TopoDS_Shape t=shape1; shape1=replacer.Apply(t); t=shape2; shape2=replacer.Apply(t); }