fix: правки пакета C по ревью Codex

- 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)
This commit is contained in:
2026-05-27 00:16:47 +03:00
parent 2aeed5ba3d
commit 4cc9fb2d00
2 changed files with 31 additions and 4 deletions
@@ -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(
@@ -4,7 +4,7 @@ using Kompas.Mcp.Core.Query;
namespace Kompas.Mcp.Tests.Integration;
/// <summary>Интеграция: формообразующие операции пакета B.</summary>
/// <summary>Интеграция: формообразующие операции пакетов B и C (массивы, зеркало).</summary>
[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<double> 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()
{