Revit to Pdf Conversion

时间:2016-09-27 09:20:28

标签: pdf autodesk revit-api revit

我正在尝试使用带有Idling事件处理程序的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();
                        }

                } 

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

你有一个过滤后的元素收集器。

在迭代这些元素的过程中,您尝试启动事务加上打印。

Keep it simple and smart!

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

然后计算这三者如何相互作用。

尽量减少互动,解决问题。