明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3243|回复: 9

[打印] plt打印输出文件空白

[复制链接]
发表于 2015-9-14 11:13:36 | 显示全部楼层 |阅读模式
最近遇到plt打印输出文件空白的情况,将设计内容复制到新建的文件后,再打印就正常了。
不知道大家有没有遇到过这种情况,帮忙指教一二,谢谢!


同时,如果知道复制功能会复制哪些内容,也麻烦说一下,这样我就好针对问题查看两个文件的区别,然后找到问题。


比如复制的内容包括:图纸内选择的图元、图层、文字样式

 楼主| 发表于 2015-9-15 08:47:38 | 显示全部楼层
  1.         public static bool AcDbPlotPlt(Extents2d PlotExtent, string sPlotDeviceName, string sSheetStyleName
  2.             , string sPlotMediaName, string sPlotPath, PlotRotation pRotation, double dPlotScale)
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             doc.LockDocument();
  6.             Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);

  7.             Editor ed = doc.Editor;
  8.             Database db = doc.Database;
  9.             Transaction tr = db.TransactionManager.StartTransaction();
  10.             using (tr)
  11.             {
  12.                 // We'll be plotting the current layout 绘制当前布局
  13.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  14.                 Layout acLayout = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead);

  15.                 //lo.PlotPlotStyles = false;
  16.                 // We need a PlotInfo object linked to the layout 初始化PlotInfo的对象并与布局关联
  17.                 PlotInfo acPlInfo = new PlotInfo();
  18.                 acPlInfo.Layout = btr.LayoutId;

  19.                 PlotSettings acPlSet = new PlotSettings(acLayout.ModelType); //modeltype 区分布局空间,模型空间
  20.                 acPlSet.CopyFrom(acLayout);

  21.                 //如果是布局空间,直接默认打印样式为1:1
  22.                 if (!acLayout.ModelType)
  23.                     dPlotScale = 1;

  24.                 // The PlotSettingsValidator helps create a valid PlotSettings object
  25.                 PlotSettingsValidator psv = PlotSettingsValidator.Current;

  26.                 //设置打印样式
  27.                 if (!string.IsNullOrEmpty(sSheetStyleName))
  28.                 {
  29.                     acPlSet.PlotPlotStyles = true;
  30.                     acPlSet.PrintLineweights = true;
  31.                     //lo.CurrentStyleSheet = sSheetStyleName;
  32.                     psv.SetCurrentStyleSheet(acPlSet, sSheetStyleName);
  33.                 }

  34.                 //设置打印方向
  35.                 psv.SetPlotRotation(acPlSet, pRotation);
  36.                 psv.SetPlotConfigurationName(acPlSet, sPlotDeviceName, sPlotMediaName);
  37.                 //设置打印尺寸
  38.                 //设置图纸单位
  39.                 psv.SetPlotPaperUnits(acPlSet, PlotPaperUnit.Millimeters);


  40.                 #region<<设置打印比例>>
  41.                 psv.SetUseStandardScale(acPlSet, true);
  42.                 if (dPlotScale == 1)
  43.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To1);
  44.                 else if (dPlotScale == 2)
  45.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To2);
  46.                 else if (dPlotScale == 4)
  47.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To4);
  48.                 else if (dPlotScale == 8)
  49.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To8);
  50.                 else if (dPlotScale == 10)
  51.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To10);
  52.                 else if (dPlotScale == 16)
  53.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To16);
  54.                 else if (dPlotScale == 20)
  55.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To20);
  56.                 else if (dPlotScale == 30)
  57.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To30);
  58.                 else if (dPlotScale == 40)
  59.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To40);
  60.                 else if (dPlotScale == 50)
  61.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To50);
  62.                 else if (dPlotScale == 100)
  63.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale1To100);
  64.                 else if (dPlotScale == 0.5)
  65.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale2To1);
  66.                 else if (dPlotScale == 0.25)
  67.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale4To1);
  68.                 else if (dPlotScale == 0.125)
  69.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale8To1);
  70.                 else if (dPlotScale == 0.1)
  71.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale10To1);
  72.                 else if (dPlotScale == 0.01)
  73.                     psv.SetStdScaleType(acPlSet, StdScaleType.StdScale100To1);
  74.                 else if (dPlotScale == 0)
  75.                     psv.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);
  76.                 else
  77.                 {
  78.                     psv.SetUseStandardScale(acPlSet, false);
  79.                     CustomScale plotScale = new CustomScale(1, dPlotScale);
  80.                     psv.SetCustomPrintScale(acPlSet, plotScale);
  81.                 }
  82.                 #endregion


  83.                 //设置打印的范围,中心和比例
  84.                 psv.SetPlotWindowArea(acPlSet, PlotExtent);
  85.                 // 设置自定义打印偏移
  86.                 psv.SetPlotOrigin(acPlSet, new Point2d(0, 0));
  87.                 psv.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Window);

  88.                 acPlInfo.OverrideSettings = acPlSet;

  89.                 // Validate the plot info
  90.                 PlotInfoValidator acPlInfoVdr = new PlotInfoValidator();
  91.                 acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
  92.                 acPlInfoVdr.Validate(acPlInfo);

  93.                 // Check to see if a plot is already in progress
  94.                 if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
  95.                 {
  96.                     using (PlotEngine acPlEng = PlotFactory.CreatePublishEngine())
  97.                     {
  98.                         // Track the plot progress with a Progress dialog
  99.                         PlotProgressDialog acPlProgDlg = new PlotProgressDialog(false,
  100.                                                                                 1,
  101.                                                                                 true);

  102.                         using (acPlProgDlg)
  103.                         {
  104.                             // Define the status messages to display when plotting starts
  105.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.DialogTitle,
  106.                                                           "Plot Progress");
  107.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage,
  108.                                                           "Cancel Job");
  109.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage,
  110.                                                           "Cancel Sheet");
  111.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption,
  112.                                                           "Sheet Set Progress");
  113.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption,
  114.                                                           "Sheet Progress");

  115.                             // Set the plot progress range
  116.                             acPlProgDlg.LowerPlotProgressRange = 0;
  117.                             acPlProgDlg.UpperPlotProgressRange = 100;
  118.                             acPlProgDlg.PlotProgressPos = 0;

  119.                             // Display the Progress dialog
  120.                             acPlProgDlg.OnBeginPlot();
  121.                             acPlProgDlg.IsVisible = true;

  122.                             // Start to plot the layout
  123.                             acPlEng.BeginPlot(acPlProgDlg, null);

  124.                             // Define the plot output
  125.                             acPlEng.BeginDocument(acPlInfo,
  126.                                                   doc.Name, null, 1, true, sPlotPath);

  127.                             // Display information about the current plot
  128.                             acPlProgDlg.set_PlotMsgString(PlotMessageIndex.Status,
  129.                                                           "Plotting: " + doc.Name + " - " +
  130.                                                           acLayout.LayoutName);

  131.                             // Set the sheet progress range
  132.                             acPlProgDlg.OnBeginSheet();
  133.                             acPlProgDlg.LowerSheetProgressRange = 0;
  134.                             acPlProgDlg.UpperSheetProgressRange = 100;
  135.                             acPlProgDlg.SheetProgressPos = 0;

  136.                             // Plot the first sheet/layout
  137.                             PlotPageInfo acPlPageInfo = new PlotPageInfo();
  138.                             acPlEng.BeginPage(acPlPageInfo, acPlInfo, true, null);

  139.                             acPlEng.BeginGenerateGraphics(null);
  140.                             acPlEng.EndGenerateGraphics(null);

  141.                             // Finish plotting the sheet/layout
  142.                             acPlEng.EndPage(null);
  143.                             acPlProgDlg.SheetProgressPos = 100;
  144.                             acPlProgDlg.OnEndSheet();

  145.                             // Finish plotting the document
  146.                             acPlEng.EndDocument(null);

  147.                             // Finish the plot
  148.                             acPlProgDlg.PlotProgressPos = 100;
  149.                             acPlProgDlg.OnEndPlot();
  150.                             acPlEng.EndPlot(null);
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.             return true;
  156.         }
 楼主| 发表于 2015-9-15 08:49:10 | 显示全部楼层
这个是需要打印的文件,谢谢各位大侠了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-10-1 21:49:21 | 显示全部楼层
本帖最后由 WangZewei 于 2015-10-31 17:15 编辑

问题终于解决,根据当前视图的目标坐标进行一下变换就行了。
发表于 2015-11-17 17:06:58 | 显示全部楼层
WangZewei 发表于 2015-10-1 21:49
问题终于解决,根据当前视图的目标坐标进行一下变换就行了。

我也遇到类似问题,请教下如何变换?
发表于 2015-11-21 09:27:42 | 显示全部楼层
hnzgs 发表于 2015-11-17 17:06
我也遇到类似问题,请教下如何变换?

对于视图方向与Z轴平行的情况,先
Point3d ptTarget = Application.GetSystemVariable("TARGET");
然后将打印范围的X和Y分别减去ptTarget的X和Y值即可。
发表于 2015-11-21 17:09:58 | 显示全部楼层
WangZewei 发表于 2015-11-21 09:27
对于视图方向与Z轴平行的情况,先
Point3d ptTarget = Application.GetSystemVariable("TARGET");
然后 ...

非常感谢!周一上班去试试
发表于 2017-12-6 14:38:14 | 显示全部楼层
6楼的方法正确,我用该方法解决问题了,多谢!
发表于 2024-6-27 21:07:19 | 显示全部楼层
哪位帮忙继续解答一下,用这个方法解决了大部分文件的问题,但是仍然有文件出会现打印范围偏移。附件中PDF是打印成果,DWG是源文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-27 21:08:26 | 显示全部楼层
这是会偏移的文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 03:40 , Processed in 0.157866 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表