a4cc755fb4
Три способа получить форму там, где раньше был только замкнутый контур из отрезков и дуг. 1. Примитив эскиза type=text: ksTextEx + ksConvertTextToCurve. Пока текст остаётся текстом, это оформление, и операция его не видит; после конвертации глифы становятся обычным сечением. Ответ возвращает фактическую длину строки — иначе ширину шрифта до выдавливания не узнать. 2. extrude(thinThickness, thinSide): контур трактуется как стенка заданной толщины. outward по замкнутому контуру даёт кайму-эквидистанту вокруг него — так надпись получает подложку без 2D-эквидистанты. Толщину при dtReverse КОМПАС читает из reverseThickness: положить её в normalThickness значит молча получить СПЛОШНОЕ сечение вместо рамки. 3. Инструмент primitive: элементарные тела API7 (block, cylinder, sphere, cone) с result=new|union|subtract|intersect. Карман и паз строятся вычитанием тела, без эскиза и выреза. Update() возвращает TRUE даже когда вычитание прошло мимо тела, поэтому сервис сверяет объём до и после и откатывает операцию, если ничего не изменилось.
78 lines
3.2 KiB
C#
78 lines
3.2 KiB
C#
using Kompas.Mcp.Core.Modeling;
|
|
|
|
namespace Kompas.Mcp.Tests;
|
|
|
|
/// <summary>
|
|
/// Разбор и валидация примитивов. У слитого инструмента схема не запрещает лишние поля,
|
|
/// поэтому недостающий размер обязана назвать валидация — вместе с типом тела.
|
|
/// </summary>
|
|
[Trait("Category", "Unit")]
|
|
public sealed class PrimitivesTests
|
|
{
|
|
[Theory]
|
|
[InlineData("block", PrimitiveKind.Block)]
|
|
[InlineData(" BOX ", PrimitiveKind.Block)]
|
|
[InlineData("cylinder", PrimitiveKind.Cylinder)]
|
|
[InlineData("sphere", PrimitiveKind.Sphere)]
|
|
[InlineData("cone", PrimitiveKind.Cone)]
|
|
public void Kind_names_and_aliases_are_recognized(string value, PrimitiveKind expected)
|
|
=> Assert.Equal(expected, Primitives.ParseKind(value));
|
|
|
|
[Theory]
|
|
[InlineData("", PrimitiveResult.NewBody)]
|
|
[InlineData("new", PrimitiveResult.NewBody)]
|
|
[InlineData("union", PrimitiveResult.Union)]
|
|
[InlineData("subtract", PrimitiveResult.Subtract)]
|
|
[InlineData("cut", PrimitiveResult.Subtract)]
|
|
[InlineData("intersect", PrimitiveResult.Intersect)]
|
|
public void Result_names_and_aliases_are_recognized(string value, PrimitiveResult expected)
|
|
=> Assert.Equal(expected, Primitives.ParseResult(value));
|
|
|
|
[Fact]
|
|
public void Unknown_kind_lists_the_allowed_ones()
|
|
{
|
|
var ex = Assert.Throws<ArgumentException>(() => Primitives.ParseKind("torus"));
|
|
|
|
Assert.Contains("torus", ex.Message, StringComparison.Ordinal);
|
|
Assert.Contains("cylinder", ex.Message, StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Block_names_the_missing_dimension()
|
|
{
|
|
var ex = Assert.Throws<ArgumentException>(
|
|
() => Primitives.Validate(PrimitiveKind.Block, length: 10, width: null, height: 5, diameter: null));
|
|
|
|
Assert.Contains("block", ex.Message, StringComparison.Ordinal);
|
|
Assert.Contains("width", ex.Message, StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Cylinder_needs_diameter_and_height_not_length()
|
|
{
|
|
var ex = Assert.Throws<ArgumentException>(
|
|
() => Primitives.Validate(PrimitiveKind.Cylinder, length: 10, width: 10, height: 5, diameter: null));
|
|
|
|
Assert.Contains("diameter", ex.Message, StringComparison.Ordinal);
|
|
}
|
|
|
|
[Fact]
|
|
public void Sphere_needs_only_the_diameter()
|
|
{
|
|
Primitives.Validate(PrimitiveKind.Sphere, length: null, width: null, height: null, diameter: 12);
|
|
}
|
|
|
|
[Fact]
|
|
public void Non_positive_size_is_rejected_with_the_value()
|
|
{
|
|
var ex = Assert.Throws<ArgumentException>(
|
|
() => Primitives.Validate(PrimitiveKind.Block, length: 10, width: 0, height: 5, diameter: null));
|
|
|
|
Assert.Contains("width", ex.Message, StringComparison.Ordinal);
|
|
Assert.Contains("> 0", ex.Message, StringComparison.Ordinal);
|
|
}
|
|
|
|
// Маппинг в COM-перечисления (ksObj3dTypeEnum / ksOperationResultEnum) проверяется
|
|
// интеграционно — сборки КОМПАС в тестовом проекте недоступны без установленного CAD.
|
|
}
|