diff --git a/Cad/ShaftRawFreeForgeRoundShaftDrawer.cs b/Cad/ShaftRawFreeForgeRoundShaftDrawer.cs index 2a5e499..9faf608 100644 --- a/Cad/ShaftRawFreeForgeRoundShaftDrawer.cs +++ b/Cad/ShaftRawFreeForgeRoundShaftDrawer.cs @@ -64,6 +64,10 @@ namespace CadParamPluging.Cad double W = dia.Value; double H = len.Value; + // 获取原始值用于判断断线(防止缩放干扰) + var originalDia = ctx.OriginalBag?.GetDoubleOrNull(FeatureDrivenDrawer.KeyDiameter); + double originalW = originalDia.HasValue ? originalDia.Value : W; + double ox = ctx.Center.X - W / 2.0; double oy = ctx.Center.Y - H / 2.0; @@ -73,8 +77,20 @@ namespace CadParamPluging.Cad double maxR = Math.Min(W / 2.0, H / 2.0); if (filletR > maxR) filletR = maxR; + // 判断是否需要断线 + bool needBreakLines = originalW > 150; + const double lineSpacing = 3.5; + // 1. 绘制主体轮廓 (矩形 + 圆角) - 保持原来的白色边框 - DrawRectWithFillets(ctx, ox, oy, W, H, filletR, DrawingStyleManager.Role.OutlineBold); + if (needBreakLines) + { + double xBreak = ox + W / 4.0; + DrawRectWithBreak(ctx, ox, oy, W, H, filletR, xBreak, lineSpacing); + } + else + { + DrawRectWithFillets(ctx, ox, oy, W, H, filletR, DrawingStyleManager.Role.OutlineBold); + } // 2. 绘制左右两端的弧线(向外凸出) // 弧高设为 H/5(高度的1/5,确保弧高小于半弦长) @@ -84,6 +100,12 @@ namespace CadParamPluging.Cad // 3. 绘制中心线 (横向,在中间位置) DrawHorizontalCenterLine(ctx, ctx.Center.Y, ox, ox + W); + // 4. 绘制断线 (如果需要) + if (needBreakLines) + { + DrawBreakLines(ctx, ox, oy, W, H); + } + // 3. 尺寸标注 // 3.1 直径标注 (底部) @@ -163,7 +185,16 @@ namespace CadParamPluging.Cad double pOx = ctx.Center.X - pW / 2.0; double pOy = ctx.Center.Y - pH / 2.0; - DrawRectOutline(ctx, pOx, pOy, pW, pH, DrawingStyleManager.Role.PartContour); + if (needBreakLines) + { + // 使用与锻件相同的断线X坐标和间距 + double xBreak = ox + W / 4.0; + DrawRectOutlineWithBreak(ctx, pOx, pOy, pW, pH, xBreak, lineSpacing, DrawingStyleManager.Role.PartContour); + } + else + { + DrawRectOutline(ctx, pOx, pOy, pW, pH, DrawingStyleManager.Role.PartContour); + } } } @@ -300,5 +331,131 @@ namespace CadParamPluging.Cad } return newBag; } + + /// + /// 绘制断线(使用 BreakLine 样式:白色 PHANTOM 双点划线) + /// + private static void DrawBreakLines(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double width, double height) + { + const double lineSpacing = 3.5; + const double extend = 5.0; + + double xBreak = ox + width / 4.0; + + double y0 = oy - extend; + double y1 = oy + height + extend; + + var line1 = new Line(new Point3d(xBreak, y0, 0), new Point3d(xBreak, y1, 0)); + ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine); + ctx.Btr.AppendEntity(line1); + ctx.Tr.AddNewlyCreatedDBObject(line1, true); + + var line2 = new Line(new Point3d(xBreak + lineSpacing, y0, 0), new Point3d(xBreak + lineSpacing, y1, 0)); + ctx.Style?.Apply(line2, DrawingStyleManager.Role.BreakLine); + ctx.Btr.AppendEntity(line2); + ctx.Tr.AddNewlyCreatedDBObject(line2, true); + } + + /// + /// 绘制带断口的矩形轮廓(在断线位置打断上下横线) + /// + private static void DrawRectWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double r, double xBreak, double breakWidth) + { + // 左边竖线 + var leftLine = new Line(new Point3d(x, y, 0), new Point3d(x, y + h, 0)); + ctx.Style?.Apply(leftLine, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(leftLine); + ctx.Tr.AddNewlyCreatedDBObject(leftLine, true); + + // 右边竖线 + var rightLine = new Line(new Point3d(x + w, y, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(rightLine, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(rightLine); + ctx.Tr.AddNewlyCreatedDBObject(rightLine, true); + + // 底边:断开 [xBreak, xBreak + breakWidth] + // 左段 + var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(xBreak, y, 0)); + ctx.Style?.Apply(bottomLeft, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(bottomLeft); + ctx.Tr.AddNewlyCreatedDBObject(bottomLeft, true); + // 右段 + var bottomRight = new Line(new Point3d(xBreak + breakWidth, y, 0), new Point3d(x + w, y, 0)); + ctx.Style?.Apply(bottomRight, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(bottomRight); + ctx.Tr.AddNewlyCreatedDBObject(bottomRight, true); + + // 顶边:断开 [xBreak, xBreak + breakWidth] + // 左段 + var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(xBreak, y + h, 0)); + ctx.Style?.Apply(topLeft, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(topLeft); + ctx.Tr.AddNewlyCreatedDBObject(topLeft, true); + // 右段 + var topRight = new Line(new Point3d(xBreak + breakWidth, y + h, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(topRight, DrawingStyleManager.Role.OutlineBold); + ctx.Btr.AppendEntity(topRight); + ctx.Tr.AddNewlyCreatedDBObject(topRight, true); + } + + /// + /// 绘制带断口的零件轮廓(在断线位置打断上下横线) + /// 支持自定义 Role (通常为 PartContour) + /// + private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, DrawingStyleManager.Role role) + { + // 左边竖线 + var leftLine = new Line(new Point3d(x, y, 0), new Point3d(x, y + h, 0)); + ctx.Style?.Apply(leftLine, role); + ctx.Btr.AppendEntity(leftLine); + ctx.Tr.AddNewlyCreatedDBObject(leftLine, true); + + // 右边竖线 + var rightLine = new Line(new Point3d(x + w, y, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(rightLine, role); + ctx.Btr.AppendEntity(rightLine); + ctx.Tr.AddNewlyCreatedDBObject(rightLine, true); + + // 底边:断开 [xBreak, xBreak + breakWidth] + // 需要判断 xBreak 是否在当前矩形范围内 + // 通常零件在锻件内部,且断线位置也会穿过零件 + // 我们假设断线切断了矩形(如果 xBreak < x 或 xBreak > x+w,应该做特殊处理,这里暂不考虑极端情况) + + // 左段 + if (xBreak > x) + { + var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(xBreak, x + w), y, 0)); + ctx.Style?.Apply(bottomLeft, role); + ctx.Btr.AppendEntity(bottomLeft); + ctx.Tr.AddNewlyCreatedDBObject(bottomLeft, true); + } + + // 右段 + if (xBreak + breakWidth < x + w) + { + var bottomRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y, 0), new Point3d(x + w, y, 0)); + ctx.Style?.Apply(bottomRight, role); + ctx.Btr.AppendEntity(bottomRight); + ctx.Tr.AddNewlyCreatedDBObject(bottomRight, true); + } + + // 顶边:断开 [xBreak, xBreak + breakWidth] + // 左段 + if (xBreak > x) + { + var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(xBreak, x + w), y + h, 0)); + ctx.Style?.Apply(topLeft, role); + ctx.Btr.AppendEntity(topLeft); + ctx.Tr.AddNewlyCreatedDBObject(topLeft, true); + } + // 右段 + if (xBreak + breakWidth < x + w) + { + var topRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y + h, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(topRight, role); + ctx.Btr.AppendEntity(topRight); + ctx.Tr.AddNewlyCreatedDBObject(topRight, true); + } + } } } diff --git a/Cad/ShaftRawFreeForgeSquareShaftDrawer.cs b/Cad/ShaftRawFreeForgeSquareShaftDrawer.cs index 2adad81..b914214 100644 --- a/Cad/ShaftRawFreeForgeSquareShaftDrawer.cs +++ b/Cad/ShaftRawFreeForgeSquareShaftDrawer.cs @@ -220,7 +220,15 @@ namespace CadParamPluging.Cad double pOx = ctx.Center.X - pL / 2.0; double pOy = ctx.Center.Y - pH / 2.0; - DrawRectOutline(ctx, pOx, pOy, pL, pH, DrawingStyleManager.Role.PartContour); + if (needBreakLines) + { + double xBreak = ox + S1 / 4.0; + DrawRectOutlineWithBreak(ctx, pOx, pOy, pL, pH, xBreak, lineSpacing, DrawingStyleManager.Role.PartContour); + } + else + { + DrawRectOutline(ctx, pOx, pOy, pL, pH, DrawingStyleManager.Role.PartContour); + } } } @@ -444,6 +452,63 @@ namespace CadParamPluging.Cad ctx.Btr.AppendEntity(line); ctx.Tr.AddNewlyCreatedDBObject(line, true); } + + + /// + /// 绘制带断口的零件轮廓(在断线位置打断上下横线) + /// 支持自定义 Role (通常为 PartContour) + /// + private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, DrawingStyleManager.Role role) + { + // 左边竖线 + var leftLine = new Line(new Point3d(x, y, 0), new Point3d(x, y + h, 0)); + ctx.Style?.Apply(leftLine, role); + ctx.Btr.AppendEntity(leftLine); + ctx.Tr.AddNewlyCreatedDBObject(leftLine, true); + + // 右边竖线 + var rightLine = new Line(new Point3d(x + w, y, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(rightLine, role); + ctx.Btr.AppendEntity(rightLine); + ctx.Tr.AddNewlyCreatedDBObject(rightLine, true); + + // 底边:断开 [xBreak, xBreak + breakWidth] + // 左段 + if (xBreak > x) + { + var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(xBreak, x + w), y, 0)); + ctx.Style?.Apply(bottomLeft, role); + ctx.Btr.AppendEntity(bottomLeft); + ctx.Tr.AddNewlyCreatedDBObject(bottomLeft, true); + } + + // 右段 + if (xBreak + breakWidth < x + w) + { + var bottomRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y, 0), new Point3d(x + w, y, 0)); + ctx.Style?.Apply(bottomRight, role); + ctx.Btr.AppendEntity(bottomRight); + ctx.Tr.AddNewlyCreatedDBObject(bottomRight, true); + } + + // 顶边:断开 [xBreak, xBreak + breakWidth] + // 左段 + if (xBreak > x) + { + var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(xBreak, x + w), y + h, 0)); + ctx.Style?.Apply(topLeft, role); + ctx.Btr.AppendEntity(topLeft); + ctx.Tr.AddNewlyCreatedDBObject(topLeft, true); + } + // 右段 + if (xBreak + breakWidth < x + w) + { + var topRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y + h, 0), new Point3d(x + w, y + h, 0)); + ctx.Style?.Apply(topRight, role); + ctx.Btr.AppendEntity(topRight); + ctx.Tr.AddNewlyCreatedDBObject(topRight, true); + } + } } }