feat: коническое отверстие (hole_conic) — ksHTConic + IConicHoleParameters

- ConicHoleAsync (ksHTConic + IConicHoleParameters: ConicType=ksCNAngle, ConicAngle)
- инструмент hole_conic (diameter у дна, conicAngle 0..180); тот же HoleCore-паттерн
- интеграционный тест (конус удаляет больше цилиндра Ø10); типы отверстий завершены
- 70 инструментов, 119 тестов
This commit is contained in:
2026-05-27 12:17:28 +03:00
parent b8dbe48fad
commit 675e43160e
3 changed files with 56 additions and 0 deletions
@@ -147,4 +147,28 @@ public sealed class HoleTests
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Conic_hole_removes_tapered_volume()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
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;
// Коническое Ø10 у дна, угол 20°, глухое на 15 мм по центру верхней грани.
await _holes.ConicHoleAsync(0, 0, 20, diameter: 10, depth: 15, throughAll: false, conicAngle: 20);
var removed = before - (await _query.GetPartInfoAsync()).Volume;
// Конус расширяется к поверхности → объём больше цилиндра Ø10×15 (π·25·15≈1178) и в разумных пределах.
var baseCyl = Math.PI * 25 * 15;
Assert.True(removed > baseCyl, "Конусное отверстие должно удалить больше цилиндра Ø10.");
Assert.True(removed < baseCyl * 4, "Объём конуса в разумных пределах.");
}
finally { await _docs.CloseAsync(save: false); }
}
}