diff --git a/docs/OPEN_QUESTIONS.md b/docs/OPEN_QUESTIONS.md index 31e2d62..a2eb2fc 100644 --- a/docs/OPEN_QUESTIONS.md +++ b/docs/OPEN_QUESTIONS.md @@ -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`. diff --git a/src/Kompas.Mcp.Host/Tools/FeatureTools.cs b/src/Kompas.Mcp.Host/Tools/FeatureTools.cs index d1c481e..6b74327 100644 --- a/src/Kompas.Mcp.Host/Tools/FeatureTools.cs +++ b/src/Kompas.Mcp.Host/Tools/FeatureTools.cs @@ -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")] diff --git a/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs b/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs index 756df72..c102d9d 100644 --- a/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs +++ b/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs @@ -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);