From d3b3a7d58990438eec0feb5692cbe139314ba51a Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Wed, 27 May 2026 21:52:35 +0300 Subject: [PATCH] =?UTF-8?q?review(drawing):=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?Codex=20(=D0=B0=D1=81=D1=81=D0=BE=D1=86=D0=B8=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - свободный путь (associate=false) берёт только ISymbols2DContainer (как раньше) — IDrawingContainer запрашивается лишь при associate=true (не расширяем поверхность отказа) - XML-доки диаметрального/радиального уточнены: при associate значение из геометрии 16 тестов привязки+регрессии зелёные, сборка Release чистая. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Drawings/DrawingService.cs | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Kompas.Mcp.Core/Drawings/DrawingService.cs b/src/Kompas.Mcp.Core/Drawings/DrawingService.cs index 3a3eb4d..10e8aaa 100644 --- a/src/Kompas.Mcp.Core/Drawings/DrawingService.cs +++ b/src/Kompas.Mcp.Core/Drawings/DrawingService.cs @@ -137,9 +137,11 @@ public sealed class DrawingService => _dispatcher.InvokeAsync(() => RequireSymbols2DContainer(viewNumber).Symbols.LineDimensions?.Count ?? 0, ct); /// - /// Поставить диаметральный размер (Ø) окружности с центром (xc,yc) и радиусом - /// (ЛОКАЛЬНАЯ СК вида, мм) на виде. — направление выноски (градусы). - /// Значение (диаметр = 2·radius) измеряется автоматически. Возвращает диаметр и номер вида. + /// Поставить диаметральный размер (Ø) окружности на виде. — направление + /// выноски (градусы). При =false — свободный размер по (xc,yc,radius), + /// значение = 2·radius. При =true — (xc,yc,radius) служат ключом поиска + /// спроецированной окружности (Circles), размер привязывается к ней (BaseObject), значение Ø читается + /// из геометрии. Координаты — ЛОКАЛЬНАЯ СК вида (мм). Возвращает диаметр и номер вида. /// public Task AddDiametralDimensionAsync(int viewNumber, double xc, double yc, double radius, double angleDeg, bool associate = false, CancellationToken ct = default) @@ -152,8 +154,20 @@ public sealed class DrawingService DrawingValidation.RequirePositiveRadius(radius); var angleRad = DimensionAngles.ToRadians(angleDeg); - var (view, symbols, drawing) = RequireViewContainers(viewNumber); - var baseObject = associate ? FindBaseCircle(drawing, xc, yc, radius) : null; + // Свободный путь берёт только ISymbols2DContainer (как раньше); IDrawingContainer (геометрия) + // нужен лишь для ассоциативной привязки — не расширяем поверхность отказа свободного пути. + IView view; ISymbols2DContainer symbols; IDrawingObject? baseObject = null; + if (associate) + { + var c = RequireViewContainers(viewNumber); + view = c.View; symbols = c.Symbols; + baseObject = FindBaseCircle(c.Drawing, xc, yc, radius); + } + else + { + var c = RequireSymbols2DContainer(viewNumber); + view = c.View; symbols = c.Symbols; + } var dim = symbols.DiametralDimensions?.Add() ?? throw new InvalidOperationException("DiametralDimensions.Add вернул null."); try @@ -190,9 +204,11 @@ public sealed class DrawingService => _dispatcher.InvokeAsync(() => RequireSymbols2DContainer(viewNumber).Symbols.DiametralDimensions?.Count ?? 0, ct); /// - /// Поставить радиальный размер (R) окружности/дуги с центром (xc,yc) и радиусом - /// (ЛОКАЛЬНАЯ СК вида, мм) на виде. — направление выноски (градусы). - /// Значение (= радиус) измеряется автоматически. Возвращает радиус и номер вида. + /// Поставить радиальный размер (R) окружности на виде. — направление + /// выноски (градусы). При =false — свободный размер по (xc,yc,radius), + /// значение = radius. При =true — (xc,yc,radius) служат ключом поиска + /// спроецированной окружности (Circles), размер привязывается к ней (BaseObject), значение R читается + /// из геометрии. Координаты — ЛОКАЛЬНАЯ СК вида (мм). Возвращает радиус и номер вида. /// public Task AddRadialDimensionAsync(int viewNumber, double xc, double yc, double radius, double angleDeg, bool associate = false, CancellationToken ct = default) @@ -205,8 +221,20 @@ public sealed class DrawingService DrawingValidation.RequirePositiveRadius(radius); var angleRad = DimensionAngles.ToRadians(angleDeg); - var (view, symbols, drawing) = RequireViewContainers(viewNumber); - var baseObject = associate ? FindBaseCircle(drawing, xc, yc, radius) : null; + // Свободный путь берёт только ISymbols2DContainer (как раньше); IDrawingContainer (геометрия) + // нужен лишь для ассоциативной привязки — не расширяем поверхность отказа свободного пути. + IView view; ISymbols2DContainer symbols; IDrawingObject? baseObject = null; + if (associate) + { + var c = RequireViewContainers(viewNumber); + view = c.View; symbols = c.Symbols; + baseObject = FindBaseCircle(c.Drawing, xc, yc, radius); + } + else + { + var c = RequireSymbols2DContainer(viewNumber); + view = c.View; symbols = c.Symbols; + } var dim = symbols.RadialDimensions?.Add() ?? throw new InvalidOperationException("RadialDimensions.Add вернул null."); try