private static void AlternatingCuttingCurve(ProcessObject processObject, Curve curve, double d) { var par = processObject.ProcessingParams; // s - текущее смещение от кривой контура детали curve // d - заданная величина смещения var s = par.Depth > 0 ? (par.DepthAll > d ? par.DepthAll : d) : d; s -= par.Depth; if (s < d) { s = d; } var direction = processObject.Direction; var isFirstPass = true; do { if (!IsCalculation) { return; } if (!isFirstPass) { s -= par.Depth; if (s < d) { s = d; } direction = -direction; } var s1 = Settings.WithCompensation ? s : s + processObject.Tool.Diameter.Value / 2; Curve toolpathCurve = AutocadUtils.GetOffsetCopy(curve, processObject.Curve.OutsideSign * s1); ObjectId toolObjectId = AutocadUtils.CreateToolCurve(s, toolpathCurve.StartPoint.Z, processObject.Tool.Thickness); Feed(toolpathCurve, direction, processObject.Curve.OutsideSign, par, isFirstPass); List <ProcessingAction> actions = new List <ProcessingAction>(); if (processObject.Curve.Type == CurveType.Polyline || processObject.Curve.Type == CurveType.Circle) { actions = Machine.Cutting(AutocadUtils.Explode(toolpathCurve, direction == -1), par.GreatSpeed); } else { actions.Add(Machine.Cutting(toolpathCurve, par.GreatSpeed)); } actions.ForEach(p => p.ToolObjectId = toolObjectId); Retract(toolpathCurve, direction, processObject.Curve.OutsideSign, par); isFirstPass = false; }while (s > d); }