{"id":809,"date":"2016-10-24T10:00:00","date_gmt":"2016-10-24T08:00:00","guid":{"rendered":"https:\/\/blogs.autodesk.com\/villagebim\/2016\/10\/exemple-dynamo-fonction-coupure-en-un-clic.html"},"modified":"2016-10-24T10:00:00","modified_gmt":"2016-10-24T08:00:00","slug":"exemple-dynamo-fonction-coupure-en-un-clic","status":"publish","type":"post","link":"https:\/\/blogs.autodesk.com\/villagebim\/2016\/10\/exemple-dynamo-fonction-coupure-en-un-clic.html","title":{"rendered":"Exemple Dynamo : Fonction Coupure en un clic"},"content":{"rendered":"<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01bb0946d93d970d-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"244\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95a6970c-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p style=\"text-align: justify\">&#160;<\/p>\n<p style=\"text-align: justify\">Je pense que vous commencez \u00e0 bien connaitre Dynamo for Revit au travers des diff\u00e9rents exemples que j\u2019ai pu r\u00e9aliser.<\/p>\n<p style=\"text-align: justify\">Notamment, au travers de ce billet, je vais vous montrer comment un script Python peut appeler et utiliser l\u2019API Revit (Application Programming Interface).<\/p>\n<p style=\"text-align: justify\">Pour illustrer cette exemple, je vais utiliser la fonction &quot;<em>Couper<\/em>&quot; de Revit, voire l\u2019am\u00e9liorer (si, si) !<\/p>\n<p style=\"text-align: justify\">En effet, lorsque vous voulez couper plusieurs \u00e9l\u00e9ments par rapport \u00e0 un volume vide, il faut cliquer l\u2019\u00e9l\u00e9ment \u00e0 couper puis le volume vide et r\u00e9p\u00e9ter l\u2019op\u00e9ration autant de fois que vous avez d\u2019\u00e9l\u00e9ments (par exemple 20 \u00e9l\u00e9ments soit 40 clics).<\/p>\n<p style=\"text-align: justify\">Voici les diff\u00e9rentes \u00e9tapes :<\/p>\n<p style=\"text-align: justify\"><strong><u>1- Cr\u00e9ation d\u2019un n\u0153ud personnalis\u00e9 :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\"><a href=\"http:\/\/villagebim.typepad.com\/villagebim\/2016\/01\/exemple-dynamo-creation-d-un-noeud-personnalise.html\">Dans cet article<\/a>, je vous explique&#160;comment cr\u00e9er un n\u0153ud personnalis\u00e9.<\/p>\n<ul>\n<li>Sur la page d\u2019accueil de Dynamo, cliquez sur le bouton \u201c <em>N\u0153ud personnalis\u00e9<\/em>\u201d<\/li>\n<\/ul>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c25a970b-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"198\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c25e970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"244\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<ul>\n<li>Donnez un nom, une description et l\u2019endroit o\u00f9 devra appara\u00eetre votre n\u0153ud personnalis\u00e9 (ici chapitre Revit)<\/li>\n<\/ul>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01bb0946d944970d-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"312\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c265970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"304\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<ul>\n<li>nous allons cr\u00e9er deux entr\u00e9es (<em>Input<\/em>):<\/li>\n<\/ul>\n<p style=\"text-align: justify\">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; &#8211; S\u00e9lection d\u2019\u00e9l\u00e9ments a couper<\/p>\n<p style=\"text-align: justify\">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; &#8211; S\u00e9lection du vide<\/p>\n<p style=\"text-align: justify\">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; &#8211; Un n\u0153ud Python (<em>Python Script<\/em>) \u00e0 deux entr\u00e9es et une sortie (<em>Output<\/em>)<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01bb0946d948970d-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"325\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95ae970c-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<ul>\n<li>Reliez les diff\u00e9rents n\u0153uds et modifiez le n\u0153ud Python (clic droit&#160; \u201c<em>Modifier<\/em>\u201d)<\/li>\n<\/ul>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95b9970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"326\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95c0970c-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<p style=\"text-align: justify\"><strong><u>2- Cr\u00e9ation du script Python:<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">A l\u2019ouverture de l\u2019\u00e9diteur python, nous d\u00e9couvrons le squelette de base avec ses diff\u00e9rentes zones<\/p>\n<ul>\n<li>D\u00e9claration<\/li>\n<li>Affectation des valeurs d\u2019entr\u00e9e<\/li>\n<li>Traitement des donn\u00e9es (actuellement rien)<\/li>\n<li>Affectation de la (ou les) valeur de sortie<\/li>\n<\/ul>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95c4970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"379\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01bb0946d953970d-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a>&#160;<\/p>\n<p style=\"text-align: justify\"><strong><u>2.a Partie d\u00e9claration :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">La partie d\u00e9clarative ci-dessous permet d\u2019appeler l\u2019API de Revit avec ses services.<\/p>\n<p style=\"text-align: justify\">Revit &quot;Document \/ Application&quot; est rendu accessible via Dynamo \u201c<em>Document Manager<\/em>\u201d, soit :<\/p>\n<p style=\"text-align: justify\"><em>\u201cclr.AddReference(&quot;RevitAPI&quot;)<\/em><\/p>\n<p style=\"text-align: justify\"><em>clr.AddReference(&quot;RevitServices&quot;)<\/em><\/p>\n<p style=\"text-align: justify\"><em>import RevitServices <\/em><\/p>\n<p style=\"text-align: justify\"><em>from RevitServices.Persistence import DocumentManager<\/em>\u201d<\/p>\n<p style=\"text-align: justify\">&#160;<\/p>\n<p style=\"text-align: justify\">Dynamo fournit son propre cadre de transaction pour travailler avec les API de Revit.<\/p>\n<p style=\"text-align: justify\">Cela signifie que le script Python sera ex\u00e9cut\u00e9 dans le cadre d&#039;une transaction globale Dynamo, d&#039;o\u00f9 :<\/p>\n<p style=\"text-align: justify\"><em>\u201c<span>from RevitServices.Transactions import TransactionManager<\/span>\u201d<\/em><\/p>\n<p style=\"text-align: justify\"><strong><u>2.b Partie affectations des valeurs :<\/u><\/strong><br \/>Voici les variables:<\/p>\n<p style=\"text-align: justify\">On affecte l\u2019actuel fichier Revit ouvert&#160; \u00e0 la variable \u201cDocumentOBA\u201d.<\/p>\n<p style=\"text-align: justify\">\u201c<em>ElementaACoupe<\/em>\u201d = r\u00e9cup\u00e8re la valeur de la premi\u00e8re entr\u00e9e<\/p>\n<p style=\"text-align: justify\">\u201c<em>Vide<\/em>\u201d&#160; = r\u00e9cup\u00e8re la valeur de la deuxi\u00e8me entr\u00e9e <br \/>Nota&#160; : cette fonction \u201c<em>UnwrapElement<\/em>\u201d permet de transformer en propri\u00e9t\u00e9 Dynamo Python la variable \u201cenvelopp\u00e9e\u201d .<\/p>\n<p style=\"text-align: justify\">Soit le code ci-dessous :<\/p>\n<p style=\"text-align: justify\"><span>\u201c<em>DocumentOBA = DocumentManager.Instance.CurrentDBDocument<br \/>ElementsACouper = UnwrapElement(IN[0])<br \/>Vide = UnwrapElement(IN[1])\u201d<\/em><\/span><\/p>\n<p style=\"text-align: justify\"><strong><u>2.c&#160; Partie traitement des donn\u00e9es :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Je vais r\u00e9aliser une boucle qui prendra en compte tous les \u00e9l\u00e9ments s\u00e9lectionn\u00e9s (de&quot; <em>i<\/em>&quot; \u00e0 &quot;<em>ElementsACouper<\/em>&quot;).<\/p>\n<p style=\"text-align: justify\">Ensuite , j&#039;initialise l&#039;op\u00e9ration Dynamo du fichier ouvert (&#039;<em>TransactionManager.Instance.EnsureInTransaction(DocumentOBA<\/em>)&#039;).<\/p>\n<p style=\"text-align: justify\">La m\u00e9thode \u201c<em>AddInstanceVoidCut<\/em>\u201d suivi des trois arguments&#160; (DocumentOBA,i, Vide) permet de couper l\u2019\u00e9l\u00e9ment \u201ci\u201d avec le Volume vide.<\/p>\n<p style=\"text-align: justify\">Soit le code suivant :<\/p>\n<p style=\"text-align: justify\"><em><span>\u201cfor i in ElementsACouper:&#160;&#160;&#160; <br \/>&#160;&#160;&#160; TransactionManager.Instance.EnsureInTransaction(DocumentOBA)<br \/>&#160;&#160;&#160; InstanceVoidCutUtils.AddInstanceVoidCut(DocumentOBA,i, Vide)\u201d<\/span><\/em><\/p>\n<p style=\"text-align: justify\"><strong><u>2.d&#160; Partie affectation de la (ou les) valeur de sortie :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Pas de changement , car nous n\u2019utilisons pas la valeur de sortie (uniquement le fonctionnement de l\u2019API).<\/p>\n<p style=\"text-align: justify\"><strong><u>2e Code complet :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Voici la totalit\u00e9 du code que vous pouvez recopier.<\/p>\n<p style=\"text-align: justify\">import clr<br \/>clr.AddReference(&#039;RevitAPI&#039;)<br \/>from Autodesk.Revit.DB import *<br \/>clr.AddReference(&quot;RevitServices&quot;)<br \/>clr.AddReference(&quot;ProtoGeometry&quot;)<br \/>from Autodesk.DesignScript.Geometry import *<br \/>import RevitServices<br \/>from RevitServices.Persistence import DocumentManager<br \/>from RevitServices.Transactions import TransactionManager<\/p>\n<p style=\"text-align: justify\">DocumentOBA = DocumentManager.Instance.CurrentDBDocument<br \/>ElementsACouper = UnwrapElement(IN[0])<br \/>Vide = UnwrapElement(IN[1])<\/p>\n<p style=\"text-align: justify\">for i in ElementsACouper:&#160;&#160;&#160; <br \/>&#160;&#160;&#160; TransactionManager.Instance.EnsureInTransaction(DocumentOBA)<br \/>&#160;&#160;&#160; InstanceVoidCutUtils.AddInstanceVoidCut(DocumentOBA,i, Vide)<\/p>\n<p style=\"text-align: justify\">OUT =&#160; 0<\/p>\n<p style=\"text-align: justify\"><strong><u>3 Mise en fonction :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Apr\u00e8s avoir cliquer sur le bouton \u201c<em>Accepter le modification<\/em>\u201d, vous allez pouvoir cr\u00e9er un nouveau script (en cliquant le bouton \u201c<em>Nouveau<\/em>\u201d) qui appellera le n\u0153ud personnalis\u00e9.<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95ca970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"156\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c27c970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"304\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<p style=\"text-align: justify\">Dans la biblioth\u00e8que du r\u00e9pertoire Revit, cliquez sur le n\u0153ud personnalis\u00e9 \u201c<em>ExempleCouper<\/em>\u201d pour le placer dans l\u2019interface Dynamo.<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95ce970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"326\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c280970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a>&#160;<\/p>\n<p style=\"text-align: justify\">Ensuite utilisez deux n\u0153uds suppl\u00e9mentaires :<\/p>\n<ul>\n<li>\u201cSelect Model Elements\u201d = S\u00e9lectionner tous les \u00e9l\u00e9ments \u00e0 couper (au pluriel)<\/li>\n<li>\u201cSelect Model Element\u201d= S\u00e9lectionner le volume vide (au singulier)<\/li>\n<\/ul>\n<p style=\"text-align: justify\">Enfin connectez les deux n\u0153uds au n\u0153ud personnalis\u00e9 (attention ne pas se tromper au niveau des entr\u00e9es).<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95d3970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"326\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c286970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<p style=\"text-align: justify\">Si vous avez bien tout r\u00e9alis\u00e9, voici&#160;le r\u00e9sultat final :<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b8d22d95e0970c-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"244\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c291970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<p style=\"text-align: justify\"><u><strong>4 \u2013 Conclusion :<\/strong><\/u><\/p>\n<p style=\"text-align: justify\">J\u2019esp\u00e8re que vous avez pu appr\u00e9cier au travers de ce petit exemple la puissance de Dynamo utilisant l&#039;API de Revit.<\/p>\n<p style=\"text-align: justify\">Je suis s\u00fbr que cela va vous donner des id\u00e9es pour renforcer la puissance de Revit !<\/p>\n<p style=\"text-align: justify\"><strong><u>5- T\u00e9l\u00e9chargement :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Voici le fichier Revit <span class=\"asset  asset-generic at-xid-6a015391e15a28970b01b7c8a454b3970b img-responsive\"><a href=\"http:\/\/villagebim.typepad.com\/files\/coupevidevillagebim.rvt\">Ici<\/a><\/span>,<\/p>\n<p style=\"text-align: justify\">Voici le n\u0153ud personnalis\u00e9 <span class=\"asset  asset-generic at-xid-6a015391e15a28970b01b8d22e090b970c img-responsive\"><a href=\"http:\/\/villagebim.typepad.com\/files\/coupevidevillagebim.dyf\">Ici<\/a><\/span>,<\/p>\n<p style=\"text-align: justify\">Voici le script Dynamo <span class=\"asset  asset-generic at-xid-6a015391e15a28970b01bb0947701b970d img-responsive\"><a href=\"http:\/\/villagebim.typepad.com\/files\/coupevidevillagebim.dyn\">Ici<\/a><\/span>,<\/p>\n<p style=\"text-align: justify\"><strong><u>7- La vid\u00e9o :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Voici ma vid\u00e9o qui reprend les diff\u00e9rentes \u00e9tapes:<\/p>\n<p style=\"text-align: justify\">&#160;<\/p>\n<p class=\"asset-video\" style=\"text-align: center\">\n<p style=\"text-align: justify\">&#160;<\/p>\n<p style=\"text-align: justify\"><strong><u>6 \u2013 Remerciements :<\/u><\/strong><\/p>\n<p style=\"text-align: justify\">Je veux remercier <strong>Cesare Caoduro<\/strong> cr\u00e9ateur du Package dynamo \u201cDynamo4MEP\u201d car pour r\u00e9aliser ce billet, je me suis inspir\u00e9 d\u2019un de ses nombreux n\u0153uds.<\/p>\n<p><a href=\"http:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01bb0946d95d970d-pi\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"132\" src=\"https:\/\/villagebim.typepad.com\/.a\/6a015391e15a28970b01b7c8a3c296970b-pi\" style=\"background-image: none;padding-top: 0px;padding-left: 0px;padding-right: 0px;border: 0px;margin-left: auto;margin-right: auto\" title=\"image\" width=\"454\" \/><\/a><\/p>\n<p>&#160;<\/p>\n<p style=\"text-align: justify\"><strong>Donc : Grazie mille Cesare !<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#160; Je pense que vous commencez \u00e0 bien connaitre Dynamo for Revit au travers des diff\u00e9rents exemples que j\u2019ai pu r\u00e9aliser. Notamment, au travers de ce billet, je vais vous montrer comment un script Python peut appeler et utiliser l\u2019API Revit (Application Programming Interface). Pour illustrer cette exemple, je vais utiliser la fonction &quot;Couper&quot; de [&hellip;]<\/p>\n","protected":false},"author":13092,"featured_media":2472,"menu_order":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[15,17,6],"tags":[1182,20,1180,1181,865,419,1183],"class_list":["post-809","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autodesk-revit","category-nouveautes","category-trucs-et-astuces","tag-api","tag-autodesk","tag-cesare","tag-coupure","tag-exemple-dynamo","tag-python","tag-script","dhig-theme--light"],"acf":[],"_links":{"self":[{"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/posts\/809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/users\/13092"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/comments?post=809"}],"version-history":[{"count":0,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/posts\/809\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/media\/2472"}],"wp:attachment":[{"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/media?parent=809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/categories?post=809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.autodesk.com\/villagebim\/wp-json\/wp\/v2\/tags?post=809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}