Files
kompas3d-mcp/src/Kompas.Mcp.Core/Drawings/DimensionOrientation.cs
T
mikhail b6ca2f7b21 feat: drawing_add_diametral_dimension — упрочнение по ревью Codex реализации
#2: инвариант диаметра value>0 (value<=0||!IsFinite, не Abs<1e-6). #3: сообщение
create_standard_views обобщено (номера видов для инструментов размеров). #4a:
ToRadians проверяет конечность результата (переполнение). #5d: тест viewNumber:999
(вид не найден). #6: комментарий DimensionType переформулирован (COM-дефолт).

Тесты: DrawingDiametralTests 4→5. Итого 141 unit + 77 integration = 218.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 18:38:33 +03:00

57 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Kompas6Constants;
namespace Kompas.Mcp.Core.Drawings;
/// <summary>Ориентация линейного размера (обёртка над <see cref="ksLineDimensionOrientationEnum"/>).</summary>
public enum DimensionOrientation
{
/// <summary>Горизонтальный (измеряет |X2X1|).</summary>
Horizontal,
/// <summary>Вертикальный (измеряет |Y2Y1|).</summary>
Vertical,
/// <summary>Параллельный отрезку P1→P2 (реальная длина).</summary>
Parallel,
}
/// <summary>Конверсии углов размеров (2D-API КОМПАС использует радианы).</summary>
public static class DimensionAngles
{
/// <summary>Градусы → радианы (угол выноски в API задаётся в радианах).</summary>
public static double ToRadians(double degrees)
{
if (!double.IsFinite(degrees))
throw new ArgumentException("Угол должен быть конечным числом.", nameof(degrees));
var result = degrees * (Math.PI / 180.0);
if (!double.IsFinite(result)) // защита от переполнения на экстремальных degrees
throw new ArgumentOutOfRangeException(nameof(degrees), "Угол слишком велик (переполнение при переводе в радианы).");
return result;
}
}
/// <summary>Маппинг ориентации размера ↔ перечисление КОМПАС и разбор строки.</summary>
public static class DimensionOrientations
{
public static ksLineDimensionOrientationEnum ToKompas(DimensionOrientation orientation) => orientation switch
{
DimensionOrientation.Horizontal => ksLineDimensionOrientationEnum.ksLinDHorizontal,
DimensionOrientation.Vertical => ksLineDimensionOrientationEnum.ksLinDVertical,
DimensionOrientation.Parallel => ksLineDimensionOrientationEnum.ksLinDParallel,
_ => throw new ArgumentOutOfRangeException(nameof(orientation), orientation, "Неизвестная ориентация размера."),
};
/// <summary>Разобрать строку ориентации (англ./рус.) в <see cref="DimensionOrientation"/>.</summary>
public static DimensionOrientation Parse(string value)
{
ArgumentNullException.ThrowIfNull(value);
return value.Trim().ToLowerInvariant() switch
{
"horizontal" or "h" or "горизонтальный" or "горизонтальная" => DimensionOrientation.Horizontal,
"vertical" or "v" or "вертикальный" or "вертикальная" => DimensionOrientation.Vertical,
"parallel" or "p" or "параллельный" or "параллельная" => DimensionOrientation.Parallel,
_ => throw new ArgumentException(
$"Неизвестная ориентация размера '{value}'. Допустимо: horizontal, vertical, parallel.",
nameof(value)),
};
}
}