Revit 到 PDF 转换

Revit to Pdf Conversion

我正在尝试使用带有空闲事件处理程序的 Revit API 在 Revit 2017 中自动执行 pdf 打印过程。我正在使用 OpenDocumentFile 方法打开 revit 文档,而不是在任何地方使用 ActiveUIDocument。此进程正在生成无效操作异常。我不确定为什么会出现异常,或者是否允许使用 Revit API。请帮忙。谢谢

日志输出:

' 1:< 0 <-pushSettingsIntoDriver 
' C 27-Sep-2016 14:45:22.641;   1:< ExportToRequestedFormat() : Pdf Print Exception : InvalidOperationExceptionAt least one view from the view set could not be printed.
' at Autodesk.Revit.DB.Document.Print(ViewSet views, View viewTemplate, Boolean useCurrentPrintSettings)
' at Autodesk.Revit.DB.Document.Print(ViewSet views, Boolean useCurrentPrintSettings)
' at RevitCommandListener.RevitCommandListenerService.ExportToRequestedFormat(UIApplication uiapp) 

隐藏代码:

 using (FilteredElementCollector viewCollector = new FilteredElementCollector(doc))
 {
       ViewSet set = new ViewSet();
       ElementClassFilter viewFilter = null;
       PrintManager pm = PrinterDriverSettings.GetPrintManager(doc, _ifcSaveFile, PrinterDriver.Bullzip);

       switch (_pdfExportSetting)
       {
           case PDFExportOptions.SheetsOnly:
                viewFilter = new ElementClassFilter(typeof(Autodesk.Revit.DB.ViewSheet));
                viewCollector.WherePasses(viewFilter);

                foreach (Autodesk.Revit.DB.ViewSheet vw in viewCollector)
                {
                      if (vw.CanBePrinted && !vw.IsTemplate)
                           set.Insert(vw);
                }
                break;

           case PDFExportOptions.ViewsOnly:
                viewFilter = new ElementClassFilter(typeof(Autodesk.Revit.DB.View));
                viewCollector.WherePasses(viewFilter);

                foreach (Autodesk.Revit.DB.View vw in viewCollector)
                {
                      if (vw.CanBePrinted  && !vw.IsTemplate && !(vw.GetType() == typeof(ViewSheet))) //Skip sheets
                          set.Insert(vw);
                }
                      break;


           case PDFExportOptions.ViewsAndSheets:

                viewFilter = new ElementClassFilter(typeof(Autodesk.Revit.DB.View));
                viewCollector.WherePasses(viewFilter);

                foreach (Autodesk.Revit.DB.View vw in viewCollector)
                {
                    if (vw.CanBePrinted  && !vw.IsTemplate)
                         set.Insert(vw);
                }
                break;

            case PDFExportOptions.Sections:
                 viewFilter = new ElementClassFilter(typeof(Autodesk.Revit.DB.ViewSection));
                 viewCollector.WherePasses(viewFilter);
                 foreach (Autodesk.Revit.DB.ViewSection vw in viewCollector)
                 {
                      if (vw.CanBePrinted &&  && !vw.IsTemplate !(vw.ViewType == ViewType.Elevation))
                         set.Insert(vw);
                 }

                 break;

            case PDFExportOptions.Elevations:
                 viewFilter = new ElementClassFilter(typeof(Autodesk.Revit.DB.ViewSection));
                 viewCollector.WherePasses(viewFilter);

                 foreach (Autodesk.Revit.DB.ViewSection vw in viewCollector)
                 {
                      if (vw.CanBePrinted  && !vw.IsTemplate && vw.ViewType == ViewType.Elevation)
                      {
                           set.Insert(vw);
                      }

                  }
                  break;

             case PDFExportOptions.Schedules:
                  viewFilter = new ElementClassFilter(typeof(ViewSchedule));
                  viewCollector.WherePasses(viewFilter);

                  foreach (ViewSchedule vw in viewCollector)
                  {
                       if (vw.CanBePrinted && !vw.IsTemplate)
                            set.Insert(vw);
                  }
                  break;
               }

               if (_pdfExportSetting != PDFExportOptions.None && set.Size > 0)
               {
                    Transaction tr = new Transaction(doc, "tr_pdf_print");

                        try
                        {
                             tr.Start();
                             doc.Print(set, true);
                             tr.Commit();
                        }
                        catch(Autodesk.Revit.Exceptions.InvalidOperationException iopex)
                        {
                                uiapp.Application.WriteJournalComment("ExportToRequestedFormat() : Pdf Print Exception : InvalidOperationException" + iopex.Message + Environment.NewLine + iopex.StackTrace, true);
                        }
                            catch(Autodesk.Revit.Exceptions.ArgumentNullException argsex)
                        {
                                uiapp.Application.WriteJournalComment("ExportToRequestedFormat() : Pdf Print Exception : ArgumentNullException" + argsex.Message + Environment.NewLine + argsex.StackTrace, true);
                        }
                            catch(Autodesk.Revit.Exceptions.ArgumentException arex)
                        {
                                uiapp.Application.WriteJournalComment("ExportToRequestedFormat() : Pdf Print Exception : ArgumentException" + arex.Message + Environment.NewLine + arex.StackTrace, true);
                        }
                            catch(Autodesk.Revit.Exceptions.ApplicationException appex)
                        {
                                uiapp.Application.WriteJournalComment("ExportToRequestedFormat() : Pdf Print Exception : ApplicationException" + appex.Message + Environment.NewLine + appex.StackTrace, true);
                        }
                        finally
                        {
                            set.Dispose();
                            viewFilter.Dispose();
                            viewCollector.Dispose();
                            pm.Dispose();
                            tr.Dispose();
                        }

                } 

除了 IsPrintable 字段之外,您需要检查的另一件事是视图是否实际上是视图模板。使用 IsTemplate 检查一下。

这对我来说太复杂了,对 Revit 来说可能也是如此。

您有过滤元素收集器。

在你对这些元素的迭代中,你尝试开始一个交易加打印。

Keep it simple and smart!

首先,将过滤后的元素迭代、事务和打印分离成三个完全独立的操作。

然后弄清楚这三者需要如何相互作用。

尽量减少互动,你的问题应该就解决了。