diff --git a/src/Mod/Path/App/Area.cpp b/src/Mod/Path/App/Area.cpp index 73b8200327..cb96f3cf71 100644 --- a/src/Mod/Path/App/Area.cpp +++ b/src/Mod/Path/App/Area.cpp @@ -668,11 +668,13 @@ std::shared_ptr Area::getClearedAreaFromPath(const Toolpath *path, double // 1 in Thicken() cleared area // 2 in getRestArea target area offset in and back out // Oversize cleared areas by buffer to smooth out imprecision in arc/segment conversion. getRestArea() will compensate for this - const double buffer = myParams.Accuracy * 6.3; + AreaParams params = myParams; + params.Accuracy = myParams.Accuracy * .7/4; // 2.3 already encoded in gcode; 4 * .7/4 = 3 total + const double buffer = myParams.Accuracy * 3; // Do not fit arcs after these offsets; it introduces unnecessary approximation error, and all off // those arcs will be converted back to segments again for clipper differencing in getRestArea anyway - CAreaConfig conf(myParams, /*no_fit_arcs*/ true); + CAreaConfig conf(params, /*no_fit_arcs*/ true); Base::Vector3d pos = Base::Vector3d(0, 0, zmax + 1); printf("getClearedAreaFromPath(path, diameter=%g, zmax=%g:\n", diameter, zmax); @@ -695,7 +697,7 @@ std::shared_ptr Area::getClearedAreaFromPath(const Toolpath *path, double printf("\n"); - std::shared_ptr clearedArea = make_shared(&myParams); + std::shared_ptr clearedArea = make_shared(¶ms); //clearedArea->myTrsf = myTrsf; clearedArea->myTrsf = {}; if (visitor.count > 0) { @@ -722,11 +724,13 @@ std::shared_ptr Area::getRestArea(std::vector> clear // 1 in Thicken() cleared area // 2 in getRestArea target area offset in and back out // Cleared area representations are oversized by buffer to smooth out imprecision in arc/segment conversion. getRestArea() will compensate for this - const double buffer = myParams.Accuracy * 6.3; - const double roundPrecision = buffer; + AreaParams params = myParams; + params.Accuracy = myParams.Accuracy * .7/4; // 2.3 already encoded in gcode; 4 * .7/4 = 3 total + const double buffer = myParams.Accuracy * 3; + const double roundPrecision = params.Accuracy; // transform all clearedAreas into our workplane - Area clearedAreasInPlane(&myParams); + Area clearedAreasInPlane(¶ms); clearedAreasInPlane.myArea.reset(new CArea()); printf("getRestArea\n"); printf("\n"); @@ -742,8 +746,8 @@ std::shared_ptr Area::getRestArea(std::vector> clear // clearable = offset(offset(A, -dTool/2), dTool/2) printf("Compute clearable\n"); CArea clearable(*myArea); - clearable.OffsetWithClipper(-diameter/2, JoinType, EndType, myParams.MiterLimit, roundPrecision); - clearable.OffsetWithClipper(diameter/2, JoinType, EndType, myParams.MiterLimit, roundPrecision); + clearable.OffsetWithClipper(-diameter/2, JoinType, EndType, params.MiterLimit, roundPrecision); + clearable.OffsetWithClipper(diameter/2, JoinType, EndType, params.MiterLimit, roundPrecision); // remaining = clearable - prevCleared printf("Compute remaining\n"); @@ -754,7 +758,7 @@ std::shared_ptr Area::getRestArea(std::vector> clear // add buffer to dTool to compensate for oversizing in getClearedAreaFromPath printf("Compute rest\n"); CArea restCArea(remaining); - restCArea.OffsetWithClipper(diameter + buffer, JoinType, EndType, myParams.MiterLimit, roundPrecision); + restCArea.OffsetWithClipper(diameter + buffer, JoinType, EndType, params.MiterLimit, roundPrecision); restCArea.Clip(toClipperOp(Area::OperationIntersection), &clearable, SubjectFill, ClipFill); printf("Convert CArea to Area (num curves: %d)\n", (int)restCArea.m_curves.size()); @@ -762,7 +766,7 @@ std::shared_ptr Area::getRestArea(std::vector> clear return {}; } - std::shared_ptr restArea = make_shared(&myParams); + std::shared_ptr restArea = make_shared(¶ms); gp_Trsf trsf(myTrsf.Inverted()); TopoDS_Shape restShape = Area::toShape(restCArea, false, &trsf); restArea->add(restShape, OperationCompound);