feat(drawing): формат и ориентация листа (drawing_set_sheet_format)

Задать формат (A0–A5/user) и ориентацию (книжная/альбомная) листа чертежа через
API7 ILayoutSheet.Format (ISheetFormat). Стандартный формат — размеры авто; user —
явные width/height (landscape игнорируется, ориентация из соотношения сторон).

- DrawingService.SetSheetFormatAsync + RequireLayoutSheet
- PaperFormat (enum + Parse/ToKompas/FromKompas), SheetFormatResult
- DrawingValidation.ValidateFormatDimensions (user: >0; стандартный: размеры запрещены)
- 19 unit + 7 интеграционных тестов (всего 304 зелёных), сборка Release чистая

Спайк подтвердил: дефолт A4 portrait; стандартный формат пересчитывает W/H авто
(A3 landscape→420×297); user применяет width/height. Ревью спека pi/glm-5.1 + pi/kimi-k2.6
учтено (FromKompas для дружелюбного имени, запрет размеров у стандартного, sheetNumber>0,
landscape игнорируется для user).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 23:19:37 +03:00
parent adc9da37fa
commit 56ed2cb0cf
9 changed files with 470 additions and 0 deletions
@@ -91,4 +91,32 @@ public sealed class DrawingValidationTests
[Fact]
public void RequireNonEmptyText_accepts_non_empty()
=> Assert.Null(Record.Exception(() => DrawingValidation.RequireNonEmptyText("Ra 1.6", "text")));
[Theory]
[InlineData(0, 300)]
[InlineData(500, 0)]
[InlineData(-1, 300)]
[InlineData(double.NaN, 300)]
[InlineData(500, double.PositiveInfinity)]
public void ValidateFormatDimensions_user_throws_on_non_positive_or_non_finite(double w, double h)
=> Assert.Throws<ArgumentOutOfRangeException>(
() => DrawingValidation.ValidateFormatDimensions(PaperFormat.User, w, h));
[Fact]
public void ValidateFormatDimensions_user_accepts_positive()
=> Assert.Null(Record.Exception(
() => DrawingValidation.ValidateFormatDimensions(PaperFormat.User, 500, 300)));
[Theory]
[InlineData(500, 0)]
[InlineData(0, 300)]
[InlineData(500, 300)]
public void ValidateFormatDimensions_standard_throws_when_dimensions_given(double w, double h)
=> Assert.Throws<ArgumentException>(
() => DrawingValidation.ValidateFormatDimensions(PaperFormat.A3, w, h));
[Fact]
public void ValidateFormatDimensions_standard_accepts_zero_dimensions()
=> Assert.Null(Record.Exception(
() => DrawingValidation.ValidateFormatDimensions(PaperFormat.A3, 0, 0)));
}