使用.NET来实现AutoCAD打印

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.oCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.PlottingServices;

using Autodesk.AutoCAD.DatabaseServices;

namespace PlottingApplication

{

    public class PlottingCommands

    {

        [CommandMethod("simplot")]

        static public void SimplePlot()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument; 

            Editor ed = doc.Editor; 

            Database db = doc.Database; 

            Transaction tr = db.TransactionManager.StartTransaction();

             using (tr)

            {

                // 将打印当前布局

                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);

                Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);

                // 需要一个与布局有关的PlotInfo对象      

                PlotInfo pi = new PlotInfo();

                pi.Layout = btr.LayoutId;

                // 需要一个基于布局设置的PlotSettings对象,这样我们就可以进行自定义设置

                PlotSettings ps = new PlotSettings(lo.ModelType);

                ps.CopyFrom(lo);

                // PlotSettingsValidator对象帮助我们创建一个有效的PlotSettings对象         

                PlotSettingsValidator psv = PlotSettingsValidator.Current;

                //进行范围打印、中心打印和按比例打印         

                psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);

                psv.SetUseStandardScale(ps, true); 

                psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);

                psv.SetPlotCentered(ps, true);

                //使用标准的DWF PC3,这里我们只是打印到文件        

                psv.SetPlotConfigurationName(ps, "DWF6 ePlot.pc3", "ANSI_A_(8.50_x_11.00_Inches)");

                // 我们需要把PlotInfo链接到PlotSettings并验证它的有效性        

                pi.OverrideSettings = ps;

                PlotInfoValidator piv = new PlotInfoValidator();

                piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;

                piv.Validate(pi);

                // PlotEngine对象执行真正的打印工作         

                // (也可以创建一个用来预览)        

                if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)

                {

                    PlotEngine pe = PlotFactory.CreatePublishEngine();

                    using (pe)

                    {

                        //创建一个打印对话框,用于提供打印信息和允许用户取消打印            

                        PlotProgressDialog ppd = new PlotProgressDialog(false, 1, true);

                        using (ppd)

                        {

                            ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress");

                            ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");

                            ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");

                            ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");

                            ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");

                            ppd.LowerPlotProgressRange = 0;

                            ppd.UpperPlotProgressRange = 100;

                            ppd.PlotProgressPos = 0;

                            //最后让我们来启动打印                

                            ppd.OnBeginPlot();

                            ppd.IsVisible = true;

                            pe.BeginPlot(ppd, null);

                            // 我们将打印一个单文档              

                            pe.BeginDocument(pi, doc.Name, null, 1, true, "c:\\test-output");

                            //只包含一个图纸               

                            ppd.OnBeginSheet();

                            ppd.LowerSheetProgressRange = 0;

                            ppd.UpperSheetProgressRange = 100;

                            ppd.SheetProgressPos = 0;

                            PlotPageInfo ppi = new PlotPageInfo();

                            pe.BeginPage(ppi, pi, true, null);

                            pe.BeginGenerateGraphics(null); pe.EndGenerateGraphics(null);

                            // 结束图纸              

                            pe.EndPage(null);

                            ppd.SheetProgressPos = 100;

                            ppd.OnEndSheet();

                            // 结束文档               

                            pe.EndDocument(null);

                            // 结束打印               

                            ppd.PlotProgressPos = 100;

                            ppd.OnEndPlot();

                            pe.EndPlot(null);

                        }

                    }

                }

                else

                {

                    ed.WriteMessage("\nAnother plot is in progress.");

                }

            }

        }

    }



对代码的一些解释:

我选择使用标准的DWF打印驱动/PC3文件来打印一个文件,主要是为了不用猜测每个人用的是什么打印机:-) SDK的样例会在对话框中弹出一个组合框来让用户选择设备和纸张大小,但我只想让代码在所有的系统上都可以运行。


下面是当你启动SIMPLOT命令后,应该可以看到的

  
我添加了一些简单的代码,用于检查是否有另外的打印在进行过程中……,因为上面的代码会启动前台或后台打印(这取决于BACKGROUNDPLOT系统变量的值),如果代码没有通过PlotFactory.ProcessPlotState进行检查的话,很容易会导致打印失败(或者当你调用PlotFactory.CreatePublishEngine()时,对“另外的打印已经开始”这一异常情况进行处理)

你可能感兴趣的:(AutoCAD,.NET二次开发)