Files
kompas3d-mcp/src/Kompas.Mcp.Core/Drawings/DimensionOrientation.cs
T
mikhail 910d120c8a feat: drawing_add_diametral_dimension — диаметральный размер на виде (API7)
Веха 2D-ЧЕРТЁЖ, инкремент 4. DrawingService.AddDiametralDimensionAsync:
(ISymbols2DContainer)view.DiametralDimensions.Add → Xc/Yc/Radius/Angle(рад) +
AutoNominalValue → Update → Valid → NominalValue (= диаметр 2R). angle в градусах
(DimensionAngles.ToRadians). Новый инструмент drawing_add_diametral_dimension.

Рефактор по ревью Codex: извлечён RequireSymbols2DContainer(viewNumber) (общий для
линейных/диаметральных размеров); AutoNominalValue выставляется явно (как у линейного);
DimensionType — COM-дефолт; ToRadians — чистый helper с unit-тестом.

Валидаторы: RequirePositiveRadius (новый). Тесты: +10 unit (ToRadians,
RequirePositiveRadius), +4 integration (DrawingDiametralTests: диаметр=2R, адресация
вида, radius<=0, нет видов). Итого 141 unit + 76 integration = 217.

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

54 lines
2.7 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));
return degrees * Math.PI / 180.0;
}
}
/// <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)),
};
}
}