コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: BuilderUtils.cs プロジェクト: airmay/CAM
        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);
        }
コード例 #3
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();
                    }
        }