diff --git a/src/Mod/Path/App/Area.cpp b/src/Mod/Path/App/Area.cpp index 171b2670e2..decc85ab5b 100644 --- a/src/Mod/Path/App/Area.cpp +++ b/src/Mod/Path/App/Area.cpp @@ -1899,6 +1899,16 @@ void Area::makeOffset(list > &areas, PARAM_ENUM_CONVERT(AREA_MY,PARAM_FNAME,PARAM_ENUM_EXCEPT,AREA_PARAMS_CLIPPER_FILL); #endif + if(offset<0) { + stepover = -fabs(stepover); + if(count<0) { + if(!last_stepover) + last_stepover = offset*0.5; + else + last_stepover = -fabs(last_stepover); + }else + last_stepover = 0; + } for(int i=0;count<0||i()); @@ -1940,8 +1950,19 @@ void Area::makeOffset(list > &areas, #endif if(count>1) FC_TIME_LOG(t1,"makeOffset " << i << '/' << count); - if(area.m_curves.empty()) + if(area.m_curves.empty()) { + if(from_center) + areas.pop_front(); + else + areas.pop_back(); + if(last_stepover && last_stepover>stepover) { + offset -= stepover; + stepover = last_stepover; + --i; + continue; + } return; + } } FC_TIME_LOG(t,"makeOffset count: " << count); } @@ -2004,6 +2025,7 @@ TopoDS_Shape Area::makePocket(int index, PARAM_ARGS(PARAM_FARG,AREA_PARAMS_POCKE Offset = -tool_radius-extra_offset-shift; ExtraPass = -1; Stepover = -stepover; + LastStepover = -last_stepover; // make offset and make sure the loop is CW (i.e. inner wires) return makeOffset(index,PARAM_FIELDS(PARAM_FNAME,AREA_PARAMS_OFFSET),-1,from_center); }case Area::PocketModeZigZagOffset: diff --git a/src/Mod/Path/App/AreaParams.h b/src/Mod/Path/App/AreaParams.h index 8010c5a524..eaa4763716 100644 --- a/src/Mod/Path/App/AreaParams.h +++ b/src/Mod/Path/App/AreaParams.h @@ -105,6 +105,9 @@ ((double,extra_offset,PocketExtraOffset,0.0,"Extra offset for pocketing",App::PropertyDistance))\ ((double,stepover,PocketStepover,0.0,\ "Cutter diameter to step over on each pass. If =0, use ToolRadius.",App::PropertyLength))\ + ((double,last_stepover,PocketLastStepover,0.0,\ + "Cutter diameter to step over for the last loop when using offset pocket.\n"\ + "If =0, use 0.5*ToolRadius.", App::PropertyLength))\ ((bool,from_center,FromCenter,false,"Start pocketing from center"))\ ((double,angle,Angle,45,"Pattern angle in degree",App::PropertyAngle))\ ((double,angle_shift,AngleShift,0.0,"Pattern angle shift for each section", App::PropertyAngle))\ @@ -129,7 +132,10 @@ "Offset value, positive for expansion, negative for shrinking",App::PropertyDistance))\ ((long,extra_pass,ExtraPass,0,"Number of extra offset pass to generate."))\ ((double,stepover,Stepover,0.0,\ - "Cutter diameter to step over on each pass. If =0, use Offset",App::PropertyLength)) + "Cutter diameter to step over on each pass. If =0, use Offset",App::PropertyLength))\ + ((double,last_stepover,LastStepover,0.0,\ + "Cutter diameter to step over for the last loop when shrinking with ExtraPass<0, i.e. for\n"\ + "offset pocketing. If =0, use 0.5*Offset.", App::PropertyLength)) #define AREA_PARAMS_SECTION_EXTRA \ ((enum,mode,SectionMode,2,"Section offset coordinate mode.\n"\