revit 打印 api
最近开始实现revit打印功能,记录一下踩的坑
-
官方文档:主要是用到 PrintManager这个类来实现打印设置
-
打印设置:PrintManager.PrintSetup设置成InSession,修改其PrintParameters Properties后,需要 SaveAs() 后才能生效,打印完成后再删除保存的临时打印设置(参考)
1.参考中对 ViewSheetSetting 也做了类似的处理,但我并没有采用SubmitPrint()进行打印,因为这个方法无法直接覆盖已有pdf,而改为采用doc.Print()方法,因而无需清除临时的ViewSheet;
2.参考中获取PrintSetup采用的是FilteredElementCollector(doc).OfClass(typeof(PrintSetting))
方法,还有GetPrintSettingIds
方法(链接) -
获取所有的ViewSheetSet:链接
-
printManager.SelectNewPrintDriver(comboBox_Printers.SelectedItem.ToString());
printManager.PrintRange = PrintRange.Select;
printManager.CombinedFile = true;
这上面的顺序不能乱,如果先选择打印范围,再更改打印机,会出现打印范围又被自动修正为Current,导致printManager.CombinedFile = true;
出错 -
在执行
doc.Print(viewSetToBePrinted)
之前,必须在transaction中执行以下代码,否则会报错printManager.ViewSheetSetting.CurrentViewSheetSet = printManager.ViewSheetSetting.InSession;
printManager.ViewSheetSetting.CurrentViewSheetSet.Views = viewSetToBePrinted;
-
C#获取系统的打印机名称列表:
System.Drawing.Printing.PrinterSettings.InstalledPrinters
获取打印机详细信息:链接
获取打印机对应的图纸尺寸,直接调用PrintManager.PaperSizes
即可 -
GitHub上有现成的实现Revit打印选项框的项目:链接
-
pdf打印时,PrintManager.PrintToFileName 属性只能决定pdf的名称,不能决定打印到哪个路径;
只能通过修改pdf打印机的默认输出文件夹来实现打印路径的选择;
以adobe pdf打印机为例,通过修改注册表来修改默认输出文件夹:var key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default);
var subkey = key.OpenSubKey(@"SOFTWARE\Adobe\Acrobat Distiller\DC\AdobePDFOutputFolder", true);
var pathKey = subkey.GetValue("").ToString();
originPath = subkey.GetValue(pathKey).ToString(); //subkey.GetValueNames();
subkey.SetValue(pathKey, plotDir, RegistryValueKind.String);
subkey.Close();
key.Close();
打印完了再把注册表恢复成原始值即可
cad.net
-
最近客户反映,插完图框设置布局,布局设置无法适用于本地发布,猜测是布局设置时,直接对layout进行操作,应该新建PlotSettings,并将其设置为layout的布局样式,于是采用了官方文档里的布局设置方法:参考,果然OK了
-
好东西! 如何绕过cad直接对pc3、pmp文件进行操作:参考 通过这个方法,对项目的打印机配置代码进行了迭代,直接自动化配置pc3、pmp,稳定多了!
发现了一个宝藏博主!进而发现了更多:
跃动方程gitee库:除了包含上面的cad打印配置解析外,还有其他几个项目,以后有时间可以测试测试
cad.net dll动态加载和卸载--还未测试
cad.net 脱离cad读取dwg的方法A-TeiGhaForDrawing配置教程--还未测试 -
一般来说,cad加载、卸载cuix文件,直接用
acApp.LoadPartialMenu(menuPath); acApp.UnloadPartialMenu(menuPath);
即可;
但要实现cad退出时自动卸载cuix文件,使用acApp.UnloadPartialMenu(menuPath)
方法会失效;
解决办法:链接 -
获取图框块边界报错,参考:链接
一般还是图框原文件有问题,图框外有乱七八糟的东西 -
winform中若涉及与cad的交互操作,应该用
Application.ShowModelessDialog(form);
,而不是直接form.ShowDialog()
-
之前完成模型空间指定点插图框的时候,坐标问题搞了好久,最后算是慢慢试出了转换的办法,总的来说,不正常的插入图框效果,主要跟ucs坐标系、target变量、doc.Inbase、doc.base等等有关
找了一个关于cad开发中坐标的系列博客:参考