From 4cc9fb2d00304a63dd16813d0df648d0396986d4 Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Wed, 27 May 2026 00:16:47 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0=20C=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20Codex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mirror_body: ChooseBodies() в interop не приводится к ksChooseBodies (null) и не нужен — o3d_mirrorAllOperation по умолчанию отражает все тела, сохраняя оригинал (проверено тестом); убран нерабочий вызов (P2 fail-fast вскрыл, что приведение всегда падает) - добавлен тест CircularPattern_reverse_flips_rotation_direction (проводка inverce) — P2 - комментарий класса FeatureOpsTests: пакеты B и C — P3 - 101 тест (60 unit + 41 integration) --- .../Modeling/PartModeler.Features.cs | 6 ++-- .../Integration/FeatureOpsTests.cs | 29 ++++++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Kompas.Mcp.Core/Modeling/PartModeler.Features.cs b/src/Kompas.Mcp.Core/Modeling/PartModeler.Features.cs index ffa5690..1299f7c 100644 --- a/src/Kompas.Mcp.Core/Modeling/PartModeler.Features.cs +++ b/src/Kompas.Mcp.Core/Modeling/PartModeler.Features.cs @@ -467,9 +467,9 @@ public sealed partial class PartModeler var def = entity.GetDefinition() as ksMirrorCopyAllDefinition ?? throw new InvalidOperationException("GetDefinition() зеркала тела вернул не ksMirrorCopyAllDefinition."); def.SetPlane(planeEntity); - // Отражаем все тела детали. - if (def.ChooseBodies() is ksChooseBodies chooser) - chooser.ChooseBodiesType = (int)ksChooseBodiesType.ksAllBodies; + // ChooseBodies() в этом interop не приводится к ksChooseBodies (даёт null), а вызов и не + // требуется: o3d_mirrorAllOperation по умолчанию отражает ВСЕ тела детали, сохраняя + // оригинал (проверено тестом — объём удваивается). Поэтому выбор тел не настраиваем. if (!entity.Create()) throw new InvalidOperationException( diff --git a/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs b/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs index db7e682..76f931b 100644 --- a/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs +++ b/tests/Kompas.Mcp.Tests/Integration/FeatureOpsTests.cs @@ -4,7 +4,7 @@ using Kompas.Mcp.Core.Query; namespace Kompas.Mcp.Tests.Integration; -/// Интеграция: формообразующие операции пакета B. +/// Интеграция: формообразующие операции пакетов B и C (массивы, зеркало). [Trait("Category", "Integration")] [Collection(KompasCollection.Name)] public sealed class FeatureOpsTests @@ -194,6 +194,33 @@ public sealed class FeatureOpsTests finally { await _docs.CloseAsync(save: false); } } + [Fact] + public async Task CircularPattern_reverse_flips_rotation_direction() + { + // count=2 (исходный + 1 копия на 90°): forward и reverse уводят копию в РАЗНЫЕ + // стороны по Y, поэтому MaxY габарита заметно различается (проводка def.inverce). + async Task CopyMaxY(bool reverse) + { + await _docs.CreateAsync(KompasDocumentType.Part); + try + { + var s = await _modeler.OpenSketchAsync(BasePlane.XOY); + await _modeler.AddCircleAsync(s, 20, 0, 3); // цилиндр R3 центр (20,0) + await _modeler.CloseSketchAsync(s); + var cyl = await _modeler.ExtrudeAsync(s, depth: 10); + await _modeler.CircularPatternAsync(new[] { cyl }, CoordinateAxis.Z, count: 2, step: 90, reverse: reverse); + await _modeler.RebuildAsync(); + return (await _query.GetBoundingBoxAsync()).MaxY; + } + finally { await _docs.CloseAsync(save: false); } + } + + var fwd = await CopyMaxY(reverse: false); + var rev = await CopyMaxY(reverse: true); + // Одно направление: копия в (0,+20) → MaxY≈23; другое: в (0,−20) → MaxY≈3. Разница ~20. + Assert.True(Math.Abs(fwd - rev) > 10, $"reverse не меняет направление вращения: fwd MaxY={fwd:F1}, rev MaxY={rev:F1}"); + } + [Fact] public async Task MirrorOperation_mirrors_two_features_across_YOZ() {