namespace Kompas.Mcp.Core.Drawings; /// Геометрия окружности-кандидата вида (центр + радиус, локальная СК вида, мм). public sealed record CircleCandidate(double Xc, double Yc, double Radius); /// /// Чистый отбор окружности проекционного вида по ключу (центр + радиус) для ассоциативной привязки /// размера. Выделен из COM-перечисления ради unit-тестов. /// public static class CircularObjectMatch { /// /// Индекс единственной окружности из , чей центр и радиус совпадают с /// ключом (,,) в пределах /// (мм): dist(центр,ключ) ≤ tol И |R − keyR| ≤ tol. /// /// Нет подходящих (0) или неоднозначно (>1). public static int SelectMatchIndex(IReadOnlyList candidates, double keyX, double keyY, double keyR, double tol) { ArgumentNullException.ThrowIfNull(candidates); var matches = new List(); for (var i = 0; i < candidates.Count; i++) { var c = candidates[i]; var dx = c.Xc - keyX; var dy = c.Yc - keyY; if (Math.Sqrt(dx * dx + dy * dy) <= tol && Math.Abs(c.Radius - keyR) <= tol) matches.Add(i); } return matches.Count switch { 1 => matches[0], 0 => throw new InvalidOperationException( $"Окружность не найдена рядом с ({keyX},{keyY}) R≈{keyR} (допуск {tol} мм). " + "Проверьте координаты/радиус и наличие окружности на этом виде."), _ => throw new InvalidOperationException( $"Неоднозначный выбор окружности у ({keyX},{keyY}) R≈{keyR}: подходит {matches.Count}. " + "Уточните координаты/радиус."), }; } }