feat(drawing): текстовые обозначения — шероховатость, текст, тех. требования

drawing_add_rough (знак шероховатости: ISymbols2DContainer.Roughs + IRoughParams,
SignType ksRoughSignEnum, значение Ra/Rz через RoughParamText.Str),
drawing_add_text (свободная надпись: IDrawingContainer.DrawingTexts + IText.Str),
drawing_set_technical_requirements (блок тех. требований уровня документа:
IDrawingDocument.TechnicalDemand.Text).

- DrawingService: AddRoughAsync/AddTextAsync/SetTechnicalRequirementsAsync +
  ReadTechnicalRequirementsAsync + счётчики; RequireDrawingContainer/RequireTechnicalDemand
- RoughSignType (enum + Parse/ToKompas), DrawingAnnotationResult (Value read-back из COM)
- RequireNonEmptyText в DrawingValidation
- 13 unit + 13 интеграционных тестов (всего 267 зелёных), сборка Release чистая

Спайк подтвердил: значение шероховатости через IRoughParams.RoughParamText.Str (round-trip);
текст НЕ в IView.ObjectCount (счёт по DrawingTexts.Count); тех. требования IsCreated False→True
при первом Text.Str+Update, многострочно через \n. Ревью Codex спека учтено (height убран —
это высота блока, не шрифт; guards; read-back возврат). Спек — docs/superpowers/specs/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 21:13:11 +03:00
parent 1f153e43ab
commit 5272066bef
11 changed files with 756 additions and 0 deletions
@@ -0,0 +1,29 @@
using Kompas.Mcp.Core.Drawings;
namespace Kompas.Mcp.Tests;
[Trait("Category", "Unit")]
public sealed class RoughSignTypesTests
{
[Theory]
[InlineData("delete", RoughSignType.DeleteMaterial)]
[InlineData("without", RoughSignType.WithoutDeleteMaterial)]
[InlineData("none", RoughSignType.NoProcessing)]
[InlineData(" DELETE ", RoughSignType.DeleteMaterial)]
[InlineData("с удалением", RoughSignType.DeleteMaterial)]
[InlineData("без удаления", RoughSignType.WithoutDeleteMaterial)]
[InlineData("без указания", RoughSignType.NoProcessing)]
public void Parse_maps_known(string value, RoughSignType expected)
=> Assert.Equal(expected, RoughSignTypes.Parse(value));
[Fact]
public void Parse_throws_on_unknown()
=> Assert.Throws<ArgumentException>(() => RoughSignTypes.Parse("polished"));
[Fact]
public void Parse_throws_on_null()
=> Assert.Throws<ArgumentNullException>(() => RoughSignTypes.Parse(null!));
// ToKompas (→ ksRoughSignEnum) намеренно НЕ покрыт unit-тестом: тестовый проект не ссылается на
// Kompas6Constants (граница проекта, как у AngleDimensionTypes/DimensionOrientations).
}