2016-09-27 162 views
0

我正在嘗試使用Revit API和Idling事件處理程序在Revit 2017中自動執行PDF打印過程。我使用OpenDocumentFile方法打開Revit文檔,而不是在任何地方使用ActiveUIDocument。此過程正在生成無效操作異常。我不確定它爲什麼會提供例外或是否允許使用Revit API。請幫忙。謝謝。Revit轉換爲PDF格式

雜誌輸出:

' 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

除了IsPrintable場,其他的事情你需要檢查是查看是否實際上是一個視圖模板。使用IsTemplate來檢查。

+0

感謝您的建議。我編輯了我的問題,包括檢查模板,但它沒有效果。有沒有其他的失蹤? – amit

+0

只是爲了幫助專注 - 它是否會導致所有_pdfExportSetting案件都失敗?或只是特定的? – Matt

+0

這是具體案件失敗。 – amit

1

這對我來說太複雜了,也可能是Revit。

您有一個過濾元素收集器。

在您對這些元素的迭代中,您嘗試啓動事務加打印。

Keep it simple and smart!

首先,單獨的過濾元件迭代中,交易和印刷成三個完全獨立的操作。

然後計算這三者如何互動。

儘量減少交互作用,解決問題。