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