Je pense que vous commencez à bien connaitre Dynamo for Revit au travers des différents exemples que j’ai pu réaliser.
Notamment, au travers de ce billet, je vais vous montrer comment un script Python peut appeler et utiliser l’API Revit (Application Programming Interface).
Pour illustrer cette exemple, je vais utiliser la fonction "Couper" de Revit, voire l’améliorer (si, si) !
En effet, lorsque vous voulez couper plusieurs éléments par rapport à un volume vide, il faut cliquer l’élément à couper puis le volume vide et répéter l’opération autant de fois que vous avez d’éléments (par exemple 20 éléments soit 40 clics).
Voici les différentes étapes :
1- Création d’un nœud personnalisé :
Dans cet article, je vous explique comment créer un nœud personnalisé.
- Sur la page d’accueil de Dynamo, cliquez sur le bouton “ Nœud personnalisé”
- Donnez un nom, une description et l’endroit où devra apparaître votre nœud personnalisé (ici chapitre Revit)
- nous allons créer deux entrées (Input):
– Sélection d’éléments a couper
– Sélection du vide
– Un nœud Python (Python Script) à deux entrées et une sortie (Output)
- Reliez les différents nœuds et modifiez le nœud Python (clic droit “Modifier”)
2- Création du script Python:
A l’ouverture de l’éditeur python, nous découvrons le squelette de base avec ses différentes zones
- Déclaration
- Affectation des valeurs d’entrée
- Traitement des données (actuellement rien)
- Affectation de la (ou les) valeur de sortie
2.a Partie déclaration :
La partie déclarative ci-dessous permet d’appeler l’API de Revit avec ses services.
Revit "Document / Application" est rendu accessible via Dynamo “Document Manager”, soit :
“clr.AddReference("RevitAPI")
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager”
Dynamo fournit son propre cadre de transaction pour travailler avec les API de Revit.
Cela signifie que le script Python sera exécuté dans le cadre d'une transaction globale Dynamo, d'où :
“from RevitServices.Transactions import TransactionManager”
2.b Partie affectations des valeurs :
Voici les variables:
On affecte l’actuel fichier Revit ouvert à la variable “DocumentOBA”.
“ElementaACoupe” = récupère la valeur de la première entrée
“Vide” = récupère la valeur de la deuxième entrée
Nota : cette fonction “UnwrapElement” permet de transformer en propriété Dynamo Python la variable “enveloppée” .
Soit le code ci-dessous :
“DocumentOBA = DocumentManager.Instance.CurrentDBDocument
ElementsACouper = UnwrapElement(IN[0])
Vide = UnwrapElement(IN[1])”
2.c Partie traitement des données :
Je vais réaliser une boucle qui prendra en compte tous les éléments sélectionnés (de" i" à "ElementsACouper").
Ensuite , j'initialise l'opération Dynamo du fichier ouvert ('TransactionManager.Instance.EnsureInTransaction(DocumentOBA)').
La méthode “AddInstanceVoidCut” suivi des trois arguments (DocumentOBA,i, Vide) permet de couper l’élément “i” avec le Volume vide.
Soit le code suivant :
“for i in ElementsACouper:
TransactionManager.Instance.EnsureInTransaction(DocumentOBA)
InstanceVoidCutUtils.AddInstanceVoidCut(DocumentOBA,i, Vide)”
2.d Partie affectation de la (ou les) valeur de sortie :
Pas de changement , car nous n’utilisons pas la valeur de sortie (uniquement le fonctionnement de l’API).
2e Code complet :
Voici la totalité du code que vous pouvez recopier.
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference("RevitServices")
clr.AddReference("ProtoGeometry")
from Autodesk.DesignScript.Geometry import *
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
DocumentOBA = DocumentManager.Instance.CurrentDBDocument
ElementsACouper = UnwrapElement(IN[0])
Vide = UnwrapElement(IN[1])
for i in ElementsACouper:
TransactionManager.Instance.EnsureInTransaction(DocumentOBA)
InstanceVoidCutUtils.AddInstanceVoidCut(DocumentOBA,i, Vide)
OUT = 0
3 Mise en fonction :
Après avoir cliquer sur le bouton “Accepter le modification”, vous allez pouvoir créer un nouveau script (en cliquant le bouton “Nouveau”) qui appellera le nœud personnalisé.
Dans la bibliothèque du répertoire Revit, cliquez sur le nœud personnalisé “ExempleCouper” pour le placer dans l’interface Dynamo.
Ensuite utilisez deux nœuds supplémentaires :
- “Select Model Elements” = Sélectionner tous les éléments à couper (au pluriel)
- “Select Model Element”= Sélectionner le volume vide (au singulier)
Enfin connectez les deux nœuds au nœud personnalisé (attention ne pas se tromper au niveau des entrées).
Si vous avez bien tout réalisé, voici le résultat final :
4 – Conclusion :
J’espère que vous avez pu apprécier au travers de ce petit exemple la puissance de Dynamo utilisant l'API de Revit.
Je suis sûr que cela va vous donner des idées pour renforcer la puissance de Revit !
5- Téléchargement :
Voici le fichier Revit Ici,
Voici le nœud personnalisé Ici,
Voici le script Dynamo Ici,
7- La vidéo :
Voici ma vidéo qui reprend les différentes étapes:
6 – Remerciements :
Je veux remercier Cesare Caoduro créateur du Package dynamo “Dynamo4MEP” car pour réaliser ce billet, je me suis inspiré d’un de ses nombreux nœuds.
Donc : Grazie mille Cesare !