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()时,对“另外的打印已经开始”这一异常情况进行处理)
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打印命令实现过程,包括如何设置打印范围、中心打印、比例打印等参数,并通过示例代码展示了如何创建打印对话框及执行打印任务。
6200

被折叠的 条评论
为什么被折叠?



