You are on page 1of 53
Xe miguelvidal’calvet es ie guillefmo, ramirez camarero x & * oS * ew fikearg.com edicién 2011 notas previas Esto NO es un manual de programacion Este documento no pretende ser una referencia para quisn quiera aprender a programar. Este manual es un pequefio compendio de ejercicios, a modo de cuademo de apuntes, destinado @ quien quiera introducirse an la elaboracion de scripts para generar disefos. N jamente, Se pasara por encima de los conceptos basicos de la programacion para empezar a escnbir cédigo que entisnda la maquina. Sera na pasada rapida, pero suficiente para ponerse a escribir cédgio lo antes posible de una manera solvente Esto Si es un manual de scripting para Rhino elaborado por disefadores para diseniadores manual basico de scripting con C# en Grasshopper aplcada al aseno gens de arqutecura indice A. Nociones basicas de programacion AA. Introduccion a la programacién aplicado al disefo generative 101 Programacién orientada @ objetos 02 interfaz de scripting en Grasshopper 2. Tipos de datos, declaracién y operaciones con variables (03 Deciaracién de datos simples: enteros, decimales y booleanos 04 Declaracidn de datos compuestos. cadenas de caracteres, listas, y es- tructura de arbol de datos. A. Clausulas condicionales ¢ Iteracion 05 Clausulas condicionales: clausulas fF. elea y switch, 06 Estructuras terativas: bucles fory while. A.4. Funciones: abstraccion 07 Estructura de una Funcion (08 Valor de una funcién: return B. RhinoCommon en Grasshopper B.1. Microejercicios de iniclacién a C#y RhinoCommon E04 Dibujar cuatro puntos formando los vértices de un cuadrado E02 Dibujar cuatro puntos formande los vertices de un cuadrado @ partir de un yun valor de lado ias diagonales e imprimirias en un panel en una lista jar un rectangulo a partir de esos puntos rar una funcién que fabrica un vectores entre dos puntos E08 Fabricar vectores @ partir de los vértices y visualizarios dandoles color E09 Unir los vértices consecutivamante mediante lineas. E10 Extraer los puntos medios de cada segmento de rectangulo y unitlos con lineas B.2. Ejemplos de aplicacion 82.1 Paballén temporal de la galeria Serpentine del afto 2002, Toyo ito con Cecil Balmona ANEXOS. ANEXO 1. Estructura de RhinoCommon ANEXO 2. Processing ANEXO 3. Glosario de términos A Programacién y diseo generative AL: Introduccion a la programacion aplicada al disefio generativo 01. ¢Por qué C#? C# 9s un lenguaje de programacién orientada a objetos basado en Cy C++. 95 muy similar a Java, tiene una extensa y actualizada documentacion y esta construido por una plataforma muy extendida como NET. Debido a esto, hacen que sea un lenguaje idéneo para dar los primeros pasos en os entomos de programacién, En cuanto a las simi que saa Sencillo ent @ otros ent (as para jos. disefiadores, sobre todo, Processing y Arduino, 0 tambien scripting con Maya jambién puede ser un buen comienzo para mas adelante adoptar con facilidad Python, que probablemente sea un lenguaje de programacién esténdar para desarrollar scripts en software de 3D y otros En cuanto a la documentacion, desde un punto de vista meremente préctico, ef hacho de estar respaldado por una plataforma potente como NET (desarrollada Por Microsoft), aseguran las actualizeciones y soporte del mismo. Para Cconsultar la referencia, ir a http:/Imsdn micrasoft.com/en-usflibraryfkx37*362,aspx ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez 03. {Qué es la programacién orientada a objetos? La programacion orentada a objetos es un paradigma de programacion que usa ‘objetos y sus interacciones pera disetar aplicaciones y programas informaticos Los objetos son entidades que tienen un determinado estado, comportamiento (método) e identidad El estado esti compuasto de datos, sera uno o varios atributos a los que se habrén asignado unos valores coneretos (datos). El comportamiento esta dafinido por los métodos © mens: responder dicho objeto, es decir, qué operaciones se pueden 3 con él La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, 8s su identificador (concepto analago ai de identificador de una variable o una constante s 8 los que sabe Un objeto contione toda la informacién que permite definirio @ identficario frente a otros objetos pertenecientes a otras clases e incluso frente @ objetos de una misma clase, al poder tenar valores bien diferenciades en sus atnbutos. A su ‘vez, los objetos disponen de mecanismos de interaccién lismados métodos, que favorecen la comunicacion entre ellos. Esta comunicacién favorece a su vez ¢l cambio de estado en los propios objetos, Esta caracter leva a tratarios como unidades indivisibles, en las que no se separa el estado y el comportamiento, Fuente: wiepedta org 03. Interfaz de scripting en Grasshopper Existen tres componentes de scripting en Grasshopper en los que se puede escribir cédigo en otros tantos lenguajes = C# Script ~ VB Seript = Python Script Para extraer estos componentes ira la pestafa de Math > Seript. Los dos primeros componentes vienen cargados en la instalacién de Grasshopper. En el momento do la odicion de este manual el componente de scripting con Python unicamente puede uitiizarsa con Rhino 5. Para instelario, visita: hitpyhvww food4rnino com. Edicién del componente script Para escribir cddigo en estos componentes, hacer doble click en el cuerpo del mismo o bien click con el botén derecho y luego Edit source. Se abrird una ventana en ia que escribiremos nuestro cédigo en donde se lee “/ your code ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez Entradas y salidas de variabl componente script Podemos trabajar con tantas variables como queramos dentro del codigo que escribamos y también podemos utilizar las entradas del componente para introducir datos de la definicion de Grasshopper o de archivos de Rhino ‘Ademas, podramos también tener salidas de datos a nuestra eleccién. Para modificar las entradas de datos, haremos click con el botdn con el botén derecho e ira Input manager ... Ademas, éstas deben ser formateadas del modo adecuado para trabajar con ellas en nuestro componente, Hablaremos de ello en el siguiente capitulo, A continuacién, unas imagenes con los pasos de este proceso piney peareyy Para modificar era Output mi como Object y Grassho que no es necesario dari componente La salida out La salida out del componente scripttiene dos funciones. Esta salida seria como la consola de cualquier entorno de programacién. Para visualizar cualquiera de ambos casos anteriores, conectaremos un panel ‘a funeién P) La funcién Print escribe cadenas de caractares (ver tipos de datos compuestos), ‘88 daar, texto en la salida out del componente script Esta funcién nos seré muy util para ir comprobando la validez de nuestro edigo, como veremos a lo larga del manual Print(*hola, cocacola); NOTA: & parte anora todo e texto con a apaniencla del rao Cowrespondera a coaiga que introaueiremas en el componerte de sr donde se ee el texto “/yeur coge here como antes se ha comentad, ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez Comentarios en el codigo Otro asunto que también va a sermos muy util para hacar nuestros scripts 05 hacer comentarios dentro del cédigo. Los comentarios son texto que forma Parte del codigo, pero que la maquina va a obviar cuando lo esta leyendo Esto nos puede servir para anotar aspectos relevantes del codigo 0 asuntos que son importantes recordar y también para ordenarlo. Esto nos servira no solo para no perderos nosotros mismos sino para posibles futuras segundas 0 terceras personas que puedan acceder a él. Existen dos maneras de comentar el codigo - comentario de una sola linea. cusiquier texto que escribamos en) una linea a partir de los caracteres de barra “/” quedara comentado J/la funcion print sirve para imprimir texto Print(*hola, cocacola); - comentario mi cualesquiera linea o lineas de texto entre los caracteres de apertura ‘/" y de ciorrre "7 quedaran comentadas I cédigo de prueba escrito como primer ejercicio del manual de scripting de Frikearg :) " (fla funcién print sirve para imprimir texto Bripnet(rehoka pi cintgzcinka pjlinea de aria a abajo y de ix a daracha. Para que ol intérprata cambia de linea, as nacesario afiad final de cada una de elias, para que entienda que el cddigo continua en la siguiente linea por AQ tipos dé datos, daclaracién y oparaciones con variables, 05. Tipos de datos primitivos Tipos de datos primitives que mas vamos a utilizar y sus identificadores ‘manual de scripting con grasshopper Miguel Vidal lerma Ramirez ones de datos habituales Existen funciones para convertir datos de un tipo a otro tipo de dato nombre (en inglés) identificador Convene numero entero ger numero decimal ‘double precision floating double a entero (Convert Toint32(vaior) 0 ( point number ‘a decimal ‘Convert ToDouble(vaion o lor boolean boolean valve (true 0 false) ‘bool erdadero 0 faiso) caracter character char Yun dato compuesto para empezar. tipo de dato nombre (en inglés) identificador ‘cadena de caractores string sting) NOTA: Una cadena de caracteres, 0 sea, terto, es un tpo de dato, como el namire indica, nastrams en este punto que para que devusiva ng. Esto nos sera uti para ir mostrando ualquler dato ay que corwertra prevamente a Yo que vayamos na booleano Convert ToBoolean| valor) ‘a cadena de caracteres valor ToString NOTA: En programacion. sigue una ibgica bara, de verdadero 0 fasa. ena que a ‘numérica entero"O" sel asigna e! valor booleanc“Taso" (fase) al valor numenco ertera"1 2 e asigna el valor bocieana "versadero” (rv). int entero = 15 double decimal bool verdadero //debenos convertir los datos a cadena de caracteres para poder imprimirlos en pantalla Print (entero. ToString()); Print (decimal. ToString()); Print (verdadero. Tostring()) poe 04. Variables Una variable es un nombre que se asigna a una cantidad conocida 0 desconocida de informacién para poder trabajar con este nombre independientemente de la informacion que representa La mayor parte del trabajo que vamos @ realizar con nuestros senipts lo haremos @ traves de variables. Pare trabajar con variables es necesario Inielallzarlas segun el tipo de dato que representa. El esquama basico que sigue @! languaje de pragramacion C# es el siguiente Inicializacién de variables identiticador de | nombre dé asignacion| valor variable variable (eltipo de dato que va a] (cualquier nombr jexcepto los resorval int a = 12 ; Asignacién de valor a vari identificador de | nombre de [asignacién| valor variable variable 0 de dato que va a int a = 12 ; izacion y asignacién en ta misma linea int a = 12 ; ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez 07. Datos compuestos Antes de comenzar con este apartado, recordamos que para deciarar, iar y asignar valor a variables de datos compuestos, seguiremos el mismo esquema que habiamos visto en el apartado de variables, pero con una excepoidn: debemos instanciarios [new sequido det tipo de dato) tipo de |identificador | nombre | asignacion dato | de variable | de e fen qué (altipo de | variable formato vamos} gato quevaa |) "tol que aaimacenar | contener esa [queramos) los datos) |) variable) Listas En programacién, las listas son sucesiones ordenadas de elementos. Para declarar @ instanciar una lista, seguimos ol esquema anterior List listaPts = new List(); 12 que acabamos de instanciar esta vacia, para afiadir elementos dentro la, utizamos la funcion .Add listaPts.Add(new Point3d(1, 1, 1)); listaPts.Add(new Pointsd(2, 2, 2) listaPts.Add(new Point3d(3, 3, 3) Finalmente, igualamos la salida con la lista que hemos fabricado A= listaPts; Para extraer un item, utiizamos el siguiante método, que también lo podemos asignar @ otra salida del componente, despues de haberta afadido con Ouput menager B = listapts[1]; 09 Estructura de arbol de datos DataTree puntos = new DataTree() ; puntos.Add(new Point3d(1, 1, 1)); puntos.Add(new Point3d(2, 2, 2)); puntos.Add(new Point3d(3, 3, 3)); A B puntos, puntos. Branch(0) [0]; ‘También podemos asignar rutas en las que queremos almacenar la estructura de arbol de datos, que deciararemos con el tipo GH_Path. GH_Path se construye con numeros enteros. Las rutas 0 paths son nombres a las que se le asignan a la estructura de arbol de datos DataTree puntos = new DataTree(); GH_Path ruta = new GH_Path(2); puntos.Add(new Point3d(1, 1, 1), ruta); puntos.Add(new Point3d(2, 2, 2), ruta); puntos.Add(new Point3d(3, 3, 3), ruta); A = puntos; B = puntos.Branch(ruta) [0]; ‘manual de scripting con grasshopper cul Miguel Vidal smo Ramirez porn ‘manual de scripting con grasshopper Miguel Vidal X Guiterma Ramirez 07. Iteracion inicializacion | > conprobacion sles verdadero declaracién | actualizacién (segin un rango que establezcanos) J for(inicializacién; comprobacion; rango de actualizacion) { } sies falso dec laraci6n; pon 08. Funciones: abstraccion Las funciones son subrutinas incluidas dentro de un programa mas grande y que nos permite resolver una tarea especifica. Las funciones son utiles Para desarrollar tareas que se van a repetir dentro del programa principal y para, de esta manera, modular el codigo en apartados pequerios. Las funciones en C# devuelven un Unico valor, que se asigna con return Dicha subrutina, cuando es llamada dentro del cédigo principal, hace que la lectura de ese codigo se detenga y se dinja a ejecutar el codigo de la subrutina. En ciertos lenguajes de programacién, como C#, las funciones son subrutinas que devuelven un valor. En los componentes de Grasshopper, tendremos que afiadir el cédigo de la funcién en el apartado da"/ Nuestra primera funcién, que fabricara vectores a partir de dos puntos, se lamara Vector2Puntos, y la podremos llamar desde nuestro cédigo camo na funcion mas de C# o RhneCommon, Estructura de una funcion TIPO QUE DEVUELVE NOMBRE (| PARAMETROS DE LA) (en caso de que devuelva FUNCION. algun valor) (que hay que deciarar en este punto) { OPERACIONES DE LAFUNCION return —_ VALOR QUE GUEREMOS GUE DEVUELVA } ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez por B RhnoCommon en Grasshopper B.1 microsjercicios de creacién de geometria con RhinoCommon E0 es dibujar cuatro puntos formando los vértices de un cuadrado 01. objetivos trabajar con variables ~ construir puntos con RhinoCommon 02. conceptos clave double, Point3d 03. procedimiento private void RunScript(object x, object y, ref object A, ref object B, ref object C, ref object D) { //declaranos double lado; las variables // valor numérico decimal Pointad verticeO; //puntosd (una clase de Rhino) Point3d verticet; Point3d vertice2; Point3d vertices; // asignamos valores a las variables lado = 20; para los puntos, invocamos la clase Point3d con new. Ww las coordenadas X e Y del verticeOrigen (propiedad de una clase) y le su- El valor de mamos el valor de lado verticed = new Point3d(0, 0, 0); verticel = new Pointdd(0, lado, 0); vertice2 = new Point3d(lado, lado, 0); verticed = new Pointsd(0, lado, 0: // asignamos cada uno de los puntos a una salida del componente A = verticed; B = verticet; c= vertice2; D = vertices; + manual de senpting con grasshopper Miguel Viaat Guillermo Ramirez pois: dibujar cuatro puntos formando los vértices de un cuadrado @ partir de un vértice inicial y un valor de lado 01. objetivos ~ acceder a propiadades de clases trabajar con input de datos extemos al componente 02. conceptos clave double, Point3d 03. procedimiento Tomamos dos variables exteriores al componente de scriot -una primera, que toma valores numéricos de un sider, Deberemos hacer click con el botén derecho ‘an la antrada y luego “Type hint” para que Io entienda como un dato da tipo numérico decimal (double), - otra segunda, @ le que llamamos verticeinicial, que tome el valor del vertice incial @ partir de! cual posicionamas el resto de puntos y que inicialzamos como el tipo Pointid de Rhino private void RunScript(double lado, PointSd verticeOrigen, ret object A, ref object B, ref object C, ref object D) t /[declaramos las variables como puntoSd (una clase de Rhino) Pointad vertice Point3d vertice2; Pointdd vertices; asignamos un valo' a la variable invocando 1a clase Pointsd con new. El valor de las coordenadas X e Y del verticeOrigen (propiedad de una clase) y le sumamos el valor de lado verticel = new Point3d(verticeOrigen.x + lado, verticeOrigen.Y, 0); vertice? = new Point3d(verticeOrigen.x + lado, verticeOrigen.Y + lado, 0); vertices = new Point3d(verticeOrigen.Xx, verticedrigen.Y + lado, 0); // asignanos cada uno de los puntos a una salida del componente A = verticeorigen; B = verticet; = vertice2; D = vertices manual de senpting con grasshopper Miguel Viaat mo Ramirez pore. medirlas distancias diagonales ¢ imprimirias en un panel 01. objetivos llamar a métodos de clases imprimir texto por la salida out del componente de script y utilizar cadenas de caracteres - utilizar funciones matematicas en el cédigo ylos métodos de Math trabajar con estructuras condicionales 02. conceptos clave double, Point3d, Distance, Print, if, else 03. procedimiento Primero, calculamos la distancia por el método elgebraico. En segundo lugar, medimos ia distancia con el método Distance de Pointd3d de RhinoCommon. Y, por uitimo, comprabamos que ambas coinciden | declaramos y asignamos las variables en la misma linea double diagAlgi = Math.Sqrt (Wath. Pow ((vertice2.x-verticeorigen. x) 2)4Math. Pow( (vertice2.Y-verticedrigen.Y) ,2));//llath.Sqrt(), raiz cuadrada double diagAlg2 = Math.Sqrt(Math.Pow((vertice3.x - vertice1.Xx), 2) + Math. Pow((verticed.Y - vertice1.Y), 2)); double diagPt1 = verticeOrigen.DistanceTo(vertice2 double diagPt2 = vertice1.DistanceTo(vertices) ; / pasamos a un valor de dos decimales diagAlg = Math.Round(diagAlgt, 2); diagAlg2 = Math.Round(diagAlg2, 2); diagPtt = Math.Round(diagPtt, 2); diagPt2 = Math.Round(diagPt2, 2); // estructura condicional if((Math.Round(diagAlg!, 2) == Math.Round(diagPt1, 2)) && (Math. Round(diagAlg2, 2) == Math.Round(diagPt2, 2))) { + else 1 } Print( “guay!” Print (“horror !*); manual de senpting con grasshopper Miguel Vidat por? E04 01. objetivos ~ aprender a declarar, crear y afadir valores a una lista 02. conceptos clave List, new, Add 03. procedimiento private void RunScript(double lado, Pointsd verticeorigen, ref object A) { [declaramos las variables como puntoSd (una clase de Rhino) Point3d verticet = new Point3d(verticeOrigen.Xx + lado, verticeOrigen.Y, 0); Point3d vertice? = new Point3d(verticeorigen.Xx + lado, verticeOrigen.Y + lado, 0); Point3d vertices = new PointSd(verticedrigen.x, verticeOrigen.¥ + lado, 0); J/ declaramos una lista de puntos llamada “vertices” List vertices; utilizamos el constructor predeterminado para crear una lista de de puntos con una capacidad de 0 vertices = new List(); //aiiadimos valores a la lista en orden vertices.Add(verticeOrigen); vertices.Add(verticet) ; vertices.Add(vertice2) ; vertices.Add(verticed) ; // asignanos la lista a una salida A= vertices; manual de senpting con grasshopper Miguel Viaat Guillermo Ramirez pie % manual de senpting con grasshopper - x Miguel Viaat x x mo Ramirez tunirlos puntos en diagonal con lineas 01. objetivos ~ aprender a acceder a los 02. conceptos clave List, List item, Add 03. procedimiento Accedemoa alos temes de la lista de vertices con [indice] y los unimos con la funcion de RhinoCommon Line // mismo cédigo que en el ejercicio anterior con una nueva salida en el componente para las lineas diagonales, a la que llamamos D // declaranos 1a lista de diagonales List diagonales = new List(); /{ dibujamos las diagonales Line diagonal1 = new Line(vertices[0], vertices[2]);// accedenos a los itemes de las listas con [indice] Line diagonal2 = new Line(vertices[3], vertices[1] J] las afadimos a la lista de diagonales diagonales.Add(diagonal1) diagonales.Add (diagonal?) ; // asignamos 1a lista a una nueva salida D = diagonales; . pois dibujar un rectangulo a partir de esos puntos 01. objetivos ~ aprender a fabricar vectores, planos y rectangulos, 02. conceptos clave Plane, Vector3d, Rectangle3d 03. procedimiento / mismo cédigo que en el ejercicio anterior con una nueva salida en e1 componente para el recténgulo, a la que llamamos R // para fabricar un rectangulo, necesitaremos un plano y dos numeros decimales para el ancho y el alto Rectanglead rec: /{ podemos fabricar un plano de distintas maneras, pero vamos a hacerlo a partir de un punto base y dos vectores Plane plan Point3d ptoOrigenPlano = vertices[0]; // podemos declarar 1a variable y asignarle valor en la misma linea Vector3d vecxPlano = new Vectorsd();// para construir un vector necesitamos, fundamentalmente, sus coordenadas XYZ sobreescribimos las propiedades x, Y y Z del vector vecxPlano.X = vertices[1].X - vertices[0].x; vecxPlano.Y = vertices[1].Y - vertices[0].¥; vecxPlano.Z = vertices[1].Z - vertices[0].Z; / también podemos declarar y construir el vector en la sisma linea Vectordd vecYPlano = new Vectorad(vertices[3].x - vertices[0].X, vertices(3].Y - vertices(0].Y, vertices[3].Z - vertices[0].Z); plano = new Plane(ptoOrigenPlano, vecXPlano, vecYPlano); // lado del rectangulo double ladoRec = vertices[0] .DistanceTo(vertices[1]); rec = new Rectangledd(plano, ladoRec, ladoRec); R = recs manual de senpting con grasshopper Miguel Viaat Guillermo Ramirez 020. manual de senpting con grasshopper E07. aE mo Ramirez slaborar una funcion para fabricar vectores entre dos puntos 01. objetivos ~ aprender a elaborar funciones 02. conceptos clave function, Vector3d, Rectangle3d 03. procedimiento Este cédigo lo efladimos en el apartado “custom additional code" de tal manera que sirva para llamario. fn cualquier momento dentro del eédige principal // Vectorad Vector2Puntos(Pointsd ptoA, Point3d ptoB) 4 Vectorad vec = new Vectordd(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z = ptoA.Z)5 return vec; } pot fabricar vectores a partir de vertices del rectangulo y visualizarios dandoles color 01. objetivos ~ aprender a reutilizar cédigo, ~ entender cémo funciona CustomDisplay 02. conceptos clave CustomDisplay, Vector3d, Rectangle3d 03. procedimiento List vecs = new List();// lista de vectores Polyline recPol = rec.ToPolyline();//convertimos rec en polilinea // recorremos 1a lista de segmentos de 1a polilinea for(int 5 = 0; 5 < recPol.SegmentCount; s++) { vecs..Add(Vector2Puntos(recPol.SegmentAt(s) .From Segmentat(s) .To)); } V = vees; recPol. J/ visualizamos los vectores con Display.CustomDisplay Rhino.Display.CustomDisplay cd = new Rhino.Display. CustomDisplay (true) for(int v = 0; v < vecs.Count; v++) { cd.AddVector(recPol.SegmentAt(v).From, vecs[v], System.Drawing. Color.LimeGreen, true); } y : / Vector3d Vector2Puntos(Point3d ptoA, Point3d ptoB) { Vectordd vec = new Vectorsd(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z - ptoA.Z); return ver manual de senpting con grasshopper Miguel Vidat Guillermo Ramirez p22, x E09: ‘manual de scnptng con grassnopper axtraer los puntos medios de cada segmento de rectangulo y unirios con lineas p29 manual de senpting con grasshopper - x Miguel Viaat x x mo Ramirez unirlos puntos consecutivamente mediante lineas 01. objetivos ~ aprender cémo trabaja un bucle for 02. conceptos clave for, List, List item, Add 03. procedimiento /| mismo cédigo que en el ejercicio anterior con una nueva salida en e1 componente para las lineas, a la que llamamos L // declaracién de lista de lineas para los lados List lados = new List(); 1 bucle para unir los vértices consecutivamente for(int i = 0; i < vertices.Count; i++) { // excepcion para el iiltimo elemento if(i == vertices.Count - 1) 4 lados.Add(new Line(vertices[i], vertices[0])); Lins { Jados.Add(new Line(vertices[i], vertices[i + 1]))+ t a } 2 // salida de datos L = lados; ae p24 m ‘manual de scripting con grassnopper fiat as s y x Coutlerma Ramirez uunirlos puntos medios con lineas po2s: gioeayide ep sojdwole cd B2 x manual de senptng con grassnopper uel Via pabellon de la Serpentine Gallery 2002, Toyo ito con Cecii Salmond 01. objetivos - crear geometria bidimensioneal y tridimensional con RhinoCommon ~ entender el funcionamiento de estructura de datos en programacién orientada a objetos aprender a trabajar con funciones para modular el cédigo 02. conceptos clave List, DataTree, for, if 03. procedimiento El pabellon temporal del afto 2002 de la galeria Serpentine, proyectado por Toyo Ito con Ce n de Arup, se construye a partir de un algoritmo iterative que dibuja la cublerta Partiendo de un cuadrado Se van uniendo consecutivamente los puntos medios con los puntos tercios de sus segments. 1. Dibujar el rectangulo inicial 2. Extraer los puntos medios y tercios 3. Dibujar las lineas de unién entre los puntos medios y tercios (lineas auxiliares) 4. Dibujar las lineas de interseccién con el recténgulo inicial (Iineas de estructura) 5. Dibujar un nuevo rectangulo a partir de puntos medios y tercios 6. Introducir todas las funciones en un bucle iterativo 7. Terminar el dibujo de la cubierta y las fachadas 7. Terminar de 1. Recténgulo inicial 2. Puntos medios y___3. Lineas auxiliares 5. Nuevo rectanguio 6 tercios del recténgulo estructura (ena las funciones enun _—_-modelarla curbierta y inicial este ea ae ees bucle iterative fachadas * * Este anartago de jer‘ce, per su complejisad, se realzaré con fos componentes yanua. rasshopper, por fo que no se expicaré paso a paso en e Dibujar el rectangulo inicial lado di Nuestro componente de scriot tendra dos entradas cone: que define cuadrado inicial, y ‘cota’, que define la cota de arranque de la cubierta: y una salida: ‘rec_inic’ private void RunScript(double 1i, double cota, ref object rec_inic) { /I declaracion de variable Rectanglesd recInic; nacién de variable recInic = new Rectanglesd(); te a sus i/ inicializ ble (refiri constructores) PecInic = new Rectanglead(new Plane (new Point3d(0, 0, cota), Vectorsd. XAxis, Vectorad.YAxis), new Interval(0, li), new Interval(0, 1i)): // el valor del lado del cuadrado es un slider (1i) // asignar la variable construida a la salida rec_inic rec_inic = recInic; } manual de senpting con grasshopper Miguel Viaat mo Ramirez poze manual de senpting con grasshopper ex K faiguel Vit \ x Xx Gutters Ramirez 2. Extraer puntos medios y tercios private void RunScript(double 1i, double cota, ref object rec_inic) { // declaracién, asignacién e inicializacién de vari nisna linea Rectangle3d recInic = new Rectangledd(Plane.WorldxY, new Interval(0, 1i), new Interval(0, 1i)); / asignar la variable construida a ec_inic rec_inic = recInic | lista contenedora de puntos List ptosMedios = new List(); List ptosTercios = new List(); [dividimos los segmentos // para ello, convertimos el rectangulo en polilinea con Rectanglesd. ToPolyline(), de tal manera que podeaos acceder a cada uno de los segnentos con el método Segmentat( indiceDeSegmento) for(int s = 0; s < recInic.ToPolyline().SeguentCount; s++) { Point3d ptoledio = recInic.ToPolyline() .SegmentAt(s) .Pointat (0.5) ptosiledios. Add (ptoledio) ; Pointd ptoTercio = recInic. ToPolyline() .SeguentAt(s) .PointAat (0.333) ; ptosTercios.Add(ptoTercio) } Z — // devolvenos las variables por salidas diferentes . ptos_medios = ptosMedios; ptos_tercios = ptosTercios; f } ‘ f ozs 3. Dibujar las lineas auxiliares Para dibujar las lineas auxiliares, tendremos que unir el punto medio con el punto tercio del siguiente segmento, Tendremos que incluir una excepcién para el Ultimo segmento del rectangulo, puesto que si dejamos que la lista vaya hasta el ultimo elemento, el script dara un error. La excepcién consistiré en que, cuando llegue al ultimo indice, se una con el primer elemento y no con el siguiente private void RunScript(double 1i, ref object rec_inic, ref object ptos_ medios, ref object ptos_tercios, ref object LA) { // declaracién, asignacién e inicializacion de variable Rectangle3d recInic = new Rectangle3d(Plane.WorldxY, new Interval(0, li), new Interval(0, 1i)); rec_inic = recInic; // asignar la variable construida a la salida rec_ini J Listas contenedoras de puntos List ptosMedios = new List(); List ptosTercios = new List(); | Mista contenedora de Lineas List lineas = new List(); // convertimos el rectangulo a polilinea con la funcién .ToPolyline() al principio //-y 8@ la asign tantas veces Polyline pol = recInic.ToPolyline(); mos a una variable f a no tener que llasarla luego /[dividinos 10s segnentos for(int s = 0; s < pol.SegmentCount; s++) 1 //variables que se sobreescriben en cada pasada del bucle Point3d ptoledio = new Point3d(); manual de senpting con grasshopper Miguel Viaat Guillermo Ramirez 030 \ manual de senpting con grasshopper é Miguel vast \ . Guillermo Ramirez Point3d ptoTercio = new Pointad( Line 1PaPt = new Line(); //excepcién en primer lugar para no caer en error con los indices de listas if(s == pol.Segmentcount - 1) { ptoMedio = pol.SegnentAt(s).Pointat(0.5); ptoTercio = pol.Segmentat(0) .PointAt (0.333); ‘IPaPt = new Line(ptoMedio, ptoTercio) ; else { ptoMedio = pol.SegmentAt(s).Pointat(0.5); ptoTercio = pol.Segmentat(s + 1).Pointat(0.333); 1PaPt = new Line(ptoMedio, ptoTercio) t //anadinos a las Listas ptosiedios.Add(ptoMedio) ; ptosTercios.Add(ptoTercio) ; lineas Add (1PmPt) ; // devolvemos las variables por salidas diferentes ry ptos_medios = ptosMedios; ptos_tercios = ptosTercios; LA = lineas; ¥ post 4, Dibujar las lineas de estructura (Interseccién con el recténgulo inicial) Hemos llamado ‘lineas de estructura’ a aquellas que son la proyeccién de las lineas auxiliares sobre al rectangulo inicial. En la primera iteracién, las lineas auxiliares coincidiran con las lineas de estructura pero en las demas no Para dibujar estas lineas, primero hallaremos la interseccién entre las lineas auxiliares con cada uno da los segmentos del rectangulo inicial. En Rhino, una interseccién entre dos lineas se puede tomar como la interseccién entre dos lineas similares pero de longitud infinita, asi que no es necesario que se intersequen fisicamente para que devusivan los puntos de interseccion. J (.+.) todo el bloque de cédigo del ejercicio anterior //dividimos los segmentos for(int 5 = 0; 5 < pol.SegmentCount; s++) t 1/(.+4) todo el bloque de cédigo del ejercicio anterior // INTERSECCION DE DOS LINEAS //lista de intersecciones List inter = new List(); // ruta para los datatree GH_Path ruta = new GH_Path(s); // fabricamos un nuevo bucle para las intersecciones con el rectangulo inicial for(int i = 0; i < pol.Segmentcount; i++) { double a; // parametro t de la primera linea double b; // parametro t de la segunda linea bool rc = Rhino.Geometry. Intersect. Intersection. LineLine(1PmPt, pol.Segmentat(i), out a, out b, 0.0, false); manual de senpting con grasshopper Miguel vast Guillermo Ramirez p32 if(re && (a >= 0 && b >= 0))// algunas de las intersecciones devolvera nulo o fuera de una linea (-1), asi que colocamos esta excepe ién para no caer en error { inter .Add(pol.SegmentAt(i) .Pointat(b)); } } (Jafadimos a la lista de puntos e intersecciones ptosInt.AddRange(inter, ruta); LineasEst.Add(new Line (inter[0], inter[1]), ruta); TTT /Jaiiadimos a las Listas ptosiedios.Add(ptoMedio) ; ptosTercios.Add(ptoTercio) ; Lineas.Add(1PmPt) ; I // devolvemos las variables por salidas diferentes ptos_medios = ptosMedios; ptos_tercios = ptosTercios; LA = lineas; PI = ptosint; LE = lineasest manual de senpting con grasshopper Miguel vast Guillermo Ramirez p39 5. Dibujar un recténgulo a partir de las lineas auxiliares anteriores Elaboramos una funcién que devuelva un rectangulo a partir de una lista de lineas, que seran las lineas auxiliares. A dicha funcién le hemos llamado RectanguloAPart irDeAuxiliares. El resutlatdo de esta funcién tiene que sobreescribirse en cada iteracion Rectanglesd RectanguloAPartirDeAuxiliares(List lineasAux) { Rectangle3d rec; //variable que vamos a devolver List verRec = new List(); //vertices del plano del rectangulo Plane pl; //plano del rectangulo // este bucle nos sirve para encontrar los vertices del rectangulo Tor (int j = 0; j < lineasAux.Count - 13 j+*) { bool hayInterseccion; double paramLineat, paramLinea2; hayInterseccion = Rhino.Geometry. Intersect. Intersection. LineLine(lineasAux[j], lineasAux(j + 1], out paramLineat, out paramLinea2, 0, false); if(hayInterseccion && (paramLinea2 <= 1)) { afiadimos a la lista de intersecciones en el rectangulo verRec .Add(lineasAux[j + 1].Pointat(paramLinea2) ); , } pl = new Plane(verRec(0], verRec[1], verRec[2]);//plano del rectangulo // construinos el nuevo rectangulo return rec = new Rectangle3d(pl, verRec[0] .DistanceTo(verRec[1]), verRec[1].DistanceTo(verRec[2])); manual de senpting con grasshopper Miguel Vidat Guillermo Ramirez pos \ manual de senpting con grasshopper Xx Miguel vast Guillermo Ramirez las funciones en un bucle iterativo 6. Introducimos tod Al introducir todas los pasos anteriores en sus corraspondientes funciones y llamartas desde un cédigo principal, obtendremos la siguiente solucién con cada funcién a continuacién: private void RunScript(double li, int nIt, ref object rec_inic, ref object lineas_auxiliares, ref object lineas_estructura) 4 / rectangulo inicial Rectangle3d recInic = new RectangleSd(Plane.ViorldXxY, new Interval(0, li), new Interval(0, 1i)); DataTree lineasAux = new DataTree(); DataTree estructura = new DataTree(); Rectangle3d rec = recInic; for (int i = 0; i < nit; i++) { //almacenamos cada paso del bucle en una rama diferente GH_Path ruta = new GH_Path(i); List In = FabricarDivisiones(rec) List est = LineasEstructura(recInic, In); JineasAux.AddRange(1n, ruta); estructura.AddRange (est, ruta); // vectangulo que se va a ir sobreescribiendo en cada paso del < 5 buc le rec = RectanguloAPartirDeAuxiliares (In); x } | salida de datos TI rec_inic = recInic; Lineas_auxiliares = lineasAux; C lineas_estructura = estructura; + po3s: FUNCION PARA CONSTRUIR LAS LINEAS AUXILIARES List LineasAuxiliares(Rectangle3d recInic) { // lista contenedora de puntos List ptosMedios = new List(); List ptosTercios = new List(); //Lista contenedora de Lineas List lineas = new List(); for(int s = 0; s < recInic.ToPolyline().SegmentCount; s++) i n cada pasada del bucle //variables que se sobreescriben Point3d ptoMedio = new Pointd(); Point3d ptoTercio = new Point3d(); Line 1PmPt = new Line(); //excepcién en primer lugar para no caer en error con los de listas if(s == recInic.ToPolyline().Segmentcount - 1) { ptoMledio = recInic.ToPolyline() .Seqnentat(s) -PointAt (0.5); ptoTercio = recInic.ToPolyline().SegmentAt(0) .PointAt (0.333) ; 1PaPt = new Line(ptoMedio, ptoTercio); , else { ptoMedio = recInic.ToPolyline().SegnentAt(s).PointAat(0.5); ptoTercio = recInic.ToPolyline().Segmentat(s + 1).PointAat(0.333) ; 1PaPt = new Line(ptoMedio, ptoTercio); + manual de senpting con grasshopper Miguel vast Guillermo Ramirez 036 /Janadinos a las listas ptosiMedios. Add (ptoMedio) ptosTercios.Add(ptoTercio) ; lineas.Add(1PmPt) ; //devolvenos un valor de la funcién return linea: FUNCION PARA CONSTRUIR LAS LINEAS AUXILIARES List LineasEstructura (RectangleSd recInic, List div) { declaramos e inicializamos la lista de lineas que vamos a querer devolver List lineas = new List(); for(int i = 0; i < div.count; i++) { /] Tabricamos el plano Plane plano = new Plane(div[i].From, Vector2Points(div[i].From, div[i].To), Vector3d.ZAxis) ; // declaramos la lista de intersec List pi = new List(); ciones segmentos del rectangulo //fabricanos la interseccién con todos los for(int s = 0; s < recInic.ToPolyline().SegmentCount; s++) { Rhino.Geometry. Intersect .CurveIntersections ci = Rhino.Geometry. Intersect. Intersection. CurvePlane(recInic.ToPolyline().SegmentAt(s) . ToNurbsCurve(), plano, 0.0); manual de senpting con grasshopper Miguel vast Guillermo Ramirez pos? //para no caer en error cuando no hay intersecciones, afadimos la excepcion de que slo afadimos los puntos cuando haya interseccion it(ci != null) 4 afadimos los puntos for (int p = 0; p < ci.Count; p++) { pi-Add(ci[p].Pointa) + } fabricamos la linea y la ahadimos a la lista + Lineas.Add(new Lino(pi[0], pift])): } return lineas; FUNGION PARA CONSTRUIR UN RECTANGULO A PARTIR DE LAS LINEAS AUXILIARES Rectangle3d RectanguloAPartirDeAuxiliares(List lineasAux) { Rectanglesd rec riable que vamos a devolver List verRec = new List(); //vertices del plano del rectangulo Plane pl; //plano dei rectangulo // este bucle nos sirve para encontrar los vertices del rectangulo for (int j = < lineasAux.Count - 1; i++) { bool hayInterseccion; double paranLineat, paramLinea2; hayInterseccion = Rhino.Geometry. Intersect. Intersection. LineLine(1ineasAux[j], lineasAux[j + 1], out paramLineat, out paramLinea2, 0, false); manual de senpting con grasshopper Miguel vast Guillermo Ramirez pose if(hayInterseccion && (paramLinea2 <= 1)) { //ahadinos a la lista de intersecciones en el rectangulo verRec.Add(lineasAux[j + 1].PointAt(paramLinea2) ); , } pl = new Plane(verRec[0], verRec{1], verRec[2]);//plano del rectangulo construimos e1 nuevo rectangulo return rec = new Rectangle3d(pl, verRec[0].DistanceTo(verRec[1]), verRec[1] .DistanceTo(verRec[2])) ; } FUNCION PARA CONSTRUIR UN VECTOR A PARTIR DE DOS PUNTOS Vectorad Vector2Points(Point3d ptoA, Pointsd ptoB) { VectorSd vec = new VectorSd(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z = ptoa.z); return vec; manual de senpting con grasshopper Miguel vast p39 SOXANV RhinocCommon piNocoMMON Rhino.Collections Curvetist Rhino Commands Rhino. bi CustomDisplay Text3d Rhino.DocObjects RhinoObject Rhino DocOb Rhino DocObjects Tab Rhino FilalO. Rhino. Geometry Pointsd Vectorad Box Brep Curve Potytine Rectanglead Surface Rhino. Geometry.Collections BrepFace BrepEdge Rhino. Geometry.intersect Curveintersection Intersection IntersectionEvent stom put. Custom Plugins Rhino Render RI Rhino R Rhino Runtime interoy Rhino Ut NOTA: Se resatan en negrta los NameSpace que uttzamos en ls era GRASHOPPER GRASHOPPER_IO GRASHOPPER GH_InstanceServer Grasshopper GU! Grasshopper-Kernel GH_Path GH_Document (os del manual. Se muestran so las clases con las que vamos a trabajar. Rano PYTHON ‘RHINO FoR MAC ANEXO 2 Processing 01. Estructura basica de un programa de Processing // Esta primera parte es 1a que se ejecuta primero cuando el programa corre. asi que declararemos las variables globales al principio del cédigo, que podran ser llamadas en cualquier apartado del programa int y = 0; // a continuacién, vienen las funciones setup y draw. cada programa tiene una sola de cada una de estas funciones. Los corchetes de cada una de ellas detinen un bloque independiente J/ el bloque de 1a funcién setup se ejecuta una Unica vez por programa y en ella colocamos, Tundamentalmente, las propiedades del dibujo de processing void setup() { + size(300, 300) // 1 bloque de la funcién draw se ejecuta continuamente hasta que el programa para void draw() { line(0, y, 300, y); //dibujo de una Linea yoy tas Fuerte: BEN FRY, CASEY REAS “Processing A programming handbook or visual designers and arise", The MIT Press: ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez 02. Ellienzo y la consola nzo (canvas Es el espacio de pantalla en ol que vamos a hacer nuestro dibujo de Processing Tiene dos propiedades. -tamatioo size - color de fondo 0 background Ambas propiedades se definen en la parte de setuo de Processing int ancho = 10; int alto = 10; void setup() t size(ancho, alto); //tamano del lienzo + Laconso Es [a ventana en la que imprimimos textodesda el codigo de Processing Utlizamos dos funciones = print escribe cadenas de caracteres de un modo continuo - printin: eserba cadanas de caracteres afladiondo un salto de carro poss 02. Algunas funciones basicas de dibujo en Processing Dibujar un punto point (x, yi x entero o decimal: coordenada x del punto y entero o decimal: coordenada y del punto Dibujar una lines Line (x1, yt, x1, v1); x1 entero 0 decimal: coordenada x del punto origen yi entero o decimal: coordenada y del punto origen x2 entero o decimal: coordenada x del punto destino y2 entero o decimal: coordenada y del punto destino Dibujarun rectangulo rect(x, y, ancho, alto); x entero o decimal: coordenada X del vértice superior izquierdo y entero o decimal: coordenada Y del vértice superior izquierdo ancho entero o decimal: anchura del rectangulo alto entero o decimal: altura del rectangulo Dibujar una elipse ellipse(x, y, ancho, alto); x entero o decimal: coordenada X de la elipse y entero o decimal: coordenada Y de la elipse width entero o decimal: anchura de la elipse height entero o decimal: altura de la elipse ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez Dibujar una curva beginShape () ; curveVertex(x, y); endShape(); x entero o decimal: coordenada X del vértice de la curva y entero o decimal: coordenada Y del vértice de la curva Dibujar texto PFont miFuente; wiFuente = createFont(“FFScala”, 32); // crea automaticamente una fuente y 1a guarda en la carpeta “data” de nuestro dibujo de Processing textFont(miFuente);// esta funcion asigna el tipo de Tuente con la que se va a dibujar a continuacién text(“hola cocacola”, x, y); texto caracter 0 cadena de caracteres x entero o decimal: coordenada X del texto y entero o decimal: coordenada Y del texto Colocar una imagen PInage p; p = loadimage (nombre) ; image (Pp, Xs y)i nombre cadena de caracteres: nombre de la imagen, si esté en la carpeta “data”, si no, ruta de la misma x entero o decimal: coordenada X de la imagen y entero o decimal: coordenada Y de la imagen poss ‘manual de scripting con grasshopper 3 Miguel Vidal 7 X Guiterma Ramirez 03. Propiedades del dibujo de Processing Las propiedades fundamentales de lo que cibujamos en processing son las No suavizar borde: siguientes noSmooth(); Color Color de trazo stroke (gray); stroke(gray, alpha) ; stroke(valuet, value2, valued); stroke(value1, value2, value3, alpha); stroke (color); stroke(color, alpha); Grosor de trazo strokevieight (); Color de relleno rill() No dibujar trazo nostroke(); No dibujar relleno noFill(); Suavizar bordes mooth(); por ‘manual de scripting con grasshopper a : Miguel Vidal 7 X Guiterma Ramirez 04. Algunas funciones basicas de interaccién en Processing Posicién del raton mouseXx mouseY pmousex pmouseY Eventos de raton, mousePressed() mouseRe leased() mouseMoved() mouseDragged() poss, 05. Ejemplos de aplicacién Dibujar una curva a partir de las coordenadas del ratén void setup() { size(640, 200); background (102) ; + void draw() { stroke (255); if (mousePressed) { + Line (mouseX, mouseY, pmouseX, pmouseY); } ‘manual de scripting con grasshopper Miguel Vidal Guiterma Ramirez \eclén con botones Dibujar una interfaz de int. tamafo visor int ancho = 450; int alto = 200; tamaiio botones int lado = 30; posicion botones int posx = 50; int posY = 50; colores color cBotInicial = color(80); color cBotEncima = color(20, 20, 180); color cBotPulsado = color(255); color colorRect; void setup() { size(ancho, alto); background (0); noStroke(); rectMode (CORNER) ; void draw() { colorRect = cBotInicial; if ((mouseX >= posX && mousex <= posX+lado) && (wouseY >= posY && mouseY <= posY+lado)) { } colorRect = cBotEncima; poo ‘manual de scripting con grasshopper P Miguel Vidal 7 X Guiterma Ramirez if(((mouseX >= posX && mouseX <= posXtlado) && (mouseY >= posY && mouseY <= posY+lado)) && mouse Pressed) { + colorRect = cBotPulsado; fill(colorRect) rect(posX, posY, lado, lado); p00 Glosario de términos programacion Proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el codigo fuente de un programa informatica lenguaje de programacion Idioma artificial ado para expresar instrucciones que pueden ser llevadas a cabo or maquinas, como una computadora. ioma esta formado por un conjunto estructura y el significado de sus expresiones Lenguaje de programacién orientado a objotos desarrollado y estandanzado por Microsoft ‘como parte de su plataforma NET. Su sintaxis basica deriva de C y C++ y utliza el modelo de objetos similar al de Java, programacién orientada a objetos Peradigma de programacion que usa objetos y Sus interacciones para disefer aplicaciones ¥ programas informaticos, Esté basado en varias técnicas, entre las que se incluyen la herencia, la abstracci6n, el polimorfismo y el encapsulamiento plataforma NET Plataforma de sofware, que corre principaimer rosoft Windows, que incluye una extensa 10a de clases soportada por divarsos, jes de programacién, como C# o Visual j¢NET, y un entorno de software en el cual se ojecutan las aplicaciones (Common Language Runtime), similar @ una maquina virtual de pl script {Se traduce literalmente del inglés como ‘quidn’, “archivo de ordenes’, seria ta traduccién adecuada) ‘Se trata de un programa simp! Los scripts son casi siempre interpretados, es decir, que son ejecutados por un intérpret intérprete Programa infrormatico capaz de analizer y ‘ejecutar otros programas fetes realizen la traduccion a cédigo maquina (unos y ceros) a medida que ésta es necesaria, tipicamente instruccién por instruccién y sin guardar el resultado de dicha traduccion. Esto hace que los programas Interpretados sean més lentos, pero a cambio mas flexibles para reemplazar 0 afadir partes del programa y, ademas, offecen al programa un entorno no dependients de la maquina donda se ejecuta el intarprate (la que se conoca ‘cominmente como maquina virtual) maquina virtual Software que emula a una computadora y puede ojecuter programas como si fuese una ‘computadora real Common Language Runtime (rentorno en tiempo de ejecucion de lenguje ‘comun’) Es el entomo de ejecucién para los cédigos de los programas de la plataforma NET, como C# © Visual BasicNET, Se encarge de compilar un codigo intermedio al cédigo maquina nativo. Se ojecuta s6lo en Microsoft Windows. No 05. exaclemente una maquina virtual, pero su objetivo es el mismo. RhinoCommon Es una SDK (Sofware Developement construida bajo la platatorma NE desarrollo de plug-ins para todas las p! de Rhinoceros, esto es, Rhino 5 (32 y 64 bits) Rhino para Macintosh, Grasshopper y Phyton scripting para Rhino. SDK (Software Developement Kit) Conjunto de Herramientas de desarrollo que Permiten la creacién de aplicaciones para un determinado paquete 0 plataforma de sofware, hardware o plataformas similares Plug-in En computacion, se trata de un conjunto de componentes de sofware que afladen capacidades aspecificas a una aplicacion mfas grande Fuente: whepedta og

You might also like