Communauté
BIM Revit, BIM et Autodesk Construction Cloud (ACC) - Français
Bienvenue sur le forum AEC francophone dédié aux solutions BIM de la société Autodesk. Cet espace est dédié aux professionnels et passionnés du secteur de l'Architecture, de l'Ingénierie et de la Construction (AEC) qui utilisent le logiciel Revit ainsi que les plateformes collaboratives d'Autodesk (ACC et Autodesk Forma). Partagez vos connaissances, posez des questions, collaborez sur des idées, et explorez les sujets, que vous soyez architecte, ingénieur, gestionnaire de projet ou tout autre acteur de l'AEC.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Revit - Dynamo : Modifier les paramètres de plusieurs famille depuis un projet (avec python).

7 RÉPONSES 7
RÉSOLU
Répondre
Message 1 sur 8
m_duboisZSG8C
204 Visites, 7 Réponses

Revit - Dynamo : Modifier les paramètres de plusieurs famille depuis un projet (avec python).

Bonjour,

 

J'ai tentais de créer un script Dynamo (à l'aide d'un tuto youtube qui nécessite python)  qui permet de rentrer automatiquement dans les famille, modifier certains paramètres et enregistrer ces familles, le tout depuis un projet.

 

Malheureusement, cela n'a pas fonctionné, sans doute que le script python utilisé ne fonctionne pas dans mon cas.

J'en demande donc à votre aide...

 

Dans le script Dynamo, j'ai utilisé le package "Crumple en version 2022" et un fichier Excel qui recense les familles, leurs types et le(s) paramètre(s) à modifier.

 

Le script Dynamo est en copie.

m_duboisZSG8C_0-1717397957766.png

Script python fait par Gavin Crump :

# Made by Gavin Crump
# Free for use


# Boilerplate text
import clr

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

# Preparing input from dynamo to revit
famDocs  = IN[0]
famNames = [f.Title for f in famDocs]

# Get all the data we need to check vs excel
famTypesList, famTypeNamesList, famNames, famParamsList, famParamNamesList, = [],[],[],[],[]

for f in famDocs:
        # Get family name and manager
        famMan = f.FamilyManager
        famNames.append(f.Title)
        # Get type data
        famTypes  = list(famMan.Types)
        typeNames = [f.Name for f in famTypes]
        famTypesList.append(famTypes)
        famTypeNamesList.append(typeNames)
        # Get paramaters
        params = famMan.GetParameters()
        paramNames = [p.Definition.Name for p in params]
        famParamsList.append(params)
        famParamNamesList.append(paramNames)

# Function to set family parameter value for a type
def famDoc_setParameter(famDoc,p,t,v):
        try:
                famMan = famDoc.FamilyManager
                famMan.CurrentType = t
                famMan.Set(p,v)
                return True
        except:
                return False

# Work through excel data
paramNames = IN[1]
excelData  = IN[2]
outcomesList = []

for row in excelData:
        # Results for this row
        outcomes = []
        # Get the family
        famInd = famNames.index(row[0])
        famDoc = famDocs[famInd]
        # Get the type
        typeInd = famTypeNamesList[famInd].index(row[1])
        famType = famTypesList[famInd][typeInd]
        # Limit to the parameter columns
        values = row[2:]
        # Start a transaction in the family document
        t = Transaction(famDoc, row[0]+" - "+row[1])
        t.Start()
        # For each param/value pair for this type...
        for p,v in zip(paramNames,values):
                # Get the parameter
                parInd = famParamNamesList[famInd].index(p)
                famPar = famParamsList[famInd][parInd]
                # Set the parameter
                setParam = famDoc_setParameter(famDoc,famPar,famType,v)
                outcomes.append(setParam)
        # Commit the transaction
        t.Commit()
        # Append outcomes to list
        outcomesList.append(outcomes)

# Preparing output to Dynamo
OUT = outcomesList

Balises (3)
Étiquettes (2)
7 RÉPONSES 7
Message 2 sur 8
c.poupin
en réponse à: m_duboisZSG8C

Bonjour @m_duboisZSG8C 

il serait préférable de gérer dans  1 seul nœud Python (pour chaque fichier rfa 😞

  1. l'ouverture du fichier
  2. l'édition des paramètres
    1. pour chaque paramètre :
      1. recherche du paramètre correspondant + valeur dans le fichier Excel
      2. mise à jour de la valeur de paramètre
  3. la fermeture du fichier
  4. Libération des ressources

ça limite les erreurs et les ressources (cela n'ouvre qu'un fichier rfa à la fois)

 

pense à rajouter la structure de ton fichier Excel (screenshot de la feuille ou le fichier même)

Cyril POUPIN

EESignature


Message 3 sur 8
m_duboisZSG8C
en réponse à: c.poupin

Disons que l'objectif n'est pas de modifier un fichier "projet" mais plutôt de modifier plusieurs familles à la fois.

En soit le script fonctionne, cependant le changement de paramètre ne s'effectue pas.

Après l'idée de tout faire sur un seul noeud python je suis d'accord mais n'ayant aucune expérience en programmation/codage j'ai voulu réduire au maximum le casse tête 😅.

 

Et oui désolé pour le fichier excel j'ai pas pensé à l'envoyer.

Voici le fichier excel type :

m_duboisZSG8C_0-1717489757679.png

 

Message 4 sur 8
c.poupin
en réponse à: m_duboisZSG8C

Tes longueurs doivent être converties dans l'unité de Revit 

 

si tu copies colle du code Python, je te suggère fortement d'avoir quelques bases sur la programmation Python et sur l'API Revit, à défaut, tu ne pourrais pas savoir maintenir ton script dynamo

voici tout de même, une alternative en Python avec la bibliothèque pandas (Revit 2023+)

cpoupin_0-1717531898654.png

 

 

# Charger les bibliothèques DesignScript et Standard Python
import sys
import clr
import System
from System.IO import *

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument
app = uiapp.Application

import re
import pandas as pd

def convert_ToIntern(parameter, value):
    unitType = parameter.Definition.GetDataType()
    UIunit = doc.GetUnits().GetFormatOptions(unitType).GetUnitTypeId()
    convert = UnitUtils.ConvertToInternalUnits(value, UIunit)
    return convert	

folder_rfa_path = IN[0]
xlsx_path = IN[1]
results = []
# get all rfa files in this folder
lst_rfa_files = Directory.GetFiles(folder_rfa_path, "*.rfa", SearchOption.TopDirectoryOnly)
# read excel file as DataFrame
df = pd.read_excel(xlsx_path)

for rfa_file_path in lst_rfa_files:
    # do not open the save file 001, 002, etc..
    if re.search(r'\.\d+.rfa$', rfa_file_path) is None:
        # open document
        famDoc = app.OpenDocumentFile(rfa_file_path)
        TransactionManager.Instance.ForceCloseTransaction()
        if famDoc.IsFamilyDocument:
            family = famDoc.OwnerFamily
            famManager = famDoc.FamilyManager
            for familyType in famManager.Types:
                TransactionManager.Instance.EnsureInTransaction(famDoc)
                nameFamily = famDoc.Title 
                #set name of type if no name get family name
                nameType = familyType.Name
                if nameType is None or nameType == "" or nameType == " ":
                    nameType = famDoc.Title 
                #
                # set the current type to active
                famManager.CurrentType = familyType
                famDoc.Regenerate()
                # search row in dataframe
                df_this_type = df[(df["Famille"] == famDoc.Title) & (df["Type"] == nameType)]
                if df_this_type.shape[0] > 0:
                    row_this_type = df_this_type.iloc[0]
                    #
                    for parameter in famManager.Parameters:
                        if parameter.Definition.Name in df.columns:
                            # get value from row (series) Pandas
                            value = row_this_type[parameter.Definition.Name]
                            if parameter.StorageType == StorageType.Double:
                                value = convert_ToIntern(parameter, value)
                                famManager.Set(parameter, value)
                            else:
                                famManager.Set(parameter, value)
                            results.append(f"SUCCESS to set the parameter '{parameter.Definition.Name}' in '{nameFamily}', '{nameType}' ")
                else:
                    results.append(f"ERROR to find the Family '{nameFamily}', '{nameType}' in xlsx")
                TransactionManager.Instance.TransactionTaskDone()   
        # close Transaction before close
        TransactionManager.Instance.ForceCloseTransaction()
        # close family document
        famDoc.Close(True)
        # Releases all resources used by the Document
        famDoc.Dispose()

OUT = results

Cyril POUPIN

EESignature


Message 5 sur 8
m_duboisZSG8C
en réponse à: c.poupin

Merci pour ta réponse.

 

Mais la bibliothèque pandas m'est impossible à installer. Ou du moins, le schémas d'installation effectué n'a sans doute pas marché pour ma part.

 

Message 6 sur 8
c.poupin
en réponse à: m_duboisZSG8C

Essaie de l'installer avec cette méthode

https://voltadynabim.blogspot.com/2022/03/dynamo-python-installation-automatise.html


Note : à partir de Revit 2024 pandas, numpy, openpyxl sont intégrés par défaut à Dynamo

Cyril POUPIN

EESignature


Message 7 sur 8
m_duboisZSG8C
en réponse à: c.poupin

Ok, merci beaucoup !

Message 8 sur 8
patrick.emin
en réponse à: m_duboisZSG8C

Bonjour @m_duboisZSG8C  les réponses de Cyril vous ont-elles aidé et avez-vous pu installer ce composant logiciel?


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report