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