Les utilisateurs du logiciel Revit connaissent la fonction « Autoriser/Interdire la jonction » entre éléments d’ossature (poutres). Cependant, elle provoque souvent des frustrations car elle s’effectue nœud par nœud et donc génère des pertes de temps. Je vous propose de construire le script Dynamo For Revit afin de réaliser cette tâche.
1- Recherche bibliographique de la solution sur la toile:
1. 1 Recherche d’une solution :
La bibliothèque de « Dynamo For Revit » ne disposant pas d’un nœud permettant d’ « Autoriser/Interdire la jonction », il est possible de réaliser une recherche parmi les packages Dynamo disponibles.
Après une brève recherche, il s’avère qu’il existe un package qui permettrai de réaliser l’opération. Cependant, je n’ai pas opté pour cette raison pour plusieurs raisons :
- il date de l’année 2016 et risque de poser des problèmes avec les versions Revit plus récentes,
- si vous comptez partager votre script, il faudra que les personnes utilisatrices pensent à installer ce package
En conséquence, la seule solution est de travailler en utilisant un script Python faisait appel à l’API de Revit. N’étant pas un expert de ce type de langage (quelques notion quand même voir ici et ici), j’ai fait une recherche sur la toile.
Après avoir tapé comme mot clé sur mon moteur de recherche internet préféré « revit allow or disallow join python », j’ ai trouvé cette page (un forum Dynamo qui parle de ce sujet) où notamment le code python est partagé :
import clr clr.AddReference('RevitAPI') from Autodesk.Revit.DB import * from Autodesk.Revit.DB.Structure import * clr.AddReference('RevitNodes') import Revit clr.ImportExtensions(Revit.GeometryConversion) clr.ImportExtensions(Revit.Elements) clr.AddReference('RevitServices') import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument #Unwrapping Dynamoelement to Revit element. beams = UnwrapElement(IN[0]) #Do some action in a Transaction TransactionManager.Instance.EnsureInTransaction(doc) for beam in beams: StructuralFramingUtils.DisallowJoinAtEnd(beam,0) StructuralFramingUtils.DisallowJoinAtEnd(beam,1) TransactionManager.Instance.TransactionTaskDone() OUT = 0 |
Après lecture du code Python, je vois divers problèmes :
- Il permet d’interdire le joint mais ne permet pas de l’autoriser,
- Il faut absolument que les éléments récupérés par le code soient des éléments de type « Ossature » dans le cas contraire le script ne fonctionnera pas.
1.2 Recherche des éléments manquants :
Comme dit ci-dessus, le script permet d’interdire le joint mais pas de l’autoriser.
Après avoir tapé comme mot clé sur moteur de recherche internet « StructuralFramingUtils. », j’ai trouvé cette page où l’on décrit l’utilisation de la méthode « AllowJoinAtEnd » permettant d’autoriser la jonction entre éléments d’ossature.
Nota : vous trouvez ici, la documentation décrivant toutes les syntaxes pouvant être utilisée pour l’API Revit.
A cette étape, nous avons toutes les informations pour créer le script Dynamo For Revit.
2- Création du script Dynamo For Revit:
2.1 Sélection des éléments :
Sélectionner plusieurs éléments dans Revit via Dynamo for Revit se réalise en utilisant le nœud « Select Model Elements », néanmoins, il faut absolument que les éléments récupérés par le script Python soit des éléments de type « Ossature » dans le cas contraire le script ne fonctionnera pas.
En conséquence nous allons effectuer un filtre sur les éléments sélectionnés en utilisant les nœuds :
- « Element.GetParameterValueByName » : extrait des valeurs d’une variable via son appellation
- « List.FilterByBoolMask » : applique un filtre composé de booléens afin d’extraire deux listes (liste vrai, liste fausse)
Extraction de la catégorie des éléments sélectionnés :
Après voir placé les nœuds « Select Model Elements » et « Element.GetParameterValueByName », je les connecte ensembles en extrayant la catégorie des éléments sélectionner (Code Block texte « Catégorie »).
Je transforme la liste des catégories en texte à l’aide du nœud « String from Object », pour l’utiliser comme première entrée du nœud condition « = » et la comparer au Code Block texte « Ossature ».
De cette façon, j’obtiens une liste composée de booléen m’indiquant la position des poutres dans la liste de sélection.
Enfin, je fais utiliser la liste de booléen comme masque pour filtrer la liste de sélection à l’aide du nœud « List.FilterByBoolMask ». La sortie « In » de ce nœud étant la liste des poutres résultantes du filtre.
2.2 Utilisation et modification du script Python :
Cette partie va consister à réécrire le script Python découvert dans le chapitre 1.1 pour répondre à nos contraintes (pouvoir Autoriser ou Interdire le joint).
Modification du script :
Vous trouvez ci-dessous mes modifications :
- Introduction d’une deuxième variable « jonction » permettant de savoir si l’utilisateur veut autoriser ou pas les jonctions (booléen).
- Ajout de la condition « If » dépendant de la valeur « jonction » (vrai ou faux) à l’intérieur du « For » permettant de lancer la fonction Autoriser ou la fonction Interdire la jonction.
import clr |
Lorsque le code est créé, il suffit de l’introduire dans un nœud Python.
Création du nœud Python : dans la fonction de recherche entrez « Script python ».
- Cliquez sur le bouton « + » pour créer une deuxième entrée « IN[1] », effectuez un clic droit puis sélectionnez « Modifier » pour visualiser le code Python.
- Par défaut, ce nœud dispose un script Python de base, remplacez-le par le code modifié ci-dessus puis cliquez sur le bouton « Enregistrer les modifications ».
- Enfin, créez un dernier nœud de type « booléen » pour le connecter à la deuxième entrée du script Python (la première entrée étant réservée au « In » du nœud « List.FilterByBoolMask ».
Si tous s’est bien passé après sélectionné un groupe d’éléments et cliquer alternativement sur « True » ou « False », vous devez voir apparaitre les changements dans Revit.
3- Utilisation du script dans « Dynamo Player » :
Pou ceux qui veulent utiliser le script dans « Dynamo Player » pensez :
- renommer les nœuds
- désigner les deux entrées comme « ENTREE »
Soit dans « Dynamo Player » :
Pour ceux qui veulent utiliser mon code, vous pouvez le télécharger JoindreOuDisjoindre.
Bonjour
merci pour ce script.
est il possible de faire un script de même type pour l'attachement automatique des murs?
je vous remercie par avance de votre réponse.
Rédigé par : marianne | 18/06/2019 à 11:11
Bonjour Marianne,
Je ne suis pas un expert de l'API de Revit mais je pense que cela est possible. A condition, de trouver la variable de l'APi de Revit qui permet d'attacher/détacher les murs et de l'introduire dans un script Dynamo For Revit (en code phyton).
Cordialement
Olivier
Rédigé par : Olivier | 18/06/2019 à 15:15