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(); } }
public override void BuildProcessing(MillingCommandGenerator generator) { var disk3DTechProcess = (Disk3DTechProcess)TechProcess; var offsetSurface = CreateOffsetSurface(); //generator.ZSafety = offsetSurface.GeometricExtents.MinPoint.Z + TechProcess.Thickness.Value + TechProcess.ZSafety; //generator.ToolPosition.Point += Vector3d.ZAxis * generator.ZSafety; //generator.ToolLocation.Set(new Point3d(double.NaN, double.NaN, generator.ZSafety), 0, TechProcess.IsA90 ? 90 : 0); generator.SetZSafety(TechProcess.ZSafety, offsetSurface.GeometricExtents.MinPoint.Z + TechProcess.Thickness.Value); Matrix3d?matrix = null; if (TechProcess.IsA90) { matrix = Matrix3d.Rotation(-Math.PI / 2, Vector3d.XAxis, Point3d.Origin); } if (TechProcess.Angle != 0) { var m = Matrix3d.Rotation(disk3DTechProcess.Angle.ToRad(), Vector3d.ZAxis, Point3d.Origin); matrix = matrix.HasValue ? matrix.Value * m : m; } if (matrix.HasValue) { offsetSurface.TransformBy(matrix.Value); } var bounds = offsetSurface.GeometricExtents; //generator.ZSafety = bounds.MinPoint.Z + TechProcess.Thickness.Value + TechProcess.ZSafety; //generator.ToolLocation.Point += Vector3d.ZAxis * generator.ZSafety; //var ray = new Ray { UnitDir = Vector3d.XAxis }; //var y = StartPass; //do //{ // ray.BasePoint = new Point3d(0, y, 0); // var curves = s.ProjectOnToSurface(point, Vector3d.ZAxis); // curves[0].ColorIndex = 2; // curves[0].AddToCurrentSpace(); // y += StepPass; //} //while (y < boundsModel.MaxPoint.Y); //var startTime = System.Diagnostics.Stopwatch.StartNew(); //var point = new DBPoint(); //int cnt = 0; //for (var y = boundsModel.MinPoint.Y + StartPass; y < boundsModel.MaxPoint.Y; y += StepPass) //{ // for (var x = boundsModel.MinPoint.X; x < boundsModel.MaxPoint.X; x += StepLong) // { // for (var s = 0; s <= 2; s += 4) // { // point.Position = new Point3d(x, y + s, 0); // //line.StartPoint = new Point3d(x, y, 0); // //line.EndPoint = new Point3d(x, y + 8, 0); // try // { // var curves = offsetSurfaces.ProjectOnToSurface(point, Vector3d.ZAxis); // cnt++; // if (curves.Length == 0) // Acad.Write("111"); // curves[0].ColorIndex = 6; // curves[0].AddToCurrentSpace(); // } // catch // { // } // } // } //} //startTime.Stop(); //var resultTime = startTime.Elapsed; //Acad.Write("timer=" + resultTime); //Acad.Write("cnt=" + cnt); //var startTime = System.Diagnostics.Stopwatch.StartNew(); //var line = new Line(); //int cnt = 0; //int err = 0; //for (var y = boundsModel.MinPoint.Y + StartPass; y < boundsModel.MaxPoint.Y; y += StepPass) //{ // for (var x = boundsModel.MinPoint.X; x < boundsModel.MaxPoint.X; x += StepLong) // { // for (var s = 0; s <= 2; s += 4) // { // line.StartPoint = new Point3d(x, y, 0); // line.EndPoint = new Point3d(x, y + 8, 0); // try // { // var curves = offsetSurfaces.ProjectOnToSurface(line, Vector3d.ZAxis); // cnt++; // if (curves.Length == 0) // Acad.Write("111"); // curves[0].ColorIndex = 6; // curves[0].AddToCurrentSpace(); // } // catch (Exception ex) // { // err++; // } // } // } //} //startTime.Stop(); //var resultTime = startTime.Elapsed; //Acad.Write("timer=" + resultTime); //Acad.Write("cnt=" + cnt); //var contour = NoDraw.Rectang(new Point3d(bounds.MinPoint.X, bounds.MinPoint.Y, 0), new Point3d(bounds.MaxPoint.X, bounds.MaxPoint.Y, 0)); //var ray = new Ray //{ // BasePoint = contour.StartPoint, // UnitDir = Vector3d.XAxis.RotateBy(((Disk3DTechProcess)TechProcess).Angle.ToRad(), Vector3d.ZAxis) //}; //ray.BasePoint += ray.UnitDir.GetPerpendicularVector() * StartPass; //var crossVector = ray.UnitDir.GetPerpendicularVector() * StepPass; //var plane = new Plane(); //while (true) //{ // var pc = new Point3dCollection(); // ray.IntersectWith(contour, Intersect.ExtendThis, plane, pc, IntPtr.Zero, IntPtr.Zero); // if (pc.Count != 2) // break; // var vector = (points[1] - points[0]).GetNormal() * tactileTechProcess.TactileTechProcessParams.Departure; // var startPoint = points[0] + passDir * s - vector - Vector3d.ZAxis * Depth; // var endPoint = points[1] + passDir * s + vector - Vector3d.ZAxis * Depth; // if (generator.IsUpperTool) // generator.Move(startPoint.X, startPoint.Y, angleC: BuilderUtils.CalcToolAngle(ProcessingAngle.ToRad())); // generator.Cutting(startPoint, endPoint, feed, tactileTechProcess.TactileTechProcessParams.TransitionFeed); // ray.BasePoint += crossVector; //} var startY = StartPass == 0 ? bounds.MinPoint.Y : StartPass; var endY = (EndPass == 0 ? bounds.MaxPoint.Y : EndPass) - (disk3DTechProcess.IsExactlyEnd ? TechProcess.Tool.Thickness : 0); //double startY, endY; //if (!TechProcess.IsA90) //{ // startY = bounds.MinPoint.Y + StartPass; // var endY = EndPass != 0 ? bounds.MinPoint.Y + EndPass : bounds.MaxPoint.Y; //} //if (startY < endY) //{ // if (disk3DTechProcess.IsExactlyEnd) // endY -= TechProcess.Tool.Thickness.Value; //} //else //{ // startY -= TechProcess.Tool.Thickness.Value; // if (!disk3DTechProcess.IsExactlyEnd) // endY -= TechProcess.Tool.Thickness.Value; // StepPass *= -1; //} //var count = bounds.MaxPoint.Y - (disk3DTechProcess.IsExactlyEnd ? TechProcess.Tool.Thickness : 0); //Acad.SetLimitProgressor((int)((endY - startY) / StepPass)); //var PassList = new List<List<Point3d>>(); //for (var y = startY; StepPass > 0 ? y < endY : y > endY; y += StepPass) // расчет точек начала и конца поверхности //var boundCurves = new List<Curve>(); //var entitySet = new DBObjectCollection(); //offsetSurface.Explode(entitySet); //for (int i = 0; i < entitySet.Count; i++) //{ // if (entitySet[i] is DbSurface) // { // var subEntitySet = new DBObjectCollection(); // ((Entity)entitySet[i]).Explode(subEntitySet); // boundCurves.AddRange(subEntitySet.Cast<Curve>()); // } // else // { // boundCurves.Add(entitySet[i] as Curve); // } //} //var boundCurves2d = new List<Curve>(); //var plene = new Plane(Point3d.Origin, Vector3d.ZAxis); //foreach (var curve in boundCurves) //{ // if (curve != null) // { // boundCurves2d.Add(curve.ToCurve2dArray GetOrthoProjectedCurve(plene)); // } //} Acad.SetLimitProgressor((int)((endY - startY) / StepPass)); var PassList = new List <List <Point3d> >(); for (var y = startY; y < endY; y += StepPass) { Acad.ReportProgressor(); var points = new Point3dCollection(); //var pass = new Line2d(new Point2d(bounds.MinPoint.X, y), new Point2d(bounds.MinPoint.X, y)); //foreach (var cv in boundCurves2d) //{ // pass.IntersectWith(cv.to); //} for (var x = bounds.MinPoint.X; x <= bounds.MaxPoint.X; x += StepLong) { double z = 0; for (double s = 0; s <= TechProcess.Tool.Thickness; s += TechProcess.Tool.Thickness.Value) { if (y + s > bounds.MaxPoint.Y) { break; } offsetSurface.RayTest(new Point3d(x, y + s, bounds.MinPoint.Z), Vector3d.ZAxis, 0.0001, out SubentityId[] col, out DoubleCollection par); //if (par.Count == 0) //{ // z = 0; // break; //} if (par.Count > 0) { z = par[par.Count - 1] > z ? par[par.Count - 1] : z; } } if (z > 0) { var point = new Point3d(x, y, bounds.MinPoint.Z + z); var ind = points.Count - 1; if (ind > 0 && points[ind - 1].GetVectorTo(points[ind]).IsCodirectionalTo(points[ind].GetVectorTo(point))) { points[ind] = point; } else { points.Add(point); } //Draw.Point(point); } } if (points.Count > 1) { PassList.Add(CalcOffsetPoints(points, bounds)); } } offsetSurface.Dispose(); if (matrix.HasValue) { matrix = matrix.Value.Inverse(); } if (TechProcess.IsA90 && PassList.First()[0].TransformBy(matrix.Value).Z < PassList.Last()[0].TransformBy(matrix.Value).Z) { PassList.Reverse(); } if (IsReverse) { PassList.Reverse(); } if (TechProcess.IsA90) { generator.Matrix = matrix; } Point3d?lastPoint = null; PassList.ForEach(p => { var points = p; if (TechProcess.MachineType == MachineType.ScemaLogic) //Settongs.IsFrontPlaneZero { points = points.ConvertAll(x => new Point3d(x.X, x.Y + TechProcess.Tool.Thickness.Value, x.Z)); } if (matrix.HasValue && !TechProcess.IsA90) { points = points.ConvertAll(x => x.TransformBy(matrix.Value)); } var loc = generator.ToolPosition; if (lastPoint.HasValue && lastPoint.Value.DistanceTo(points.First()) > lastPoint.Value.DistanceTo(points.Last())) { points.Reverse(); } if (TechProcess.IsA90) { lastPoint = BuildPassA90(generator, points, matrix.Value, bounds.MinPoint.Z + PenetrationAll); } else { lastPoint = BuildPass(generator, points); } }); if (TechProcess.IsA90) { generator.Move(lastPoint.Value.Add(Vector3d.ZAxis * 100)); } if (generator is DonatoniCommandGenerator donatoniCommandGenerator) { donatoniCommandGenerator.IsSupressMoveHome = true; } //progressor.Stop(); }