2016-09-27 5 views
0

Ich versuche den Prozess des PDF-Drucks in Revit 2017 zu automatisieren, indem ich die Revit API mit dem Idling Event Handler verwende. Ich öffne das Revit-Dokument mit der OpenDocumentFile-Methode und verwende ActiveUIDocument nirgendwo. Dieser Prozess generiert eine ungültige Vorgangsausnahme. Ich bin nicht sicher, warum gibt es die Ausnahme oder ob es erlaubt ist, Revit API zu verwenden. Bitte helfen Sie. Vielen Dank.Revit to Pdf Konvertierung

Journal Ausgabe:

' 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) 

-Code Behind:

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(); 
         } 

       } 

Antwort

2

Neben dem isPrintable Feld, das andere, was Sie für überprüfen müssen, ob die View ist eigentlich eine Ansicht Vorlage . Verwenden Sie IsTemplate, um das zu überprüfen.

+0

Danke für den Vorschlag. Ich habe meine Frage bearbeitet, um nach Vorlagen zu suchen, aber das hat keine Auswirkungen. Fehlt noch etwas? – amit

+0

Nur um zu konzentrieren - schlägt es für alle _pdfExportSetting Fälle fehl? oder nur bestimmte? – Matt

+0

Es ist für die spezifischen Fälle fehlgeschlagen. – amit

1

Dies ist viel zu kompliziert für mich und wahrscheinlich auch für Revit.

Sie haben einen gefilterten Elementkollektor.

In der Iteration über dieses Element versuchen Sie, eine Transaktion plus Druck zu starten.

Keep it simple and smart!

Zu allererst separaten gefilterten Element Iteration, Transaktionen und Drucken in drei völlig unabhängige Operationen.

Dann Abbildung, wie diese drei interagieren müssen.

Minimieren Sie die Interaktion, und Ihr Problem sollte gelöst werden.