4 Formas de programar en Revit con Python


Programar en Revit con Python

“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í.

Python se localiza en la parte superior derecha solo debajo de Java, aquí se esta midiendo la popularidad de los lenguajes en base al número de proyectos en Git Hub y en la cantidad de etiquetas encontradas en Stack Overflow.

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



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.