fix(feature): правки shell по ревью Codex

- сообщение shell считает грани после дедупликации (Distinct)
- тест переименован (open_cap) + комментарий о симметрии торцов
- RCW-долг транзитов shell задокументирован в OPEN_QUESTIONS v2-2

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 22:31:59 +03:00
parent 115fcb8759
commit fef0741eef
3 changed files with 8 additions and 3 deletions
+3
View File
@@ -64,6 +64,9 @@
`EntityCollection(o3d_face/o3d_edge)` не освобождаются (унаследованный паттерн; `QueryService`
их освобождает, `PartModeler` — только зарегистрированные сущности в `ResetCore`). Накапливается
за длинную сессию. На проработку: единый `using`/release транзитов в построителе.
Тот же паттерн у новых членов (`SelectFaceByIndex`, `ShellAsync`: транзитные `ksShellDefinition`/
`FaceArray()`/коллекции граней не освобождаются — сознательно, ради консистентности с
`Fillet`/`Chamfer`; войдёт в общий рефакторинг release транзитов).
- v2-3 — **стабильность индексов граней** (`list_faces``sketch_create_on_face_index`):
индекс валиден, пока геометрия не меняется между вызовами. После любой операции порядок/состав
граней может измениться — переиспользовать старый индекс нельзя, нужно перезапросить `list_faces`.
+2 -1
View File
@@ -100,7 +100,8 @@ public sealed class FeatureTools(KompasSession session, PartModeler modeler)
{
await session.ConnectAsync();
var id = await modeler.ShellAsync(faceIndices, thickness, outward);
return $"Оболочка толщиной {thickness} мм создана (удалено граней: {faceIndices.Length}), id={id}.";
var removed = faceIndices?.Distinct().Count() ?? 0;
return $"Оболочка толщиной {thickness} мм создана (удалено граней: {removed}), id={id}.";
}
[McpServerTool(Name = "rebuild")]
@@ -21,7 +21,7 @@ public sealed class FeatureOpsTests
}
[Fact]
public async Task Shell_box_hollows_with_open_top()
public async Task Shell_box_hollows_with_open_cap()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
@@ -33,7 +33,8 @@ public sealed class FeatureOpsTests
await _modeler.ExtrudeAsync(s, depth: 20);
var before = (await _query.GetPartInfoAsync()).Volume; // 24000
// Удаляем одну из двух плоских граней-торцов (площадь 40×30=1200) → открытая оболочка.
// Удаляем один из двух плоских торцов (площадь 40×30=1200) → открытая оболочка.
// Какой именно торец (верх/низ) — для объёма не важно: результат симметричен.
var faces = await _query.ListFacesAsync();
var cap = faces.First(f => f.Type == "plane" && Math.Abs(f.Area - 1200) < 1);
var id = await _modeler.ShellAsync(new[] { cap.Index }, thickness: 2, outward: false);