c# autocad二次开发 dwg文件的框表框图导出pdf方便打印 dwg转pdf工具 您所在的位置:网站首页 cad窗口打印 c# autocad二次开发 dwg文件的框表框图导出pdf方便打印 dwg转pdf工具

c# autocad二次开发 dwg文件的框表框图导出pdf方便打印 dwg转pdf工具

2023-07-18 08:25| 来源: 网络整理| 查看: 265

20190815 热

项目背景:

最近搞电气装配图,一份dwg里面N份框表框图,打印时,要先一个个框图导出pdf,而导出pdf时又要一个个用窗口模式选择导出范围,流程比较繁琐,于是程序员之魂觉醒赶紧弄了这么一个工具来帮我一次行导出pdf并全部合并。

talk is cheap,先上工程。

工具对应autocad的版本是2017,其他版本没有测试过,应该是兼容2016的。

工具执行文件:

https://download.csdn.net/download/newidea07/11562721

工具项目开源,链接:

https://gitee.com/newideas/cad2pdf.git (ps:合并pdf部分用了Spire.Pdf库,导致项目比较大,后期有时间换个另一个库或者自己写pdf)

核心代码:

差不多每行都有注释,方便理解回忆。

AcadDocument AcdDoc = new AcadDocument(); AcadDocument doc = null; doc = AcdDoc.Application.Documents.Open(filePath, true, null); //以只读方式打开该文件 //doc.SetVariable("sdi", 0); //doc.SetVariable("Filedia", 0); //doc.SetVariable("RASTERPREVIEW", 1);//控制是否将缩略图预览图像随图形一起创建和保存。 doc.SetVariable("BACKGROUNDPLOT", 0);//前台打印 doc.Application.ZoomExtents(); doc.ActiveLayout.ConfigName = "DWG To PDF.pc3";//使用的打印机设置名称 页面设置名称 //object LowerLeft;//左下坐标,即xy最小值 //object UpperRight;//右上坐标,即xy最大值 //doc.ActiveLayout.GetWindowToPlot(out LowerLeft, out UpperRight); List ls_rec = new List(); for (int i = 0; i < doc.ModelSpace.Count; i++) { button_start.Text = "正在查找对象:" + i + "/" + doc.ModelSpace.Count; if (i % 59 == 0) { Application.DoEvents(); } //AcadEntity cadObject = doc.ModelSpace.Item(i); dynamic cadObject = doc.ModelSpace.Item(i); Console.WriteLine(cadObject.EntityName); //AcDbBlockReference //AcDbMText //AcDbLine //AcDbPolyline //AcDbText //AcDbOle2Frame //AcDbCircle if (checkedListBox1.GetItemChecked(1) && cadObject.EntityName == "AcDbPolyline")//为矩形类型的才判断 { dynamic acadMLine = cadObject; double[] coordinates = acadMLine.Coordinates; //AcadMLine acadMLine = (AutoCAD.AcadMLine)cadObject; //object double3_min, double3_max; //acadMLine.GetBoundingBox(out double3_min, out double3_max); object LowerLeft = new double[2];//左下坐标,即xy最小值 object UpperRight = new double[2];//右上坐标,即xy最大值 ((double[])LowerLeft)[0] = coordinates.Where((r, index) => index % 2 == 0).Min(); ((double[])LowerLeft)[1] = coordinates.Where((r, index) => index % 2 == 1).Min(); ((double[])UpperRight)[0] = coordinates.Where((r, index) => index % 2 == 0).Max(); ((double[])UpperRight)[1] = coordinates.Where((r, index) => index % 2 == 1).Max(); if (calcDiagonal(LowerLeft, UpperRight) > minDiagonal) { ls_rec.Add(new object[] { LowerLeft, UpperRight }); } } if (checkedListBox1.GetItemChecked(0) && cadObject.EntityName == "AcDbBlockReference")//为block类型的才判断 { AcadBlockReference acadBlock = (AcadBlockReference)cadObject; dynamic block = acadBlock.Explode(); if (((object[])(block)).Length > 0) { object double3_min, double3_max; acadBlock.GetBoundingBox(out double3_min, out double3_max); object LowerLeft = new double[2];//左下坐标,即xy最小值 object UpperRight = new double[2];//右上坐标,即xy最大值 ((double[])LowerLeft)[0] = ((double[])double3_min)[0]; ((double[])LowerLeft)[1] = ((double[])double3_min)[1]; ((double[])UpperRight)[0] = ((double[])double3_max)[0]; ((double[])UpperRight)[1] = ((double[])double3_max)[1]; if (calcDiagonal(LowerLeft, UpperRight) > minDiagonal) { ls_rec.Add(new object[] { LowerLeft, UpperRight }); } } } } int pdfIndex = 1; List ls_pdfs = new List();//生成的分开的pdf文件 foreach (var item in ls_rec) { doc.ActiveLayout.SetWindowToPlot(item[0], item[1]); doc.ActiveLayout.PlotType = AcPlotType.acWindow; //打印模式 doc.ActiveLayout.StandardScale = AcPlotScale.acScaleToFit; //标准比例,需要UseStandardScale = true; doc.ActiveLayout.UseStandardScale = true; // 使用标准比例 doc.ActiveLayout.CenterPlot = true; // 居中 //doc.ActiveLayout.PaperUnits = AcPlotPaperUnits.acMillimeters; //单位毫米 //doc.ActiveLayout.PlotRotation = AcPlotRotation.ac0degrees; doc.Plot.QuietErrorMode = true;//生成存档,避免报错 string destPath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + pdfIndex++ + ".pdf"); ls_pdfs.Add(destPath); doc.Plot.PlotToFile(destPath);//第二个参数为打印机名称 } doc.Close(false); AcdDoc.Close(false); 工具使用场景:

像下图这种,dwg里面有多个框图,用自带的pdf窗口导出功能比较费事,要一个个框选中定输出坐标。

工具界面及使用方法:

本质上是个方便小步骤的工具,基本是所见即理解。因为制图人不同,有些把外框做成block,有些只是用矩形或者多段线直接画,为了提供搜索对象的速度,我做成可选的。第三个图是输入输出文件,默认输出到同级目录,每个框图单独输出到pdf,并提供一个合并后的总pdf。

     



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有