Author Topic: multiple plot to pdf  (Read 242 times)

0 Members and 1 Guest are viewing this topic.

daboho

  • Mosquito
  • Posts: 3
multiple plot to pdf
« on: September 26, 2020, 07:31:06 AM »
 i has try change code from this link https://www.keanw.com/2007/10/plotting-a-wind.html
i want plot multiple pdf by select block reference as border
this is my code
Code: [Select]
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.PlottingServices;
using Autodesk.AutoCAD.Geometry;
using System.Runtime.InteropServices;
using System;
using System.Collections.Generic;

namespace PlottingApplication
{
    public class SimplePlottingCommands
    {
        [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
        static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
        [CommandMethod("winplot")]
        static public void WindowPlot()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            //PromptPointOptions ppo = new PromptPointOptions("\nSelect first corner of plot area: ");
            //ppo.AllowNone = false;
            //PromptPointResult ppr = ed.GetPoint(ppo);
            //if (ppr.Status != PromptStatus.OK) return;

            //PromptCornerOptions pco =new PromptCornerOptions("\nSelect second corner of plot area: ",first);
            //ppr = ed.GetCorner(pco);
            //if (ppr.Status != PromptStatus.OK) return;
            int n = 1;
            var pso = new PromptSelectionOptions();
            pso.MessageForAdding = "\nsilahkan select All :";
            var psr = ed.GetSelection(pso);
            if (psr.Status != PromptStatus.OK) return;
            var dic = new Dictionary<Point3d, Point3d>();
            using (var tr = db.TransactionManager.StartTransaction())
            {
                short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT");
                //set the BACKGROUNDPLOT = 0 temporarily.
                Application.SetSystemVariable("BACKGROUNDPLOT", 0);
                foreach (SelectedObject ss in psr.Value)
                {
                    var br = ss.ObjectId.GetObject(OpenMode.ForRead) as BlockReference;
                    if (br.Bounds.HasValue)
                    {
                        var extents = br.Bounds;
                        var ext1 = extents.Value.MinPoint;
                        var ext2 = extents.Value.MaxPoint;
                        dic.Add(ext1, ext2);
                    }

                }
                if (dic.Count == 0) return;
                // Transform from UCS to DCS
                Point3d first; Point3d second;
                foreach (var item in dic)
                {
                    first = item.Key;
                    second = item.Value;
                    ResultBuffer rbFrom = new ResultBuffer(new TypedValue(5003, 1)), rbTo = new ResultBuffer(new TypedValue(5003, 2));
                    double[] firres = new double[] { 0, 0, 0 };
                    double[] secres = new double[] { 0, 0, 0 };
                    // Transform the first point...
                    acedTrans(first.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject, 0, firres);
                    // ... and the second
                    acedTrans(second.ToArray(), rbFrom.UnmanagedObject, rbTo.UnmanagedObject, 0, secres);
                    // We can safely drop the Z-coord at this stage
                    Extents2d window = new Extents2d(firres[0], firres[1], secres[0], secres[1]);

                    // We'll be plotting the current layout
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, 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.SetPlotWindowArea(ps, window); psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);
                    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, "DWG To PDF.pc3", "ISO_full_bleed_A3_(420.00_x_297.00_MM)");
                  //  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);
                    // A PlotEngine does the actual plotting
                    // (can also create one for Preview)
                    if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
                    {
                        PlotEngine pe = PlotFactory.CreatePublishEngine();
                        using (pe)
                        {
                            // and allow thej user to cancel
                            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;
                                // Let's start the plot, at last
                                ppd.OnBeginPlot();
                                ppd.IsVisible = true;
                                pe.BeginPlot(ppd, null);
                                // We'll be plotting a single document
                                pe.BeginDocument(pi, doc.Name, null, 1, true, "c:\\test-output" + n.ToString());
                                // 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);
                                [color=red][b]pe.BeginGenerateGraphics(null);[/b][/color] // [color=red]problem in this part [/color]
                                pe.EndGenerateGraphics(null);
                                // Finish the sheet
                                pe.EndPage(null);
                                ppd.SheetProgressPos = 100;
                                ppd.OnEndSheet();
                                // Finish the document
                                pe.EndDocument(null);
                                // And finish the plot
                                ppd.PlotProgressPos = 100;
                                ppd.OnEndPlot();
                                pe.EndPlot(null);
                                n++;
                            }
                        }
                    }
                    else
                    {
                        ed.WriteMessage("\nAnother plot is in progress.");
                    }
                }
                Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot);
                tr.Commit();
            }
        }












    }

}

daboho

  • Mosquito
  • Posts: 3
Re: multiple plot to pdf
« Reply #1 on: October 03, 2020, 04:34:09 PM »
Any body can help me