diff --git a/src/Mod/TechDraw/App/DrawGeomHatch.cpp b/src/Mod/TechDraw/App/DrawGeomHatch.cpp index 6d50658a66..cd73af2e33 100644 --- a/src/Mod/TechDraw/App/DrawGeomHatch.cpp +++ b/src/Mod/TechDraw/App/DrawGeomHatch.cpp @@ -238,11 +238,24 @@ std::vector DrawGeomHatch::getTrimmedLinesSection(DrawViewSection* sou double scale ) { std::vector result; - TopoDS_Face tFace = f; - tFace = TopoDS::Face(GeometryObject::invertGeometry(tFace)); + gp_Pln p; + Base::Vector3d vfc = DrawUtil::getFaceCenter(f); + gp_Pnt fc(vfc.x, vfc.y, vfc.z); + double dir = -1.0; + if (fc.Z() < 0.0) { + dir = -dir; + } + Base::Vector3d stdZ(0.0, 0.0, 1.0); + Base::Vector3d offset = stdZ * p.Distance(fc) * dir; + + //f may be above or below paper plane and must be moved so Common operation in + //getTrimmedLines succeeds + TopoDS_Shape moved = TechDraw::moveShape(f, + offset); + TopoDS_Face fMoved = TopoDS::Face(GeometryObject::invertGeometry(moved)); result = getTrimmedLines(source, lineSets, - tFace, + fMoved, scale ); return result; } diff --git a/src/Mod/TechDraw/App/DrawUtil.cpp b/src/Mod/TechDraw/App/DrawUtil.cpp index a7fee72614..7ad35d5ff2 100644 --- a/src/Mod/TechDraw/App/DrawUtil.cpp +++ b/src/Mod/TechDraw/App/DrawUtil.cpp @@ -774,6 +774,22 @@ bool DrawUtil::isCrazy(TopoDS_Edge e) return result; } +//get 3d position of a face's center +Base::Vector3d DrawUtil::getFaceCenter(TopoDS_Face f) +{ + BRepAdaptor_Surface adapt(f); + double u1 = adapt.FirstUParameter(); + double u2 = adapt.LastUParameter(); + double mu = (u1 + u2) / 2.0; + double v1 = adapt.FirstVParameter(); + double v2 = adapt.LastVParameter(); + double mv = (v1 + v2) / 2.0; + BRepLProp_SLProps prop(adapt,mu,mv,0,Precision::Confusion()); + const gp_Pnt gv = prop.Value(); + Base::Vector3d v(gv.X(), gv.Y(), gv.Z()); + return v; +} + // Supplementary mathematical functions // ==================================== diff --git a/src/Mod/TechDraw/App/DrawUtil.h b/src/Mod/TechDraw/App/DrawUtil.h index f87f5db58e..d8633ae4ac 100644 --- a/src/Mod/TechDraw/App/DrawUtil.h +++ b/src/Mod/TechDraw/App/DrawUtil.h @@ -120,6 +120,7 @@ class TechDrawExport DrawUtil { static App::Color pyTupleToColor(PyObject* pColor); static PyObject* colorToPyTuple(App::Color color); static bool isCrazy(TopoDS_Edge e); + static Base::Vector3d getFaceCenter(TopoDS_Face f); // Supplementary mathematical functions static int sgn(double x);