Previewing and plotting a single sheet in AutoCAD using .NET

转载 2007年10月15日 14:02:00
 This week's posts take the code I threw together last week for single-sheet and multi-sheet plotting, and introduces the concept of "plot preview".

I'm learning as I go for much of this, so there are structural (although usually not functional) changes being made to the code as it develops. In this instance, for example, I've factored off common functionality needed by both previewing and plotting into a single helper function. This will no doubt evolve further (and change in structure) when I come to apply the principle to multi-sheet plotting later in the week.

Here's the C# code:

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.PlottingServices;


namespace PlottingApplication

{

  public class PreviewCommands

  {

    [CommandMethod("simprev")]

    static public void SimplePreview()

    {

      Document doc =

        Application.DocumentManager.MdiActiveDocument;

      Editor ed = doc.Editor;

      Database db = doc.Database;


      // PlotEngines do the previewing and plotting


      if (PlotFactory.ProcessPlotState ==

          ProcessPlotState.NotPlotting)

      {

        // First we preview...


        PreviewEndPlotStatus stat;

        PlotEngine pre =

          PlotFactory.CreatePreviewEngine(

            (int)PreviewEngineFlags.Plot

          );

        using (pre)

        {

          stat =

            PlotOrPreview(

              pre,

              true,

              db.CurrentSpaceId,

              ""

            );

        }

        if (stat == PreviewEndPlotStatus.Plot)

        {

          // And if the user asks, we plot...


          PlotEngine ple =

            PlotFactory.CreatePublishEngine();

          stat =

            PlotOrPreview(

              ple,

              false,

              db.CurrentSpaceId,

              "c://previewed-plot"

            );

        }

      }

      else

      {

        ed.WriteMessage(

          "/nAnother plot is in progress."

        );

      }

    }


    static PreviewEndPlotStatus PlotOrPreview(

      PlotEngine pe,

      bool isPreview,

      ObjectId spaceId,

      string filename)

    {

      Document doc =

        Application.DocumentManager.MdiActiveDocument;

      Editor ed = doc.Editor;

      Database db = doc.Database;


      PreviewEndPlotStatus ret =

        PreviewEndPlotStatus.Cancel;


      Transaction tr =

        db.TransactionManager.StartTransaction();

      using (tr)

      {

        // We'll be plotting the current layout


        BlockTableRecord btr =

          (BlockTableRecord)tr.GetObject(

            spaceId,

            OpenMode.ForRead

          );

        Layout lo =

          (Layout)tr.GetObject(

            btr.LayoutId,

            OpenMode.ForRead

          );


        // We need a PlotInfo object

        // linked to the layout


        PlotInfo pi = new PlotInfo();

        pi.Layout = btr.LayoutId;


        // We need a PlotSettings object

        // based on the layout settings

        // which we then customize


        PlotSettings ps =

          new PlotSettings(lo.ModelType);

        ps.CopyFrom(lo);


        // The PlotSettingsValidator helps

        // create a valid PlotSettings object


        PlotSettingsValidator psv =

          PlotSettingsValidator.Current;


        // We'll plot the extents, centered and

        // scaled to fit


        psv.SetPlotType(

          ps,

          Autodesk.AutoCAD.DatabaseServices.PlotType.Extents

        );

        psv.SetUseStandardScale(ps, true);

        psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);

        psv.SetPlotCentered(ps, true);


        // We'll use the standard DWF PC3, as

        // for today we're just plotting to file


        psv.SetPlotConfigurationName(

          ps,

          "DWF6 ePlot.pc3",

          "ANSI_A_(8.50_x_11.00_Inches)"

        );


        // We need to link the PlotInfo to the

        // PlotSettings and then validate it


        pi.OverrideSettings = ps;

        PlotInfoValidator piv =

          new PlotInfoValidator();

        piv.MediaMatchingPolicy =

          MatchingPolicy.MatchEnabled;

        piv.Validate(pi);


        // Create a Progress Dialog to provide info

        // and allow thej user to cancel


        PlotProgressDialog ppd =

          new PlotProgressDialog(isPreview, 1, true);

        using (ppd)

        {

          ppd.set_PlotMsgString(

            PlotMessageIndex.DialogTitle,

            "Custom Preview Progress"

          );

          ppd.set_PlotMsgString(

            PlotMessageIndex.SheetName,

            doc.Name.Substring(

              doc.Name.LastIndexOf("//") + 1

            )

          );

          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;


          // Let's start the plot/preview, at last


          ppd.OnBeginPlot();

          ppd.IsVisible = true;

          pe.BeginPlot(ppd, null);


          // We'll be plotting/previewing

          // a single document


          pe.BeginDocument(

            pi,

            doc.Name,

            null,

            1,

            !isPreview,

            filename

          );


          // Which contains a single sheet


          ppd.OnBeginSheet();


          ppd.LowerSheetProgressRange = 0;

          ppd.UpperSheetProgressRange = 100;

          ppd.SheetProgressPos = 0;


          PlotPageInfo ppi = new PlotPageInfo();

          pe.BeginPage(

            ppi,

            pi,

            true,

            null

          );

          pe.BeginGenerateGraphics(null);

          ppd.SheetProgressPos = 50;

          pe.EndGenerateGraphics(null);


          // Finish the sheet


          PreviewEndPlotInfo pepi =

            new PreviewEndPlotInfo();

          pe.EndPage(pepi);

          ret = pepi.Status;


          ppd.SheetProgressPos = 100;

          ppd.OnEndSheet();


          // Finish the document


          pe.EndDocument(null);


          // And finish the plot


          ppd.PlotProgressPos = 100;

          ppd.OnEndPlot();

          pe.EndPlot(null);

        }


        // Committing is cheaper than aborting


        tr.Commit();

      }

      return ret;

    }

  }

}

When you execute the SIMPREV command, you receive enter a "preview" mode, from where you can either cancel or plot. The trick was really in determining the button selected by the user, which we do by passing an appropriate object (of class PreviewEndPlotInfo) into the EndPage() function, to collect information on what the users selects. The next post will take this further, allowing the user to cycle through multiple sheets using "next" and "previous" buttons.

机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新......)

机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新……)author@jason_ql http://blog.csdn.net/lql07161、机器学习/深度学习1.1...
  • lql0716
  • lql0716
  • 2017年04月23日 00:55
  • 8113

CVPR2017论文分类汇总

Machine Learning 1 Spotlight 1-1A Exclusivity-Consistency Regularized Multi-View Subspace Clusteri...
  • LK274857347
  • LK274857347
  • 2017年08月08日 11:30
  • 6154

ECCV2016 部分文章

摘录ECCV2016部分文章,主要有Human pose esimation,  Human activiity / actions, Face alignment, Face detection &...
  • chenxicx1992
  • chenxicx1992
  • 2016年10月11日 14:13
  • 3309

Preview Word files (docx) in HTML using ASP.NET, OpenXML and LINQ to XML

Since an image (or even an example) tells more than any text will ever do, heres what Ive created in...
  • nowgoant
  • nowgoant
  • 2011年06月10日 22:20
  • 893

Zero Server Controls technique in ASP.Net, C# (XML Insertion, JavaScript tricks using AJAX deletion and XSLT record display using JavaScript)

  • 2009年09月12日 10:41
  • 14KB
  • 下载

Identifying multiple/single values of metadata and recording into XML via .NET Client Object Model

Steps Involved: 1.       Open Visual Studio 2012 (Run as administrator). 2.       Go to File=> New...
  • lviiii
  • lviiii
  • 2014年08月07日 18:57
  • 808

Using JSONP in ASP.NET MVC

Introduction For security reasons browsers don't allow cross-domain communication. However, in some...
  • paolei
  • paolei
  • 2012年08月29日 10:23
  • 1398

Using WebSocket in .NET 4.5 (Part 4)

Introduction Part 1 gives an overview of the WebSocket protocol and .NET WebSocket support. Part 2 d...
  • pkudzy
  • pkudzy
  • 2013年07月22日 12:35
  • 1345

csharp:Learn how to post JSON string to generic Handler using jQuery in ASP.Net C

/// ///參考: http://james.newtonking.com/json/help/index.html# /// 塗聚文(Geovin Du) 20141228 ...
  • geovindu1
  • geovindu1
  • 2014年12月28日 19:47
  • 776

项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】

在上一篇项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】中我们已经讲解了如何使用TortoiseSVN和Vi...
  • jiaolongdy
  • jiaolongdy
  • 2011年02月10日 14:45
  • 678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Previewing and plotting a single sheet in AutoCAD using .NET
举报原因:
原因补充:

(最多只允许输入30个字)