diff --git a/Cad/HalfSectionDrawer.cs b/Cad/HalfSectionDrawer.cs new file mode 100644 index 0000000..0284a7b --- /dev/null +++ b/Cad/HalfSectionDrawer.cs @@ -0,0 +1,210 @@ +using System; +using Autodesk.AutoCAD.DatabaseServices; +using Autodesk.AutoCAD.Geometry; +using CadParamPluging.Common; + +namespace CadParamPluging.Cad +{ + public static class HalfSectionDrawer + { + public static void Draw(CadContext ctx, ParamBag bag, string deliveryStatus, string structuralFeature) + { + if (ctx == null) + { + throw new ArgumentNullException(nameof(ctx)); + } + + if (bag == null) + { + throw new ArgumentNullException(nameof(bag)); + } + + if (IsRing(structuralFeature)) + { + DrawRing(ctx, bag, deliveryStatus); + } + else if (IsDisk(structuralFeature)) + { + // 后续实现 + } + else if (IsShaft(structuralFeature)) + { + // 后续实现 + } + else if (IsBlock(structuralFeature)) + { + // 后续实现 + } + } + + private static bool IsRing(string feature) + { + return !string.IsNullOrWhiteSpace(feature) + && feature.IndexOf("环形", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private static bool IsDisk(string feature) + { + return !string.IsNullOrWhiteSpace(feature) + && (feature.IndexOf("饼盘", StringComparison.OrdinalIgnoreCase) >= 0 + || feature.IndexOf("饼", StringComparison.OrdinalIgnoreCase) >= 0 + || feature.IndexOf("盘", StringComparison.OrdinalIgnoreCase) >= 0); + } + + private static bool IsShaft(string feature) + { + return !string.IsNullOrWhiteSpace(feature) + && (feature.IndexOf("轴杆", StringComparison.OrdinalIgnoreCase) >= 0 + || feature.IndexOf("轴", StringComparison.OrdinalIgnoreCase) >= 0 + || feature.IndexOf("杆", StringComparison.OrdinalIgnoreCase) >= 0); + } + + private static bool IsBlock(string feature) + { + return !string.IsNullOrWhiteSpace(feature) + && feature.IndexOf("方体", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private static bool IsMachined(string deliveryStatus) + { + return !string.IsNullOrWhiteSpace(deliveryStatus) + && deliveryStatus.IndexOf("车加工", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private static void DrawRing(CadContext ctx, ParamBag bag, string deliveryStatus) + { + var db = ctx.Database; + var tr = ctx.Transaction; + var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); + + // 读取锻件尺寸 + double outerDia = bag.GetDouble("OuterDiameter1"); + double innerDia = bag.GetDouble("InnerDiameter2"); + double height = bag.GetDouble("Height1"); + + if (outerDia <= 0 || height <= 0) + { + return; + } + + // 锻件外轮廓(半剖:只绘制右侧) + var polyForging = new Polyline(); + polyForging.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0); + polyForging.AddVertexAt(1, new Point2d(outerDia / 2, 0), 0, 0, 0); + polyForging.AddVertexAt(2, new Point2d(outerDia / 2, height), 0, 0, 0); + polyForging.AddVertexAt(3, new Point2d(0, height), 0, 0, 0); + polyForging.Closed = false; + polyForging.ColorIndex = 7; + + btr.AppendEntity(polyForging); + tr.AddNewlyCreatedDBObject(polyForging, true); + + // 锻件内孔轮廓 + if (innerDia > 0) + { + var polyForgingInner = new Polyline(); + polyForgingInner.AddVertexAt(0, new Point2d(innerDia / 2, 0), 0, 0, 0); + polyForgingInner.AddVertexAt(1, new Point2d(innerDia / 2, height), 0, 0, 0); + polyForgingInner.Closed = false; + polyForgingInner.ColorIndex = 7; + + btr.AppendEntity(polyForgingInner); + tr.AddNewlyCreatedDBObject(polyForgingInner, true); + } + + // 中心线 + double centerLineExt = 20.0; + var lineCenter = new Line( + new Point3d(-centerLineExt, height / 2, 0), + new Point3d(outerDia / 2 + centerLineExt, height / 2, 0)); + lineCenter.ColorIndex = 4; + + TryLoadCenterLinetype(db, tr, lineCenter); + + btr.AppendEntity(lineCenter); + tr.AddNewlyCreatedDBObject(lineCenter, true); + + // 车加工态:绘制零件轮廓及填充 + if (IsMachined(deliveryStatus)) + { + double outerDiaPrime = bag.GetDouble("OuterDiameter1Prime"); + double innerDiaPrime = bag.GetDouble("InnerDiameter2Prime"); + double heightPrime = bag.GetDouble("Height1Prime"); + + if (outerDiaPrime > 0 && heightPrime > 0) + { + double partOffsetY = (height - heightPrime) / 2.0; + + // 零件轮廓(闭合) + var polyPart = new Polyline(); + polyPart.AddVertexAt(0, new Point2d(innerDiaPrime / 2, partOffsetY), 0, 0, 0); + polyPart.AddVertexAt(1, new Point2d(outerDiaPrime / 2, partOffsetY), 0, 0, 0); + polyPart.AddVertexAt(2, new Point2d(outerDiaPrime / 2, partOffsetY + heightPrime), 0, 0, 0); + polyPart.AddVertexAt(3, new Point2d(innerDiaPrime / 2, partOffsetY + heightPrime), 0, 0, 0); + polyPart.Closed = true; + polyPart.ColorIndex = 7; + + btr.AppendEntity(polyPart); + tr.AddNewlyCreatedDBObject(polyPart, true); + + // 剖面填充 + try + { + var hatch = new Hatch(); + hatch.Normal = new Vector3d(0, 0, 1); + hatch.Elevation = 0.0; + hatch.SetDatabaseDefaults(); + + btr.AppendEntity(hatch); + tr.AddNewlyCreatedDBObject(hatch, true); + + hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31"); + hatch.PatternScale = 5.0; + hatch.Associative = true; + hatch.ColorIndex = 4; + + var ids = new ObjectIdCollection(); + ids.Add(polyPart.ObjectId); + hatch.AppendLoop(HatchLoopTypes.External, ids); + hatch.EvaluateHatch(true); + } + catch + { + // 填充失败时忽略 + } + } + } + } + + private static void TryLoadCenterLinetype(Database db, Transaction tr, Line line) + { + try + { + var linetypeTbl = (LinetypeTable)tr.GetObject(db.LinetypeTableId, OpenMode.ForRead); + if (linetypeTbl.Has("CENTER")) + { + line.Linetype = "CENTER"; + } + else + { + try + { + db.LoadLineTypeFile("CENTER", "acad.lin"); + if (linetypeTbl.Has("CENTER")) + { + line.Linetype = "CENTER"; + } + } + catch + { + // 忽略 + } + } + } + catch + { + // 忽略 + } + } + } +} diff --git a/CadParamPluging.csproj b/CadParamPluging.csproj index b640432..5c9b1e5 100644 --- a/CadParamPluging.csproj +++ b/CadParamPluging.csproj @@ -77,6 +77,7 @@ + diff --git a/UI/ParamDrawingPanel.cs b/UI/ParamDrawingPanel.cs index 0c8d4f9..542e4d7 100644 --- a/UI/ParamDrawingPanel.cs +++ b/UI/ParamDrawingPanel.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Windows.Forms; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; +using Autodesk.AutoCAD.Geometry; using CadParamPluging.Cad; using CadParamPluging.Common; using CadParamPluging.Domain; @@ -159,9 +160,13 @@ namespace CadParamPluging.UI var btnSettings = new Button { Text = "设置", AutoSize = true }; btnSettings.Click += (_, __) => OnOpenSettings(); + var btnTestDraw = new Button { Text = "测试绘制", AutoSize = true }; + btnTestDraw.Click += (_, __) => OnTestDraw(); + panel.Controls.Add(btnGenerate); panel.Controls.Add(btnSaveAs); panel.Controls.Add(btnSettings); + panel.Controls.Add(btnTestDraw); return panel; } @@ -607,8 +612,14 @@ namespace CadParamPluging.UI } } - var cadService = new CadDrawingService(ctx); - DomainFacade.DrawByParams(_selectedTemplate, drawingParams, cadService); + // 根据模板参数绘制半剖视图 + HalfSectionDrawer.Draw( + ctx, + bag, + tplParams.ProjectType, // 交付状态 + tplParams.SheetSize // 结构特征 + ); + ctx.Commit(); } @@ -755,6 +766,179 @@ namespace CadParamPluging.UI } } + private void OnTestDraw() + { + try + { + // ========================================== + // 参数定义 - 调整比例接近参考图 + // ========================================== + + // 1. 锻件尺寸参数 (扁平环形件) + double Φ1 = 500.0; // 锻件外径 + double a1 = 2.0; // 外径上差 + double b1 = -1.0; // 外径下差 + + double Φ2 = 150.0; // 锻件内径 + double a2 = 1.5; // 内径上差 + double b2 = -0.5; // 内径下差 + + double H1 = 100.0; // 锻件高度 + double a3 = 1.0; // 高度上差 + double b3 = -1.0; // 高度下差 + + double T = 45.0; // 最小壁厚 (设定值) + + // --- 零件尺寸 --- + double Φ_1 = 485.0; // 零件外径 (Φ'1) + double Φ_2 = 165.0; // 零件内径 (Φ'2) + double H_1 = 90.0; // 零件高度 (H'1) + + + // ========================================== + // 2. 逻辑校验 (使用 T 参数) + // ========================================== + double actualWallThickness = (Φ1 - Φ2) / 2.0; + if (actualWallThickness < T) + { + AppendLog($"[警告] 实际壁厚 ({actualWallThickness}) 小于设定最小壁厚 T ({T})"); + } + + + // ========================================== + // 3. 绘图逻辑 (使用其余几何参数) + // ========================================== + + // 仅计算相对位置,不增加额外参数 + double partOffsetY = (H1 - H_1) / 2.0; + + var doc = AcadApp.DocumentManager.MdiActiveDocument; + if (doc == null) + { + AppendLog("未找到活动图纸。"); + return; + } + + using (doc.LockDocument()) + using (var ctx = new CadContext(doc)) + { + var db = ctx.Database; + var tr = ctx.Transaction; + var btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); + + // --- 半剖视图:只绘制右侧 --- + + // 锻件外轮廓 (不闭合,用于显示剖面边界) + var polyForging = new Polyline(); + polyForging.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0); // 中心线底部 + polyForging.AddVertexAt(1, new Point2d(Φ1 / 2, 0), 0, 0, 0); // 外径底部 + polyForging.AddVertexAt(2, new Point2d(Φ1 / 2, H1), 0, 0, 0); // 外径顶部 + polyForging.AddVertexAt(3, new Point2d(0, H1), 0, 0, 0); // 中心线顶部 + polyForging.Closed = false; + polyForging.ColorIndex = 7; // White + + // 锻件内孔轮廓 + var polyForgingInner = new Polyline(); + polyForgingInner.AddVertexAt(0, new Point2d(Φ2 / 2, 0), 0, 0, 0); + polyForgingInner.AddVertexAt(1, new Point2d(Φ2 / 2, H1), 0, 0, 0); + polyForgingInner.Closed = false; + polyForgingInner.ColorIndex = 7; // White + + // 零件轮廓 (闭合,用于填充) + var polyPart = new Polyline(); + polyPart.AddVertexAt(0, new Point2d(Φ_2 / 2, partOffsetY), 0, 0, 0); + polyPart.AddVertexAt(1, new Point2d(Φ_1 / 2, partOffsetY), 0, 0, 0); + polyPart.AddVertexAt(2, new Point2d(Φ_1 / 2, partOffsetY + H_1), 0, 0, 0); + polyPart.AddVertexAt(3, new Point2d(Φ_2 / 2, partOffsetY + H_1), 0, 0, 0); + polyPart.Closed = true; + polyPart.ColorIndex = 7; // White + + // --- 绘制中心线 (水平,表示轴线) --- + double centerLineExt = 20.0; + var lineCenter = new Line( + new Point3d(-centerLineExt, H1 / 2, 0), + new Point3d(Φ1 / 2 + centerLineExt, H1 / 2, 0)); + lineCenter.ColorIndex = 4; // Cyan + + // 尝试加载线型 + try + { + var linetypeTbl = (LinetypeTable)tr.GetObject(db.LinetypeTableId, OpenMode.ForRead); + if (linetypeTbl.Has("CENTER")) + { + lineCenter.Linetype = "CENTER"; + } + else + { + try + { + db.LoadLineTypeFile("CENTER", "acad.lin"); + if (linetypeTbl.Has("CENTER")) + { + lineCenter.Linetype = "CENTER"; + } + } + catch { /* Ignore */ } + } + } + catch { /* Ignore */ } + + // 添加到数据库 + btr.AppendEntity(polyForging); + tr.AddNewlyCreatedDBObject(polyForging, true); + + btr.AppendEntity(polyForgingInner); + tr.AddNewlyCreatedDBObject(polyForgingInner, true); + + btr.AppendEntity(polyPart); + tr.AddNewlyCreatedDBObject(polyPart, true); + + btr.AppendEntity(lineCenter); + tr.AddNewlyCreatedDBObject(lineCenter, true); + + // --- 剖面填充 --- + try + { + var hatch = new Hatch(); + hatch.Normal = new Vector3d(0, 0, 1); + hatch.Elevation = 0.0; + hatch.SetDatabaseDefaults(); + + btr.AppendEntity(hatch); + tr.AddNewlyCreatedDBObject(hatch, true); + + hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31"); + hatch.PatternScale = 5.0; + hatch.Associative = true; + hatch.ColorIndex = 4; // Cyan + + var ids = new ObjectIdCollection(); + ids.Add(polyPart.ObjectId); + hatch.AppendLoop(HatchLoopTypes.External, ids); + hatch.EvaluateHatch(true); + } + catch (Exception ex) + { + AppendLog($"填充失败: {ex.Message}"); + } + + ctx.Commit(); + + // --- 日志输出 --- + AppendLog($"半剖视图绘制完成"); + AppendLog($"锻件: Φ{Φ1}, 内Φ{Φ2}, H{H1}"); + AppendLog($"零件: Φ'{Φ_1}, 内Φ'{Φ_2}, H'{H_1}"); + } + + // Zoom Extents + doc.SendStringToExecute("._ZOOM _E ", true, false, false); + } + catch (Exception ex) + { + AppendLog($"测试绘制失败: {ex.Message}"); + Logger.Error("TestDraw", ex); + } + } private void AppendLog(string message) {