fix: правки draft по ревью Codex

- угол уклона вынесен в чистый SketchGeometry.RequireDraftAngle (0<angle<90, finite) + unit-тесты границ — P2
- описание инструмента уточнено: строго 0 < angle < 90 — P2
- интеграционный тест Draft_outward_expands_box — страхует маппинг направления (outward→!direction) — P2
- 115 тестов (69 unit + 46 integration)
This commit is contained in:
2026-05-27 10:28:23 +03:00
parent 205a4b02de
commit 143877c6cc
5 changed files with 58 additions and 4 deletions
@@ -487,8 +487,7 @@ public sealed partial class PartModeler
public Task<int> DraftAsync(IReadOnlyList<int> faceIndices, BasePlane neutralPlane, double angle, bool outward = false, CancellationToken ct = default)
=> _dispatcher.InvokeAsync(() =>
{
if (!double.IsFinite(angle) || angle <= 0 || angle >= 90)
throw new ArgumentOutOfRangeException(nameof(angle), "Угол уклона должен быть в (0; 90) градусов.");
SketchGeometry.RequireDraftAngle(angle, nameof(angle));
ArgumentNullException.ThrowIfNull(faceIndices);
var indices = faceIndices.Distinct().ToList();
if (indices.Count == 0) throw new ArgumentException("Нужна хотя бы одна грань для уклона.", nameof(faceIndices));
@@ -41,6 +41,13 @@ public static class SketchGeometry
throw new ArgumentOutOfRangeException(paramName, value, $"Значение должно быть >= {min}.");
}
/// <summary>Требовать угол уклона: конечный и строго в диапазоне (0; 90) градусов.</summary>
public static void RequireDraftAngle(double angle, string paramName)
{
if (!double.IsFinite(angle) || angle <= 0 || angle >= 90)
throw new ArgumentOutOfRangeException(paramName, angle, "Угол уклона должен быть в (0; 90) градусов.");
}
/// <summary>Валидировать список точек: не null, минимум <paramref name="min"/>, все координаты конечны.</summary>
public static void RequirePoints(IReadOnlyList<(double x, double y)> points, int min, string paramName)
{
+2 -2
View File
@@ -199,11 +199,11 @@ public sealed class FeatureTools(KompasSession session, PartModeler modeler, Hol
}
[McpServerTool(Name = "draft")]
[Description("Уклон граней: наклонить грани faceIndices (из list_faces) на угол angle (градусы, 0..90) относительно нейтральной (опорной) координатной плоскости neutralPlane (XOY|XOZ|YOZ) — сечение тела в этой плоскости остаётся неизменным, грани уклоняются вокруг линии пересечения с ней. outward=true — расширение (материал добавляется), false — сужение. Грани должны граничить/пересекаться с нейтральной плоскостью. Возвращает id операции.")]
[Description("Уклон граней: наклонить грани faceIndices (из list_faces) на угол angle (градусы, строго 0 < angle < 90) относительно нейтральной (опорной) координатной плоскости neutralPlane (XOY|XOZ|YOZ) — сечение тела в этой плоскости остаётся неизменным, грани уклоняются вокруг линии пересечения с ней. outward=true — расширение (материал добавляется), false — сужение. Грани должны граничить/пересекаться с нейтральной плоскостью. Возвращает id операции.")]
public async Task<string> Draft(
[Description("Индексы уклоняемых граней из list_faces")] int[] faceIndices,
[Description("Нейтральная (опорная) плоскость: XOY|XOZ|YOZ")] string neutralPlane,
[Description("Угол уклона, градусы (0..90)")] double angle,
[Description("Угол уклона, градусы (0 < angle < 90)")] double angle,
[Description("Расширение (true) или сужение (false)")] bool outward = false)
{
await session.ConnectAsync();