예제 #1
0
        private void BuildPass(MillingCommandGenerator generator, List <Point3d> points)
        {
            var point0 = Algorithms.NullPoint3d;
            var point  = Algorithms.NullPoint3d;

            foreach (var p in points)
            {
                if (generator.IsUpperTool)
                {
                    generator.Move(p.X, p.Y, angleC: ((Disk3DTechProcess)TechProcess).Angle);
                }

                if (point.IsNull())
                {
                    if (generator.ToolPosition.Point != p)
                    {
                        generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                    }
                }
                else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                {
                    generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                    point0 = point;
                }
                if (point0.IsNull())
                {
                    point0 = p;
                }
                point = p;
            }
            generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
        }
예제 #2
0
        private Point3d BuildPass(MillingCommandGenerator generator, List <Point3d> points)
        {
            var  z = generator.ZSafety - TechProcess.ZSafety;
            bool isComplete;
            var  point = Algorithms.NullPoint3d;

            do
            {
                isComplete = true;
                z         -= Penetration;
                var point0 = Algorithms.NullPoint3d;

                foreach (var pt in points)
                {
                    var p = pt;
                    if (z > p.Z)
                    {
                        p          = new Point3d(p.X, p.Y, z);
                        isComplete = false;
                    }
                    if (generator.IsUpperTool)
                    {
                        generator.Move(p.X, p.Y, angleC: ((Disk3DTechProcess)TechProcess).Angle);
                        generator.Cycle();
                    }
                    if (point.IsNull())
                    {
                        if (generator.ToolPosition.Point != p)
                        {
                            generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                        }
                        else
                        {
                            generator.Move(p.X, p.Y);
                            generator.Cycle();
                        }
                    }
                    else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                    {
                        generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                        point0 = point;
                    }
                    if (point0.IsNull())
                    {
                        point0 = p;
                    }
                    point = p;
                }
                generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                points.Reverse();
            }while (!isComplete);

            if (IsUplifting)
            {
                generator.Uplifting();
            }

            return(point);
        }
예제 #3
0
        private Point3d BuildPassA90(MillingCommandGenerator generator, List <Point3d> points, Matrix3d matrix, double z0)
        {
            var  z = z0;
            bool isComplete;
            var  point = Algorithms.NullPoint3d;

            do
            {
                isComplete = true;
                z         -= Penetration;
                var point0 = Algorithms.NullPoint3d;
                point = Algorithms.NullPoint3d;
                //var isPassStarted = false;

                foreach (var pt in points)
                {
                    var p = pt;
                    if (z > p.Z)
                    {
                        p          = new Point3d(p.X, p.Y, z);
                        isComplete = false;
                    }
                    if (generator.IsUpperTool)
                    {
                        generator.Move(p, angleC: TechProcess.Angle, angleA: 90);
                        generator.Cycle();
                    }
                    if (point.IsNull())
                    {
                        if (generator.ToolPosition.Point != p.TransformBy(matrix))
                        {
                            generator.GCommand(CommandNames.Penetration, 1, point: p, feed: TechProcess.PenetrationFeed);
                        }
                        else
                        {
                            generator.Move(p, angleA: 90);
                            generator.Cycle();
                        }
                    }
                    else if (point0 != point && point != p && !point0.GetVectorTo(point).IsCodirectionalTo(point.GetVectorTo(p)))
                    {
                        generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                        point0 = point;
                    }
                    if (point0.IsNull())
                    {
                        point0 = p;
                    }
                    point = p;
                }
                generator.GCommand(CommandNames.Cutting, 1, point: point, feed: CuttingFeed);
                points.Reverse();
            }while (!isComplete);

            //generator.Move(point.Add(Vector3d.ZAxis * 100));
            return(point);
        }
예제 #4
0
        public override void BuildProcessing(MillingCommandGenerator generator)
        {
            switch (CalcMethod)
            {
            case CalcMethodType.Average:
                for (int i = 0; i < PointsX.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: PointsX[i] + 230, y: PointsY[i] - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolPosition.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = %TastL.ZLastra - %TastL.ZBanco", "Измерение");
                    generator.Command($"G0 Z(THICK{i}/1000 + 100)");
                }
                var s = String.Join(" + ", Enumerable.Range(0, PointsX.Count).Select(p => $"THICK{p}"));
                generator.Command($"DBL THICK = ({s})/{PointsX.Count}/1000");
                break;

            case CalcMethodType.Minimum:
                for (int i = 0; i < PointsX.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: PointsX[i] + 230, y: PointsY[i] - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolPosition.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = %TastL.ZLastra - %TastL.ZBanco", "Измерение");
                    generator.Command($"G0 Z(THICK{i}/1000 + 100)");

                    if (i != 0)
                    {
                        generator.Command($"IF (THICK{i} < THICK0) THEN");
                        generator.Command($" THICK0 = THICK{i}");
                        generator.Command("ENDIF");
                    }
                }
                generator.Command("DBL THICK = THICK0/1000");
                break;

            case CalcMethodType.Сorners:

                var points  = PointsX.Select((p, i) => new Point2d(p, PointsY[i])).OrderBy(p => p.X).ToList();
                var corners = points.Take(2).OrderBy(p => p.Y).Concat(points.Skip(2).OrderByDescending(p => p.Y)).ToList();

                for (int i = 0; i < corners.Count; i++)
                {
                    generator.GCommand(CommandNames.Fast, 0, x: corners[i].X + 230, y: corners[i].Y - 100 - TechProcess.Tool.Thickness.GetValueOrDefault());
                    generator.ToolPosition.Point -= new Vector3d(0, 0, 1);
                    generator.GCommand("", 0, z: Thickness.GetValueOrDefault() + TechProcess.ZSafety);

                    generator.Command("M131");
                    generator.Command($"DBL THICK{i} = (%TastL.ZLastra - %TastL.ZBanco)/1000", "Измерение");
                    generator.Command($"G0 Z(THICK{i} + 100)");
                }
                var l1 = corners[3].X - corners[0].X;
                var l2 = corners[1].Y - corners[0].Y;
                generator.Command($"DBL KK1=(THICK3 - THICK0) / {l1}");
                generator.Command($"DBL KK2=(THICK2 - THICK1) / {l1}");
                generator.Command("DBL THICK");
                generator.ThickCommand = $"THICK = (({{0}}-{corners[0].X})*KK2+THICK1)*({{1}}-{corners[0].Y})/{l2} + (({{0}}-{corners[0].X})*KK1+THICK0)*(1-({{1}}-{corners[0].Y})/{l2})";
                break;
            }
            generator.WithThick = true;
        }
예제 #5
0
        protected override void BuildProcessing(MillingCommandGenerator generator)
        {
            generator.ZSafety = ZSafety;
            if (MachineType.Value == CAM.MachineType.Donatoni)
            {
                generator.SetTool(2, Frequency, angleA: 90, hasTool: false);
            }
            else
            {
                generator.SetTool(1, Frequency, angleA: 0, hasTool: false);
            }

            var curves    = ProcessingArea.Select(p => p.ObjectId).QOpenForRead <Curve>().ToList();
            var bounds    = ProcessingArea.Select(p => p.ObjectId).GetExtents();
            var random    = new Random();
            var mainDir   = Vector3d.XAxis.RotateBy(Angle1.ToRad(), Vector3d.ZAxis);
            var side      = 1;
            var sign      = -1;
            var basePoint = bounds.MinPoint + (bounds.GetCenter() - bounds.MinPoint).GetNormal() * 100;

            using (var ray = new Ray())
                while (true)
                {
                    ray.BasePoint = basePoint;
                    ray.UnitDir   = mainDir.RotateBy(Angle2.ToRad() * side, Vector3d.ZAxis);
                    var points = ray.Intersect(curves).FindAll(p => p.DistanceTo(ray.BasePoint) > 10);
                    if (!points.Any())
                    {
                        break;
                    }

                    basePoint = points.First() + ray.UnitDir.Negate();
                    Cutting(ray.BasePoint, basePoint, ray.UnitDir, ray.UnitDir.GetPerpendicularVector() * side * sign);
                    side *= -1;
                }

            void Cutting(Point3d point1, Point3d point2, Vector3d dir, Vector3d pv)
            {
                var z = 0;

                if (generator.IsUpperTool)
                {
                    generator.Move(point1.X, point1.Y);
                    generator.GCommand(CommandNames.Cutting, 1, x: point1.X, y: point1.Y, z: ZEntry, feed: Feed / 5);
                    z = ZEntry;
                }
                var point0  = point1;
                var line    = new Line();
                var length  = point1.DistanceTo(point2);
                var l       = 0D;
                var a       = 0D;
                var count   = 10D;
                var stepA   = Math.PI / count;
                var stepL   = 0D;
                var amp     = 0;
                var isInner = true;

                while (l < length)
                {
                    if (Math.Abs(Math.Sin(a)) < Consts.Epsilon)
                    {
                        stepL = random.Next(StepMin, StepMax) / count;
                        amp   = random.Next(AmplitudeMin, AmplitudeMax);
                    }
                    l += stepL;
                    a += stepA;
                    var point = point1 + dir * l + pv * Math.Sin(a) * amp;
                    line.StartPoint = point0;
                    line.EndPoint   = point;
                    if (line.Intersect(curves).Any())
                    {
                        isInner = !isInner;
                    }
                    if (isInner)
                    {
                        if (z > 0)
                        {
                            z--;
                        }
                        generator.GCommand(CommandNames.Cutting, 1, x: point.X, y: point.Y, z: z, feed: Feed);
                    }
                    point0 = point;
                }
                line.Dispose();
                if (Math.Sin(a - stepA) > 0)
                {
                    sign = -sign;
                }
            }

            //var ray = new Ray
            //{
            //    BasePoint = new Point3d(bounds.MinPoint.X, 0, 0),
            //    UnitDir = Vector3d.YAxis
            //};
            //var uppDir = true;
            //var random = new Random();

            //while (true)
            //{
            //    var points = ray.Intersect(ProcessingArea.Select(p => p.ObjectId).QOpenForRead<Curve>().ToList(), Intersect.ExtendThis);
            //    if (points.Count == 0)
            //        break;
            //    if (points.Count > 1)
            //    {
            //        points = (uppDir ? points.OrderBy(p => p.Y) : points.OrderByDescending(p => p.Y)).ToList();
            //        Cutting(points.First(), points.Last());
            //    }
            //    ray.BasePoint += Vector3d.XAxis * Step1;
            //}

            //void Cutting(Point3d point1, Point3d point2)
            //{
            //    if (generator.IsUpperTool)
            //        generator.Move(point1.X, point1.Y);
            //    generator.GCommand(CommandNames.Cutting, 1, point: point1);

            //    var length = point1.DistanceTo(point2);
            //    var rnd = IsRandomStepCount ? (random.NextDouble() / 2 + 0.75) : 1;
            //    var countCycles = (int)Math.Round(length * rnd / Step2 / 2) * 2;
            //    var coodrs = Enumerable.Range(1, countCycles).Select(p => (double)p);
            //    if (IsRandomStepParams)
            //        coodrs = coodrs.Select(p => p + (p != countCycles ? (random.NextDouble() / 2 - 0.25) : 0));
            //    var coordArray = coodrs.ToArray();
            //    double l = 0;
            //    double a = 0;
            //    var count = 10;
            //    var stepA = Math.PI / count;
            //    for (int i = 0; i < coordArray.Length; i++)
            //    {
            //        var coord0 = i > 0 ? coordArray[i - 1] : 0;
            //        var dl = coordArray[i] - coord0;
            //        var stepL = dl * length / countCycles / count;

            //        foreach (var j in Enumerable.Range(1, count))
            //        {
            //            l += stepL;
            //            a += stepA;
            //            var point = point1 + new Vector3d(Math.Sin(a) * Amplitude * dl, uppDir ? l : -l, 0);
            //            generator.GCommand(CommandNames.Cutting, 1, point: point, feed: Feed);
            //        }
            //    }

            //while(true)
            //{
            //    cnt++;
            //    if (length - l < 2 * Step2)
            //    {

            //    }
            //    var rnd = random.Next(5, 10) / 10D;
            //    foreach (var i in Enumerable.Range(0, 10))
            //    {
            //        var point = point1 + new Vector3d(Math.Sin(a) * Amplitude * rnd, uppDir ? l : -l, 0);
            //        generator.GCommand(CommandNames.Cutting, 1, point: point, feed: Feed);
            //        l += stepL / 10 * rnd;
            //        a += stepA / 10;
            //    }
            //}


            //foreach (var i in Enumerable.Range(0, count))
            //{
            //    var point = point1 + new Vector3d(Math.Sin(a) * Amplitude, uppDir ? l : -l, 0);
            //    generator.GCommand(CommandNames.Cutting, 1, point: point, feed: Feed);
            //    l += stepL;
            //    a += stepA;
            //}
            //    uppDir = !uppDir;
            //}
        }
예제 #6
0
        public void BuildProcessingOld(MillingCommandGenerator generator)
        {
            var sectionProfile = (SectionProfileTechProcess)TechProcess;
            var toolThickness  = TechProcess.Tool.Thickness.Value;

            var rail = sectionProfile.Rail != null?sectionProfile.Rail.GetCurve() as Line : new Line(Point3d.Origin, new Point3d(sectionProfile.Length.Value, 0, 0));

            var railVector  = rail.Delta.GetNormal();
            var passVector  = rail.Delta;
            var crossVector = railVector.RotateBy(-Math.PI / 2, Vector3d.ZAxis);
            var startPass   = rail.StartPoint;
            var shift       = TechProcess.MachineType == MachineType.Donatoni ^ BuilderUtils.CalcEngineSide(rail.Angle) == Side.Left ? toolThickness : 0;

            if (rail.IsNewObject)
            {
                rail.Dispose();
            }

            var profile = sectionProfile.ProcessingArea[0].GetCurve() as Polyline;

            if (profile == null)
            {
                throw new Exception("Профиль должен быть полилинией");
            }

            if (Delta != 0)
            {
                profile = (Polyline)profile.GetOffsetCurves(Delta)[0];
            }

            var endX          = Math.Max(profile.StartPoint.X, profile.EndPoint.X);
            var profilePoints = profile.GetPolylineFitPoints(ProfileStep).Select(p => new Point2d(endX - p.X, p.Y)).ToList();

            if (profilePoints[0].X > Consts.Epsilon)
            {
                profilePoints.Reverse();
            }
            profilePoints = profilePoints
                            .TakeWhile(p => p.X < toolThickness)
                            .Select(p => p - Vector2d.XAxis * toolThickness)
                            .Concat(profilePoints)
                            .ToList();
            var passPoints = profilePoints.Select((p, i) =>
            {
                var y = p.Y;
                for (int j = i + 1; j < profilePoints.Count && profilePoints[j].X - profilePoints[i].X < toolThickness; j++)
                {
                    if (profilePoints[j].Y > y)
                    {
                        y = profilePoints[j].Y;
                    }
                }
                return(new Point2d(p.X, y));
            })
                             .ToList();

            if (Departure > 0)
            {
                passPoints.Insert(0, new Point2d(-Departure, passPoints.First().Y));
                passPoints.Add(new Point2d(passPoints.Last().X + Departure, passPoints.Last().Y));
            }

            var sp = startPass + crossVector * (passPoints[0].X + shift) + passPoints[0].Y * Vector3d.ZAxis;

            generator.Move(sp.X, sp.Y, angleC: BuilderUtils.CalcToolAngle(railVector.GetAngleTo(Vector3d.XAxis)));

            var passPointsDirect = new List <Point2d>[2] {
                passPoints, Enumerable.Reverse(passPoints).ToList()
            };
            int direct = 0;

            Acad.SetLimitProgressor((int)(passVector.Length / LongStep));
            for (double x = 0; x < passVector.Length; x += LongStep)
            {
                Acad.ReportProgressor();
                passPointsDirect[direct].ForEach(p => generator.GCommand(CommandNames.Cutting, 1, point: startPass + crossVector * (p.X + shift) + p.Y * Vector3d.ZAxis + x * railVector, feed: CuttingFeed));
                direct = 1 - direct;
            }
        }
예제 #7
0
        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();
                    }
        }