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() {