Lower edge of the duct relative to the slab below

from Autodesk.Revit.DB import (
    FilteredElementCollector, BuiltInCategory, FamilyInstance, 
    LocationPoint, StorageType, Transaction, ElementId, Level
)
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

def get_element_base_level_height(element, doc):
    """
    Retourne la hauteur de base d'un élément basée sur son niveau de base.
    """
    try:
        level_param = element.LookupParameter('Base Constraint')  # Nom du paramètre du niveau de base
        if level_param and level_param.StorageType == StorageType.ElementId:
            level_id = level_param.AsElementId()
            level = doc.GetElement(level_id)
            if isinstance(level, Level):
                return level.Elevation
    except Exception as e:
        print(f"Erreur en obtenant la hauteur de niveau : {e}")
    return None

def set_parameter_value(element, param_name, value):
    """
    Définit la valeur d'un paramètre dans un élément.
    """
    try:
        param = element.LookupParameter(param_name)
        if param:
            if param.StorageType == StorageType.Double:
                param.Set(value)
            else:
                print(f"Paramètre '{param_name}' n'est pas du type Double.")
        else:
            print(f"Paramètre '{param_name}' non trouvé.")
    except Exception as e:
        print(f"Erreur en définissant le paramètre : {e}")

def main():
    # Accéder au document Revit courant
    doc = DocumentManager.Instance.CurrentDBDocument
    
    # Récupérer tous les éléments de la gaine et de la dalle
    collector_gaine = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctCurves)
    collector_dalle = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)

    # Filtrer pour obtenir les éléments de gaine et de dalle
    gaine_elements = list(collector_gaine)
    dalle_elements = list(collector_dalle)

    if not gaine_elements or not dalle_elements:
        print("Aucun élément de gaine ou de dalle trouvé.")
        return

    gaine = gaine_elements[0]  # Vous pouvez améliorer la logique pour choisir l'élément spécifique
    dalle = dalle_elements[0]  # Vous pouvez améliorer la logique pour choisir l'élément spécifique

    # Obtenir la hauteur de la gaine et la dalle
    hauteur_gaine = get_element_base_level_height(gaine, doc)
    hauteur_dalle = get_element_base_level_height(dalle, doc)
    
    if hauteur_gaine is None or hauteur_dalle is None:
        print("Impossible d'obtenir la hauteur des éléments.")
        return
    
    # Calculer l'arase inférieure
    arase_inferieure = hauteur_dalle - hauteur_gaine

    # Démarrer une transaction pour modifier les paramètres
    TransactionManager.Instance.EnsureInTransaction(doc)
    
    # Mettre à jour le paramètre 'SYN_Cote_AI' pour chaque élément de gaine
    for gaine in gaine_elements:
        set_parameter_value(gaine, "SYN_Cote_AI", arase_inferieure)
    
    # Terminer la transaction
    TransactionManager.Instance.TransactionTaskDone()

    print(f"L'arase inférieure de la gaine par rapport à la dalle est de {arase_inferieure:.2f} mètres et a été insérée dans le paramètre 'SYN_Cote_AI'.")

# Exécuter le script
main()

always give syntax error

@f.hssine

from Autodesk.Revit.DB import (
FilteredElementCollector, BuiltInCategory, FamilyInstance,
LocationPoint, StorageType, Transaction, ElementId, Level
)
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

def get_element_base_level_height(element, doc):
#"
#Retourne la hauteur de base d’un élément basée sur son niveau de base.
#"
try:
    level_param = element.LookupParameter("Base Constraint") # Nom du paramètre du niveau de base
    if level_param and level_param.StorageType == StorageType.ElementId:
        level_id = level_param.AsElementId()
        level = doc.GetElement(level_id)
        if isinstance(level, Level):
            return level.Elevation
except Exception as e:
    print(f"Erreur en obtenant la hauteur de niveau : {e}")
    return None

def set_parameter_value(element, param_name, value):
#"
#Définit la valeur d’un paramètre dans un élément.
#"
try:
    param = element.LookupParameter(param_name)
        if param:
            if param.StorageType == StorageType.Double:
                param.Set(value)
            else:
                print(f"Paramètre ‘{param_name}’ n’est pas du type Double.“)
        else:
            print(f"Paramètre ‘{param_name}’ non trouvé.”)
except Exception as e:
    print(f"Erreur en définissant le paramètre : {e}")

def main():
# Accéder au document Revit courant
doc = DocumentManager.Instance.CurrentDBDocument

# Récupérer tous les éléments de la gaine et de la dalle
collector_gaine = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_DuctCurves)
collector_dalle = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)

# Filtrer pour obtenir les éléments de gaine et de dalle
gaine_elements = list(collector_gaine)
dalle_elements = list(collector_dalle)

if not gaine_elements or not dalle_elements:
    print("Aucun élément de gaine ou de dalle trouvé.")
    return

gaine = gaine_elements[0]  # Vous pouvez améliorer la logique pour choisir l'élément spécifique
dalle = dalle_elements[0]  # Vous pouvez améliorer la logique pour choisir l'élément spécifique

# Obtenir la hauteur de la gaine et la dalle
hauteur_gaine = get_element_base_level_height(gaine, doc)
hauteur_dalle = get_element_base_level_height(dalle, doc)

if hauteur_gaine is None or hauteur_dalle is None:
    print("Impossible d'obtenir la hauteur des éléments.")
    return

# Calculer l'arase inférieure
arase_inferieure = hauteur_dalle - hauteur_gaine

# Démarrer une transaction pour modifier les paramètres
TransactionManager.Instance.EnsureInTransaction(doc)

# Mettre à jour le paramètre 'SYN_Cote_AI' pour chaque élément de gaine
for gaine in gaine_elements:
    set_parameter_value(gaine, "SYN_Cote_AI", arase_inferieure)

# Terminer la transaction
TransactionManager.Instance.TransactionTaskDone()

print(f"L'arase inférieure de la gaine par rapport à la dalle est de {arase_inferieu

@f.hssine

seems to be AI generated ? :wink: do you use dynamo for run or pyRevit

because you do not print in dynamo you need OUT

1 Like

we can do this (except in 2025 there is a stdout bug)

1 Like

in addition to @Draxl_Andreas 's answer

F-Strings is a Python3 synthax, you need to replace by str.format() method if you use IronPython2

2 Likes