DominaDynamo Dynamo para Revit · ejemplo Point) que pueda dar lugar a varios comandos seguido de...

13
DominaDynamo 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 Dynamo para Revit Extra: Python

Transcript of DominaDynamo Dynamo para Revit · ejemplo Point) que pueda dar lugar a varios comandos seguido de...

Page 1: DominaDynamo Dynamo para Revit · 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.

DominaDynamo

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

Dynamo para Revit

Extra: Python

Page 2: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 2

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

Page 3: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 3

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

Page 4: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 4

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.

Page 5: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 5

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.

Page 6: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 6

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;

Page 7: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 7

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

Page 8: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 8

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

Page 9: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 9

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.

Page 10: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 10

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

Page 11: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 11

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)

Page 12: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 12

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.

Page 13: DominaDynamo Dynamo para Revit · 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.

Curso: Dynamo para Revit

Extra: Python y Dynamo

©Joan Moretó | DominaDynamo 13

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