Example #1
0
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);
}