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:
@@ -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)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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); }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user