From 253545e4988c856bb01163ff1e4843bb0ca22f8b Mon Sep 17 00:00:00 2001 From: sladro Date: Tue, 3 Feb 2026 19:12:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=89=E5=9C=86=E5=A4=B4=E7=9A=84=E5=BC=A7?= =?UTF-8?q?=E7=BA=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cad/FeatureDrivenDrawer.cs | 44 ++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/Cad/FeatureDrivenDrawer.cs b/Cad/FeatureDrivenDrawer.cs index 6d045d4..0dc5094 100644 --- a/Cad/FeatureDrivenDrawer.cs +++ b/Cad/FeatureDrivenDrawer.cs @@ -3018,20 +3018,27 @@ namespace CadParamPluging.Cad double xInnerRight = ox + visualTotalW - arcHeight; double innerWidth = xInnerRight - xInnerLeft; - // 获取内框圆角参数:优先取 UnspecifiedFilletRadiusMax,如果没有则取 BoxFilletRadiusMax + // 获取圆头处圆角半径 (BoxRoundHeadFilletRadiusMax) - 用于外侧圆角 + // 依据用户需求:外侧圆角由“圆头处圆角半径”控制 + var headFilletParam = bag.GetDoubleOrNull(KeyBoxRoundHeadFilletRadiusMax); + double headFilletR = headFilletParam.HasValue && headFilletParam.Value > 0 + ? headFilletParam.Value + : 0; + + // 获取内框圆角参数:优先取 UnspecifiedFilletRadiusMax,如果没有则取 BoxFilletRadiusMax - 用于内部剖面 var innerFilletParam = bag.GetDoubleOrNull(KeyUnspecifiedFilletRadiusMax); if (!innerFilletParam.HasValue || innerFilletParam.Value <= 0) { innerFilletParam = bag.GetDoubleOrNull(KeyBoxFilletRadiusMax); } - double innerFilletR = innerFilletParam.HasValue && innerFilletParam.Value > 0 + double sectionFilletR = innerFilletParam.HasValue && innerFilletParam.Value > 0 ? innerFilletParam.Value : 0; // 1. 绘制完整锻件外轮廓(方体有圆头 - 白色,大圆弧) - // 修正:圆弧弦线需向内缩进 innerFilletR,以与锻件圆角起点对齐 - DrawBlockRoundHeadOutline(ctx, ox, oy, visualTotalW, H, arcHeight, innerFilletR); + // 修正:圆弧弦线需向内缩进 headFilletR (原 logic 使用 innerFilletR),以与锻件外侧圆角起点对齐 + DrawBlockRoundHeadOutline(ctx, ox, oy, visualTotalW, H, arcHeight, headFilletR); // 2. 绘制分段式内框(左、中、右三段)以支持中间剖面区域的独立圆角 // 中间区域(剖面)作为主体,如果设置了圆角,四个角都应为圆角 @@ -3065,26 +3072,24 @@ namespace CadParamPluging.Cad double xSectionRight = xSectionLeft + visualSectionWidth; // 绘制中间剖面框(带圆角) - // 复用 Ring 模板的 SectionContourWithFillet 逻辑绘制中间闭合框 - // 注意:这里需要把 Ring 的 DrawRingSectionContourWithFillet 方法提取出来通用或者直接复制逻辑 - // 为简单起见,这里直接使用类似的逻辑绘制 - DrawBoxSectionContourWithFillet(ctx, xSectionLeft, xSectionRight, oy, H, innerFilletR); + // 使用 sectionFilletR + DrawBoxSectionContourWithFillet(ctx, xSectionLeft, xSectionRight, oy, H, sectionFilletR); // 绘制左侧框线(连接左端圆弧和中间剖面框) - // 左端: xInnerLeft (需处理左上下角的圆角 - 修正为使用内框圆角 innerFilletR,与方体参数一致) + // 左端: xInnerLeft (需处理左上下角的圆角 - 使用 headFilletR) // 右端: xSectionLeft (连接到中间框的直边) - DrawBoxSideFrame(ctx, xInnerLeft, xSectionLeft, oy, H, innerFilletR, isLeft: true); + DrawBoxSideFrame(ctx, xInnerLeft, xSectionLeft, oy, H, headFilletR, isLeft: true); // 绘制右侧框线 // 左端: xSectionRight (连接到中间框的直边) - // 右端: xInnerRight (需处理右上下角的圆角 - 修正为使用内框圆角 innerFilletR,与方体参数一致) - DrawBoxSideFrame(ctx, xSectionRight, xInnerRight, oy, H, innerFilletR, isLeft: false); + // 右端: xInnerRight (需处理右上下角的圆角 - 使用 headFilletR) + DrawBoxSideFrame(ctx, xSectionRight, xInnerRight, oy, H, headFilletR, isLeft: false); // 3. 剖面填充 - 只在中间区域 - // 如果有圆角,填充范围也应考虑圆角(不过Hatch边界通常可以自动处理) - if (innerFilletR > 0.01) + // 使用 sectionFilletR + if (sectionFilletR > 0.01) { - DrawRingSectionHatchWithFillet(ctx, xSectionLeft, xSectionRight, oy, H, innerFilletR); + DrawRingSectionHatchWithFillet(ctx, xSectionLeft, xSectionRight, oy, H, sectionFilletR); } else { @@ -3135,8 +3140,9 @@ namespace CadParamPluging.Cad // 修正:标注需涵盖内框宽度 (矩形部分) - // 修正:引线起点改为内框边界 (xInnerLeft/Right) 和高度底部上移圆角半径 (oy + innerFilletR),确保闭合到白色线框 - double dimOriginY = oy + innerFilletR; + // 修正:引线起点改为内框边界 (xInnerLeft/Right) 和高度底部上移圆角半径,确保闭合到白色线框 + // 使用 headFilletR 作为 Offset,因为这是侧边框的倒角 + double dimOriginY = oy + headFilletR; AddLinearDim( ctx, new Point3d(xInnerLeft, dimOriginY, 0), @@ -3167,8 +3173,8 @@ namespace CadParamPluging.Cad // 标注从圆弧最外侧开始(避免与圆弧轮廓线重叠) double xOuterRight = ox + visualTotalW; - // 修正:标注界线起点应从圆弧顶端开始,往内缩进一个圆弧高度 arcHeight + innerFilletR,定位在弦线上 - double xDimOrigin = xOuterRight - (arcHeight + innerFilletR); + // 修正:标注界线起点应从圆弧顶端开始,往内缩进一个圆弧高度 arcHeight + headFilletR,定位在弦线上 + double xDimOrigin = xOuterRight - (arcHeight + headFilletR); AddLinearDim( ctx,