删除AutoCAD起始布局引发PDF导出失败的原因及解决方法
AutoCAD Design Automation删除开头布局后-EXPORT命令失败的问题解决
问题概述
在AutoCAD Design Automation平台中,使用AutoCAD.NET删除图纸布局后,执行PDF导出脚本时出现异常:删除末尾布局时脚本正常运行,删除开头布局时-EXPORT命令解析输入出错,导致PDF生成失败。
相关代码与脚本
删除布局的C#代码
using (Transaction trans = db.TransactionManager.StartTransaction()) { // 获取布局字典 DBDictionary layoutDict = (DBDictionary)trans.GetObject(db.LayoutDictionaryId, OpenMode.ForWrite); // 如果字典中存在目标布局则删除 if (layoutDict.Contains(space.Name)) { LayoutManager.Current.DeleteLayout(space.Name); } // 提交事务 trans.Commit(); }
PDF导出脚本
DC_LOADDATA "D:\Desktop\Testing\AutoCAD Tests\2024-01-29 Layouts\data\instructions.json" DC_LAYOUT SAVEAS 2018 "results\result.dwg" TILEMODE 1 TILEMODE 0 PDFSHX 0 FILEDIA 0 -EXPORT PDF A "results\result.pdf" <blank line>
错误现象
- 删除末尾布局时:脚本正常执行,成功生成PDF,控制台输出正常处理所有布局的打印。
- 删除开头布局时:
-EXPORT命令在输入打印区域选项A后,错误地将后续的文件名识别为未知命令,导致命令终止:
Command: TILEMODE Enter new value for TILEMODE <1>: 1 Command: TILEMODE Enter new value for TILEMODE <1>: 0 Regenerating layout. Regenerating model - caching viewports. Command: PDFSHX Enter new value for PDFSHX <0>: 0 Command: FILEDIA Enter new value for FILEDIA <0>: 0 Command: -EXPORT Enter file format [Dwf/dwfX/Pdf] <Pdf>PDF Enter plot area [Current layout/All layouts]<All layouts>: A Command: "results\\result.pdf" Unknown command "PDF""). Press F1 for help.
在Design Automation平台中,最终报错缺失输出文件result.pdf:
[02/01/2024 14:42:51] End AutoCAD Core Engine standard output dump. [02/01/2024 14:42:51] Error: AutoCAD Core Console output contains error(s). [02/01/2024 14:42:51] End script phase. [02/01/2024 14:42:51] Start upload phase. [02/01/2024 14:42:51] Error: Non-optional output [result.pdf] is missing. [02/01/2024 14:42:51] Error: An unexpected error happened during phase Publishing of job. [02/01/2024 14:42:51] Job finished with result FailedMissingOutput
原因分析
删除开头布局后,AutoCAD的布局列表索引发生变化,导致-EXPORT命令在处理All layouts选项时,命令行的输入上下文出现异常。本质是删除布局后,当前布局的状态未正确刷新,命令流的输入解析逻辑出现错乱,把本该作为文件名的输入当成了新命令。
解决方案
方案1:删除布局后显式切换到存在的布局
在导出脚本中,添加显式切换布局的命令,确保命令上下文正确:
DC_LOADDATA "D:\Desktop\Testing\AutoCAD Tests\2024-01-29 Layouts\data\instructions.json" DC_LAYOUT SAVEAS 2018 "results\result.dwg" TILEMODE 1 TILEMODE 0 ; 切换到某个已保留的布局(示例为Layout1) LAYOUT S Layout1 PDFSHX 0 FILEDIA 0 -EXPORT PDF A "results\result.pdf" <blank line>
方案2:在.NET代码中主动设置当前布局
在删除布局并提交事务后,主动刷新布局管理器并设置当前布局,保存状态:
using (Transaction trans = db.TransactionManager.StartTransaction()) { DBDictionary layoutDict = (DBDictionary)trans.GetObject(db.LayoutDictionaryId, OpenMode.ForWrite); if (layoutDict.Contains(space.Name)) { LayoutManager.Current.DeleteLayout(space.Name); } trans.Commit(); } // 删除后设置当前布局为第一个非模型空间布局 LayoutManager lm = LayoutManager.Current; foreach (var layoutName in lm.LayoutNames) { if (!layoutName.Equals("Model", StringComparison.OrdinalIgnoreCase)) { lm.CurrentLayout = layoutName; break; } } // 保存当前状态 db.SaveAs(db.Filename, DwgVersion.AC1032, true, null);
方案3:避免使用"All layouts"选项导出
修改-EXPORT命令,使用Current layout选项,逐个导出需要的布局,避免受布局列表变化影响:
; 先切换到目标布局 LAYOUT S Layout1 -EXPORT PDF C "results\result_Layout1.pdf" <blank line> ; 若有多个布局,重复上述步骤 LAYOUT S Layout2 -EXPORT PDF C "results\result_Layout2.pdf" <blank line>
内容的提问来源于stack exchange,提问作者Marc Lavoie
相关产品推荐
相关产品推荐

