Delayed output of print() and output.print

I have a problem that all outputs from my script are delayed in the pyrevit text window. Same problem with print and output.print. Already tried sys.stdout.flush() but did not solve the problem. Does anyone have a tip for me?

Hi, welcome,
Care to share some of your code?
Does it happen on your homemade tools or in all pyrevit tools?

Its my own code on Revit 2022.1.
It exports four ifc files out of a large revit mep model. The export is called as function with argument of the 3d view to export.
I will share it on monday when i am back in office.
Would be nice if you could help me.

1 Like

Hi,

here is the code of my script but the problem is in my other scripts also.
The output works but its delayed. Same with print()

# coding: utf8

__title__ = "NPina IFC-Modell-Export"
__author__ = "SL"
__doc__ = """
Dieses Programm Exportiert das Modell in 4 IFC-Teilmodelle.
"""
__min_revit_ver__ = 2022 


# ╦╔╦╗╔═╗╔═╗╦═╗╔╦╗╔═╗
# ║║║║╠═╝║ ║╠╦╝ ║ ╚═╗
# ╩╩ ╩╩  ╚═╝╩╚═ ╩ ╚═╝ IMPORTS
# ==================================================

# ===============
# Regular Imports
# ===============
import os, sys, math, datetime, time     # Regular Imports

# ===========================
# Autodesk.Revit.DB Namespace
# ===========================
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import Selection

# ===========================
# Autodesk.Revit.UI Namespace
# ===========================

# from Autodesk.Revit.UI import *

# =====================================
# Autodesk.Revit.UI.Selection Namespace
# =====================================
# from Autodesk.Revit.UI.Selection import *

# =======
# pyRevit
# =======
from pyrevit import revit, forms, script

#=============
# .NET Imports
#=============
import clr

# =====================
# .NET Assembly
# =====================
clr.AddReference("System")

# --------------------------------------
# System.Collections.Generic import List
#---------------------------------------
from System.Collections.Generic import List

# ------------------
# System import Enum
#-------------------
from System import Enum

# ╦  ╦╔═╗╦═╗╦╔═╗╔╗ ╦  ╔═╗╔═╗
# ╚╗╔╝╠═╣╠╦╝║╠═╣╠╩╗║  ║╣ ╚═╗
#  ╚╝ ╩ ╩╩╚═╩╩ ╩╚═╝╩═╝╚═╝╚═╝ VARIABLES
# ==================================================

app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument

output = script.get_output()

PATH_SCRIPT = os.path.dirname(__file__)     # Absolute path to the folder where script is placed.

# ╔═╗╦ ╦╔╗╔╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
# ╠╣ ║ ║║║║║   ║ ║║ ║║║║╚═╗
# ╚  ╚═╝╝╚╝╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ FUNCTIONS
# ==================================================

def GetSharedParameterAsValueString (element, parameter_name):
    result = ""

    if element.LookupParameter(parameter_name) is not None:
        if element.LookupParameter(parameter_name).AsValueString() is not None:
            result = element.LookupParameter(parameter_name).AsValueString()

    return result

def SetSharedParameterValue (element, parameter_name, wert):
    result = False

    if element.LookupParameter(parameter_name) is not None:
        if not element.LookupParameter(parameter_name).IsReadOnly:
            element.LookupParameter(parameter_name).Set(wert)
            result = True

    return result

def get_builtin_parameter_value(element, builtin_param):

    param = element.get_Parameter(builtin_param)
    if param is not None:
        # Untersuche den Parametertyp
        if param.StorageType == StorageType.String:
            return param.AsString()
        elif param.StorageType == StorageType.Integer:
            return param.AsInteger()
        elif param.StorageType == StorageType.Double:
            # Standardmäßig: doppelte Werte in interne Einheiten umwandeln
            return param.AsDouble()
        elif param.StorageType == StorageType.ElementId:
            return param.AsElementId().IntegerValue
        else:
            return None


def GetViewByName(view_name):
    # Suchen Sie alle Ansichten im Dokument
    views = FilteredElementCollector(doc).OfClass(View).ToElements()
    
    # Durchlaufen Sie die Ansichten und suchen Sie nach dem Namen
    for view in views:
        # Überprüfen, ob der Viewname mit dem gesuchten Namen übereinstimmt
        if view.Name == view_name:
            return view
    
    # Falls keine Ansicht gefunden wurde
    return None

def IfcExportViewByName (view_name):

    view = GetViewByName (view_name)

    if view is None:
        output.print_md ("Fehler! Die Ansicht " + view_name + " konnte nicht gefunden werden!")
    else:

        # Beginn der Änderungstransaktionen
        t = Transaction(doc,"1507NPina")
        t.Start()

        time_start = time.time()

        # Exportverzeichnis und Dateiname
        desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
        file_name = view_name + ".ifc"
        file_path = os.path.join(desktop_path, file_name)

        # IFC-Exportoptionen
        ifc_options = IFCExportOptions()

        # Version und Modus
        ifc_options.FileVersion = IFCVersion.IFC2x3CV2 #IFC2x2:	IFC Version 2x2, IFC2x3: IFC Version 2x3, IFC2x3CV2: IFC Version 2x3 Coordination View 2.0, IFC4: IFC Version 4, IFC4RV: IFC Version 4 Reference View
        ifc_options.AddOption("IFCFileType", "0") # "0 = IFC, 1 = IFC XML, 2 = Zipped IFC, 3 = Zipped IFC XML
        ifc_options.AddOption("ExportLinkedFiles", "false")  # Verknüpfte Dateien exportieren
        ifc_options.ExportBaseQuantities = False # Quantitäten sind hilfreiche Informationen über die geometrischen und materiellen Eigenschaften eines Modells, wie Volumen, Fläche, Länge usw.
        # ifc_options.AddOption("ActivePhase", "852844") # "ab 2018"

        # Standort und Begrenzungen
        ifc_options.AddOption("SitePlacement", "2") # Projektbasispunkt verwenden
        # # ifc_options.AddOption("UseProjectBasePoint", "True") # Projektbasispunkt verwenden
        ifc_options.AddOption("IncludeSiteElevation","false")
        # ifc_options.AddOption("SitePlacementElevation","false") # Höhe des Standorts nicht berücksichtigen

        # Elemente und Geometrie
        ifc_options.AddOption("TessellationLevelOfDetail","0") # Level of Detail für Tesselierung (0,0 bis 1,0)
        ifc_options.AddOption("UseOnlyTriangulation","false") # Die Geometrie wird in der besten verfügbaren Darstellung exportiert (z. B. Swept Solids, BREP).
        ifc_options.FilterViewId = view.Id # ID des zu exportierenden Views
        ifc_options.AddOption("UseActiveViewGeometry","true") # Nur Geometrie aus der aktiven Ansicht verwenden
        ifc_options.AddOption("VisibleElementsOfCurrentView","true")  # Nur sichtbare Elemente der aktuellen Ansicht
        ifc_options.AddOption("ExportAnnotations","false")  # Anmerkungen exportieren
        ifc_options.AddOption("Export2DElements","false") # 2D-Elemente exportieren
        ifc_options.WallAndColumnSplitting = False # Wände und Stützen (Columns) beim Export nicht aufteilen
        ifc_options.AddOption("IncludeSteelElements","true") # Stahlbauteile inludieren
        ifc_options.AddOption("ExportRoomsInView","false") # Räume in der Ansicht exportieren
        ifc_options.AddOption("SpaceBoundaries","0") # Räume werden ohne Raumgrenzen exportiert
        ifc_options.AddOption("Use2DRoomBoundaryForVolume","false") # Raumvolumen auf der Basis von 2D-Raumgrenzen berechnet 
        ifc_options.AddOption("ExportBoundingBox","false") # Elemente als Begrenzungsrahmen exportieren
        ifc_options.AddOption("ExportSolidModelRep","false") # Solide Modellrepräsentation
        ifc_options.AddOption("ExportPartsAsBuildingElements","false") # Teile als Gebäudeelemente exportieren
        ifc_options.AddOption("UseFamilyAndTypeNameForReference","false") # keine Abhängigkeit zu Revit-Familien und Typen haben
        # ifc_options.AddOption("UseTypeNameOnlyForIfcType","false") # Der vollständige Familienname und der Typname werden verwendet, um den IFC-Typ zu definieren.
        # ifc_options.AddOption("UseVisibleRevitNameAsEntityName","false") # Verwendet den standardmäßigen oder internen Revit-Namen als IFC-Entitätsnamen.

        # Eigenschaftssätze und Parameter
        ifc_options.AddOption("ExportInternalRevitPropertySets","false") # Revit-Eigenschaften exportieren
        ifc_options.AddOption("ExportIFCCommonPropertySets,","true") # IFC-Standard-Eigenschaften exportieren
        ifc_options.AddOption("ExportUserDefinedPsets","true") # Benutzerdefinierte Psets aktivieren
        ifc_options.AddOption("ExportUserDefinedPsetsFileName","n:/Revit/45_Exporteinstellungen/PSets/IBO_2024-10/IBO_ParameterSets.txt") # IBO PSet Definitionsdatei
        # ifc_options.AddOption("ExportUserDefinedParameterMapping","false")  # Falls Parameter explizit gemappt werden müssen
        # ifc_options.AddOption("ExportUserDefinedParameterMappingFileName","")  # Pfad zu einer benutzerdefinierten Mapping-Datei anzugeben
        ifc_options.AddOption("StoreIFCGUID","false"), # GUID als Parameter speichern
        ifc_options.AddOption("ExportSpecificSchedules","false") # Bestimmte Zeitpläne exportieren
        ifc_options.AddOption("ExportSchedulesAsPsets","false") # Zeitpläne als Eigenschaftssätze exportieren
        # ifc_options.AddOption("ExportMaterialPsets","false") # Materialeigenschaftssätze (Material Property Sets, Psets) z.B. Dichte, Wärmeleitfähigkeit, Farbe

        # IFC-Export ausführen
        doc.Export(desktop_path,file_name,ifc_options)

        # Transaktion abschließen
        t.Commit()
        t.Dispose()

        # Information über Dauer des IFC-Exports ausgeben
        time_end = time.time()
        duration = time_end - time_start

        output.print_md ("---")
        output.print_md ("Die Ansicht " + view_name + " wurde in folgendem Pfad exportiert: " + file_path)
        output.print_md ('\n Der Export hat {} Sekunden gedauert.'.format(duration))
   

# ╔═╗╦  ╔═╗╔═╗╔═╗╔═╗╔═╗
# ║  ║  ╠═╣╚═╗╚═╗║╣ ╚═╗
# ╚═╝╩═╝╩ ╩╚═╝╚═╝╚═╝╚═╝ CLASSES
# ==================================================

# - Place local classes here. If you might use any classes in other scripts, consider placing it in the lib folder.

# ╔╦╗╔═╗╦╔╗╔
# ║║║╠═╣║║║║
# ╩ ╩╩ ╩╩╝╚╝ MAIN
# ==================================================

if __name__ == '__main__':

    # Warnhinweis anzeigen
    res = forms.alert("Diese Funktion exportiert das Modell ins IFC-Format und speichert diese auf dem Desktop.\n\nEventuell vorhandene Dateien mit gleichem Namen werden überschrieben!"
                      ,ok=False, yes=True, no=True,retry=False,warn_icon=True,options=None,exitscript=True)

    output.print_md ("## NPina HLS-Modell IFC-Exporter")
    output.print_md ("---")
    output.print_md ("Exportiere Modell " + doc.Title + " ins IFC-Format ...")

    IfcExportViewByName ("Ifc-Export_HLS-BT1N")
    IfcExportViewByName ("Ifc-Export_HLS-BT1S")
    IfcExportViewByName ("Ifc-Export_HLS-BT2")
    IfcExportViewByName ("Ifc-Export_HLS-BT3")

    output.print_md ("---")
    output.print_md('Modell-Export abgeschlossen')