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:
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user