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

  • 相关阅读:
    JDBC和Ibatis中的Date,Time,Timestamp处理
    Spring Boot 配置定时任务
    SpringBoot Caused by: java.lang.NoClassDefFoundError: org/apache/tomcat/util/descriptor/tld/TldParser
    spring boot 使用thymeleaf模版 报错:org.thymeleaf.exceptions.TemplateInputException
    mybatis 报错: Invalid bound statement (not found)
    spring boot
    通过枚举enum实现单例
    lucene Filter过滤器
    javaweb url
    mysql 报错:java.lang.OutOfMemoryError: Java heap space
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2358374.html
Copyright © 2011-2022 走看看