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); }
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); } }