Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
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
Vamos a ver un sencillo ejemplo en el que queremos obtener una serie de Fibonacci* en
la que introduciremos el número de elementos.
*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
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 *
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]
i=2
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.
Por último, OUT = fib , establece que la lista fib sea el valor de salida.
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
centro = Point.ByCoordinates(0,0,0)
angulo = 90
vector = Vector.ZAxis()
espiral = []
curva = Arc.ByCenterPointRadiusAngle(centro,1,0,angulo,vector)
espiral.append(curva)
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
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 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).
En este caso, introduciremos varios valores en los puertos de entrada del nodo.
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.
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
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]
lineas=[]
nx = len(coordsx)
ny = len(coordsy)
pilares = []
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)
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.
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:
http://docs.python.org.ar/tutorial/3/index.html
http://www.mclibre.org/consultar/python/
https://www.python.org/
https://github.com/DynamoDS/Dynamo/wiki/Python-0.6.3-to-0.7.x-Migration
https://github.com/architecture-building-systems/revitpythonshell