Está en la página 1de 13

DominaDynamo

Dynamo para Revit


Extra: Python

El contenido de esta obra (texto y vídeos enlazados) está protegido por la Ley de Propiedad
Intelectual Española, que establece penas de prisión y/o multas, además de las correspondientes
indemnizaciones por daños y perjuicios. No se permite copiar, distribuir, exhibir este trabajo ni
realizar otros trabajos derivados del mismo con propósitos comerciales. En caso de citar el trabajo,
previa autorización escrita por el propietario del copyright, se deberá reconocer y citar al autor.

©Joan Moretó | DominaDynamo


Curso: Dynamo para Revit
Extra: Python y Dynamo

1. Python

Python es un lenguaje de programación que, según los expertos, dispone de una sintaxis
fácilmente comprensible, por lo menos en comparación con otros lenguajes, y permite la
integración de funcionalidades o procedimientos estructurados en bibliotecas, lo que que
le permite interactuar de forma directa con aplicaciones existentes como Dynamo o Revit

La principal ventaja de Python respecto a la programación visual es que puede facilitar en


gran medida las operaciones condicionales y con bucles y, por otro lado permite conectar
con la interfaz de programación de aplicaciones (API) de Revit, con lo que podemos
llegar a desarrollar funciones aun no implementadas en los nodos visuales de Dynamo
(como por ejemplo colocar puertas o ventanas). Esta capacidad será la principal razón
por la que, como indicábamos al hablar de nodos personalizados, muchos de éstos
contienen código de Python en su interior.

Se trata en todo caso de todo un lenguaje de programación y, por tanto, resulta un tema
demasiado extenso para desarrollarlo en este curso. Existen muchas alternativas–
muchas gratuitas–para aprender Python, y una forma de ir aprendiendo también puede
ser partir de nodos personalizados existentes y realizar las modificaciones oportunas para
adaptarlos a otra función similar.

Para insertar un nodo de código Python usaremos el nodo Python Script. Pinchando en +
o en - podemos añadir o quitar tantos puertos de entrada como queramos pero siempre
tendrá un único puerto de salida (que podrá ser en todo caso una lista o una lista de listas
dando lugar a distintos resultados).

Para entrar dentro del nodo y poder editar su código deberemos hacer doble click dentro
del mismo (también podemos hacer click con el botón derecho y seleccionar Editar), con
lo que se abrirá una ventana como la de la figura 12.01

Figura 12.01: Bloque de Pyhon

©Joan Moretó | DominaDynamo 2


Curso: Dynamo para Revit
Extra: Python y Dynamo

Las 3 primeras líneas, que aparecen por


defecto al insertar el nodo, importan a
Python los nodos y funcionalidades de
Dynamo, por lo que podemos trabajar
introduciendo los nodos como texto de
forma similar al modo en que veíamos en
el Tema 07 Code Block.

Como veíamos en ese tema, al introducir el


nombre de un tipo de elemento (como por
ejemplo Point) que pueda dar lugar a
varios comandos seguido de un punto, se
despliega un menú en el que vemos las
distintas opciones que tenemos. De este
modo, podremos seleccionar el comando
deseado en la lista sin necesidad de
teclearlo.

2. Ejemplo con valores numéricos.

Vamos a ver un sencillo ejemplo en el que queremos obtener una serie de Fibonacci* en
la que introduciremos el número de elementos.

Figura 12.02: Serie de Fibonacci

*La serie o sucesión de Fibonacci es una lista de número enteros comenzando por 0 y 1
en la que cada término es la suma de los 2 anteriores. Tiene numerosas aplicaciones en

©Joan Moretó | DominaDynamo 3


Curso: Dynamo para Revit
Extra: Python y Dynamo

ciencias de la computación o matemáticas y aparece frecuentemente en la naturaleza.


También se encuentra con frecuencia en la arquitectura clásica.

Vamos a analizar el script que hemos creado.

Como decíamos, las 3 primeras líneas importan al bloque de Python los nodos de
Dynamo. En este caso, como no vamos a emplear nodos específicos de Dynamo, se
podrían borrar y funcionaría igual (haz la prueba).

Import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

La siguiente línea asigna un nombre al valor que introducimos en el puerto de entrada


IN[0]

num=IN[0]

Definimos fib como una lista con los valores 0 y 1. Fíjate en que se crea con corchetes y
no con llaves, como hacíamos con el lenguaje DesigScript que es el que se utiliza en el
bloque de código.

fib=[0,1]

Asignamos a la variable i, que va a ser el índice de la lista, el valor inicial 2.

i=2

En el siguiente párrafo definimos la sucesión:

while i < num:


nval=fib[i-1] +fib[i-2]
fib.append(nval)
i = i+1

Con la primera línea establecemos que mientras i (el número de índice) sea menor que
num (la variable que introducimos) se deben repetir en un bucle las líneas que siguen con
una tabulación a la izquierda.

La siguiente define nval como la suma de los elementos de la lista fib con índice i-1 e i-2.

fib.append(nval) añade al final de la lista fib el valor nval.

Para finalizar el bucle, aumentamos el índice en uno.

Por último, OUT = fib , establece que la lista fib sea el valor de salida.

©Joan Moretó | DominaDynamo 4


Curso: Dynamo para Revit
Extra: Python y Dynamo

3. Ejemplo con geometría de Dynamo.

Vamos a ver ahora como se puede introducir


geometría de Dynamo. En este caso, vamos
a utilizar la sucesión de Fibonacci que
acabamos de ver para dibujar una espiral de
Fibonacci, una aproximación a la espiral
aurea generada a partir de arcos circulares
con un radio que se incrementa de forma
proporcional a dicha sucesión.

Figura 12.03: Espiral de Fibonacci y la capilla


Pazzi

A partir del primer arco, de radio 1, el


proceso que emplearemos para trazar cada
uno de los arcos siguientes será:

 Obtenemos el punto final del arco anterior


p1.

 Trasladamos este punto en la


perpendicular a la curva una distancia
nval igual a la suma correspondiente a los
2 términos de la lista anteriores (que se
corresponderá con los radios de las 2
curvas anteriores)

 Trazamos el arco con centro en el punto


que acabamos de crear y radio nval que
abarcará un ángulo de 90 grados.

©Joan Moretó | DominaDynamo 5


Curso: Dynamo para Revit
Extra: Python y Dynamo

Vemos ahora como resulta este procese en Python.

Como se puede apreciar, hasta la línea 9 todo es igual que en el ejemplo anterior.

Import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
#Las entradas de este nodo se almacenan como lista en las variables IN.
dataEnteringNode = IN
num = IN[0]
lis = [0,1]
i=2

A partir de aquí empezarán las diferencias;

©Joan Moretó | DominaDynamo 6


Curso: Dynamo para Revit
Extra: Python y Dynamo

centro = Point.ByCoordinates(0,0,0)
angulo = 90
vector = Vector.ZAxis()
espiral = []

curva = Arc.ByCenterPointRadiusAngle(centro,1,0,angulo,vector)
espiral.append(curva)

Vamos a trazar el primer arco con el nodo (de Dynamo) Arc.ByCenterPointRadiusAngle,


por lo que necesitaremos introducir un punto para el centro, un radio, un ángulo inicial y
uno final y un vector normal al plano de la curva. En las primeras líneas, definimos el
centro, el ángulo final (el inicial– 0– lo introducimos numéricamente) y el vector. Además,
definimos una lista vacía espiral en la que añadiremos las curvas.

En las 2 últimas líneas creamos el primer arco y lo añadimos a la lista espiral.

A partir de aquí iniciamos un bucle como el que veíamos en el ejemplo anterior


añadiendo los nodos de geometría correspondientes al proceso que describíamos al
principio.

while i < num:


nval = lis[i-1]+lis[i-2]
lis.append(nval)

vec = curva.NormalAtParameter(1)
pto1 = curva.PointAtParameter(1)
centro = pto1.Translate(vec,nval)

curva = Arc.ByCenterPointRadiusAngle(centro,nval,angulo,angulo+90,vector)
espiral.append(curva)

angulo = angulo + 90
i=i+1

Observa cómo se añade cada una de las curvas a la lista espiral de modo que el
resultado del nodo sea la espiral completa.

OUT = espiral

©Joan Moretó | DominaDynamo 7


Curso: Dynamo para Revit
Extra: Python y Dynamo

4. Python y Revit

Para trabajar con elementos de Revit, tendremos que añadir al inicio más bibliotecas
además de la de Dynamo que hemos empleado hasta ahora.

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import RevitNodes
clr.AddReference("RevitNodes")
import Revit

# Import Revit elements


from Revit.Elements import *

# Import DocumentManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager

import System

De este modo podremos emplear, además de los nodos relacionados con Revit propios
Dynamo otras funciones disponibles en la API de Revit que no están implementadas en
los nodos visuales.

Vamos a ver un ejemplo, en que queremos insertar una malla de pilares con un número
de pilares variable en cada una de las 2 direcciones y la altura de cada pilar será la
establecida por un volumen como la de la imagen, en la que un plano inclinado corta un
paralelepípedo dando lugar a alturas distintas en cada una de las aristas. En este caso,
los valores de entrada que emplearemos serán las alturas en 3 de las esquinas, h0, h1 y
h2 (la altura en la cuarta esquina se deduce de las otras 3, ya que forman un plano).

©Joan Moretó | DominaDynamo 8


Curso: Dynamo para Revit
Extra: Python y Dynamo

En este caso, introduciremos varios valores en los puertos de entrada del nodo.

 En los IN[0] e IN[1] introducimos sendas listas de valores numéricos que


corresponderán a las coordenadas X e Y de los puntos.

 En IN[2], IN[3] e IN[4] introducimos los valores de h0, h1 y h2 respectivamente.

 Finalmente, en IN[5] e IN[6] introducimos el tipo de pilar que vamos a introducir y el


nivel en el que lo introduciremos.

El nodo de Python ejecutará el resto del script, creando un bucle en el que se introducen
los puntos inicial y final de cada pilar para a continuación introducir el pilar en base a una
línea.

Analiza con paciencia el script y verás que es más sencillo de lo que puede parecer a
primera vista.

©Joan Moretó | DominaDynamo 9


Curso: Dynamo para Revit
Extra: Python y Dynamo

Las primeras líneas son las que hemos visto que se emplean para cargar las distintas
bibliotecas por lo que empezamos a analizar desde la línea 10.

Las primeras 6 líneas servirán para identificar en el script los valores que hemos
introducido en los puertos de entrada. En este caso, hemos añadido la palabra float en
algunos casos para que el programa trate esos número como decimales aunque sean

©Joan Moretó | DominaDynamo 10


Curso: Dynamo para Revit
Extra: Python y Dynamo

enteros, ya que en caso contrario Python devuelve siempre un numero entero como
resultado de la división de 2 enteros.

coordsx = IN[0]
coordsy = IN[1]
h0 = float(IN[2])
h1 = float(IN[3])
h2 = float(IN[4])
fam=IN[5]
lev=IN[6]

A continuación, creamos las listas vacías líneas y pilares y llamamos nx y ny al número


de elementos de las listas coordsx y coordsy respectivamente (la estructura len(…) es
propia de Python y devuelve el número de elementos de una lista).

lineas=[]
nx = len(coordsx)
ny = len(coordsy)
pilares = []

Finalmente, desarrollamos la malla de pilares. Para ello emplearemos la estructura de


Python for…in range(…,…), en la se realiza una acción para cada valor comprendido en
un intervalo. Al emplear la estructura 2 veces, abarcaremos todos los valores como
producto vectorial. También empleamos la estructura if…: / else: que sirve para
establecer 2 resultados en función de una condición (con Python resulta muy sencillo
definir acciones basadas en condiciones).

for i in range(0,nx):
x=coordsx[i]

if i == 0:
z0 = h0
else:
z0 = z0 + ((h1-h0)/(nx-1))

for j in range(0,ny):
y=coordsy[j]
if j == 0:
z=z0
else:
z = z + ((h2-h1)/(ny-1))
pt0 = Point.ByCoordinates(x,y,0)
pt1 = Point.ByCoordinates(x,y,z)
linea = Line.ByStartPointEndPoint(pt0,pt1)

©Joan Moretó | DominaDynamo 11


Curso: Dynamo para Revit
Extra: Python y Dynamo

pilar = StructuralFraming.ColumnByCurve(linea,lev,fam)
lineas.append(linea)
pilares.append(pilar)

OUT = lineas,pilares

En este caso, establecemos 2 listas como valor de salida. Si, siguiendo un script de
Dynamo, quisiéramos utilizar una de las 2, sería muy fácil obtenerla usando
List.GetItemAtIndex.

El resultado en Revit.

5. Conclusiones

Como has podido ver, Python puede ser bastante interesante y, con unos mínimos
conocimientos, nos puede ayudar a alcanzar de forma relativamente sencilla resultados a
los que, cuanto menos, nos costaría llegar con nodos gráficos.

En cualquier caso, es conveniente ser capaz de manipular mínimamente nodos de


Python para poder adaptar o corregir nodos personalizados ya que, como veíamos en el
tema 8, en ocasiones podemos tener que realizar modificaciones en estos nodos para
que se adapten al idioma y las unidades de nuestra versión de Revit.

©Joan Moretó | DominaDynamo 12


Curso: Dynamo para Revit
Extra: Python y Dynamo

6. Recursos

Como te indicaba, existe mucha información en internet relativa Python (en general, no su
aplicación específica en Dynamo). Te indico algunas páginas interesantes:

Para aprender Python desde cero en castellano:

http://docs.python.org.ar/tutorial/3/index.html

http://www.mclibre.org/consultar/python/

La web oficial de Python (en inglés):

https://www.python.org/

No se dispone de tanta información específica sobre la relación entre Dynamo y Python.


Algunas páginas al respecto son:

https://github.com/DynamoDS/Dynamo/wiki/Python-0.6.3-to-0.7.x-Migration

https://github.com/architecture-building-systems/revitpythonshell

©Joan Moretó | DominaDynamo 13

También podría gustarte