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

- направление сверления — по факту убыли объёма (Update=TRUE даже при сверлении в воздух
  на сквозном отверстии); TryDirection + CurrentVolume (API5 МЦХ) — P2-баг, вскрыт тестом
- валидация double.IsFinite для координат/диаметра/глубины (Infinity проходил мимо >0) — P2
- откат точки-сироты и объекта отверстия при неуспехе (IFeature7.Delete) + RebuildDocument — P2
- тест Hole_through_bottom_face_uses_direction_fallback (нижняя грань) — P3
- 104 теста зелёных
This commit is contained in:
2026-05-27 10:04:22 +03:00
parent 13ab0f6581
commit d3dd78ec0b
3 changed files with 105 additions and 27 deletions
@@ -71,4 +71,29 @@ public sealed class HoleTests
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Hole_through_bottom_face_uses_direction_fallback()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
// Коробка 40×40×20, нижняя грань на Z=0 (нормаль смотрит наружу, −Z).
var s = await _modeler.OpenSketchAsync(BasePlane.XOY);
await _modeler.AddRectangleAsync(s, -20, -20, 20, 20);
await _modeler.CloseSketchAsync(s);
await _modeler.ExtrudeAsync(s, depth: 20);
var before = (await _query.GetPartInfoAsync()).Volume; // 32000
// Сверлим со стороны НИЖНЕЙ грани (0,0,0): корректное направление в тело — внутрь (+Z),
// т.е. противоположно нормали → проверяет авто-подбор направления (fallback).
await _holes.HoleAsync(0, 0, 0, diameter: 10, depth: 0, throughAll: true);
var after = (await _query.GetPartInfoAsync()).Volume;
var removed = Math.PI * 25 * 20;
Assert.True(after < before, "Отверстие с нижней грани должно построиться (fallback направления).");
Assert.InRange(before - after, removed * 0.95, removed * 1.05);
}
finally { await _docs.CloseAsync(save: false); }
}
}