diff --git a/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.cpp b/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.cpp index 950d026f18..6e998fae5d 100644 --- a/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.cpp +++ b/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.cpp @@ -24,8 +24,14 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include +# include +# include # include +# include +# include +# include # include +# include # include # include # include @@ -217,3 +223,63 @@ Standard_Boolean BRepOffsetAPI_MakeOffsetFix::IsDeleted (const TopoDS_Shape& S) { return mkOffset.IsDeleted(S); } + +TopoDS_Shape BRepOffsetAPI_MakeOffsetFix::Replace(GeomAbs_CurveType type, const TopoDS_Shape& S) const +{ + if (S.IsNull()) + throw Standard_ConstructionError("Input shape is null"); + + // Nothing to do + if (type == GeomAbs_BSplineCurve) + return S; + + if (S.ShapeType() == TopAbs_COMPOUND) { + BRep_Builder builder; + TopoDS_Compound comp; + builder.MakeCompound(comp); + comp.Location(S.Location()); + + TopExp_Explorer xp(S, TopAbs_WIRE); + while (xp.More()) { + TopoDS_Wire wire = TopoDS::Wire(xp.Current()); + wire = ReplaceEdges(type, wire); + builder.Add(comp, wire); + xp.Next(); + } + + return comp; + } + else if (S.ShapeType() == TopAbs_WIRE) { + return ReplaceEdges(type, TopoDS::Wire(S)); + } + else { + throw Standard_ConstructionError("Wrong shape type"); + } +} + +TopoDS_Wire BRepOffsetAPI_MakeOffsetFix::ReplaceEdges(GeomAbs_CurveType type, const TopoDS_Wire& wire) const +{ + BRepBuilderAPI_MakeWire mkWire; + for (TopExp_Explorer xp(wire, TopAbs_EDGE); xp.More(); xp.Next()) { + TopoDS_Edge edge = TopoDS::Edge(xp.Current()); + TopLoc_Location edgeLocation = edge.Location(); + + BRepAdaptor_Curve curve(edge); + + if (curve.GetType() == type) { + ShapeConstruct_Curve scc; + double u = curve.FirstParameter(); + double v = curve.LastParameter(); + Handle(Geom_BSplineCurve) spline = scc.ConvertToBSpline(curve.Curve().Curve(), u, v, Precision::Confusion()); + if (!spline.IsNull()) { + BRepBuilderAPI_MakeEdge mkEdge(spline, u, v); + edge = mkEdge.Edge(); + edge.Location(edgeLocation); + } + } + + mkWire.Add(edge); + } + + return mkWire.Wire(); +} diff --git a/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.h b/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.h index 6f9709cfab..7b0d55f9eb 100644 --- a/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.h +++ b/src/Mod/Part/App/BRepOffsetAPI_MakeOffsetFix.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -85,7 +86,12 @@ public: //! Returns true if the shape S has been deleted. virtual Standard_Boolean IsDeleted (const TopoDS_Shape& S); + //! Replaces the given curve type with a B-Spline. Input shape + //! must be a wire or a compound of wires + TopoDS_Shape Replace(GeomAbs_CurveType, const TopoDS_Shape& S) const; + private: + TopoDS_Wire ReplaceEdges(GeomAbs_CurveType, const TopoDS_Wire& S) const; void MakeWire(TopoDS_Shape&); private: