找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1328|回复: 0

[分享] C#里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-4-13 16:58:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
因为有人问到,所以写了个例子。具体的要求是从.NET(比如C#)里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件,而且要把打印页面的大小设置成和DWG视图的页面的大小一致。当然除了ActiveX API,其它接口,比如ObjectARX和AutoCAD.NET API也支持打印并能实现上述功能的。不过我们今天就限定一下范围,用一用ActiveX API,而且指定产品是AutoCAD 2010吧。
执行步骤:打开一个dwg文件,用netload加载下面代码所在的.dll文件,再输入命令plottest,就得到输出结果(一个.pdf文件)。
要用到的参考:
AcDbMgd.dll;AcMgd.dll;AutoCAD 2010 Type Library;System.Windows.Forms; AutoCAD/ObjectDBX Common 18.0 Type Library.


VB.NET:
Imports System
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput

        <Autodesk.AutoCAD.Runtime.CommandMethod("Plottest")> _
        Public Sub PlotToPDF()
            Dim activeDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim ThisDrawing As AcadDocument = CType(activeDoc.AcadDocument, AcadDocument)
            Dim layout As AcadLayout = ThisDrawing.ActiveLayout
            Dim MediaName As String = layout.CanonicalMediaName
            If MediaName.Equals("") Then
                activeDoc.Editor.WriteMessage("There is no media set for the active layout.")
                Return
            Else
                activeDoc.Editor.WriteMessage(("The media for the active layout is: " + MediaName))
            End If
            Try
                Dim oplot As AcadPlotConfiguration = ThisDrawing.PlotConfigurations.Add("PDF", layout.ModelType)
                oplot.**Units = AcPlot**Units.acMillimeters
                oplot.StyleSheet = "monochrome.ctb"
                oplot.PlotWithPlotStyles = True
                oplot.ConfigName = "DWG To PDF.pc3"
                oplot.UseStandardScale = True
                oplot.StandardScale = AcPlotScale.acScaleToFit
                oplot.PlotType = AcPlotType.acExtents
                oplot.CenterPlot = True
                Dim oMediaNames As Object = layout.GetCanonicalMediaNames
                Dim mediaNames As ArrayList = New ArrayList(CType(oMediaNames, String()))
                For Each sName As String In mediaNames
                    If sName.Contains(MediaName) Then
                        oplot.CanonicalMediaName = sName
                        layout.CopyFrom(oplot)
                        layout.PlotRotation = AcPlotRotation.ac0degrees
                        layout.RefreshPlotDeviceInfo()
                        ThisDrawing.SetVariable("BACKGROUNDPLOT", 0)
                        ThisDrawing.Plot.QuietErrorMode = True
                        ThisDrawing.Plot.PlotToFile("c:/temp/d1.pdf", "DWG To PDF.pc3")
                        oplot.Delete()
                        oplot = Nothing
                        Return
                    End If
                Next
            Catch es As System.Exception
                System.Windows.Forms.MessageBox.Show(es.ToString)
            End Try
        End Sub

C#:
using System;
using System.Collections;
using System.Collections.Specialized;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;

        // Define Command "plotTest"
        [CommandMethod("plotTest")]
        static public void PlotToPDF()
        {
            Document activeDoc = Application.DocumentManager.MdiActiveDocument;
            AcadDocument ThisDrawing = activeDoc.AcadDocument as AcadDocument;
            AcadLayout layout = ThisDrawing.ActiveLayout;

            String MediaName = layout.CanonicalMediaName;
            if (MediaName.Equals(""))
            {
                activeDoc.Editor.WriteMessage("There is no media set for the active layout.");
                return;
            }
            else
            {
                activeDoc.Editor.WriteMessage("The media for the active layout is: " + MediaName);
            }

            try
           {
               AcadPlotConfiguration oplot = ThisDrawing.PlotConfigurations.Add("PDF", layout.ModelType);
               oplot.**Units = AcPlot**Units.acMillimeters;
               oplot.StyleSheet = "monochrome.ctb";
               oplot.PlotWithPlotStyles = true;
               oplot.ConfigName = "DWG To PDF.pc3";
               oplot.UseStandardScale = true;              
               oplot.StandardScale = AcPlotScale.acScaleToFit;
               oplot.PlotType = AcPlotType.acExtents;
               oplot.CenterPlot = true;
               
                Object oMediaNames = layout.GetCanonicalMediaNames();

                ArrayList mediaNames = new ArrayList((string[])oMediaNames);

                foreach (String sName in mediaNames)
                {
                    if (sName.Contains(MediaName))
                    {
                        oplot.CanonicalMediaName = sName;
                        layout.CopyFrom(oplot);
                        layout.PlotRotation = AcPlotRotation.ac0degrees;
                        layout.RefreshPlotDeviceInfo();

                        ThisDrawing.SetVariable("BACKGROUNDPLOT", 0);
                        ThisDrawing.Plot.QuietErrorMode = true;                    

                        ThisDrawing.Plot.PlotToFile("c://temp//d1.pdf","DWG To PDF.pc3");
                        oplot.Delete();
                        oplot=null;
                        return;
                    }
                }
            }
            catch (System.Exception es)
            {
                System.Windows.Forms.MessageBox.Show(es.ToString());
            }
        }
输出结果:




这只是个例子。大家从中可以看到AutoCAD的打印定制程序可以是这样写的。但是实际需求是各种各样的,要具体分析情况并使用不同的方法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:09 , Processed in 0.375091 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表