review(drawing): правки по ревью реализации (Codex + pi/glm-5.1 + pi/kimi-k2.6)

- проверка возврата 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) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 00:28:04 +03:00
parent f89ad951ae
commit beaa220510
4 changed files with 17 additions and 8 deletions
@@ -510,8 +510,10 @@ public sealed class DrawingService
// выноска без ответвлений валит КОМПАС (RPC_E_SERVERFAULT). Проверено спайком. // выноска без ответвлений валит КОМПАС (RPC_E_SERVERFAULT). Проверено спайком.
var branches = baseLeader as IBranchs var branches = baseLeader as IBranchs
?? throw new InvalidOperationException("Выноска не приводится к IBranchs."); ?? throw new InvalidOperationException("Выноска не приводится к IBranchs.");
branches.AddBranchByPoint(0, x, y); // остриё ответвления 0 (куда указывает стрелка) if (!branches.AddBranchByPoint(0, x, y)) // остриё ответвления 0 (куда указывает стрелка)
baseLeader.SetBranchTextPosition(textX, textY); // положение полки/текста throw new InvalidOperationException("AddBranchByPoint вернул FALSE — ответвление выноски не создано.");
if (!baseLeader.SetBranchTextPosition(textX, textY)) // положение полки/текста
throw new InvalidOperationException("SetBranchTextPosition вернул FALSE — полка выноски не задана.");
var leader = baseLeader as ILeader var leader = baseLeader as ILeader
?? throw new InvalidOperationException("Выноска не приводится к ILeader."); ?? throw new InvalidOperationException("Выноска не приводится к ILeader.");
@@ -44,7 +44,8 @@ public static class ShelfDirections
"up" or "вверх" => ShelfDirection.Up, "up" or "вверх" => ShelfDirection.Up,
"down" or "вниз" => ShelfDirection.Down, "down" or "вниз" => ShelfDirection.Down,
_ => throw new ArgumentException( _ => throw new ArgumentException(
$"Неизвестное направление полки '{value}'. Допустимо: auto, right, left, up, down.", $"Неизвестное направление полки '{value}'. Допустимо: auto/авто, right/вправо, " +
"left/влево, up/вверх, down/вниз.",
nameof(value)), nameof(value)),
}; };
} }
+2 -1
View File
@@ -211,7 +211,8 @@ public sealed class DrawingTools(KompasSession session, DrawingService drawing)
[McpServerTool(Name = "drawing_add_leader")] [McpServerTool(Name = "drawing_add_leader")]
[Description("Поставить линию-выноску с текстом на виде активного чертежа. Стрелка выноски указывает " + [Description("Поставить линию-выноску с текстом на виде активного чертежа. Стрелка выноски указывает " +
"в точку (x,y); текст text размещается на полке у точки (textX,textY) — всё в ЛОКАЛЬНОЙ СК вида (мм). " + "в точку (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) " + "viewNumber — номер вида из drawing_create_standard_views (0 = первый/главный). Точка острия (x,y) " +
"должна отличаться от точки полки (textX,textY). Возвращает поставленный текст и номер вида.")] "должна отличаться от точки полки (textX,textY). Возвращает поставленный текст и номер вида.")]
public async Task<string> AddLeader( public async Task<string> AddLeader(
@@ -60,8 +60,12 @@ public sealed class DrawingLeaderTests : IntegrationTestBase
finally { await _docs.CloseAsync(save: false); } finally { await _docs.CloseAsync(save: false); }
} }
[Fact] [Theory]
public async Task Leader_with_explicit_shelf_direction() [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(); var partFile = await BuildAndSaveBoxAsync();
await _docs.CreateAsync(KompasDocumentType.Drawing); 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 views = await _drawing.CreateStandardViewsAsync(partFile, 1.0, 100, 150);
var target = views.ViewNumbers[0]; var target = views.ViewNumbers[0];
var before = await _drawing.GetViewLeaderCountAsync(target); 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, 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); var after = await _drawing.GetViewLeaderCountAsync(target);
Assert.Equal(before + 1, after); Assert.Equal(before + 1, after);
Assert.Equal("Слева", r.Value); Assert.Equal("Полка", r.Value);
} }
finally { await _docs.CloseAsync(save: false); } finally { await _docs.CloseAsync(save: false); }
} }