From fef0741eef852f3932930d3ef6f90ce7976ac157 Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Tue, 26 May 2026 22:31:59 +0300 Subject: [PATCH] =?UTF-8?q?fix(feature):=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20shell=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=20Codex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - сообщение shell считает грани после дедупликации (Distinct) - тест переименован (open_cap) + комментарий о симметрии торцов - RCW-долг транзитов shell задокументирован в OPEN_QUESTIONS v2-2 Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/OPEN_QUESTIONS.md | 3 +++ src/Kompas.Mcp.Host/Tools/FeatureTools.cs | 3 ++- tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) 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);