Ejemplo n.º 1
0
        protected override MutableObject Mutate(MutableObject mutable)
        {
            foreach (var entry in Scope.GetEntries(mutable))
            {
                var entropy = Entropy.GetValue(entry);

                var bandSpacing = BandSpacing.GetValue(entry);

                var entropySteps =
                    (from step in EntropySteps.GetValue(entry).Split(',') select float.Parse(step.Trim()))
                    .ToArray();

                var entropyLevel = 0;
                while (entropyLevel < entropySteps.Length && entropy > entropySteps[entropyLevel])
                {
                    entropyLevel++;
                }

                var minBands = MinimumBandSize.GetValue(entry) + entropyLevel;

                LowerBandTarget.SetValue(minBands, entry);
                UpperBandTarget.SetValue(bandSpacing + minBands, entry);
            }

            return(mutable);
        }
Ejemplo n.º 2
0
        public void CalcType(ObjectId[] ids)
        {
            Type             = null;
            BandSpacing      = null;
            BandWidth        = null;
            BandStart1       = null;
            BandStart2       = null;
            ProcessingAngle1 = null;
            ProcessingAngle2 = null;

            if (ids.Length < 2)
            {
                Acad.Alert("Выберите 2 элемента");
                return;
            }
            var contourPoints = GetContour().GetPolyPoints().ToArray();
            var curves        = ids.QOpenForRead <Curve>();
            var circles       = curves.OfType <Circle>().ToArray();

            if (circles.Any())
            {
                var radius = circles.Max(p => p.Radius);
                circles = circles.Where(p => p.Radius == radius).ToArray();
                const double Delta = 1;
                radius += Delta;
                var vector = circles[1].Center - circles[0].Center;
                var center = (circles[1].Center.X < circles[0].Center.X ? circles[1] : circles[0]).Center;
                BandSpacing = radius * 2;
                BandWidth   = vector.Length - BandSpacing.Value;
                if (vector.IsParallelTo(Vector3d.XAxis) || vector.IsPerpendicularTo(Vector3d.XAxis))
                {
                    Type             = "Конусы прямые";
                    ProcessingAngle1 = 0;
                    ProcessingAngle2 = 90;
                    BandStart1       = center.Y + radius - contourPoints[0].Y;
                    BandStart2       = center.X + radius - contourPoints[0].X;
                }
                else
                {
                    Type = "Конусы диагональные";
                    var ray = new Ray {
                        BasePoint = center
                    };

                    ProcessingAngle1 = 135;
                    ray.UnitDir      = Vector3d.XAxis.RotateBy(Graph.ToRad(ProcessingAngle1.Value), Vector3d.ZAxis);
                    BandStart1       = ray.GetDistToPoint(contourPoints[0], true) + radius;

                    ProcessingAngle2 = 45;
                    ray.UnitDir      = Vector3d.XAxis.RotateBy(Graph.ToRad(ProcessingAngle2.Value), Vector3d.ZAxis);
                    BandStart2       = ray.GetDistToPoint(contourPoints[3], true) % vector.Length + radius;
                }
                RoundParams();
                return;
            }
            var lines = curves.OfType <Line>().ToArray();

            if (lines.Length == 8)
            {
                Type             = "Квадраты";
                ProcessingAngle1 = 0;
                ProcessingAngle2 = 90;
                BandSpacing      = lines.First().Length;
                var points = lines.SelectMany(p => Graph.GetStartEndPoints(p));
                var point1 = new Point3d(points.Min(p => p.X), points.Min(p => p.Y), 0);
                BandStart1 = point1.Y + BandSpacing - contourPoints[0].Y;
                BandStart2 = point1.X + BandSpacing - contourPoints[0].X;
                var point2 = new Point3d(points.Max(p => p.X), points.Max(p => p.Y), 0);
                var vector = point2 - point1;
                BandWidth = (vector.X > vector.Y ? point2.X - point1.X : point2.Y - point1.Y) - BandSpacing * 2;

                RoundParams();
                return;
            }
            if (lines.Length == 3 || lines.Length == 4)
            {
                var vector = lines[0].Delta;
                if (vector.IsParallelTo(Vector3d.XAxis, Tolerance.Global))
                {
                    ProcessingAngle1 = 0;
                }
                if (vector.IsParallelTo(Vector3d.XAxis.RotateBy(Math.PI / 4, Vector3d.ZAxis)))
                {
                    ProcessingAngle1 = 45;
                }
                if (vector.IsParallelTo(Vector3d.YAxis, Tolerance.Global))
                {
                    ProcessingAngle1 = 90;
                }
                if (vector.IsParallelTo(Vector3d.XAxis.RotateBy(Math.PI * 3 / 4, Vector3d.ZAxis)))
                {
                    ProcessingAngle1 = 45;
                }
                if (ProcessingAngle1.HasValue)
                {
                    Type = $"Полосы {ProcessingAngle1}";
                    var point = ProcessingAngle1 == 45 ? contourPoints[3] : contourPoints[0];
                    var dist  = lines.Select(p => p.GetDistToPoint(point)).OrderBy(p => p).ToArray();
                    var s1    = dist[1] - dist[0];
                    var s2    = dist[2] - dist[1];
                    BandWidth   = Math.Max(s1, s2);
                    BandSpacing = Math.Min(s1, s2);
                    BandStart1  = (s1 > s2 ? dist[0] : dist[1]) % (BandWidth + BandSpacing);

                    RoundParams();
                    return;
                }
            }
            Acad.Alert("Тип плитки не распознан");

            void RoundParams()
            {
                BandSpacing = BandSpacing?.Round(3);
                BandWidth   = BandWidth?.Round(3);
                BandStart1  = BandStart1?.Round(3);
                BandStart2  = BandStart2?.Round(3);
            }
        }