Conversión de Dynamo Scripts a Add-ins con PyRevit

Después de leer el excelente post de @Luis Alonso Otero sobre conversión de scripts de Dynamo utilizando c#, me pareció interesante plantear otra alternativa para las personas que ya están desarrollando scripts en Dynamo, utilizando Python Code Blocks. Ya que es algo que aún tengo pendiente de generar el contenido para complementar nuestro set de cursos de Automatización con Dynamo en Academia BIM. Además, me sirve de excusa para introducir una herramienta tan brillante como PyRevit, ya que su uso es bastante bajo en Chile y Latinoamérica en general. 

PyRevit está definido como un ambiente de prototipado rápido, (RAD) por sus siglas en inglés, para Revit. Básicamente permite generar Add-ins de forma rápida utilizando varios lenguajes de programación, por ejemplo, IronPython (mismo lenguaje para nodos personalizados en Dynamo), Cpython, c# o VB.Net. A la vez, permite distribuir los nuevos Add-ins generados de forma rápida dentro de una oficina, lo cual es importante. Por si esto no fuera poco, también viene con una amplio sets de herramientas desarrolladas por Ehsan Iran-Nejad (creador de PyRevit) y cuenta con una excelente documentación del uso de PyRevit. 

Para mostrar cómo utilizar PyRevit elegí una rutina de Dynamo bastante simple pero que proporciona una solución a un molesto problema que tiene Revit, y el es cálculo de longitudes, áreas y volúmenes en elementos de la categoría Muros. Por ejemplo, asumamos que un usuario de Revit quiere saber de forma rápida el área o longitud total de un conjunto de tabiques en un departamento; la única alternativa sería crear un schedule, agregar filtros, agregar parámetros a los muros, configurar el schedule... todo esto para obtener totales de un conjunto particular de tabiques de interés, mismo problema pasa en hormigón. 

El siguiente Script de Dynamo soluciona ese problema. El usuario puede correr el script de Dynamo Player previo a una selección de muros en particular y con esto obtendrá los totales de longitud, área y volumen de una forma rápida. 

Script para cálculo rápido de longitud, área y volúmen:

Script  para cálculo rápido de longitud, área y volúmen

Al correr el script se obtiene el siguiente resultado:

Resultado de Calculo de Longitud, Area y volumen. 

Para el caso previo, el volúmen sería redundante, pero si se tratara de hormigón, seria un dato muy útil. El script en cuestión usa el nodo de Spring Nodes para obtener la selección actual y un poco de Python para crear la ventana de diálogo mostrando los valores. El código de Python es sumamente simple y se presenta a continuación:

Image caption

Bueno, ahora que ya tenemos en mente el script que queremos convertir, veamos que necesitamos para primero instalar PyRevit, y luego crear nuestra pestaña con comandos personalizados en la cual estará nuestro botón para cálculo rápido de longitudes, áreas y volúmenes en Revit. 

Instalación de PyRevit

Para instalar pyRevit es necesario ir al siguiente link: https://github.com/eirannejad/pyRevit/releases . Para este caso, utilizaremos la versión 4.7.4 por lo cual podemos ir hasta la sección de Assets y descargar el archivo pyRevit_4.7.4_signed.exe

Image caption

La instalación es estándar. Cierren Revit previo a la instalación y den click en siguiente hasta que termine el instalador de hacer su trabajo. La próxima vez que se abra Revit, el software preguntará por autorización para PyRevit, luego de esto debería aparecer la siguiente pestaña con los comandos por default de PyRevit:

Image caption

Como podemos observar, todos los comandos que están disponibles dentro de la nueva pestaña fueron creados utilizando PyRevit, por lo que prueba la versatilidad de la herramienta para generar add-ins con alta complejidad. Les recomiendo den una revisada a esos comandos, sobretodo las herramientas para láminas, creado de patrones personalizados y herramientas de análisis y selección. 

Ahora bien, esto nos permite usar los comandos por default, ¿pero cómo creamos nuestros propios comandos?

Proceso de creación de Add-ins en PyRevit

Acá es donde en mi opinión brilla PyRevit. El proceso de creación de Add-ins es sumamente simple; muy fácil de entender para alguien que no tenga tanta experiencia con ambientes de programación y editores de código. Lo primero que tenemos que hacer es intalar VSCode. Este es un entorno de programación simple y flexible https://code.visualstudio.com/ .Una vez este instalado debemos agregar la extensión de Python como se muestra en la siguiente imagen:

Image caption

VSCode es la herramienta que personalmente uso para desarrollar nodos personalizados en Dynamo por lo que se adapta muy bien en mi flujo para PyRevit.

Ahora, volviendo a PyRevit. Lo primero que tenemos que hacer es una estructura de carpetas muy particular. La estructura será la siguiente:

Asumamos que crearemos una carpeta en Mis Documentos que contendrá toda la información de nuestro Add-in. Llamaré a esa carpeta Dynamo-Py; dentro de esa carpeta crearemos la siguiente estructura y por facilidad usaré la siguiente nomenclatura Nombre de Carpeta: Descripcion. No es muy común que creemos una carpeta y usemos nomenclatura como MiComando.pushbutton, pero la última parte después del punto es la forma en que PyRevit jerarquiza y distingue qué es una pestaña, qué es un panel y qué es un botón. 

Image caption

El archivo scirpt.py aún no estará generado a este punto. Eso lo haremos en el siguiente paso. El icono puede ser cualquier imágen png y esta será asociada en el botón en Revit. Para los iconos pueden usar https://www.freepik.com/popular-icons para encontrar un icono que sea de su interés.

Creación de script en VSCode

Ahora dentro de VSCode abriremos el folder que termina en .pushbutton. Esto nos permitirá crear un nuevo archivo el cual llamaremos script.py . Noten que es importante terminar el nombre con .py , pues esto le dice a VSCode que el archivo en cuestión es un script de Python.

Image caption

El script que desarrollaremos constará de 5 partes principales. Explicaré cada una de ellas a continuación:

Image caption

Parte 1:

Este no es nada más que el comentario o tooltip que aparecerá en Revit cuando el usuario mueva el cursor sobre el nuevo botón creado. Notar que se usan 3 """ al inicio y fin para terminar el comentario. 


Parte 2:

Lo primero, similar a un script de IronPython en Dynamo es importar los ensamblajes que se utilizarán. En nuestro caso necesitamos acceder a las propiedades de los muros, por lo cual necesitamos acceder a la base de datos de Revit; por ello importamos la DB. Luego, utilizamos uno de los módulos core de PyRevit para extraer el documento activo.

Image caption

Parte 3:

Las siguientes líneas de código nos permiten 2 cosas: primero, obtener la selección que el usuario tiene en la interfaz de Revit y luego generar una lista de los elementos seleccionados.

Image caption

Parte 4:

La siguiente porción de código es la lógica que permite extraer los valores de las propiedades que nos interesa. Nótese que estamos utilizando BuiltInParameters, es decir, el nombre de los parámetros en la API, que no es el mismo que el nombre que el usuario ve. Por ejemplo, el parámetro length en las propiedades de los muros es equivalente a CURVE_ELEM_LENGTH. Para más información sobre estos para metros consultar los documentos de la API de Revit en el siguiente enlace: https://www.revitapidocs.com/2017/fb011c91-be7e-f737-28c7-3f1e1917a0e0.htm

Otra nota importante es que todas las medidas internas de la API de Revit están en unidades imperiales, por lo que es necesario hacer la conversión a metros.

Image caption

Parte 5:

Lo último que necesitamos es mostrar el resultado de nuestra operación. Para esto podríamos crear un hook para mostrar la ventana de Taskdialog similar a como hicimos dentro del script de Dynamo. Sin embargo, prefiero utilizar la ventana de presentación incluida en PyRevit, para acceder a esta solo necesitamos dar Print.

Image caption

Añadiendo pestaña en Revit

Perfecto, hasta este punto ya tenemos el script. El ícono y la configuración de carpetas que necesitamos para crear nuestra herramienta. Ahora necesitamos decirle a PyRevit dentro de Revit que añada esta estructura dentro del software. Para ello lo primero es ir a Settings dentro de la pestaña de PyRevit:

Image caption

Dentro de Settings damos Add folder y buscamos el primer folder en nuestra jerarquía, para nuestro ejemplo sería el folder de Dynamo-Py.

Image caption

Luego ejecutamos el botón Save Settings and Reload. Luego de esto, debería aparecer una nueva pestaña en Revit con nuestro botón tal y como se muestra en la siguiente imagen:

Image caption

Y esto es todo, no es necesario hacer nada más que probar nuestro script.


Image caption

Como podemos observar, obtenemos los mismos valores que con el script de Dynamo, pero con varias ventajas. Entre ellas, que ahora podemos anclar este nuevo botón a un atajo de teclado, con lo cual podemos obtener los cálculos deseados con una gran rapidez. 

Image caption

Notas finales

Debug y cambios a script

Para cerrar quiero mencionar lo fácil que es el proceso de debug del Script creado. Algo que normalmente consume mucho tiempo utilizando otros métodos. Para el caso de PyRevit, asumamos que queremos cambiar el script para que muestre otro parámetro, o simplemente cambiar los nombres o unidades en que es presentada la información. Es tan simple como hacer el cambio, guardar el script y correr ejecutar el comando nuevamente:

Image caption

Link a github: https://github.com/BadAstronaut/pyRevitIntro

Autor: Ricardo Zepeda. Cofundador Academia BIM y BIMetriX.

Creado con