c# autocad二次開發 dwg文件的框表框圖導出pdf方便打印 dwg轉pdf工具

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<object[]> ls_rec = new List<object[]>();
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<string> ls_pdfs = new List<string>();//生成的分開的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。

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章