.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

plot multiple drawings

0 REPLIES 0
Reply
Message 1 of 1
c.j.mckeown
461 Views, 0 Replies

plot multiple drawings

Hello, I am trying to plot multiple drawings - the code is based off through the interface, for plotting multiple layouts in a drawing. I am having trouble finding information regarding the PlotEngine.

The code below is what I have been using, and runs until it gets to pe.BeginGenerateGraphics(null); , The code is running off a command line, I think it has something to do with the current drawing, but as soon as I add Application.DocumentManager.MdiActiveDocument = dwg; the process halts until I go to "Window" in AutoCAD and change back to the initial drawing

Any help would be greatly appreciated.

[CommandMethod("Print",CommandFlags.Session)]
public static void DevBindPurge()
{
//run a windows form, which passes the file names to one by one to the below code.
}

static public void MultiSheetPlot(string pathName, string newfileName, string existingPathFileName, string devname, string medname)
{
Document dwg = Application.DocumentManager.Open(existingPathFileName, false);
Database db = dwg.Database;
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
try
{
Transaction tr = db.TransactionManager.StartTransaction();
using (tr)
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
PlotInfo pi = new PlotInfo();
PlotInfoValidator piv = new PlotInfoValidator();
piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
// A PlotEngine does the actual plotting (can also create one for Preview)
if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
{
PlotEngine pe = PlotFactory.CreatePublishEngine();
using (pe)
{
// Collect all the paperspace layouts for plotting
ObjectIdCollection layoutsToPlot = new ObjectIdCollection();
foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
if (btr.IsLayout && btr.Name.ToUpper() != BlockTableRecord.ModelSpace.ToUpper())
{
layoutsToPlot.Add(btrId);
}
}
// Create a Progress Dialog to provide info and allow thej user to cancel
PlotProgressDialog ppd = new PlotProgressDialog(false, layoutsToPlot.Count, true);
using (ppd)
{
ed.WriteMessage("\nLayouts To Plot: {0}.", layoutsToPlot.Count);
int numSheet = 1;
foreach (ObjectId btrId in layoutsToPlot)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);
// 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 DWFx PC3, as this supports multiple sheets
//psv.SetPlotConfigurationName(ps, devname , medname );
// We need a PlotInfo object linked to the layout
pi.Layout = btr.LayoutId;
// Make the layout we're plotting current
LayoutManager.Current.CurrentLayout = lo.LayoutName;
// We need to link the PlotInfo to the PlotSettings and then validate it
pi.OverrideSettings = ps;
piv.Validate(pi);
if (numSheet == 1)
{
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, newfileName, null, 1, true, pathName);
}
// Which may contain multiple sheets
ppd.StatusMsgString = "Plotting " + doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1
) + " - sheet " + numSheet.ToString() + " of " + layoutsToPlot.Count.ToString();
ppd.OnBeginSheet();
ppd.LowerSheetProgressRange = 0;
ppd.UpperSheetProgressRange = 100;
ppd.SheetProgressPos = 0;
PlotPageInfo ppi = new PlotPageInfo();
pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null);
pe.BeginGenerateGraphics(null);
ppd.SheetProgressPos = 50;
pe.EndGenerateGraphics(null);
// Finish the sheet
pe.EndPage(null);
ppd.SheetProgressPos = 100;
ppd.OnEndSheet();
numSheet++;
}
// Finish the document
pe.EndDocument(null);
// And finish the plot
ppd.PlotProgressPos = 100;
ppd.OnEndPlot();
pe.EndPlot(null);
}
}
}
else
{
ed.WriteMessage("\nAnother plot is in progress.");
}
}
}
catch (System.Exception e)
{
Helper.Message(e);
}
dwg.CloseAndDiscard();
}
0 REPLIES 0

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost