From 0921ed29698355f557612ff4372b8cf2e0cc1d37 Mon Sep 17 00:00:00 2001 From: Andrew Shkolik Date: Tue, 25 Feb 2025 01:27:58 -0600 Subject: [PATCH] fix #19831 Sketcher: Create external Intersection geometry not working with complex surfaces Co-authored-by: Zheng Lei --- src/Mod/Sketcher/App/SketchObject.cpp | 43 ++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index e881eee5e4..0c421f785e 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -8960,16 +8960,39 @@ void processEdge(const TopoDS_Edge& edge, } else { try { - BRepOffsetAPI_NormalProjection mkProj(aProjFace); - mkProj.Add(edge); - mkProj.Build(); - const TopoDS_Shape& projShape = mkProj.Projection(); - if (!projShape.IsNull()) { - TopExp_Explorer xp; - for (xp.Init(projShape, TopAbs_EDGE); xp.More(); xp.Next()) { - TopoDS_Edge projEdge = TopoDS::Edge(xp.Current()); - TopLoc_Location loc(mov); - projEdge.Location(loc); + Part::TopoShape projShape; + // Projection of the edge on parallel plane to the sketch plane is edge itself + // all we need to do is match coordinate systems + // for some reason OCC doesn't like to project a planar B-Spline to a plane parallel to it + if (planar && plane.Axis().Direction().IsParallel(sketchPlane.Axis().Direction(), Precision::Confusion())) { + // We can't use gp_Pln::Distance() because we need to + // know which side the plane is regarding the sketch + const gp_Pnt& aP = sketchPlane.Location(); + const gp_Pnt& aLoc = plane.Location (); + const gp_Dir& aDir = plane.Axis().Direction(); + double d = (aDir.X() * (aP.X() - aLoc.X()) + + aDir.Y() * (aP.Y() - aLoc.Y()) + + aDir.Z() * (aP.Z() - aLoc.Z())); + + gp_Trsf trsf; + trsf.SetTranslation(gp_Vec(aDir) * d); + projShape.setShape(edge); + projShape.transformShape(Part::TopoShape::convert(trsf), /*copy*/false); + + } else { + // When planes not parallel or perpendicular, or edge is not planar + // normal projection is working just fine + BRepOffsetAPI_NormalProjection mkProj(aProjFace); + mkProj.Add(edge); + mkProj.Build(); + + projShape.setShape(mkProj.Projection()); + } + if (!projShape.isNull() && projShape.hasSubShape(TopAbs_EDGE)) { + for (auto &e : projShape.getSubTopoShapes(TopAbs_EDGE)) { + // Transform copy of the edge to the sketch plane local coordinates + e.transformShape(invPlm.toMatrix(), /*copy*/true, /*checkScale*/true); + TopoDS_Edge projEdge = TopoDS::Edge(e.getShape()); processEdge2(projEdge, geos); } }