DominaDynamo Dynamo para Revit

15
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 Tema 07: Code Block

Transcript of DominaDynamo Dynamo para Revit

Page 1: DominaDynamo Dynamo para Revit

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

Tema 07: Code Block

Page 2: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 2

1. Qué es y para qué sirve el Code Block

Si bien una de las grandes ventajas de Dynamo es que su interfaz visual permite su uso

sin necesidad de disponer de conocimientos de programación, el Code Block o Bloque de

Código nos va a permitir introducir partes del script mediante DesignScript, el lenguaje de

programación sobre el que se soporta Dynamo.

Aunque se pueden alcanzar programaciones muy complejas con bloques de código e

incluso resumir un script completo en un único bloque, su uso más habitual será el de

simplificar el script, permitiéndonos sustituir varios nodos por una o dos líneas de código,

como hemos visto ya en alguna ocasión en temas anteriores.

2. Introducción de datos mediante Code Block

Como hemos visto muchas veces a lo largo del curso, para introducir el nodo Code Block

basta con hace doble click en el espacio de trabajo. Hasta ahora, en la mayoría de las

ocasiones lo hemos utilizado para introducir números, textos (string) y, en alguna ocasión

fórmulas.

Figura 07.01: Introducción de números fórmulas y textos

En este tema vamos a ver que prácticamente cualquier nodo se puede introducir

mediante código. Por ejemplo, un punto por coordenadas se podrá introducir mediante

nodos, como hemos visto hasta ahora, o mediante un bloque de código como se muestra

en la figura.

Figura 07.02: Introducción de punto mediante nodos o Code Block

Page 3: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 3

3. Introducción de nodos mediante Code Block

A lo largo de curso, hemos ido viendo que la estructura más habitual del nombre de los

nodos es TipoDeObjeto.Método, TipoDeObjeto.Acción o TipoDeObjeto.Consulta, es decir

en primer lugar se indica el tipo de dato con el que vamos a trabajar y separado por un

punto se indica qué vamos a hacer con él (recordemos los 3 tipos de nodos que veíamos

en el tema 02: de Creación, de Acción y de Consulta)

Figura 07.03: Ejemplo de nomenclatura de nodos

Vemos como ejemplo los nodos de la figura 07.03:

Point.ByCoordinates: Al ser un nodo de creación se indica el método, en este caso por

coordenadas y deberemos introducir en los puertos de entrada estas coordenadas X, Y y

Z.

Point.Add: Éste es un nodo de acción (similar a Translate) por lo que tenemos que

introducir el elemento sobre el que se realiza la acción (el punto, en este caso) y otro u

otros objetos en función de la acción (en este caso el vector que traslada el punto).

Point.X: Es un nodo de consulta, por lo que únicamente se debe introducir el punto sobre

el que se realiza la consulta (en este caso, cuál es la coordenada X del punto).

La introducción de nodos o acciones mediante Code Blockse basará en el mismo

esquema.

3.1. Creación

Al introducir un nodo de creación mediante Code Block, seguiremos el esquema que

acabamos de ver–TipoDeObjeto.Método– añadiendo entre paréntesis los valores o los

objetos que introduciríamos en los puertos de entrada. Es decir, para introducir un punto

de coordenadas 3, 2, 5 escribiremos Point.ByCoordinates(3,2,5) pero si queremos un

círculo con centro en este punto y radio 5, escribiremos Circle.ByCenterPointRadius(pt,5),

en el que pt será el punto.

Page 4: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 4

Figura 07.04: Introducción de nodos de creación

Los paréntesis serán en todo caso indispensables en los nodos de creación. Incluso

aunque el nodo equivalente no tenga puertos

de entrada, como por ejemplo Vector.ZAxis,

que crea un vector de coordenadas 0,0,1, si

lo queremos introducir mediante Code Block

deberemos introducir Vector.ZAxis().*

3.2. Acción

Hay 2 formas de introducir mediante Code Block los nodos de acción. La primera sería

repetir el título del nodo–TipoDeObjeto.Acción– añadiendo entre paréntesis en primer

lugar el objeto sobre el que se actúa y a continuación el dato o los datos (de cualquier

tipo) que actúan sobre el objeto. En el caso de Point.Add, sería:

Figura 07.05a: Introducción de nodos de acción. Método 1

La otra forma es poner en primer lugar el objeto, en este caso el punto concreto, en vez

del genérico Point, de forma que no tenga que aparecer dentro del paréntesis. Lo vemos

en la figura 07.05b.

Figura 07.05b: Introducción de nodos de acción. Método 2

*Aclaración:”pt1” y “vector1” no son más que formas de llamar a los valores de entrada y

pueden sustituirse por el texto que consideremos más adecuado.

Page 5: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 5

También en este caso será necesario el

paréntesis, aunque no haya necesidad de

introducir datos adicionales en los puertos de

entrada. Vemos un ejemplo con el nodo

Curve.Reverse.

3.3. Consulta

Los nodos de consulta funcionan de forma similar al segundo método que acabamos de

ver. En este caso no se permite un método en el que el elemento procesado por el nodo

aparezca entre paréntesis sino que deberá aparecer siempre en primer lugar, antes del

punto.

Figura 07.06: Introducción de nodos de consulta

En este caso no son necesarios los paréntesis.

4. Concatenación de nodos en un bloque

Dentro del bloque de código podremos introducir distintos nodos líneas separadas

mediante punto y coma (;). Para relacionar elementos de distintas líneas utilizaremos el

símbolo =. Se entenderá mejor con un ejemplo. Vamos a ver como se podrá sustituir

mediante Code Block el siguiente gráfico:

Page 6: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 6

Figura 07.07a: Concatenación de nodos “tradicional”

En primer lugar, introduciremos los puntos, como decíamos dándoles un nombre con el

signo =.

p1=Point.ByCoordinates(0,5,0);

p2=Point.ByCoordinates(0,0,6);

A continuación, introduciremos la línea entre p1 y p2:

l1=Line.ByStartPointEndPoint(p1,p2);

Y finalmente damos la vuelta a la línea l1 que acabamos de crear:

l1.Reverse();

Figura 07.07b: Concatenación mediante Code Block

Cada unos de los símbolos > al final de cada línea son puertos de salida que podemos

conectar a otros nodos que tengamos más adelante en el script.

También podríamos unificar todo en una única línea como si se tratase de una ecuación

matemática, dando lugar a una expresión como:

(Line.ByStartPointEndPoint(Point.ByCoordinates(0,5,0),Point.ByCoordinates(0,0,6))).Reverse();

Pero, en general, va a ser más sencillo y ordenado dividirlo en distintas líneas.

Page 7: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 7

5. Enlace

Cuando trabajemos con listas, también podremos definir el enlace (más corto, más largo

o producto vectorial) al introducir nodos mediante código. Incluso podremos hacer algo

que no podemos hacer con los nodos “normales” como es definir cuál de dos listas es la

dominante. Va a resultar más sencillo de entender con un ejemplo:

Por defecto, como hemos visto hasta ahora, el enlace está establecido como más corto,

de modo que si creamos líneas por punto inicial y punto final a partir de 2 listas de

puntos, tendremos este resultado:

Figura 07.08: Enlace más corto (por defecto)

Si queremos establecer el enlace por producto vectorial, deberemos definir cuál es lista la

lista “dominante”, es decir, si las sublistas se agruparán a partir en base a la primera o la

segunda lista.

Page 8: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 8

Figura 07.09a: Enlace: Producto vectorial. Manda la lista p1

Como vemos, aparecen detrás de p1 y p2 los indicadores <1> y <2> respectivamente.

Este orden quiere decir que la lista de puntos p1(la que vemos en la fila inferior, formada

por 7 puntos) es la que “manda”, por lo que cada sublista estará formada por las rectas

que conectan con ese punto. Tendremos por lo tanto 7 sublistas de 4 elementos cada

una.

Si disponemos el orden al revés, como vemos en la figura inferior, las líneas se agrupan a

partir de la fila superior de puntos, por lo que tendremos 4 sublistas de 7 elementos cada

una.

Figura 07.09a: Enlace: Producto vectorial. Manda la lista p2

Page 9: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 9

Cabe señalar que en ambos casos las líneas son las mismas y lo único que cambia es su

orden. (Con nodos gráficos podríamos cambiar el orden con List.Transpose).

6. Nodo para código

La forma más rápida de transformar un grupo de nodos normales en Code Block es

recurrir a la orden Nodo para código (From node to code si utilizas Revit en inglés).

Para ello, seleccionamos los nodos que queramos transformar y hacemos click derecho

en la pantalla para que aparezca el menú contextual. Hacemos click entonces en Nodo

para código y ¡voilà! Ya tenemos esos nodos como un bloque de código.

Esta opción nos puede servir para simplificar una parte del script y, por otro lado, nos

puede ayudar mucho si no estamos seguros de cómo se introduce algún nodo mediante

código.

Video 07.01

7. Signos y abreviaturas

Aunque la mayoría de nodos se puede reproducir mediante Code Block de la forma que

veíamos en puntos anteriores, algunos de los más habituales se introducirán mediante

signos y abreviaturas específicos. En la siguiente lista se muestran los nodos que va a

ser más habitual que introduzcamos mediante bloque de código, junto con algunas notas

que indican los aspectos más reseñables.

Page 10: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 10

Pruébalas uno a uno para ir quedándote con estos métodos ya que resultan en general

muy útiles y ayudan a ahorrar tiempo.

NODO GRÁFICO CODE BLOCK NOTAS

Básicos

Rangos y secuencias

Una vez nos

acostumbramos, es

mucho más rápido.

Page 11: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 11

Fíjate en que

mientras en el nodo

se introduce la

división, mediante

código, introducimos

el número de

elementos.

Si el incremento es de

1, basta con

expresarlo así.

¡También se puede

hacer con letras!

Prueba a introducir

“A”..”Z”

Matemáticos

Funciona igual con

las operaciones

sencillas:

+,-,*,/

El resto de

operaciones

(trigonometrícas,

potencias, raíces…)

se introducirán

mediante

Page 12: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 12

Math.Función(x)

Concadenar textos

El Code Block tiene

además la ventaja de

permitir unir texto y

números (datos tipo

double)

Pruebas lógicas y booleanas

Funciona igual con:

!=(distinto),<, <=, >=

o >

Funciona también con

|| (comprueba si uno

de dos valores

booleanos es

verdadero)

Fíjate bien en la

estructura:

Prueba ? valor si

verdadero : valor si

falso

Listas

Page 13: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 13

Podremos generar

una lista de listas

introduciendo:

{{a1,a2,a3},{b1,b2,b3

}} * importante

En una lista de listas

podemos definir

índices de las

distintas listas y

sublistas escribiendo:

lista[ind1][ind2]…

* Con Dynamo 2.x se sustituye “{…,…}” por “[…,…]”

Lo más interesante es que podemos combinar estos métodos. De este modo, gráficos

complejos como éste...

Figura 07.10a: Script con nodos gráficos

…se podrán reducir a 2 sencillas líneas de código:

Page 14: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 14

Figura 07.10b Script con Code Block

8. Funciones

Se puede definir una función u operación (no necesariamente matemática) mediante

Code Block que se podrá utilizar a lo largo del script. Para ello introduciremos un bloque

de código sin conectores en el que la primera línea define el nombre de la función

mediante def NombreDeFunción(ValoresDeEntrada) y a continuación desarrollamos

entre llaves { } definiendo el valor de salida mediante return=resultado.

En el bloque se pueden introducir comentarios. Si tienen más de una línea, lo haremos

mediante /*comentario*/ y si solamente tiene una podremos introducir //comentario.

Una vez definida la función, no tendremos más que introducirla mediante Code Block

como si se tratara de cualquier otro nodo: NombreDeFunción(ValoresDeEntrada).

Para entenderlo mejor, vemos un ejemplo en el que definimos una función que define el

porcentaje que un valor representa respecto a otro.

Page 15: DominaDynamo Dynamo para Revit

Curso: Dynamo para Revit

Tema 07: Code Block

©Joan Moretó | DominaDynamo 15

Figura 10: Funcion mediante Code Block

9. Ventajas y desventajas de Code Block

Como hemos visto, la principal ventaja del Code Block respecto a los nodos tradicionales

es que permite simplificar el gráfico en gran medida. Otra ventaja, no desdeñable, es la

facilidad y el ahorro de tiempo que supone poder introducirlo haciendo doble click con el

ratón.

Entre los inconvenientes, además de resultar menos intuitivo, el más importante es que

en caso de fallo no permite detectar dónde está el error, cosa que resulta mucho más

sencilla con los nodos gráficos.

Por tanto, te recomendaría utilizarlo sobre todo, además de para introducir números y

textos, para atajar en las partes del script que más se simplifican mediante código que

son principalmente las que veíamos en la tabla del punto 7.