[Script Dynamo] Interdire /autoriser la jonction d’ossature

Olivier Bayle Olivier Bayle 27/05/2019

5 min de lecture

clip_image002

    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 :

clip_image003

    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 :

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.

clip_image005

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 :

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 »).

clip_image007

    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.

clip_image009

    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.

clip_image011

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 :

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])
joinction = IN[1]
#Do some action in a Transaction
TransactionManager.Instance.EnsureInTransaction(doc)
for beam in beams:
if joinction:
       StructuralFramingUtils.DisallowJoinAtEnd(beam,0)
       StructuralFramingUtils.DisallowJoinAtEnd(beam,1)
else :
       StructuralFramingUtils.AllowJoinAtEnd(beam,0)
       StructuralFramingUtils.AllowJoinAtEnd(beam,1)

TransactionManager.Instance.TransactionTaskDone()
# Affectez la sortie à la variable OUT.
OUT = 0

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 ».

clip_image013

clip_image014

clip_image016

clip_image018

    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.

clip_image020

clip_image022

3- Utilisation du script dans « Dynamo Player » :

Pou ceux qui veulent utiliser le script dans « Dynamo Player » pensez :

clip_image023

Soit dans « Dynamo Player » :

clip_image025

Pour ceux qui veulent utiliser mon code, vous pouvez le télécharger JoindreOuDisjoindre.

 

Abonnement e-mail