“La mayor parte de los conocimientos adquiridos traen consigo sus propios privilegios”
Bernard Shaw.
Saber de programación puede aumentar la eficiencia de cualquier herramienta de diseño que utilicemos. Ya sea automatizando tareas repetitivas o creando nuevas funcionalidades, podemos invertir menos tiempo en actividades operativas y más en actividades creativas o analíticas.
En el artículo anterior vimos como podemos integrar Python en nuestros flujos de trabajo sobre un Software BIM como Revit a través de pyRevit, sin embargo como lo mencionamos es sólo una opción. Por eso en esta entrada te platicaremos sobre 4 Formas de programar en Revit con Python y así amplíes tu panorama si piensas decidirte a comenzar a crear tus propios comandos con un lenguaje de programación de código abierto como Python.
¿Por que Python?
Python es un lenguaje de programación creado por Guido Van Rossum en 1991. El nombre del lenguaje proviene de la afición de su creador por los humoristas británicos Monty Python.
Revit ofrece por default soporte y ayuda para otros lenguajes como C#, Visual Basic y Visual C++. Sin embargo la curva de aprendizaje de estos es mucho mayor a la de Python. Nuestro objetivo no es ser expertos en programación sino ser capaces de aprovechar el potencial oculto tras la interfaz grafica del software.
Y para este fin Python representa la mejor opción ya que es considerado un lenguaje para principiantes en el mundo de la programación. Por la similitud de su sintaxis con el idioma inglés, que nos da acceso a la API de Revit, conectividad con otros programas como Excel, un extenso catálogo de librerías.
Además el material disponible va aumentando día con día como resultado del aumento de su popularidad como lo muestra la firma de análisis Red Monk en la siguiente gráfica actualizada a Junio de 2020, puedes ver el artículo aquí.
Recursos
Existen cursos online en plataformas como BM Learning, que orienta el aprendizaje de Python hacia entornos de modelado BIM. Cursos dirigidos al aprendizaje general del lenguaje en Udemy o Codecademy (Inglés). Libros como Aprende Python en un fin de semana en versión digital e impresa. También existen opciones gratuitas como este Curso de Python Básico Gratis disponible en YouTube. Y te dejo un listado de páginas y blogs donde podrás encontrar algunos de ejemplos del uso de Python en Revit.
#1. Programar en Revit con Python: Macros
Para este ejercicio de comparación utilizaremos un sencillo código que he escrito hace tiempo. Lo que logramos con estas líneas es que al seleccionar varios elementos basados en curvas MEP como conduits, tuberías o ductos, el programa nos muestre una ventana con la suma de las longitudes de todos los elementos seleccionados.
Esto nos permite consultar de forma rápida las longitudes estimadas de nuestras trayectorias, y saber por ejemplo si he excedido los 100 metros de longitud de alcance de un cable UTP, o la distancia de un equipo al dispositivo más lejano para los cálculos correspondientes.
El código seguramente se puede mejorar en redacción y funcionamiento. Siéntete libre de hacer cualquier ajuste que haga que este funcione mejor o si lo prefieres deja tu opinión en los comentarios.
"""
"Calculate the total length for the selected elements"
__title__ = 'Quick\nLength'
__author__ = 'Gilberto Granados'
Este codigo se comparte en https://bimetheca.com
"""
doc = self.Document
# Seleccion de elementos
selection = self.Selection.GetElementIds()
filtro = FilteredElementCollector(doc, selection).WhereElementIsCurveDriven().ToElements()
total_length = 0.0
# Iterando sobre elementos
for element in filtro:
# Obtenemos la longitud de cada elemento en la seleccion
length_param = element.Parameter[BuiltInParameter.CURVE_ELEM_LENGTH].AsDouble()
# Hacemos la suma de cada longitud en la seleccion para obtener la longitud total
total_length += length_param
# Conversion de unidades, Revit utiliza por default FEETS, convertimos a METERS
total_length_meters = UnitUtils.Convert(total_length, DisplayUnitType.DUT_DECIMAL_FEET, DisplayUnitType.DUT_METERS)
# Creamos la ventana que nos muestra la longitud total en metros
TaskDialog.Show("Bimetheca", "Total length: {} m".format(total_length_meters))
Las macros de Revit son programas que diseñamos para automatizar tareas, aprovechando la Interfaz de Programación de Aplicaciones (API). Que Revit nos ofrece para ampliar y personalizar la funcionalidad del producto. El administrador de Macros lo encontramos por default en la pestaña Manage de Revit, no es necesario instalar nada adicional. Ya que al crear una Macro Revit nos abre un IDE llamado Sharp Develop, donde podemos escribir nuestro código.
Las Macros de Revit permiten el uso de 4 lenguajes de programación: C#, VB.Net, Ruby y Python.
#2. Programar en Revit con Python: Revit Python Shell
"""Calculate the total length for the selected elements"""
__title__ = 'Quick\nLength'
__author__ = 'Gilberto Granados'
#Este codigo se comparte en https://bimetheca.com
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInParameter, UnitUtils, DisplayUnitType
from Autodesk.Revit.UI import TaskDialog
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
# Seleccion de elementos
selection = uidoc.Selection.GetElementIds()
filtro = FilteredElementCollector(doc, selection).WhereElementIsCurveDriven().ToElements()
total_length = 0.0
# Iterando sobre elementos
for element in filtro:
# Obtenemos la longitud de cada elemento en la seleccion
length_param = element.Parameter[BuiltInParameter.CURVE_ELEM_LENGTH].AsDouble()
# Hacemos la suma de cada longitud en la seleccion para obtener la longitud total
total_length += length_param
# Conversion de unidades, Revit utiliza por default FEETS, convertimos a METERS
total_length_meters = UnitUtils.Convert(total_length, DisplayUnitType.DUT_DECIMAL_FEET, DisplayUnitType.DUT_METERS)
# Creamos la ventana que nos muestra la longitud total en metros
TaskDialog.Show("Bimetheca", "Total length: {} m".format(total_length_meters))
Revit Python Shell permite accesar a la API de Revit y manipularla con Python durante una sesión de el programa en ejecución. Esto quiere decir que puedes ir probando los resultados de tu código, haciendo los ajustes necesarios de manera interactiva y más práctica. En el ejemplo ya tenemos el código escrito, pero RPS está pensado para trabajar tu código ¡directamente en tu sesión de Revit!.
#3. Programar en Revit con Python: Dynamo
"""
"Calculate the total length for the selected elements"
__title__ = 'Quick\nLength'
__author__ = 'Gilberto Granados'
Este codigo se comparte en https://bimetheca.com
"""
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
uidoc= DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
# Seleccion de elementos
selection = uidoc.Selection.GetElementIds()
filtro = FilteredElementCollector(doc, selection).WhereElementIsCurveDriven().ToElements()
total_length = 0.0
# Iterando sobre elementos
for element in filtro:
# Obtenemos la longitud de cada elemento en la seleccion
length_param = element.Parameter[BuiltInParameter.CURVE_ELEM_LENGTH].AsDouble()
# Hacemos la suma de cada longitud en la seleccion para obtener la longitud total
total_length += length_param
# Conversion de unidades, Revit utiliza por default FEETS, convertimos a METERS
total_length_meters = UnitUtils.Convert(total_length, DisplayUnitType.DUT_DECIMAL_FEET, DisplayUnitType.DUT_METERS)
# Creamos la ventana que nos muestra la longitud total en metros
TaskDialog.Show("Bimetheca", "Total length: {} m".format(total_length_meters))
Dynamo para Revit, es un complemento que nos permite explorar la programación visual. Conectando nodos precargados que contienen líneas de código Python o de otros lenguajes. Cada nodo será una pieza para armar una red de nodos que en conjunto ejecutarán una serie de instrucciones. Que nos ayudarán entre otras cosas a generar o modificar geometrías, automatizar tareas de documentación o manipular información de la base de datos del modelo.
Un tipo de nodo en especial llamado “Python Script“, nos ofrece un editor de código, de manera similiar al Sharp Develop de la Macros o a la consola de Revit Python Shell. Es ahí donde comenzamos a escribir nuestro código o lo pegamos si lo hemos escrito en un editor diferente.
#4. Programar en Revit con Python: pyRevit
"""Calculate the total length for the selected elements"""
__title__ = 'Quick\nLength'
__author__ = 'Gilberto Granados'
#Este codigo se comparte en https://bimetheca.com
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInParameter, UnitUtils, DisplayUnitType
from Autodesk.Revit.UI import TaskDialog
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
# Seleccion de elementos
selection = uidoc.Selection.GetElementIds()
filtro = FilteredElementCollector(doc, selection).WhereElementIsCurveDriven().ToElements()
total_length = 0.0
# Iterando sobre elementos
for element in filtro:
# Obtenemos la longitud de cada elemento en la seleccion
length_param = element.Parameter[BuiltInParameter.CURVE_ELEM_LENGTH].AsDouble()
# Hacemos la suma de cada longitud en la seleccion para obtener la longitud total
total_length += length_param
# Conversion de unidades, Revit utiliza por default FEETS, convertimos a METERS
total_length_meters = UnitUtils.Convert(total_length, DisplayUnitType.DUT_DECIMAL_FEET, DisplayUnitType.DUT_METERS)
# Creamos la ventana que nos muestra la longitud total en metros
TaskDialog.Show("Bimetheca", "Total length: {} m".format(total_length_meters))
pyRevit de Ehsan Iran-Nejad, es una opción que ya habíamos comentado en el artículo anterior “Tus comandos en Revit con Python + pyRevit“. La principal ventaja es su facilidad para crear botones sobre la interfaz de Revit, ¡incluso nos permite asignar atajos de teclado para nuestros comandos!. Personalmente veo a pyRevit como una evolución de Revit Python Shell, en palabras del mismo Daren Thomas creador de Revit Python Shell. Daren@Work, pyRevit es lo que RPS debió haber sido en su momento. Si analizamos los códigos de ambas opciones podemos ver que se pueden escribir exactamente igual, no así con las Macros o en Dynamo.
He dejado los códigos para cada opción debajo de la demostración para que realices la prueba tu mism@. Y así tengas una prueba aunque sea pequeña del potencial de programar en Revit con Python.
¿Cuál es la mejor opción?
Como podemos ver en las demostraciones de las 4 Formas de programar en Revit con Python, todas las opciones funcionan bien. Entonces para decidir entre una opción y otra podemos considerar temas como la disponibilidad de información en la web. Como ejemplos, tutoriales y foros, en este aspecto las Macros serían la opción más débil, al menos si queremos usarlas con Python.
La opción con mayor popularidad y por tanto con mayor información disponible es Dynamo, empezando con su página y foro oficial. Además de una gran cantidad de tutoriales en YouTube y blogs dedicados al tema.
En bimetheca nos decantamos por las opciones #3 Dynamo y #4 pyRevit, por la facilidad de aplicación y el tema de información disponible. pyRevit cuenta con una documentación muy completa y en constante actualización que puedes revisar aquí.
Espero que el artículo 4 Formas de programar en Revit con Python te sea de utilidad y te ayude a decidir la mejor opción para empezar a programar en Revit. Sientete con la libertad de comentarnos dudas o sugerencias para mejorar el contenido que te presentamos en Bimetheca. Y espera por nuevos artículos relacionados con este y otros temas que tenemos preparados para tí.
¡Hasta el próximo artículo!.
Aquí te dejo enlaces a material que profundiza en los temas tratados en este artículo:
- Aprende Python en un fin de semana
- Think Python: How to Think Like a Computer Scientist
- Salto Al Bim: Estrategias Bim de Calidad Para Empresas Punteras del Sector Aec (Español)
- Guía para implementar y gestionar proyectos BIM: Diario de un BIM manager (Spanish Edition)
- Building Information Modeling: conceptos básicos: Guía de bolsillo
Gilberto Granados, Arquitecto y Senior Digital Designer en Harris Design Studio
Términos y condiciones
El contenido proporcionado en Bimetheca es solo para fines informativos; el propietario de este blog no se responsabiliza de la exactitud, integridad y disponibilidad de la información de este sitio, el propietario no será responsable de ninguna pérdida, lesión o daño por la visualización o el uso de esta información.
Nos complace que compartan nuestras publicaciones a través de todas las plataformas de redes sociales; incluyendo las publicaciones originales con crédito al autor y proporcionando un enlace al contenido original.
Estos términos y condiciones de uso están sujetos a cambios en cualquier momento y sin previo aviso.