From beaa220510bcd6ad44d664e0fecef27194e1a7d4 Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Thu, 28 May 2026 00:28:04 +0300 Subject: [PATCH] =?UTF-8?q?review(drawing):=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?(Codex=20+=20pi/glm-5.1=20+=20pi/kimi-k2.6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - проверка возврата AddBranchByPoint/SetBranchTextPosition (bool) — ранняя диагностика вместо позднего RPC_E_SERVERFAULT (Codex, glm) - RU-алиасы в сообщении ShelfDirections.Parse и в описании инструмента (glm, kimi) - интеграционный тест направления полки параметризован Right/Left/Up/Down — покрывает всю поверхность ToKompas на реальном COM (glm, kimi) - отклонено (обоснование): unit ToKompas (граница проекта), e2e tool-обёртки (тонкая), angleDeg (нет Angle у ILeader), default text у AddText (вне объёма) 331 тест зелёный, сборка Release чистая. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/Kompas.Mcp.Core/Drawings/DrawingService.cs | 6 ++++-- src/Kompas.Mcp.Core/Drawings/ShelfDirection.cs | 3 ++- src/Kompas.Mcp.Host/Tools/DrawingTools.cs | 3 ++- .../Integration/DrawingLeaderTests.cs | 13 +++++++++---- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Kompas.Mcp.Core/Drawings/DrawingService.cs b/src/Kompas.Mcp.Core/Drawings/DrawingService.cs index 9f382b5..3d73e10 100644 --- a/src/Kompas.Mcp.Core/Drawings/DrawingService.cs +++ b/src/Kompas.Mcp.Core/Drawings/DrawingService.cs @@ -510,8 +510,10 @@ public sealed class DrawingService // выноска без ответвлений валит КОМПАС (RPC_E_SERVERFAULT). Проверено спайком. var branches = baseLeader as IBranchs ?? throw new InvalidOperationException("Выноска не приводится к IBranchs."); - branches.AddBranchByPoint(0, x, y); // остриё ответвления 0 (куда указывает стрелка) - baseLeader.SetBranchTextPosition(textX, textY); // положение полки/текста + if (!branches.AddBranchByPoint(0, x, y)) // остриё ответвления 0 (куда указывает стрелка) + throw new InvalidOperationException("AddBranchByPoint вернул FALSE — ответвление выноски не создано."); + if (!baseLeader.SetBranchTextPosition(textX, textY)) // положение полки/текста + throw new InvalidOperationException("SetBranchTextPosition вернул FALSE — полка выноски не задана."); var leader = baseLeader as ILeader ?? throw new InvalidOperationException("Выноска не приводится к ILeader."); diff --git a/src/Kompas.Mcp.Core/Drawings/ShelfDirection.cs b/src/Kompas.Mcp.Core/Drawings/ShelfDirection.cs index 33b0e9a..398b58f 100644 --- a/src/Kompas.Mcp.Core/Drawings/ShelfDirection.cs +++ b/src/Kompas.Mcp.Core/Drawings/ShelfDirection.cs @@ -44,7 +44,8 @@ public static class ShelfDirections "up" or "вверх" => ShelfDirection.Up, "down" or "вниз" => ShelfDirection.Down, _ => throw new ArgumentException( - $"Неизвестное направление полки '{value}'. Допустимо: auto, right, left, up, down.", + $"Неизвестное направление полки '{value}'. Допустимо: auto/авто, right/вправо, " + + "left/влево, up/вверх, down/вниз.", nameof(value)), }; } diff --git a/src/Kompas.Mcp.Host/Tools/DrawingTools.cs b/src/Kompas.Mcp.Host/Tools/DrawingTools.cs index aefd72b..676c694 100644 --- a/src/Kompas.Mcp.Host/Tools/DrawingTools.cs +++ b/src/Kompas.Mcp.Host/Tools/DrawingTools.cs @@ -211,7 +211,8 @@ public sealed class DrawingTools(KompasSession session, DrawingService drawing) [McpServerTool(Name = "drawing_add_leader")] [Description("Поставить линию-выноску с текстом на виде активного чертежа. Стрелка выноски указывает " + "в точку (x,y); текст text размещается на полке у точки (textX,textY) — всё в ЛОКАЛЬНОЙ СК вида (мм). " + - "shelfDirection: auto (по умолчанию — КОМПАС сам) | right | left | up | down — направление полки. " + + "shelfDirection: auto/авто (по умолчанию — КОМПАС сам) | right/вправо | left/влево | up/вверх | " + + "down/вниз — направление полки. " + "viewNumber — номер вида из drawing_create_standard_views (0 = первый/главный). Точка острия (x,y) " + "должна отличаться от точки полки (textX,textY). Возвращает поставленный текст и номер вида.")] public async Task AddLeader( diff --git a/tests/Kompas.Mcp.Tests/Integration/DrawingLeaderTests.cs b/tests/Kompas.Mcp.Tests/Integration/DrawingLeaderTests.cs index 0bfe388..c41e13c 100644 --- a/tests/Kompas.Mcp.Tests/Integration/DrawingLeaderTests.cs +++ b/tests/Kompas.Mcp.Tests/Integration/DrawingLeaderTests.cs @@ -60,8 +60,12 @@ public sealed class DrawingLeaderTests : IntegrationTestBase finally { await _docs.CloseAsync(save: false); } } - [Fact] - public async Task Leader_with_explicit_shelf_direction() + [Theory] + [InlineData(ShelfDirection.Right)] + [InlineData(ShelfDirection.Left)] + [InlineData(ShelfDirection.Up)] + [InlineData(ShelfDirection.Down)] + public async Task Leader_with_explicit_shelf_direction(ShelfDirection dir) { var partFile = await BuildAndSaveBoxAsync(); await _docs.CreateAsync(KompasDocumentType.Drawing); @@ -70,11 +74,12 @@ public sealed class DrawingLeaderTests : IntegrationTestBase var views = await _drawing.CreateStandardViewsAsync(partFile, 1.0, 100, 150); var target = views.ViewNumbers[0]; var before = await _drawing.GetViewLeaderCountAsync(target); + // Покрывает всю поверхность ShelfDirections.ToKompas (Right/Left/Up/Down) на реальном COM. var r = await _drawing.AddLeaderAsync(target, x: 10, y: 8, textX: 30, textY: 25, - text: "Слева", shelfDirection: ShelfDirection.Left); + text: "Полка", shelfDirection: dir); var after = await _drawing.GetViewLeaderCountAsync(target); Assert.Equal(before + 1, after); - Assert.Equal("Слева", r.Value); + Assert.Equal("Полка", r.Value); } finally { await _docs.CloseAsync(save: false); } }