DominaDynamo Dynamo para Revit
Transcript of 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
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
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.
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.
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:
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.
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.
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
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.
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.
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
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
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:
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.
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.