private double?[,] GetZArray(Point2dCollection[] collections, double sizeX) { var distance = TechProcess.Tool.Diameter / 2; var countX = (int)(sizeX / StepX2) + 1; var zArray = new double?[collections.Length, countX]; var intersector = new CurveCurveIntersector2d(); Acad.SetLimitProgressor(collections.Length); var rays = Enumerable.Range(0, countX).Select(p => new Ray2d(new Point2d(p * StepX2, 0), Vector2d.YAxis)).ToList(); for (int i = 0; i < collections.Length; i++) { Acad.ReportProgressor(); if (collections[i] == null) { continue; } var polylene = new PolylineCurve2d(collections[i]); var offsetCurve = polylene.GetTrimmedOffset(distance, OffsetCurveExtensionType.Fillet)[0]; for (int j = 0; j < countX; j++) { intersector.Set(offsetCurve, rays[j]); if (intersector.NumberOfIntersectionPoints == 1) { zArray[i, j] = intersector.GetIntersectionPoint(0).Y - distance; } } //if (i < 50) //{ // Draw.Pline(polylene.GetSamplePoints(10).Select(p => new Point3d(p.X + i * 100, p.Y + 1000, 0))); // Draw.Pline(offsetCurve.GetSamplePoints(10).Select(p => new Point3d(p.X + i * 100, p.Y + 1000, 0))); //} //else //{ polylene.Dispose(); offsetCurve.Dispose(); //} } rays.ForEach(p => p.Dispose()); intersector.Dispose(); return(zArray); }
public static List <Point2d> GetProcessPoints1(Curve profile, int index, double step, double shift, bool isMinToolCoord, double?begin, double?end, bool isProfileStep = false) //, bool isExactlyBegin, bool isExactlyEnd) { var result = new List <Point2d>(); var start = 10000D; var rayVector = index == 0 ? -Vector2d.YAxis : -Vector2d.XAxis; var p0 = begin ?? Math.Max(profile.StartPoint[index], profile.EndPoint[index]); var p1 = end ?? Math.Min(profile.StartPoint[index], profile.EndPoint[index]); var dir = Math.Sign(p1 - p0); using (var curve = profile.ToCompositeCurve2d()) using (var ray = new Ray2d()) using (var intersector = new CurveCurveIntersector2d()) { var pos = p0; Point2d?point0 = null; var length = profile.Length(); int curveSign = dir * Math.Sign(curve.EndPoint[index] - curve.StartPoint[index]); double? dist = null; while (dir > 0 ? pos <p1 : pos> p1) { double?max = null; for (int i = 0; i <= 10; i++) { var rayPoint = GetPoint(pos + i * (shift / 10) * dir, start, index); ray.Set(rayPoint, rayVector); intersector.Set(curve, ray); if (intersector.NumberOfIntersectionPoints > 0) { var intersect = intersector.GetIntersectionPoint(0); max = Math.Max(max ?? double.MinValue, intersect[1 - index]); if (!point0.HasValue && i == 0) { point0 = intersect; } } } if (max.HasValue) { var toolCoord = pos + shift * dir * (isMinToolCoord ^ dir < 0 ? 0 : 1); result.Add(GetPoint(toolCoord, max.Value, index)); } if (isProfileStep && point0.HasValue) { if (!dist.HasValue) { dist = curve.GetLength(0, curve.GetParameterOf(point0.Value)); } dist += step * curveSign; if (dist < 0 || dist > length) { break; } var point = curve.EvaluatePoint(curve.GetParameterAtLength(0, dist.Value, true)); pos = point[index]; } else { pos += step * dir; } } } return(result); }
protected override void BuildProcessing(MillingCommandGenerator generator) { var toolThickness = Tool.Thickness.Value; var profile = ProcessingArea[0].GetCurve(); if (Delta != 0) { profile = (Curve)profile.GetOffsetCurves(Delta)[0]; } var zMax = profile.GetStartEndPoints().Max(p => p.Y); generator.SetZSafety(ZSafety, zMax); var xMax = 0D; using (var curve = profile.ToCompositeCurve2d()) using (var ray = new Ray2d()) using (var intersector = new CurveCurveIntersector2d()) { var angleC = 360; var gCode = 2; for (var z = StartZ; z > 0; z -= StepZ) { var xMin = RadiusMin; for (int i = 0; i < 3; i++) { ray.Set(new Point2d(0, z + i * toolThickness / 2), Vector2d.XAxis); intersector.Set(curve, ray); if (intersector.NumberOfIntersectionPoints == 1) { xMin = Math.Max(xMin, intersector.GetIntersectionPoint(0).X); } } if (xMin == 0) { throw new Exception("Нет точек пересечения с профилем"); } var x = Math.Max(xMin, RadiusMax - Penetration); var s = x - xMin; int passCount = (int)Math.Ceiling(s / Penetration); var dx = s > Consts.Epsilon ? s / passCount : 1; if (generator.IsUpperTool) { generator.Move(0, -x - ZSafety, angleC: 0, angleA: 90); } else { generator.Transition(y: -x - ZSafety, feed: CuttingFeed); } generator.Transition(z: z); do { var arc = new Arc(new Point3d(0, 0, z), x, Math.PI * 1.5, Math.PI * 1.5 - Consts.Epsilon); generator.Cutting(0, -x, z, PenetrationFeed); generator.GCommand(CommandNames.Cutting, gCode, angleC: angleC, curve: arc, center: arc.Center.To2d(), feed: CuttingFeed); angleC = 360 - angleC; gCode = 5 - gCode; x -= dx; }while (x >= xMin - Consts.Epsilon); xMax = Math.Max(xMin, RadiusMax); } generator.Transition(y: -xMax - ZSafety, feed: PenetrationFeed); generator.Uplifting(); } }