20210905

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开发中坐标的系列博客:参考

WinForm

  • 实现treeview和面板的布局:参考

  • 实现treeview部分节点添加checkbox:参考

上一篇:将base64转换为file


下一篇:PHP SOAP 教程