Unify leader arrows and break lines with nominal thickness

This commit is contained in:
sladro 2026-06-22 15:34:32 +08:00
parent 2fb938cf96
commit faa79bcb37
17 changed files with 579 additions and 238 deletions

View File

@ -637,7 +637,7 @@ namespace CadParamPluging.Cad
// 尺寸参数微调
SetDimDouble(dim, "Dimtxt", 3.5); // 文字高度
SetDimDouble(dim, "Dimasz", 2.5); // 箭头大小
SetDimDouble(dim, "Dimasz", FeatureDrivenDrawer.DimensionArrowSize); // 箭头大小
SetDimDouble(dim, "Dimgap", 1.0); // 文字偏移
SetDimDouble(dim, "Dimexe", 1.0); // 延伸超出量
SetDimDouble(dim, "Dimexo", 0.0); // 原点偏移
@ -840,12 +840,13 @@ namespace CadParamPluging.Cad
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = true;
leader.HasArrowHead = false;
leader.ColorIndex = 7;
leader.Layer = "0";
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7);
var text = new DBText();
text.TextString = textContent;

View File

@ -769,12 +769,13 @@ namespace CadParamPluging.Cad
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = true;
leader.HasArrowHead = false;
leader.ColorIndex = 7; // 白色
leader.Layer = "0";
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7);
var text = new DBText();
text.TextString = textContent;
@ -837,7 +838,7 @@ namespace CadParamPluging.Cad
{
if (dim == null) return;
TrySetDimProp(dim, "Dimtxt", 3.5);
TrySetDimProp(dim, "Dimasz", 2.5);
TrySetDimProp(dim, "Dimasz", FeatureDrivenDrawer.DimensionArrowSize);
TrySetDimProp(dim, "Dimgap", 1.0);
TrySetDimProp(dim, "Dimexe", 1.0);
TrySetDimProp(dim, "Dimexo", 0.0);

View File

@ -326,7 +326,7 @@ namespace CadParamPluging.Cad
{
if (dim == null) return;
TrySetDimProp(dim, "Dimtxt", 3.5);
TrySetDimProp(dim, "Dimasz", 2.5);
TrySetDimProp(dim, "Dimasz", FeatureDrivenDrawer.DimensionArrowSize);
TrySetDimProp(dim, "Dimgap", 1.0);
TrySetDimProp(dim, "Dimexe", 1.0);
TrySetDimProp(dim, "Dimexo", 0.0);

View File

@ -12,7 +12,7 @@ namespace CadParamPluging.Cad
OutlineBold,
OutlineThin,
PartContour,
BreakLine, // 截断线(白色双点划线)
BreakLine, // 截断线
Centerline,
Hidden,
Hatch,
@ -66,7 +66,7 @@ namespace CadParamPluging.Cad
case Role.PartContour:
return new LayerSpec { LayerName = "双点划线", DefaultLinetypeName = "PHANTOM", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
case Role.BreakLine:
return new LayerSpec { LayerName = "截断线", DefaultLinetypeName = BreakLineLinetypeName, DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
return new LayerSpec { LayerName = "截断线", DefaultLinetypeName = BreakLineLinetypeName, DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 4 };
case Role.Centerline:
return new LayerSpec { LayerName = "中心线", DefaultLinetypeName = "CENTER", DefaultLineWeight = LineWeight.LineWeight015, DefaultColorIndex = 7 };
case Role.Hidden:

View File

@ -88,6 +88,8 @@ namespace CadParamPluging.Cad
public const string KeyHardness = "Hardness"; // 硬度
public const string KeyMarkingContent = "MarkingContent"; // 标刻内容
public const double DimensionArrowSize = 2.5;
private const double LeaderArrowWidthRatio = 0.6;
#endregion
@ -129,6 +131,46 @@ namespace CadParamPluging.Cad
#endregion
public const double BreakLineAmplitude = 1.2;
public static void DrawSBreakLinePair(DrawingContext ctx, double x, double y0, double y1, double secondLineOffset)
{
const int segments = 24;
const double amplitude = BreakLineAmplitude;
DrawSBreakLine(ctx, x, y0, y1, amplitude, segments);
DrawSBreakLine(ctx, x + secondLineOffset, y0, y1, amplitude, segments);
}
public static double GetSBreakLineXAtY(double x, double y, double y0, double y1)
{
if (Math.Abs(y1 - y0) <= 1e-9)
{
return x;
}
var t = (y - y0) / (y1 - y0);
return x + BreakLineAmplitude * Math.Sin(Math.PI * 2.0 * t);
}
private static void DrawSBreakLine(DrawingContext ctx, double x, double y0, double y1, double amplitude, int segments)
{
var poly = new Polyline();
for (var i = 0; i <= segments; i++)
{
var t = (double)i / segments;
var y = y0 + (y1 - y0) * t;
var waveX = x + amplitude * Math.Sin(Math.PI * 2.0 * t);
poly.AddVertexAt(i, new Point2d(waveX, y), 0, 0, 0);
}
ctx.Style?.Apply(poly, DrawingStyleManager.Role.BreakLine);
try { poly.Linetype = "Continuous"; } catch { }
poly.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(poly);
ctx.Tr.AddNewlyCreatedDBObject(poly, true);
}
#region
/// <summary>
@ -190,13 +232,14 @@ namespace CadParamPluging.Cad
if (isMachined && isRolling)
{
var minWallThickness = bag.GetDoubleOrNull(KeyMinWallThickness);
var innerDia = bag.GetDoubleOrNull(KeyInnerDiameter2) ?? 0;
var nominalWallThickness = (outerDia - innerDia) / 2.0;
if (minWallThickness.HasValue && minWallThickness.Value > 0)
if (innerDia > 0 && nominalWallThickness > 0)
{
// 示意图模式:视觉宽度 = 最小壁厚 * 3不是物理外径
// 示意图模式:视觉宽度 = 名义壁厚 * 3不是公差后的 Tmin
// 比例 2:1 内孔:实体
activeWidth = minWallThickness.Value * 3.0;
activeWidth = nominalWallThickness * 3.0;
}
else
{
@ -1103,48 +1146,9 @@ namespace CadParamPluging.Cad
/// </summary>
private static void DrawRingSymmetryAxis(DrawingContext ctx, double ox, double oy, double height)
{
const double extend = 5.0; // 截断线在轮廓上下各延长一点
const double frameMargin = 5.0; // 避免越过图框边界
const double lineSpacing = 3.0; // 两根截断线间距3mm
var y0 = oy - extend;
var y1 = oy + height + extend;
// 若能检测到白色外框,则把截断线端点夹在图框内(留出少量安全边距)。
try
{
var frameExtents = TemplateDrawingService.ComputeWhiteFrameExtents(ctx?.Ctx);
if (frameExtents.HasValue)
{
var frame = frameExtents.Value;
y0 = Math.Max(y0, frame.MinPoint.Y + frameMargin);
y1 = Math.Min(y1, frame.MaxPoint.Y - frameMargin);
}
}
catch
{
// ignore
}
// 极端情况下(图框过小/检测异常导致端点反转)退回到原始高度。
if (y1 <= y0)
{
y0 = oy;
y1 = oy + height;
}
// 绘制两根双点划线,间距 lineSpacing
// 第一根在 ox 位置
var line1 = new Line(new Point3d(ox, y0, 0), new Point3d(ox, y1, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine); // 使用截断线样式(白色双点划线)
ctx.Btr.AppendEntity(line1);
ctx.Tr.AddNewlyCreatedDBObject(line1, true);
// 第二根在 ox - lineSpacing 位置
var line2 = new Line(new Point3d(ox - lineSpacing, y0, 0), new Point3d(ox - lineSpacing, y1, 0));
ctx.Style?.Apply(line2, DrawingStyleManager.Role.BreakLine); // 使用截断线样式(白色双点划线)
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
DrawSBreakLinePair(ctx, ox, oy, oy + height, -lineSpacing);
}
/// <summary>
@ -2439,7 +2443,7 @@ namespace CadParamPluging.Cad
// Template dimstyle may have very small DIMTXT; apply per-dimension overrides to keep it readable.
// Values are in drawing units (typically mm).
TrySetDimProp(dim, "Dimtxt", 3.5);
TrySetDimProp(dim, "Dimasz", 2.5);
TrySetDimProp(dim, "Dimasz", DimensionArrowSize);
TrySetDimProp(dim, "Dimgap", 1.0);
TrySetDimProp(dim, "Dimexe", 1.0);
TrySetDimProp(dim, "Dimexo", 0.0);
@ -2780,6 +2784,40 @@ namespace CadParamPluging.Cad
}
#endregion
public static void DrawLeaderArrowHead(DrawingContext ctx, Point3d tip, Point3d nextPoint, int colorIndex)
{
try
{
var dx = nextPoint.X - tip.X;
var dy = nextPoint.Y - tip.Y;
var len = Math.Sqrt(dx * dx + dy * dy);
if (len <= 0.001)
{
return;
}
var ux = dx / len;
var uy = dy / len;
var arrowWidth = DimensionArrowSize * LeaderArrowWidthRatio;
var baseX = tip.X + DimensionArrowSize * ux;
var baseY = tip.Y + DimensionArrowSize * uy;
var perpX = -uy;
var perpY = ux;
var arrow = new Solid(
tip,
new Point3d(baseX + arrowWidth / 2.0 * perpX, baseY + arrowWidth / 2.0 * perpY, 0),
new Point3d(baseX - arrowWidth / 2.0 * perpX, baseY - arrowWidth / 2.0 * perpY, 0));
arrow.ColorIndex = colorIndex;
ctx.Btr.AppendEntity(arrow);
ctx.Tr.AddNewlyCreatedDBObject(arrow, true);
}
catch
{
// ignore
}
}
public static void DrawSpecialInnerHoleLeader(DrawingContext ctx, double ox, double oy, double height, double innerDia)
{
try
@ -2803,12 +2841,13 @@ namespace CadParamPluging.Cad
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = true;
leader.HasArrowHead = false;
leader.ColorIndex = 7; // 白色
leader.Layer = "0";
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
DrawLeaderArrowHead(ctx, p1, p2, 7);
// 绘制文字
var text = new DBText();
@ -2856,12 +2895,13 @@ namespace CadParamPluging.Cad
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = true;
leader.HasArrowHead = false;
leader.ColorIndex = 7; // 白色
leader.Layer = "0";
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
DrawLeaderArrowHead(ctx, p1, p2, 7);
// 绘制文字
var text = new DBText();
@ -2898,18 +2938,21 @@ namespace CadParamPluging.Cad
var p2 = new Point3d(xStart + 15, yStart - 15, 0);
var p3 = new Point3d(p2.X + 10, p2.Y, 0); // 这里的p3是直线的终点短线接在这里
// 绘制引线
var poly = new Polyline();
poly.AddVertexAt(0, new Point2d(p1.X, p1.Y), 0, 0, 0);
poly.AddVertexAt(1, new Point2d(p2.X, p2.Y), 0, 0, 0);
poly.AddVertexAt(2, new Point2d(p3.X, p3.Y), 0, 0, 0);
ctx.Style?.Apply(poly, DrawingStyleManager.Role.Dimension); // 使用 Dimension 角色
// 修改为青色 (ColorIndex 4)
poly.ColorIndex = 4;
// 绘制带箭头的引线
var leader = new Leader();
leader.SetDatabaseDefaults();
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = false;
ctx.Btr.AppendEntity(poly);
ctx.Tr.AddNewlyCreatedDBObject(poly, true);
ctx.Style?.Apply(leader, DrawingStyleManager.Role.Dimension); // 使用 Dimension 角色
// 修改为青色 (ColorIndex 4)
leader.ColorIndex = 4;
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
DrawLeaderArrowHead(ctx, p1, p2, 4);
// 2. 文字和外围圆圈 (无论硬度值是什么,只显示固定的"HB"符号)
string displayTxt = "HB";

View File

@ -101,15 +101,14 @@ namespace CadParamPluging.Cad
double visualOuterR = physicalOuterR;
double visualInnerR = physicalInnerR;
// 轧制+车加工(示意图模式)特殊处理
// 轧制示意图几何按名义壁厚画Tmin 标注文字仍使用考虑公差后的 MinWallThickness。
if (ctx.IsMachined)
{
var minWallThkParam = bag.GetDoubleOrNull(KeyMinWallThickness);
if (minWallThkParam.HasValue && minWallThkParam.Value > 0)
var nominalWallThickness = (physicalOuterR - physicalInnerR);
if (physicalInnerR > 0 && nominalWallThickness > 0)
{
visualInnerR = minWallThkParam.Value * 2.0;
visualOuterR = minWallThkParam.Value * 3.0;
visualInnerR = nominalWallThickness * 2.0;
visualOuterR = nominalWallThickness * 3.0;
}
else
{
@ -392,12 +391,13 @@ namespace CadParamPluging.Cad
leader.AppendVertex(p1);
leader.AppendVertex(p2);
leader.AppendVertex(p3);
leader.HasArrowHead = true;
leader.HasArrowHead = false;
leader.ColorIndex = 7; // 白色
leader.Layer = "0";
ctx.Btr.AppendEntity(leader);
ctx.Tr.AddNewlyCreatedDBObject(leader, true);
FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7);
// 绘制文字
var text = new DBText();
@ -455,42 +455,9 @@ namespace CadParamPluging.Cad
private static void DrawRingSymmetryAxis(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double height)
{
const double extend = 5.0;
const double frameMargin = 5.0;
const double lineSpacing = 3.0;
var y0 = oy - extend;
var y1 = oy + height + extend;
try
{
var frameExtents = TemplateDrawingService.ComputeWhiteFrameExtents(ctx?.Ctx);
if (frameExtents.HasValue)
{
var frame = frameExtents.Value;
y0 = Math.Max(y0, frame.MinPoint.Y + frameMargin);
y1 = Math.Min(y1, frame.MaxPoint.Y - frameMargin);
}
}
catch { }
if (y1 <= y0)
{
y0 = oy;
y1 = oy + height;
}
var line1 = new Line(new Point3d(ox, y0, 0), new Point3d(ox, y1, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine);
line1.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(line1);
ctx.Tr.AddNewlyCreatedDBObject(line1, true);
var line2 = new Line(new Point3d(ox - lineSpacing, y0, 0), new Point3d(ox - lineSpacing, y1, 0));
ctx.Style?.Apply(line2, DrawingStyleManager.Role.BreakLine);
line2.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
FeatureDrivenDrawer.DrawSBreakLinePair(ctx, ox, oy, oy + height, -lineSpacing);
}
@ -776,7 +743,7 @@ namespace CadParamPluging.Cad
{
if (dim == null) return;
TrySetDimProp(dim, "Dimtxt", 3.5);
TrySetDimProp(dim, "Dimasz", 2.5);
TrySetDimProp(dim, "Dimasz", FeatureDrivenDrawer.DimensionArrowSize);
TrySetDimProp(dim, "Dimgap", 1.0);
TrySetDimProp(dim, "Dimexe", 1.0);
TrySetDimProp(dim, "Dimexo", 0.0);

View File

@ -109,16 +109,14 @@ namespace CadParamPluging.Cad
double visualOuterR = physicalOuterR;
double visualInnerR = physicalInnerR;
// 强制启用"示意图模式"逻辑 (原 IsMachined 判断)
// 因为在 RingRawRollingGenerator 中被强制设置了 "车加工"
// 轧制示意图几何按名义壁厚画Tmin 标注文字仍使用考虑公差后的 MinWallThickness。
if (true)
{
var minWallThkParam = bag.GetDoubleOrNull(KeyMinWallThickness);
if (minWallThkParam.HasValue && minWallThkParam.Value > 0)
var nominalWallThickness = (physicalOuterR - physicalInnerR);
if (physicalInnerR > 0 && nominalWallThickness > 0)
{
visualInnerR = minWallThkParam.Value * 2.0;
visualOuterR = minWallThkParam.Value * 3.0;
visualInnerR = nominalWallThickness * 2.0;
visualOuterR = nominalWallThickness * 3.0;
}
else
{
@ -346,42 +344,9 @@ namespace CadParamPluging.Cad
private static void DrawRingSymmetryAxis(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double height)
{
const double extend = 5.0;
const double frameMargin = 5.0;
const double lineSpacing = 3.0;
var y0 = oy - extend;
var y1 = oy + height + extend;
try
{
var frameExtents = TemplateDrawingService.ComputeWhiteFrameExtents(ctx?.Ctx);
if (frameExtents.HasValue)
{
var frame = frameExtents.Value;
y0 = Math.Max(y0, frame.MinPoint.Y + frameMargin);
y1 = Math.Min(y1, frame.MaxPoint.Y - frameMargin);
}
}
catch { }
if (y1 <= y0)
{
y0 = oy;
y1 = oy + height;
}
var line1 = new Line(new Point3d(ox, y0, 0), new Point3d(ox, y1, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine);
line1.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(line1);
ctx.Tr.AddNewlyCreatedDBObject(line1, true);
var line2 = new Line(new Point3d(ox - lineSpacing, y0, 0), new Point3d(ox - lineSpacing, y1, 0));
ctx.Style?.Apply(line2, DrawingStyleManager.Role.BreakLine);
line2.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
FeatureDrivenDrawer.DrawSBreakLinePair(ctx, ox, oy, oy + height, -lineSpacing);
}
@ -663,7 +628,7 @@ namespace CadParamPluging.Cad
{
if (dim == null) return;
TrySetDimProp(dim, "Dimtxt", 3.5);
TrySetDimProp(dim, "Dimasz", 2.5);
TrySetDimProp(dim, "Dimasz", FeatureDrivenDrawer.DimensionArrowSize);
TrySetDimProp(dim, "Dimgap", 1.0);
TrySetDimProp(dim, "Dimexe", 1.0);
TrySetDimProp(dim, "Dimexo", 0.0);

View File

@ -115,7 +115,7 @@ namespace CadParamPluging.Cad
DrawShaftRoundHeadUnifiedOutline(ctx, ox, oy, W, H, w, r, xf_left, xf_right, fx_L_tangTop, fy_L_tangTop, fx_L_tang, fy_L_tangBot, fx_R_tangTop, fy_R_tangTop, fx_R_tang, fy_R_tangBot, needBreakLines, xBreak, lineSpacing);
// 3. 绘制中心线 (横向,在中间位置)
DrawHorizontalCenterLine(ctx, ctx.Center.Y, ox, ox + W, needBreakLines, xBreak, lineSpacing);
DrawHorizontalCenterLine(ctx, ctx.Center.Y, ox, ox + W, needBreakLines, xBreak, lineSpacing, oy, oy + H);
// 4. 绘制断线 (如果需要)
if (needBreakLines)
@ -169,14 +169,6 @@ namespace CadParamPluging.Cad
FeatureDrivenDrawer.AddLinearDim(ctx, new Point3d(xf_right, oy, 0), new Point3d(xf_right, oy + H, 0), new Point3d(dimX, ctx.Center.Y, 0), 90, dimText);
}
// 3.3 补加未注侧倒角标注指示
if (filletR > 0)
{
double cxRight = xf_right;
double cyTop = oy + H - filletR;
DrawHeadFilletRadiusLeader(ctx, cxRight, cyTop, filletR);
}
// 4. 硬度和标刻
var hardnessVal = bag.GetString(FeatureDrivenDrawer.KeyHardness);
if (!string.IsNullOrWhiteSpace(hardnessVal) && hardnessVal != "空")
@ -211,7 +203,7 @@ namespace CadParamPluging.Cad
{
// 使用与锻件相同的断线X坐标和间距
// double xBreak = ox + W / 4.0; // variable is already declared in outer scope
DrawRectOutlineWithBreak(ctx, pOx, pOy, pW, pH, xBreak, lineSpacing, DrawingStyleManager.Role.PartContour);
DrawRectOutlineWithBreak(ctx, pOx, pOy, pW, pH, xBreak, lineSpacing, oy, oy + H, DrawingStyleManager.Role.PartContour);
}
else
{
@ -352,10 +344,14 @@ namespace CadParamPluging.Cad
}
else
{
var tL = new Line(new Point3d(xf_left, oy + H, 0), new Point3d(xBreak, oy + H, 0));
var tR = new Line(new Point3d(xBreak + breakWidth, oy + H, 0), new Point3d(xf_right, oy + H, 0));
var bL = new Line(new Point3d(xf_left, oy, 0), new Point3d(xBreak, oy, 0));
var bR = new Line(new Point3d(xBreak + breakWidth, oy, 0), new Point3d(xf_right, oy, 0));
var topBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, oy + H, oy, oy + H);
var topBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, oy + H, oy, oy + H);
var bottomBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, oy, oy, oy + H);
var bottomBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, oy, oy, oy + H);
var tL = new Line(new Point3d(xf_left, oy + H, 0), new Point3d(topBreakLeft, oy + H, 0));
var tR = new Line(new Point3d(topBreakRight, oy + H, 0), new Point3d(xf_right, oy + H, 0));
var bL = new Line(new Point3d(xf_left, oy, 0), new Point3d(bottomBreakLeft, oy, 0));
var bR = new Line(new Point3d(bottomBreakRight, oy, 0), new Point3d(xf_right, oy, 0));
ctx.Style?.Apply(tL, DrawingStyleManager.Role.OutlineBold);
ctx.Style?.Apply(tR, DrawingStyleManager.Role.OutlineBold);
ctx.Style?.Apply(bL, DrawingStyleManager.Role.OutlineBold);
@ -446,7 +442,7 @@ namespace CadParamPluging.Cad
catch { }
}
private static void DrawHorizontalCenterLine(FeatureDrivenDrawer.DrawingContext ctx, double centerY, double xLeft, double xRight, bool hasBreak = false, double xBreak = 0, double breakWidth = 0)
private static void DrawHorizontalCenterLine(FeatureDrivenDrawer.DrawingContext ctx, double centerY, double xLeft, double xRight, bool hasBreak = false, double xBreak = 0, double breakWidth = 0, double breakY0 = 0, double breakY1 = 0)
{
const double extend = 5.0;
@ -460,13 +456,15 @@ namespace CadParamPluging.Cad
else
{
// Left segment
var line1 = new Line(new Point3d(xLeft - extend, centerY, 0), new Point3d(xBreak, centerY, 0));
var breakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, centerY, breakY0, breakY1);
var breakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, centerY, breakY0, breakY1);
var line1 = new Line(new Point3d(xLeft - extend, centerY, 0), new Point3d(breakLeft, centerY, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.Centerline);
ctx.Btr.AppendEntity(line1);
ctx.Tr.AddNewlyCreatedDBObject(line1, true);
// Right segment
var line2 = new Line(new Point3d(xBreak + breakWidth, centerY, 0), new Point3d(xRight + extend, centerY, 0));
var line2 = new Line(new Point3d(breakRight, centerY, 0), new Point3d(xRight + extend, centerY, 0));
ctx.Style?.Apply(line2, DrawingStyleManager.Role.Centerline);
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
@ -507,24 +505,12 @@ namespace CadParamPluging.Cad
private static void DrawBreakLines(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double width, double height)
{
const double lineSpacing = 3.0;
const double extend = 5.0;
double xBreak = ox + width / 4.0;
double y0 = oy - extend;
double y1 = oy + height + extend;
double y0 = oy;
double y1 = oy + height;
var line1 = new Line(new Point3d(xBreak, y0, 0), new Point3d(xBreak, y1, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine);
line1.LinetypeScale = 5.0;
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);
line2.LinetypeScale = 5.0;
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
FeatureDrivenDrawer.DrawSBreakLinePair(ctx, xBreak, y0, y1, lineSpacing);
}
@ -534,7 +520,7 @@ namespace CadParamPluging.Cad
/// 绘制带断口的零件轮廓(在断线位置打断上下横线)
/// 支持自定义 Role (通常为 PartContour)
/// </summary>
private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, DrawingStyleManager.Role role)
private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, double breakY0, double breakY1, DrawingStyleManager.Role role)
{
// 左边竖线
var leftLine = new Line(new Point3d(x, y, 0), new Point3d(x, y + h, 0));
@ -556,16 +542,18 @@ namespace CadParamPluging.Cad
// 左段
if (xBreak > x)
{
var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(xBreak, x + w), y, 0));
var bottomBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, y, breakY0, breakY1);
var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(bottomBreakLeft, x + w), y, 0));
ctx.Style?.Apply(bottomLeft, role);
ctx.Btr.AppendEntity(bottomLeft);
ctx.Tr.AddNewlyCreatedDBObject(bottomLeft, true);
}
// 右段
if (xBreak + breakWidth < x + w)
var bottomBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, y, breakY0, breakY1);
if (bottomBreakRight < x + w)
{
var bottomRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y, 0), new Point3d(x + w, y, 0));
var bottomRight = new Line(new Point3d(Math.Max(bottomBreakRight, x), y, 0), new Point3d(x + w, y, 0));
ctx.Style?.Apply(bottomRight, role);
ctx.Btr.AppendEntity(bottomRight);
ctx.Tr.AddNewlyCreatedDBObject(bottomRight, true);
@ -575,15 +563,17 @@ namespace CadParamPluging.Cad
// 左段
if (xBreak > x)
{
var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(xBreak, x + w), y + h, 0));
var topBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, y + h, breakY0, breakY1);
var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(topBreakLeft, 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 topBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, y + h, breakY0, breakY1);
if (topBreakRight < x + w)
{
var topRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y + h, 0), new Point3d(x + w, y + h, 0));
var topRight = new Line(new Point3d(Math.Max(topBreakRight, 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);

View File

@ -119,12 +119,9 @@ namespace CadParamPluging.Cad
double sectionWArg = S3;
DrawShaftRoundHeadUnifiedOutline(ctx, ox, oy, S1, S2, w, r, xf_left, xf_right, fx_L_tangTop, fy_L_tangTop, fx_L_tang, fy_L_tangBot, fx_R_tangTop, fy_R_tangTop, fx_R_tang, fy_R_tangBot, needBreakLines, xBreak, lineSpacing, sectionOxArg, sectionWArg);
// 2. 中心线 (贯穿左右水平方向)
// 2. 中心线(断线区域不穿线)
double clY = oy + S2 / 2.0;
var centerLine = new Line(new Point3d(ox - 10, clY, 0), new Point3d(ox + S1 + 10, clY, 0));
ctx.Style?.Apply(centerLine, DrawingStyleManager.Role.Centerline);
ctx.Btr.AppendEntity(centerLine);
ctx.Tr.AddNewlyCreatedDBObject(centerLine, true);
DrawHorizontalCenterLine(ctx, clY, ox, ox + S1, needBreakLines, xBreak, lineSpacing, oy, oy + S2);
// 4. Draw Break Lines if needed
if (needBreakLines)
@ -195,14 +192,6 @@ namespace CadParamPluging.Cad
FeatureDrivenDrawer.AddLinearDim(ctx, new Point3d(xf_right, oy, 0), new Point3d(xf_right, oy + S2, 0), new Point3d(dimX, ctx.Center.Y, 0), 90, dimText);
}
// 补加未注侧倒角标注指示
if (filletR > 0)
{
double cxRight = xf_right;
double cyTop = oy + S2 - filletR;
DrawHeadFilletRadiusLeader(ctx, cxRight, cyTop, filletR);
}
if (S3 > 0)
{
var val = ctx.OriginalBag?.GetDoubleOrNull(FeatureDrivenDrawer.KeySquareShaftSize3) ?? S3;
@ -255,7 +244,7 @@ namespace CadParamPluging.Cad
if (needBreakLines)
{
DrawRectOutlineWithBreak(ctx, pOx, pOy, pL, pH, xBreak, lineSpacing, DrawingStyleManager.Role.PartContour);
DrawRectOutlineWithBreak(ctx, pOx, pOy, pL, pH, xBreak, lineSpacing, oy, oy + S2, DrawingStyleManager.Role.PartContour);
}
else
{
@ -270,25 +259,39 @@ namespace CadParamPluging.Cad
private static void DrawBreakLines(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double width, double height)
{
const double lineSpacing = 3.0;
const double extend = 5.0;
double xBreak = ox + width / 4.0;
double y0 = oy - extend;
double y1 = oy + height + extend;
double y0 = oy;
double y1 = oy + height;
var line1 = new Line(new Point3d(xBreak, y0, 0), new Point3d(xBreak, y1, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.BreakLine);
line1.LinetypeScale = 5.0;
FeatureDrivenDrawer.DrawSBreakLinePair(ctx, xBreak, y0, y1, lineSpacing);
}
private static void DrawHorizontalCenterLine(FeatureDrivenDrawer.DrawingContext ctx, double centerY, double xLeft, double xRight, bool hasBreak = false, double xBreak = 0, double breakWidth = 0, double breakY0 = 0, double breakY1 = 0)
{
const double extend = 5.0;
if (!hasBreak)
{
var line = new Line(new Point3d(xLeft - extend, centerY, 0), new Point3d(xRight + extend, centerY, 0));
ctx.Style?.Apply(line, DrawingStyleManager.Role.Centerline);
ctx.Btr.AppendEntity(line);
ctx.Tr.AddNewlyCreatedDBObject(line, true);
return;
}
var breakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, centerY, breakY0, breakY1);
var breakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, centerY, breakY0, breakY1);
var line1 = new Line(new Point3d(xLeft - extend, centerY, 0), new Point3d(breakLeft, centerY, 0));
ctx.Style?.Apply(line1, DrawingStyleManager.Role.Centerline);
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);
line2.LinetypeScale = 5.0;
var line2 = new Line(new Point3d(breakRight, centerY, 0), new Point3d(xRight + extend, centerY, 0));
ctx.Style?.Apply(line2, DrawingStyleManager.Role.Centerline);
ctx.Btr.AppendEntity(line2);
ctx.Tr.AddNewlyCreatedDBObject(line2, true);
}
private static void DrawShaftRoundHeadUnifiedOutline(FeatureDrivenDrawer.DrawingContext ctx, double ox, double oy, double W, double H, double w, double r, double xf_left, double xf_right, double fx_L_tangTop, double fy_L_tangTop, double fx_L_tangBotX, double fy_L_tangBot, double fx_R_tangTop, double fy_R_tangTop, double fx_R_tangBotX, double fy_R_tangBot, bool needBreakLines, double xBreak, double breakWidth, double sectionOx, double sectionW)
@ -422,8 +425,10 @@ namespace CadParamPluging.Cad
{
if (xBreak > seg.Item1 && (xBreak + breakWidth) < seg.Item2)
{
newSegs.Add(Tuple.Create(seg.Item1, xBreak));
newSegs.Add(Tuple.Create(xBreak + breakWidth, seg.Item2));
var breakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, yLine, oy, oy + H);
var breakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, yLine, oy, oy + H);
newSegs.Add(Tuple.Create(seg.Item1, breakLeft));
newSegs.Add(Tuple.Create(breakRight, seg.Item2));
}
else newSegs.Add(seg);
}
@ -641,7 +646,7 @@ namespace CadParamPluging.Cad
/// 绘制带断口的零件轮廓(在断线位置打断上下横线)
/// 支持自定义 Role (通常为 PartContour)
/// </summary>
private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, DrawingStyleManager.Role role)
private static void DrawRectOutlineWithBreak(FeatureDrivenDrawer.DrawingContext ctx, double x, double y, double w, double h, double xBreak, double breakWidth, double breakY0, double breakY1, DrawingStyleManager.Role role)
{
// 左边竖线
var leftLine = new Line(new Point3d(x, y, 0), new Point3d(x, y + h, 0));
@ -659,16 +664,18 @@ namespace CadParamPluging.Cad
// 左段
if (xBreak > x)
{
var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(xBreak, x + w), y, 0));
var bottomBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, y, breakY0, breakY1);
var bottomLeft = new Line(new Point3d(x, y, 0), new Point3d(Math.Min(bottomBreakLeft, x + w), y, 0));
ctx.Style?.Apply(bottomLeft, role);
ctx.Btr.AppendEntity(bottomLeft);
ctx.Tr.AddNewlyCreatedDBObject(bottomLeft, true);
}
// 右段
if (xBreak + breakWidth < x + w)
var bottomBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, y, breakY0, breakY1);
if (bottomBreakRight < x + w)
{
var bottomRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y, 0), new Point3d(x + w, y, 0));
var bottomRight = new Line(new Point3d(Math.Max(bottomBreakRight, x), y, 0), new Point3d(x + w, y, 0));
ctx.Style?.Apply(bottomRight, role);
ctx.Btr.AppendEntity(bottomRight);
ctx.Tr.AddNewlyCreatedDBObject(bottomRight, true);
@ -678,15 +685,17 @@ namespace CadParamPluging.Cad
// 左段
if (xBreak > x)
{
var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(xBreak, x + w), y + h, 0));
var topBreakLeft = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak, y + h, breakY0, breakY1);
var topLeft = new Line(new Point3d(x, y + h, 0), new Point3d(Math.Min(topBreakLeft, 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 topBreakRight = FeatureDrivenDrawer.GetSBreakLineXAtY(xBreak + breakWidth, y + h, breakY0, breakY1);
if (topBreakRight < x + w)
{
var topRight = new Line(new Point3d(Math.Max(xBreak + breakWidth, x), y + h, 0), new Point3d(x + w, y + h, 0));
var topRight = new Line(new Point3d(Math.Max(topBreakRight, 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);

View File

@ -480,7 +480,7 @@ namespace CadParamPluging.Cad
Func<string, string> getValueW = (k) =>
{
var val = bag.GetString(k);
if (k != null && k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase))
if (IsNoteVisibilityControlledKey(k))
{
if (bag.GetString(k + "_ShowInNote") == "0") return "__SKIP_NOTE__";
}
@ -722,6 +722,13 @@ namespace CadParamPluging.Cad
};
}
private static bool IsNoteVisibilityControlledKey(string key)
{
return key != null
&& (key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase)
|| key.StartsWith("SurfaceRoughness", StringComparison.OrdinalIgnoreCase));
}
private static BlockTableRecord GetTargetSpace(Transaction tr, Database db, string layoutName, bool scanModelSpace)
{
if (tr == null || db == null)

View File

@ -0,0 +1,120 @@
using System;
using System.IO;
public static class HardnessSymbolArrowTests
{
public static int Main()
{
try
{
AnnotationArrowsUseDimensionArrowSize();
Console.WriteLine("Annotation arrow size tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void AnnotationArrowsUseDimensionArrowSize()
{
var sourcePath = Path.Combine("Cad", "FeatureDrivenDrawer.cs");
var source = File.ReadAllText(sourcePath);
if (!source.Contains("public const double DimensionArrowSize = 2.5;"))
{
throw new InvalidOperationException(sourcePath + ": dimension arrow size must be controlled by one shared 2.5 variable.");
}
if (!source.Contains("TrySetDimProp(dim, \"Dimasz\", DimensionArrowSize);"))
{
throw new InvalidOperationException(sourcePath + ": dimension Dimasz must use DimensionArrowSize.");
}
var methodStart = source.IndexOf("public static void DrawHardnessSymbol", StringComparison.Ordinal);
if (methodStart < 0)
{
throw new InvalidOperationException(sourcePath + ": DrawHardnessSymbol method was not found.");
}
var methodEnd = source.IndexOf("/// <summary>", methodStart, StringComparison.Ordinal);
if (methodEnd < 0)
{
methodEnd = source.Length;
}
var method = source.Substring(methodStart, methodEnd - methodStart);
if (!method.Contains("var leader = new Leader()") ||
!method.Contains("ctx.Style?.Apply(leader, DrawingStyleManager.Role.Dimension)") ||
!method.Contains("DrawLeaderArrowHead(ctx, p1, p2, 4)") ||
method.Contains("double arrowLength = 5.0") ||
method.Contains("double arrowWidth = 1.5"))
{
throw new InvalidOperationException(sourcePath + ": hardness symbol arrow must use the shared dimension arrow size.");
}
RequireMethodUsesSharedArrow(source, sourcePath, "public static void DrawSpecialInnerHoleLeader");
RequireMethodUsesSharedArrow(source, sourcePath, "public static void DrawSpecialHBLeaderToTop");
RequireFileMethodUsesSharedArrow(
Path.Combine("Cad", "BlockRawFreeForgeNoRoundHeadDrawer.cs"),
"private static void DrawSpecialHBLeaderToTop",
"FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7)");
RequireFileMethodUsesSharedArrow(
Path.Combine("Cad", "BlockRawFreeForgeRoundHeadDrawer.cs"),
"private static void DrawSpecialHBLeaderToTop",
"FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7)");
RequireFileMethodUsesSharedArrow(
Path.Combine("Cad", "RingMachinedRollingDrawer.cs"),
"private static void DrawSpecialInnerHoleLeader",
"FeatureDrivenDrawer.DrawLeaderArrowHead(ctx, p1, p2, 7)");
}
private static void RequireMethodUsesSharedArrow(string source, string sourcePath, string signature)
{
var methodStart = source.IndexOf(signature, StringComparison.Ordinal);
if (methodStart < 0)
{
throw new InvalidOperationException(sourcePath + ": " + signature + " method was not found.");
}
var methodEnd = source.IndexOf("public static void", methodStart + signature.Length, StringComparison.Ordinal);
if (methodEnd < 0)
{
methodEnd = source.IndexOf("private static void", methodStart + signature.Length, StringComparison.Ordinal);
}
if (methodEnd < 0)
{
methodEnd = source.Length;
}
var method = source.Substring(methodStart, methodEnd - methodStart);
if (!method.Contains("DrawLeaderArrowHead(ctx, p1, p2, 7)"))
{
throw new InvalidOperationException(sourcePath + ": " + signature + " must draw its arrow with DimensionArrowSize.");
}
}
private static void RequireFileMethodUsesSharedArrow(string sourcePath, string signature, string expectedCall)
{
var source = File.ReadAllText(sourcePath);
var methodStart = source.IndexOf(signature, StringComparison.Ordinal);
if (methodStart < 0)
{
throw new InvalidOperationException(sourcePath + ": " + signature + " method was not found.");
}
var methodEnd = source.IndexOf("private static void", methodStart + signature.Length, StringComparison.Ordinal);
if (methodEnd < 0)
{
methodEnd = source.Length;
}
var method = source.Substring(methodStart, methodEnd - methodStart);
if (!method.Contains(expectedCall))
{
throw new InvalidOperationException(sourcePath + ": " + signature + " must draw its arrow with DimensionArrowSize.");
}
}
}

View File

@ -0,0 +1,50 @@
using System;
using System.IO;
public static class MinWallThicknessAutoCalcTests
{
public static int Main()
{
try
{
AutoCalculationUsesToleranceWorstCase();
Console.WriteLine("Min wall thickness auto calculation tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void AutoCalculationUsesToleranceWorstCase()
{
var sourcePath = Path.Combine("UI", "DrawingParamsForm.cs");
var source = File.ReadAllText(sourcePath);
if (!source.Contains("private const string KeyOuterDiameter1TolMinus = \"OuterDiameter1TolMinus\";") ||
!source.Contains("private const string KeyInnerDiameter2TolPlus = \"InnerDiameter2TolPlus\";"))
{
throw new InvalidOperationException(sourcePath + ": min wall thickness auto calculation must know outer lower tolerance and inner upper tolerance keys.");
}
if (!source.Contains("string.Equals(key, KeyOuterDiameter1TolMinus, StringComparison.OrdinalIgnoreCase)") ||
!source.Contains("string.Equals(key, KeyInnerDiameter2TolPlus, StringComparison.OrdinalIgnoreCase)"))
{
throw new InvalidOperationException(sourcePath + ": tolerance input changes must update min wall thickness.");
}
if (!source.Contains("var outerLower = GetNumericValue(KeyOuterDiameter1TolMinus);") ||
!source.Contains("var innerUpper = GetNumericValue(KeyInnerDiameter2TolPlus);") ||
!source.Contains("var t = ((phi1 + outerLower) - (phi2 + innerUpper)) / 2.0;"))
{
throw new InvalidOperationException(sourcePath + ": min wall thickness must be calculated as ((outer diameter + lower tolerance) - (inner diameter + upper tolerance)) / 2.");
}
if (source.Contains("var t = (phi1 - phi2) / 2.0;"))
{
throw new InvalidOperationException(sourcePath + ": nominal-only min wall thickness formula must not remain.");
}
}
}

View File

@ -0,0 +1,49 @@
using System;
using System.IO;
public static class RingRollingNominalWallGeometryTests
{
public static int Main()
{
try
{
RollingDrawerUsesNominalWallForGeometry("Cad", "RingMachinedRollingDrawer.cs");
RollingDrawerUsesNominalWallForGeometry("Cad", "RingRawRollingDrawer.cs");
Console.WriteLine("Ring rolling nominal wall geometry tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void RollingDrawerUsesNominalWallForGeometry(params string[] pathParts)
{
var sourcePath = Path.Combine(pathParts);
var source = File.ReadAllText(sourcePath);
if (!source.Contains("var nominalWallThickness = (physicalOuterR - physicalInnerR);"))
{
throw new InvalidOperationException(sourcePath + ": rolling geometry must derive wall width from nominal outer/inner diameters.");
}
if (!source.Contains("visualInnerR = nominalWallThickness * 2.0;") ||
!source.Contains("visualOuterR = nominalWallThickness * 3.0;"))
{
throw new InvalidOperationException(sourcePath + ": rolling schematic geometry must use nominal wall thickness for 2:1 hole/wall visual ratio.");
}
if (source.Contains("visualInnerR = minWallThkParam.Value * 2.0;") ||
source.Contains("visualOuterR = minWallThkParam.Value * 3.0;"))
{
throw new InvalidOperationException(sourcePath + ": rolling geometry must not use tolerance-adjusted MinWallThickness.");
}
if (!source.Contains("FeatureDrivenDrawer.DrawMinWallThicknessNote(ctx, xInnerRight.Value, ox + visualOuterR, oy, minWallThickness.Value"))
{
throw new InvalidOperationException(sourcePath + ": rolling Tmin annotation must continue to display MinWallThickness.");
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.IO;
public static class ShaftBreakCenterLineTests
{
public static int Main()
{
try
{
SquareShaftCenterLineSkipsBreakGap();
Console.WriteLine("Shaft break centerline tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void SquareShaftCenterLineSkipsBreakGap()
{
var sourcePath = Path.Combine("Cad", "ShaftRawFreeForgeSquareShaftDrawer.cs");
var source = File.ReadAllText(sourcePath);
if (source.Contains("var centerLine = new Line(new Point3d(ox - 10, clY, 0), new Point3d(ox + S1 + 10, clY, 0));"))
{
throw new InvalidOperationException(sourcePath + ": square shaft centerline must not pass through the break gap.");
}
if (!source.Contains("DrawHorizontalCenterLine(ctx, clY, ox, ox + S1, needBreakLines, xBreak, lineSpacing, oy, oy + S2);"))
{
throw new InvalidOperationException(sourcePath + ": square shaft centerline must reuse the break-aware centerline drawing.");
}
}
}

View File

@ -0,0 +1,38 @@
using System;
using System.IO;
public static class ShaftBreakLineClearanceTests
{
public static int Main()
{
try
{
ShaftDrawerUsesClearanceAroundBreakLines("Cad", "ShaftRawFreeForgeRoundShaftDrawer.cs");
ShaftDrawerUsesClearanceAroundBreakLines("Cad", "ShaftRawFreeForgeSquareShaftDrawer.cs");
Console.WriteLine("Shaft break-line clearance tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void ShaftDrawerUsesClearanceAroundBreakLines(params string[] pathParts)
{
var sourcePath = Path.Combine(pathParts);
var source = File.ReadAllText(sourcePath);
if (!source.Contains("FeatureDrivenDrawer.GetSBreakLineXAtY("))
{
throw new InvalidOperationException(sourcePath + ": shaft break gaps must calculate the exact S break-line intersection at each horizontal line Y.");
}
if (source.Contains("xBreak - breakClearance") ||
source.Contains("xBreak + breakWidth + breakClearance"))
{
throw new InvalidOperationException(sourcePath + ": shaft break gaps must not use fixed clearance offsets.");
}
}
}

View File

@ -0,0 +1,40 @@
using System;
using System.IO;
public static class ShaftRightTopRadiusLeaderTests
{
public static int Main()
{
try
{
ShaftDrawersDoNotDrawRightTopRadiusLeader("Cad", "ShaftRawFreeForgeRoundShaftDrawer.cs");
ShaftDrawersDoNotDrawRightTopRadiusLeader("Cad", "ShaftRawFreeForgeSquareShaftDrawer.cs");
Console.WriteLine("Shaft right-top radius leader tests passed.");
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
return 1;
}
}
private static void ShaftDrawersDoNotDrawRightTopRadiusLeader(params string[] pathParts)
{
var sourcePath = Path.Combine(pathParts);
var source = File.ReadAllText(sourcePath);
if (!source.Contains("private static void DrawHeadFilletRadiusLeader"))
{
throw new InvalidOperationException(sourcePath + ": radius leader helper should remain available for local history and narrow changes.");
}
var helperStart = source.IndexOf("private static void DrawHeadFilletRadiusLeader", StringComparison.Ordinal);
var mainFlow = source.Substring(0, helperStart);
if (mainFlow.Contains("DrawHeadFilletRadiusLeader(ctx,"))
{
throw new InvalidOperationException(sourcePath + ": shaft templates must not draw the right-top R radius leader.");
}
}
}

View File

@ -436,7 +436,7 @@ namespace CadParamPluging.UI
}
Control finalCtrl = ctrl;
if (string.Equals(def.Key, "MarkingContent", StringComparison.OrdinalIgnoreCase))
if (ShouldShowNoteVisibilityOption(def.Key))
{
var flow = new FlowLayoutPanel
{
@ -550,27 +550,27 @@ namespace CadParamPluging.UI
_ctrlMinWallThickness = _controlsByKey[KeyMinWallThickness];
var hasOuter = _controlsByKey.ContainsKey(KeyOuterDiameter1);
var hasOuterTol = _controlsByKey.ContainsKey(KeyOuterDiameter1TolMinus);
var hasOuterLower = _controlsByKey.ContainsKey(KeyOuterDiameter1TolMinus);
var hasInner = _controlsByKey.ContainsKey(KeyInnerDiameter2);
var hasInnerTol = _controlsByKey.ContainsKey(KeyInnerDiameter2TolPlus);
var hasInnerUpper = _controlsByKey.ContainsKey(KeyInnerDiameter2TolPlus);
if (hasOuter && hasOuterTol && hasInner && hasInnerTol)
if (hasOuter && hasOuterLower && hasInner && hasInnerUpper)
{
_canAutoCalcMinWallThickness = true;
UpdateMinWallThickness();
if (_ctrlMinWallThickness != null)
{
_toolTip.SetToolTip(_ctrlMinWallThickness, "自动计算: T=((Φ1+b1)-(Φ2+a2))/2\n(根据外径Φ1、外径下差b1、内径Φ2、内径上差a2)");
_toolTip.SetToolTip(_ctrlMinWallThickness, "自动计算: T=((Φ1+b1)-(Φ2+a2))/2\n(根据外径下差、内径上差取最小壁厚)");
}
}
else
{
var missing = new List<string>();
if (!hasOuter) missing.Add("外径Φ1");
if (!hasOuterTol) missing.Add("外径下差b1");
if (!hasOuterLower) missing.Add("外径下差b1");
if (!hasInner) missing.Add("内径Φ2");
if (!hasInnerTol) missing.Add("内径上差a2");
if (!hasInnerUpper) missing.Add("内径上差a2");
if (_ctrlMinWallThickness != null && missing.Count > 0)
{
@ -590,15 +590,11 @@ namespace CadParamPluging.UI
try
{
var phi1 = GetNumericValue(KeyOuterDiameter1);
var b1 = GetNumericValue(KeyOuterDiameter1TolMinus);
var outerLower = GetNumericValue(KeyOuterDiameter1TolMinus);
var phi2 = GetNumericValue(KeyInnerDiameter2);
var a2 = GetNumericValue(KeyInnerDiameter2TolPlus);
var innerUpper = GetNumericValue(KeyInnerDiameter2TolPlus);
// 注意b1通常为负数如-0.5a2通常为正数如0.5
// 最小壁厚径向T = ((外径最小) - (内径最大)) / 2
// 外径最小 = Φ1 + b1内径最大 = Φ2 + a2
// T = ((Φ1 + b1) - (Φ2 + a2)) / 2
var t = ((phi1 + b1) - (phi2 + a2)) / 2.0;
var t = ((phi1 + outerLower) - (phi2 + innerUpper)) / 2.0;
if (_ctrlMinWallThickness is NumericUpDown num)
{
@ -665,7 +661,7 @@ namespace CadParamPluging.UI
Func<string, string> getValueW = (k) =>
{
var val = tempBag.GetString(k);
if (k != null && k.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase))
if (IsNoteVisibilityControlledKey(k))
{
if (tempBag.GetString(k + "_ShowInNote") == "0") return "__SKIP_NOTE__";
}
@ -708,6 +704,35 @@ namespace CadParamPluging.UI
return bag;
}
private bool ShouldShowNoteVisibilityOption(string key)
{
if (string.IsNullOrWhiteSpace(key))
{
return false;
}
if (key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (!key.StartsWith("SurfaceRoughness", StringComparison.OrdinalIgnoreCase))
{
return false;
}
return string.Equals(_schema?.ProjectType, "车加工", StringComparison.OrdinalIgnoreCase)
&& string.Equals(_schema?.DrawingType, "轧制", StringComparison.OrdinalIgnoreCase)
&& string.Equals(_schema?.SheetSize, "环形", StringComparison.OrdinalIgnoreCase);
}
private static bool IsNoteVisibilityControlledKey(string key)
{
return key != null
&& (key.StartsWith("MarkingContent", StringComparison.OrdinalIgnoreCase)
|| key.StartsWith("SurfaceRoughness", StringComparison.OrdinalIgnoreCase));
}
private Control CreateControl(ParamDefinition def, string valueKey)
{
var initialValue = def.DefaultValue;