zoukankan      html  css  js  c++  java
  • 如何用.NET(CSharp & VB.NET)将DWG文件打印为PDF .

    因为有人问到,所以写了个例子。具体的要求是从.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.PaperUnits = AcPlotPaperUnits.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.PaperUnits = AcPlotPaperUnits.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的打印定制程序可以是这样写的。但是实际需求是各种各样的,要具体分析情况并使用不同的方法。

    来自:http://blog.csdn.net/barbarahan/article/details/4803639

  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2358374.html
Copyright © 2011-2022 走看看