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}. " +
"Уточните координаты/радиус."),
};
}
}