From 83e774a02905375c730d365d7dfc577aff5180c8 Mon Sep 17 00:00:00 2001 From: sladro Date: Thu, 18 Dec 2025 11:43:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=BA=B8=E7=94=9F=E6=88=90=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E8=A7=A3=E5=86=B3=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cad/HalfSectionDrawer.cs | 53 +++++++++++++++++++++++----------------- UI/ParamDrawingPanel.cs | 5 ++-- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/Cad/HalfSectionDrawer.cs b/Cad/HalfSectionDrawer.cs index 6f9b0e7..87fe815 100644 --- a/Cad/HalfSectionDrawer.cs +++ b/Cad/HalfSectionDrawer.cs @@ -7,7 +7,7 @@ namespace CadParamPluging.Cad { public static class HalfSectionDrawer { - public static void Draw(CadContext ctx, ParamBag bag, string deliveryStatus, string structuralFeature) + public static void Draw(CadContext ctx, ParamBag bag, string deliveryStatus, string structuralFeature, Point3d? center = null) { if (ctx == null) { @@ -19,9 +19,11 @@ namespace CadParamPluging.Cad throw new ArgumentNullException(nameof(bag)); } + var drawCenter = center ?? Point3d.Origin; + if (IsRing(structuralFeature)) { - DrawRing(ctx, bag, deliveryStatus); + DrawRing(ctx, bag, deliveryStatus, drawCenter); } else if (IsDisk(structuralFeature)) { @@ -71,7 +73,7 @@ namespace CadParamPluging.Cad && deliveryStatus.IndexOf("车加工", StringComparison.OrdinalIgnoreCase) >= 0; } - private static void DrawRing(CadContext ctx, ParamBag bag, string deliveryStatus) + private static void DrawRing(CadContext ctx, ParamBag bag, string deliveryStatus, Point3d center) { var db = ctx.Database; var tr = ctx.Transaction; @@ -87,16 +89,21 @@ namespace CadParamPluging.Cad return; } + // 计算偏移量,使图形居中于 center + // 图形原本以 (0,0) 为左端中心,宽度为 height,需要偏移使其居中 + double ox = center.X - height / 2.0; + double oy = center.Y; + // 绘制水平圆柱 (侧视图) // 中心线 (X轴) - 已移除,以匹配参考图样式 // 1. 锻件外轮廓 double R = outerDia / 2.0; var polyForging = new Polyline(); - polyForging.AddVertexAt(0, new Point2d(0, -R), 0, 0, 0); - polyForging.AddVertexAt(1, new Point2d(height, -R), 0, 0, 0); - polyForging.AddVertexAt(2, new Point2d(height, R), 0, 0, 0); - polyForging.AddVertexAt(3, new Point2d(0, R), 0, 0, 0); + polyForging.AddVertexAt(0, new Point2d(ox + 0, oy - R), 0, 0, 0); + polyForging.AddVertexAt(1, new Point2d(ox + height, oy - R), 0, 0, 0); + polyForging.AddVertexAt(2, new Point2d(ox + height, oy + R), 0, 0, 0); + polyForging.AddVertexAt(3, new Point2d(ox + 0, oy + R), 0, 0, 0); polyForging.Closed = true; polyForging.ColorIndex = 7; // 白色 @@ -109,30 +116,30 @@ namespace CadParamPluging.Cad double r = innerDia / 2.0; TryLoadLinetype(db, tr, "DASHED"); - var lineHiddenTop = new Line(new Point3d(0, r, 0), new Point3d(height, r, 0)); + var lineHiddenTop = new Line(new Point3d(ox + 0, oy + r, 0), new Point3d(ox + height, oy + r, 0)); lineHiddenTop.ColorIndex = 2; // 黄色 lineHiddenTop.Linetype = "DASHED"; btr.AppendEntity(lineHiddenTop); tr.AddNewlyCreatedDBObject(lineHiddenTop, true); - var lineHiddenBot = new Line(new Point3d(0, -r, 0), new Point3d(height, -r, 0)); + var lineHiddenBot = new Line(new Point3d(ox + 0, oy - r, 0), new Point3d(ox + height, oy - r, 0)); lineHiddenBot.ColorIndex = 2; lineHiddenBot.Linetype = "DASHED"; btr.AppendEntity(lineHiddenBot); tr.AddNewlyCreatedDBObject(lineHiddenBot, true); // 内孔标注 - AddLinearDim(db, tr, btr, new Point3d(0, r, 0), new Point3d(0, -r, 0), - new Point3d(height + 15, 0, 0), 90, $"%%c{innerDia}"); + AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy + r, 0), new Point3d(ox + 0, oy - r, 0), + new Point3d(ox + height + 15, oy, 0), 90, $"%%c{innerDia}"); } // 外径标注 - AddLinearDim(db, tr, btr, new Point3d(0, R, 0), new Point3d(0, -R, 0), - new Point3d(-15, 0, 0), 90, $"%%c{outerDia}"); + AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy + R, 0), new Point3d(ox + 0, oy - R, 0), + new Point3d(ox - 15, oy, 0), 90, $"%%c{outerDia}"); // 长度标注 - AddLinearDim(db, tr, btr, new Point3d(0, -R, 0), new Point3d(height, -R, 0), - new Point3d(height / 2, -R - 15, 0), 0, $"{height}min"); + AddLinearDim(db, tr, btr, new Point3d(ox + 0, oy - R, 0), new Point3d(ox + height, oy - R, 0), + new Point3d(ox + height / 2, oy - R - 15, 0), 0, $"{height}min"); // 4. 车加工零件 (填充) if (IsMachined(deliveryStatus)) @@ -148,10 +155,10 @@ namespace CadParamPluging.Cad // 零件轮廓 var polyPart = new Polyline(); - polyPart.AddVertexAt(0, new Point2d(offsetX, -Rp), 0, 0, 0); - polyPart.AddVertexAt(1, new Point2d(offsetX + heightPrime, -Rp), 0, 0, 0); - polyPart.AddVertexAt(2, new Point2d(offsetX + heightPrime, Rp), 0, 0, 0); - polyPart.AddVertexAt(3, new Point2d(offsetX, Rp), 0, 0, 0); + polyPart.AddVertexAt(0, new Point2d(ox + offsetX, oy - Rp), 0, 0, 0); + polyPart.AddVertexAt(1, new Point2d(ox + offsetX + heightPrime, oy - Rp), 0, 0, 0); + polyPart.AddVertexAt(2, new Point2d(ox + offsetX + heightPrime, oy + Rp), 0, 0, 0); + polyPart.AddVertexAt(3, new Point2d(ox + offsetX, oy + Rp), 0, 0, 0); polyPart.Closed = true; polyPart.ColorIndex = 7; @@ -185,11 +192,11 @@ namespace CadParamPluging.Cad } // 可以在这里添加零件尺寸标注 - AddLinearDim(db, tr, btr, new Point3d(offsetX, Rp, 0), new Point3d(offsetX, -Rp, 0), - new Point3d(offsetX - 5, 0, 0), 90, $"%%c{outerDiaPrime}"); + AddLinearDim(db, tr, btr, new Point3d(ox + offsetX, oy + Rp, 0), new Point3d(ox + offsetX, oy - Rp, 0), + new Point3d(ox + offsetX - 5, oy, 0), 90, $"%%c{outerDiaPrime}"); - AddLinearDim(db, tr, btr, new Point3d(offsetX, -Rp, 0), new Point3d(offsetX + heightPrime, -Rp, 0), - new Point3d(offsetX + heightPrime / 2, -Rp - 10, 0), 0, $"{heightPrime}"); + AddLinearDim(db, tr, btr, new Point3d(ox + offsetX, oy - Rp, 0), new Point3d(ox + offsetX + heightPrime, oy - Rp, 0), + new Point3d(ox + offsetX + heightPrime / 2, oy - Rp - 10, 0), 0, $"{heightPrime}"); } } } diff --git a/UI/ParamDrawingPanel.cs b/UI/ParamDrawingPanel.cs index 99de319..cc03aa4 100644 --- a/UI/ParamDrawingPanel.cs +++ b/UI/ParamDrawingPanel.cs @@ -616,12 +616,13 @@ namespace CadParamPluging.UI var removeResult = TemplateDrawingService.RemoveTemplateOriginalDrawing(ctx); AppendLog($"已删除原有图形: CAXA图层={removeResult.CaxaLayerErased}, 标注={removeResult.DimensionLayerErased}, 保留右上角={removeResult.DimensionLayerKept}"); - // 根据模板参数绘制半剖视图 + // 根据模板参数绘制半剖视图,居中放置于原图纸位置 HalfSectionDrawer.Draw( ctx, bag, tplParams.ProjectType, // 交付状态 - tplParams.SheetSize // 结构特征 + tplParams.SheetSize, // 结构特征 + removeResult.OriginalCenter // 原图纸中心点 ); ctx.Commit();