manual de scripting en Grasshopper con C y RhinoCommon

Page 1

manual básico de scripting con C# en grasshopper miguel vidal calvet guillermo ramírez camarero www.frikearq.com edición 2011


notas previas Esto NO es un manual de programación Este documento no pretende ser una referencia para quien quiera aprender a programar. Este manual es un pequeño compendio de ejercicios, a modo de cuaderno de apuntes, destinado a quien quiera introducirse en la elaboración de scripts para generar diseños. Necesariamente, se pasará por encima de los conceptos básicos de la programación para empezar a escribir código que entienda la máquina. Será una pasada rápida, pero suficiente para ponerse a escribir códgio lo antes posible de una manera solvente. Esto SÍ es un manual de scripting para Rhino elaborado por diseñadores para diseñadores

manual de scripting con Grasshopper aplicado al diseño de arquitectura por miguel vidal calvet y guillermo ramírez camarero edición Julio 2011 grasshopper v0.8.0010


manual básico de scripting con C# en Grasshopper aplicado al diseño generativo de arquitectura

índice A. Nociones básicas de programación

B. RhinoCommon en Grasshopper

A.1. Introducción a la programación aplicado al diseño generativo

B.1. Microejercicios de iniciación a C# y RhinoCommon

01 Programación orientada a objetos. 02 Interfaz de scripting en Grasshopper

E01 Dibujar cuatro puntos formando los vértices de un cuadrado E02 Dibujar cuatro puntos formando los vértices de un cuadrado a partir de un vértice inicial y un valor de lado E03 Medir las distancias diagonales e imprimirlas en un panel E04 Introducir los puntos en una lista E05 Unir los puntos en diagonal con líneas E06 Dibujar un rectángulo a partir de esos puntos E07 Elaborar una función que fabrica un vectores entre dos puntos E08 Fabricar vectores a partir de los vértices y visualizarlos dándoles color E09 Unir los vértices consecutivamente mediante líneas E10 Extraer los puntos medios de cada segmento de rectángulo y unirlos con líneas

A.2. Tipos de datos, declaración y operaciones con variables 03 Declaración de datos simples: enteros, decimales y booleanos. 04 Declaración de datos compuestos: cadenas de caracteres, listas, y estructura de árbol de datos. A.3. Claúsulas condicionales e Iteración 05 Cláusulas condicionales: cláusulas if ... else y switch. 06 Estructuras terativas: bucles for y while. A.4. Funciones: abstracción 07 Estructura de una Función 08 Valor de una función: return

B.2. Ejemplos de aplicación B2.1 Pabellón temporal de la galería Serpentine del año 2002, Toyo Ito con Cecil Balmond

ANEXOS ANEXO 1. Estructura de RhinoCommon ANEXO 2. Processing ANEXO 3. Glosario de términos


A

Programaci贸n y dise帽o generativo


A1

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

introducción a la programación aplicada al diseño generativo

01. ¿Por qué C#?

03. ¿Qué es la programación orientada a objetos?

C# es un lenguaje de programación orientada a objetos basado en C y C++, es muy similar a Java, tiene una extensa y actualizada documentación y está construido por una plataforma muy extendida como .NET. Debido a esto, hacen que sea un lenguaje idóneo para dar los primeros pasos en los entornos de programación.

La programación orientada a objetos es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas informáticos.

En cuanto a las similaridades, principalmente con Java, y también C++, hacen que sea sencillo entender y pasar fácilmente a otros entornos útiles para los diseñadores, sobre todo, Processing y Arduino, o también scripting con Maya. También puede ser un buen comienzo para más adelante adoptar con facilidad Python, que probablemente sea un lenguaje de programación estándar para desarrollar scripts en software de 3D y otros.

El estado está compuesto de datos, será uno o varios atributos a los que se habrán asignado unos valores concretos (datos). El comportamiento está definido por los métodos o mensajes a los que sabe responder dicho objeto, es decir, qué operaciones se pueden realizar con él. La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).

En cuanto a la documentación, desde un punto de vista meramente práctico, el hecho de estar respaldado por una plataforma potente como .NET (desarrollada por Microsoft), aseguran las actualizaciones y soporte del mismo. Para consultar la referencia, ir a: http://msdn.microsoft.com/en-us/library/kx37x362.aspx

Los objetos son entidades que tienen un determinado estado, comportamiento (método) e identidad:

Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.

Fuente: wikipedia.org p05


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

03. Interfaz de scripting en Grasshopper

Entradas y salidas de variables del componente script

Existen tres componentes de scripting en Grasshopper en los que se puede escribir código en otros tantos lenguajes: - C# Script - VB Script - Python Script

Podemos trabajar con tantas variables como queramos dentro del código que escribamos y también podemos utilizar las entradas del componente para introducir datos de la definición de Grasshopper o de archivos de Rhino. Además, podremos también tener salidas de datos a nuestra elección.

Para extraer estos componentes, ir a la pestaña de Math > Script. Los dos primeros componentes vienen cargados en la instalación de Grasshopper. En el momento de la edición de este manual, el componente de scripting con Python únicamente puede utilizarse con Rhino 5. Para instalarlo, visitar: http://www.food4rhino.com.

Para modificar las entradas de datos, haremos click con el botón con el botón derecho e ir a Input manager ... Además, éstas deben ser formateadas del modo adecuado para trabajar con ellas en nuestro componente. Hablaremos de ello en el siguiente capítulo. A continuación, unas imágenes con los pasos de este proceso

Edición del componente script Para escribir código en estos componentes, hacer doble click en el cuerpo del mismo o bien click con el botón derecho y luego Edit source. Se abrirá una ventana en la que escribiremos nuestro código en donde se lee “// your code here”. Para modificar salidas de datos, hacer click con el botón con el botón derecho e ir a Output manager ... Estos datos están formateados por el componente como Object y Grasshopper lo entiende como Generic Data (dato genérico), así que no es necesario darle ningún formato específico.

escribiremos el código a partir de esta línea

p06


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

La salida out La salida out del componente script tiene dos funciones:

- devolver los posibles errores del código - imprimir los datos que deseemos

Esta salida sería como la consola de cualquier entorno de programación. Para visualizar cualquiera de ambos casos anteriores, conectaremos un panel.

Comentarios en el código Otro asunto que también va a sernos muy útil para hacer nuestros scripts es hacer comentarios dentro del código. Los comentarios son texto que forma parte del código, pero que la máquina va a obviar cuando lo está leyendo. Esto nos puede servir para anotar aspectos relevantes del código o asuntos que son importantes recordar y también para ordenarlo. Esto nos servirá no sólo para no perdernos nosotros mismos sino para posibles futuras segundas o terceras personas que puedan acceder a él.

La función Print La función Print escribe cadenas de caractares (ver tipos de datos compuestos), es decir, texto en la salida out del componente script. Esta función nos será muy útil para ir comprobando la validez de nuestro código, como veremos a lo largo del manual.

Print(“hola, cocacola);

Existen dos maneras de comentar el código - comentario de una sola línea: cualquier texto que escribamos en una línea a partir de los caracteres de barra “//” quedará comentado.

//la función print sirve para imprimir texto Print(“hola, cocacola); - comentario multilínea: cualesquiera línea o líneas de texto entre los caracteres de apertura “/*” y de cierrre “*/” quedarán comentadas.

/* código de prueba escrito como primer ejercicio del manual de scripting de Frikearq :) */ //la función print sirve para imprimir texto Print(“hola, cocacola); El intérprete lee el código línea a línea de arriba a abajo y de izquierda

NOTA: A partir de ahora, todo el texto con la apariencia del párrafo inmediatamente superior, corresponderá a código que introduciremos en el componente de script a partir de la línea donde se lee el texto “//your code here”, como antes se ha comentado.

a derecha. Para que el intérprete cambie de línea, es necesario añadir “;” al final de cada una de ellas, para que entienda que el código continúa en la siguiente línea.

p07


A2

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

tipos de datos, declaración y operaciones con variables

05. Tipos de datos primitivos

Algunas conversiones de datos habituales

Tipos de datos primitivos que más vamos a utilizar y sus identificadores

Existen funciones para convertir datos de un tipo a otro.

tipo de dato

nombre (en inglés)

identificador

número entero

integer

int

número decimal

double precision floatingpoint number

double

... a entero

Convert.ToInt32(valor) o (int)valor

valor booleano (verdadero o falso)

boolean value (true o false)

bool

... a decimal

Convert.ToDouble(valor) o (double)valor

... a booleano

Convert.ToBoolean(valor)

caracter

character

char

... a cadena de caracteres

valor .ToString()

Convertir ...

NOTA: En programación, sigue una lógica binaria, de verdadero o falso, en la que al valor numérico entero “0” se le asigna el valor booleano “falso” (false) y al valor numérico entero “1” se le asigna el valor booleano “verdadero” (true).

Y un dato compuesto para empezar ... tipo de dato

nombre (en inglés)

identificador

cadena de caracteres

string

string

NOTA: Una cadena de caracteres, o sea, texto, es un tipo de dato, como el nombre indica, compuesto de una sucesión de caracteres. El motivo por el cual lo mostramos en este punto, es que la salida out imprime cadena de caracteres, esto quiere decir, que para que devuelva cualquier dato hay que convertirlo previamente a string. Esto nos será útil para ir mostrando en pantalla lo que vayamos haciendo.

int entero = 1; double decimal = 2.5; bool verdadero = true; //debemos convertir los datos a cadena de caracteres para poder imprimirlos en pantalla Print(entero.ToString()); Print(decimal.ToString()); Print(verdadero.ToString());

p08


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

04. Variables

07. Datos compuestos

Una variable es un nombre que se asigna a una cantidad conocida o desconocida de información para poder trabajar con este nombre, independientemente de la información que representa. La mayor parte del trabajo que vamos a realizar con nuestros scripts lo haremos a través de variables.

Antes de comenzar con este apartado, recordamos que para declarar, inicializar y asignar valor a variables de datos compuestos, seguiremos el mismo esquema que habíamos visto en el apartado de variables, pero con una excepción: debemos instanciarlos. instanciación

tipo de dato

Para trabajar con variables es necesario inicializarlas según el tipo de dato que representa. El esquema básico que sigue el lenguaje de programación C# es el siguiente:

(en qué formato vamos a almacenar los datos)

Inicialización de variables

identificador de variable

nombre de asignación variable

valor

a

=

12

;

Asignación de valor a variables

(el tipo de dato que va a contener esa variable)

int

nombre de asignación variable a

=

(el que queramos)

En programación, las listas son sucesiones ordenadas de elementos. Para declarar e instanciar una lista, seguimos el esquema anterior:

identificador de variable

dato que va a contener esa variable)

valor

Listas

(el tipo de dato que va a (cualquier nombre contener esa variable) excepto los reservados)

int

identificador nombre asignación = de variable de (el tipo de variable

(new seguido del tipo de dato)

La lista que acabamos de instanciar está vacía, para añadir elementos dentro de ella, utilizamos la función .Add.

valor

12

List<Point3d> listaPts = new List<Point3d>();

;

listaPts.Add(new Point3d(1, 1, 1)); listaPts.Add(new Point3d(2, 2, 2)); listaPts.Add(new Point3d(3, 3, 3));

Finalmente, igualamos la salida con la lista que hemos fabricado.

A = listaPts;

Inicialización y asignación en la misma línea

int

a

=

12

;

Para extraer un ítem, utilizamos el siguiente método, que también lo podemos asignar a otra salida del componente, después de haberla añadido con Ouput manager..

B = listaPts[1]; p09


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

Estructura de árbol de datos

DataTree<Point3d> puntos = new DataTree<Point3d>(); puntos.Add(new Point3d(1, 1, 1)); puntos.Add(new Point3d(2, 2, 2)); puntos.Add(new Point3d(3, 3, 3)); A = puntos; B = puntos.Branch(0)[0]; También podemos asignar rutas en las que queremos almacenar la estructura de árbol de datos, que declararemos con el tipo GH_Path. GH_Path se construye con números enteros. Las rutas o paths son nombres a las que se le asignan a la estructura de árbol de datos.

DataTree<Point3d> puntos = new DataTree<Point3d>(); 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];

p010


A3

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

07. Iteración inicialización

comprobación

si es falso

si es verdadero declaración

actualización (según un rango que establezcamos)

for(inicialización; comprobación; rango de actualizacion) { declaración; }

p011


A4

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

08. Funciones: abstracción Las funciones son subrutinas incluidas dentro de un programa más grande y que nos permite resolver una tarea específica. Las funciones son útiles para desarrollar tareas que se van a repetir dentro del programa principal y para, de esta manera, modular el código en apartados pequeños. Las funciones en C# devuelven un único valor, que se asigna con return. Dicha subrutina, cuando es llamada dentro del código principal, hace que la lectura de ese código se detenga y se dirija a ejecutar el código 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 añadir el código de la función en el apartado de “//<Custom additional code>“. Nuestra primera función, que fabricará vectores a partir de dos puntos, se llamará Vector2Puntos, y la podremos llamar desde nuestro código como una función más de C# o RhnoCommon.

Estructura de una función TIPO QUE DEVUELVE NOMBRE (en caso de que devuelva algún valor) {

(

PARÁMETROS DE LA ) FUNCIÓN (que hay que declarar en este punto)

OPERACIONES DE LA FUNCIÓN return

VALOR QUE QUEREMOS QUE DEVUELVA ;

}

p012


B

RhnoCommon en Grasshopper


B.1

microejercicios de creaci贸n de geometr铆a con RhinoCommon


E01

dibujar cuatro puntos formando los vĂŠrtices de un cuadrado

manual de scripting con grasshopper Miguel Vidal Guillermo RamĂ­rez

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) { //declaramos las variables double lado; // valor numĂŠrico decimal Point3d vertice0; //punto3d (una clase de Rhino) Point3d vertice1; Point3d vertice2; Point3d vertice3; // asignamos valores a las variables lado = 20; // para los puntos, invocamos la clase Point3d con new. El valor de las coordenadas X e Y del verticeOrigen (propiedad de una clase) y le sumamos el valor de lado vertice0 = new Point3d(0, 0, 0); vertice1 = new Point3d(0, lado, 0); vertice2 = new Point3d(lado, lado, 0); vertice3 = new Point3d(0, lado, 0); A B C D

// = = = =

asignamos cada uno de los puntos a una salida del componente vertice0; vertice1; vertice2; vertice3;

} p015


E02

dibujar cuatro puntos formando los vértices de un cuadrado a partir de un vértice inicial y un valor de lado

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - acceder a propiedades de clases - trabajar con input de datos externos al componente

02. conceptos clave double, Point3d 03. procedimiento Tomamos dos variables exteriores al componente de script: - una primera, que toma valores numéricos de un slider. Deberemos hacer click con el botón derecho en la entrada y luego “Type hint” para que lo entienda como un dato de tipo numérico decimal (double). - otra segunda, a la que llamamos verticeInicial, que toma el valor del vértice incial a partir del cual posicionamos el resto de puntos y que inicializamos como el tipo Point3d de Rhino.

private void RunScript(double lado, Point3d verticeOrigen, ref object A, ref object B, ref object C, ref object D) { //declaramos las variables como punto3d (una clase de Rhino) Point3d vertice1; Point3d vertice2; Point3d vertice3; // asignamos un valor a la variable invocando la clase Point3d con new. El valor de las coordenadas X e Y del verticeOrigen (propiedad de una clase) y le sumamos el valor de lado vertice1 = new Point3d(verticeOrigen.X + lado, verticeOrigen.Y, 0); vertice2 = new Point3d(verticeOrigen.X + lado, verticeOrigen.Y + lado, 0); vertice3 = new Point3d(verticeOrigen.X, verticeOrigen.Y + lado, 0); // asignamos cada uno de los puntos a una salida del componente A = verticeOrigen; B = vertice1; C = vertice2; D = vertice3; } p016


E03

medir las distancias diagonales e imprimirlas en un panel

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

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 matemáticas en el código y los 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 algebraico. En segundo lugar, medimos la distancia con el método Distance de Pointd3d de RhinoCommon. Y, por último, comprobamos que ambas coinciden.

// declaramos y asignamos las variables en la misma línea double diagAlg1 = Math.Sqrt(Math.Pow((vertice2.X-verticeOrigen.X), 2)+Math.Pow((vertice2.Y-verticeOrigen.Y),2));//Math.Sqrt(), raíz cuadrada double diagAlg2 = Math.Sqrt(Math.Pow((vertice3.X - vertice1.X), 2) + Math.Pow((vertice3.Y - vertice1.Y), 2)); double diagPt1 = verticeOrigen.DistanceTo(vertice2); double diagPt2 = vertice1.DistanceTo(vertice3); // pasamos a un valor de dos decimales diagAlg1 = Math.Round(diagAlg1, 2); diagAlg2 = Math.Round(diagAlg2, 2); diagPt1 = Math.Round(diagPt1, 2); diagPt2 = Math.Round(diagPt2, 2); // estructura condicional if((Math.Round(diagAlg1, 2) == Math.Round(diagPt1, 2)) && (Math. Round(diagAlg2, 2) == Math.Round(diagPt2, 2))) { Print(“guay!”); } else { Print(“horror!”); }

p017


E04

introducir los puntos en una lista

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - aprender a declarar, crear y añadir valores a una lista

02. conceptos clave List, new, Add 03. procedimiento private void RunScript(double lado, Point3d verticeOrigen, ref object A) { //declaramos las variables como punto3d (una clase de Rhino) Point3d vertice1 = new Point3d(verticeOrigen.X + lado, verticeOrigen.Y, 0); Point3d vertice2 = new Point3d(verticeOrigen.X + lado, verticeOrigen.Y + lado, 0); Point3d vertice3 = new Point3d(verticeOrigen.X, verticeOrigen.Y + lado, 0); // declaramos una lista de puntos llamada “vertices” List<Point3d> vertices; // utilizamos el constructor predeterminado para crear una lista de de puntos con una capacidad de 0 vertices = new List<Point3d>(); //añadimos valores a la lista en orden vertices.Add(verticeOrigen); vertices.Add(vertice1); vertices.Add(vertice2); vertices.Add(vertice3); // asignamos la lista a una salida A = vertices; } p018


E05

unir los puntos en diagonal con líneas

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - aprender a acceder a los ítemes de las listas

02. conceptos clave List, List item, Add 03. procedimiento Accedemoa a los ítemes de la lista de vertices con [indice] y los unimos con la función de RhinoCommon Line.

// mismo código que en el ejercicio anterior con una nueva salida en el componente para las líneas diagonales, a la que llamamos D // declaramos la lista de diagonales List<Line> diagonales = new List<Line>(); // dibujamos las diagonales Line diagonal1 = new Line(vertices[0], vertices[2]);// accedemos a los itemes de las listas con [indice] Line diagonal2 = new Line(vertices[3], vertices[1]); // las añadimos a la lista de diagonales diagonales.Add(diagonal1); diagonales.Add(diagonal2); // asignamos la lista a una nueva salida D = diagonales;

p019


E06

dibujar un rectángulo a partir de esos puntos

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - aprender a fabricar vectores, planos y rectángulos

02. conceptos clave Plane, Vector3d, Rectangle3d 03. procedimiento // mismo código que en el ejercicio anterior con una nueva salida en el componente para el rectángulo, a la que llamamos R // para fabricar un rectángulo, necesitaremos un plano y dos números decimales para el ancho y el alto Rectangle3d rec; // podemos fabricar un plano de distintas maneras, pero vamos a hacerlo a partir de un punto base y dos vectores Plane plano; Point3d ptoOrigenPlano = vertices[0]; // podemos declarar la variable y asignarle valor en la misma linea Vector3d vecXPlano = new Vector3d();// 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].Y; vecXPlano.Z = vertices[1].Z - vertices[0].Z; // también podemos declarar y construir el vector en la misma línea Vector3d vecYPlano = new Vector3d(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 Rectangle3d(plano, ladoRec, ladoRec); R = rec; p020


E07

elaborar una función para fabricar vectores entre dos puntos

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - aprender a elaborar funciones

02. conceptos clave function, Vector3d, Rectangle3d 03. procedimiento Este código lo añadimos en el apartado “custom additional code” de tal manera que sirva para llamarlo en cualquier momento dentro del código principal.

//<Custom additional code> Vector3d Vector2Puntos(Point3d ptoA, Point3d ptoB) { Vector3d vec = new Vector3d(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z - ptoA.Z); return vec; }

p021


E08

fabricar vectores a partir de vértices del rectángulo y visualizarlos dándoles color

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. objetivos - aprender a reutilizar código - entender cómo funciona CustomDisplay

02. conceptos clave CustomDisplay, Vector3d, Rectangle3d 03. procedimiento List<Vector3d> vecs = new List<Vector3d>();// lista de vectores Polyline recPol = rec.ToPolyline();//convertimos rec en polilínea // recorremos la lista de segmentos de la polilínea for(int s = 0; s < recPol.SegmentCount; s++) { vecs.Add(Vector2Puntos(recPol.SegmentAt(s).From, recPol. SegmentAt(s).To)); } V = vecs; // 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); } } //<Custom additional code> Vector3d Vector2Puntos(Point3d ptoA, Point3d ptoB) { Vector3d vec = new Vector3d(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z - ptoA.Z); return vec; } p022


E09

extraer los puntos medios de cada segmento de rectángulo y unirlos con líneas

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

p023


E09

unir los puntos consecutivamente mediante líneas

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

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 el componente para las líneas, a la que llamamos L // declaración de lista de lineas para los lados List<Line> lados = new List<Line>(); // bucle para unir los vértices consecutivamente for(int i = 0; i < vertices.Count; i++) { // excepción para el último elemento if(i == vertices.Count - 1) { lados.Add(new Line(vertices[i], vertices[0])); } else { lados.Add(new Line(vertices[i], vertices[i + 1])); } } // salida de datos L = lados;

p024


E10

unir los puntos medios con lĂ­neas

manual de scripting con grasshopper Miguel Vidal Guillermo RamĂ­rez

p025


B2

ejemplos de aplicaci贸n


B2

manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

pabellón de la Serpentine Gallery 2002, Toyo Ito con Cecil Balmond

01. objetivos - crear geometría 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

Fotografía: © David Martin, fuente: flickr.com/photos/avidday

El pabellón temporal del año 2002 de la galería Serpentine, proyectado por Toyo Ito con Cecil Balmond, de Arup, se construye a partir de un algoritmo iterativo que dibuja la cubierta. Partiendo de un cuadrado, se van uniendo consecutivamente los puntos medios con los puntos tercios de sus segmentos.

1. Dibujar el rectángulo inicial 2. Extraer los puntos medios y tercios 3. Dibujar las líneas de unión entre los puntos medios y tercios (líneas auxiliares) 4. Dibujar las líneas de intersección con el rectángulo inicial (líneas de estructura) 5. Dibujar un nuevo rectángulo 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 1. Rectángulo inicial

2. Puntos medios y tercios del rectángulo inicial

3. Líneas auxiliares

4. Líneas de estructura (en la 1ª

iteración son coincidentes con las líneas auxiliares)

5. Nuevo rectángulo

6. Introducir todas las funciones en un bucle iterativo

7. Terminar de modelar la curbierta y fachadas *

* Este apartado del ejercicio, por su complejidad, se realizará con los componentes precargados de Grasshopper., por lo que no se explicará paso a paso en este manua. p027


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

1. Dibujar el rectángulo inicial Nuestro componente de script tendrá dos entradas conectadas a sliders: “li”, que define el lado del cuadrado inicial, y “cota”, que define la cota de arranque de la cubierta; y una salida: “rec_inic”:

private void RunScript(double li, double cota, ref object rec_inic) { // declaración de variable Rectangle3d recInic; // asignación de variable recInic = new Rectangle3d(); // inicialización de variable (refiriendose adecuadamente a sus constructores) recInic = new Rectangle3d(new Plane(new Point3d(0, 0, cota), Vector3d. XAxis, Vector3d.YAxis), new Interval(0, li), new Interval(0, li)); // el valor del lado del cuadrado es un slider (li) // asignar la variable construida a la salida rec_inic rec_inic = recInic; }

p028


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

2. Extraer puntos medios y tercios

private void RunScript(double li, double cota, ref object rec_inic) { // declaración, asignación e inicialización de variable en la misma

línea Rectangle3d recInic = new Rectangle3d(Plane.WorldXY, new Interval(0, li), new Interval(0, li)); // asignar la variable construida a la salida rec_inic rec_inic = recInic; // lista contenedora de puntos List<Point3d> ptosMedios = new List<Point3d>(); List<Point3d> ptosTercios = new List<Point3d>(); //dividimos los segmentos // para ello, convertimos el rectángulo en polilínea con Rectangle3d. ToPolyline(), de tal manera que podemos acceder a cada uno de los segmentos con el método SegmentAt(indiceDeSegmento) for(int s = 0; s < recInic.ToPolyline().SegmentCount; s++) { Point3d ptoMedio = recInic.ToPolyline().SegmentAt(s).PointAt(0.5); ptosMedios.Add(ptoMedio);

Point3d ptoTercio = recInic.ToPolyline().SegmentAt(s).PointAt(0.333); ptosTercios.Add(ptoTercio) } // devolvemos las variables por salidas diferentes ptos_medios = ptosMedios; ptos_tercios = ptosTercios;

}

p029


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

3. Dibujar las líneas auxiliares Para dibujar las líneas auxiliares, tendremos que unir el punto medio con el punto tercio del siguiente segmento. Tendremos que incluir una excepción para el último segmento del rectángulo, puesto que si dejamos que la lista vaya hasta el último elemento, el script dará un error. La excepción consistirá en que, cuando llegue al último índice, se una con el primer elemento y no con el siguiente.

private void RunScript(double li, ref object rec_inic, ref object ptos_ medios, ref object ptos_tercios, ref object LA) { // declaración, asignación e inicialización de variable Rectangle3d recInic = new Rectangle3d(Plane.WorldXY, new Interval(0, li), new Interval(0, li)); rec_inic = recInic; // asignar la variable construida a la salida rec_inic // listas contenedoras de puntos List<Point3d> ptosMedios = new List<Point3d>(); List<Point3d> ptosTercios = new List<Point3d>(); //lista contenedora de lineas List<Line> lineas = new List<Line>(); // convertimos el rectángulo a polilínea con la función .ToPolyline() al principio // y se la asignamos a una variable para no tener que llamarla luego tantas veces Polyline pol = recInic.ToPolyline(); //dividimos los segmentos for(int s = 0; s < pol.SegmentCount; s++) { //variables que se sobreescriben en cada pasada del bucle Point3d ptoMedio = new Point3d(); p030


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

Point3d ptoTercio = new Point3d(); Line lPmPt = new Line(); //excepción en primer lugar para no caer en error con los índices de listas if(s == pol.SegmentCount - 1) { ptoMedio = pol.SegmentAt(s).PointAt(0.5); ptoTercio = pol.SegmentAt(0).PointAt(0.333); lPmPt = new Line(ptoMedio, ptoTercio); } else { ptoMedio = pol.SegmentAt(s).PointAt(0.5); ptoTercio = pol.SegmentAt(s + 1).PointAt(0.333); lPmPt = new Line(ptoMedio, ptoTercio); } //añadimos a las listas ptosMedios.Add(ptoMedio); ptosTercios.Add(ptoTercio); lineas.Add(lPmPt); } // devolvemos las variables por salidas diferentes ptos_medios = ptosMedios; ptos_tercios = ptosTercios; LA = lineas; }

p031


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

4. Dibujar las líneas de estructura (intersección con el rectángulo inicial) Hemos llamado “líneas de estructura” a aquellas que son la proyección de las líneas auxiliares sobre el rectángulo inicial. En la primera iteración, las líneas auxiliares coincidirán con las líneas de estructura, pero en las demás no. Para dibujar estas líneas, primero hallaremos la intersección entre las líneas auxiliares con cada uno de los segmentos del rectángulo inicial. En Rhino, una intersección entre dos líneas se puede tomar como la intersección entre dos líneas similares pero de longitud infinita, así que no es necesario que se intersequen físicamente para que devuelvan los puntos de intersección.

//(...) todo el bloque de código del ejercicio anterior //dividimos los segmentos for(int s = 0; s < pol.SegmentCount; s++) { //(...) todo el bloque de código del ejercicio anterior // INTERSECCIÓN DE DOS LÍNEAS //lista de intersecciones List<Point3d> inter = new List<Point3d>(); // ruta para los datatree GH_Path ruta = new GH_Path(s); // fabricamos un nuevo bucle para las intersecciones con el rectángulo 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(lPmPt, pol.SegmentAt(i), out a, out b, 0.0, false);

p032


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

if(rc && (a >= 0 && b >= 0))// algunas de las intersecciones devolverá nulo o fuera de una linea (-1), así que colocamos esta excepción para no caer en error { inter.Add(pol.SegmentAt(i).PointAt(b)); } } //añadimos a la lista de puntos e intersecciones ptosInt.AddRange(inter, ruta); lineasEst.Add(new Line (inter[0], inter[1]), ruta); /////////////////////////////////////////// //añadimos a las listas ptosMedios.Add(ptoMedio); ptosTercios.Add(ptoTercio); lineas.Add(lPmPt); } // devolvemos las variables por salidas diferentes ptos_medios = ptosMedios; ptos_tercios = ptosTercios; LA = lineas; PI = ptosInt; LE = lineasEst;

p033


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

5. Dibujar un rectángulo a partir de las líneas auxiliares anteriores Elaboramos una función que devuelva un rectángulo a partir de una lista de líneas, que serán las líneas auxiliares. A dicha función la hemos llamado RectanguloAPartirDeAuxiliares. El resutlatdo de esta función tiene que sobreescribirse en cada iteración.

Rectangle3d RectanguloAPartirDeAuxiliares(List<Line> lineasAux) { Rectangle3d rec; //variable que vamos a devolver List<Point3d> verRec = new List<Point3d>(); //vertices del plano del rectangulo Plane pl; //plano del rectángulo // este bucle nos sirve para encontrar los vertices del rectangulo for (int j = 0; j < lineasAux.Count - 1; j++) { bool hayInterseccion; double paramLinea1, paramLinea2; hayInterseccion = Rhino.Geometry.Intersect.Intersection. LineLine(lineasAux[j], lineasAux[j + 1], out paramLinea1, out paramLinea2, 0, false); if(hayInterseccion && (paramLinea2 <= 1)) { //añadimos 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 el nuevo rectangulo return rec = new Rectangle3d(pl, verRec[0].DistanceTo(verRec[1]), verRec[1].DistanceTo(verRec[2])); } p034


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

6. Introducimos todas las funciones en un bucle iterativo Al introducir todas los pasos anteriores en sus correspondientes funciones y llamarlas 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) { // rectángulo inicial Rectangle3d recInic = new Rectangle3d(Plane.WorldXY, new Interval(0, li), new Interval(0, li)); DataTree<Line> lineasAux = new DataTree<Line>(); DataTree<Line> estructura = new DataTree<Line>(); 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<Line> ln = FabricarDivisiones(rec); List<Line> est = LineasEstructura(recInic, ln); lineasAux.AddRange(ln, ruta); estructura.AddRange(est, ruta); // rectangulo que se va a ir sobreescribiendo en cada paso del bucle rec = RectanguloAPartirDeAuxiliares(ln); } // salida de datos rec_inic = recInic; lineas_auxiliares = lineasAux; lineas_estructura = estructura; } p035


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

FUNCIÓN PARA CONSTRUIR LAS LÍNEAS AUXILIARES

List<Line> LineasAuxiliares(Rectangle3d recInic) { // lista contenedora de puntos List<Point3d> ptosMedios = new List<Point3d>(); List<Point3d> ptosTercios = new List<Point3d>(); //lista contenedora de lineas List<Line> lineas = new List<Line>(); for(int s = 0; s < recInic.ToPolyline().SegmentCount; s++) { //variables que se sobreescriben en cada pasada del bucle Point3d ptoMedio = new Point3d(); Point3d ptoTercio = new Point3d(); Line lPmPt = new Line(); //excepción en primer lugar para no caer en error con los índices de listas if(s == recInic.ToPolyline().SegmentCount - 1) { ptoMedio = recInic.ToPolyline().SegmentAt(s).PointAt(0.5); ptoTercio = recInic.ToPolyline().SegmentAt(0).PointAt(0.333); lPmPt = new Line(ptoMedio, ptoTercio); } else { ptoMedio = recInic.ToPolyline().SegmentAt(s).PointAt(0.5); ptoTercio = recInic.ToPolyline().SegmentAt(s + 1).PointAt(0.333); lPmPt = new Line(ptoMedio, ptoTercio); }

p036


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

//añadimos a las listas ptosMedios.Add(ptoMedio); ptosTercios.Add(ptoTercio); lineas.Add(lPmPt); } //devolvemos un valor de la función return lineas; }

FUNCIÓN PARA CONSTRUIR LAS LÍNEAS AUXILIARES

List<Line> LineasEstructura (Rectangle3d recInic, List<Line> div) { // declaramos e inicializamos la lista de líneas que vamos a querer devolver List<Line> lineas = new List<Line>(); for(int i = 0; i < div.Count; i++) { // fabricamos el plano Plane plano = new Plane(div[i].From, Vector2Points(div[i].From, div[i].To), Vector3d.ZAxis); // declaramos la lista de intersecciones List<Point3d> pi = new List<Point3d>(); //fabricamos la intersección con todos los segmentos del rectangulo 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);

p037


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

//para no caer en error cuando no hay intersecciones, añadimos la excepción de que sólo añadimos los puntos cuando haya intersección if(ci != null) { //añadimos los puntos for (int p = 0; p < ci.Count; p++) { pi.Add(ci[p].PointA); } } } //fabricamos la línea y la añadimos a la lista lineas.Add(new Line(pi[0], pi[1])); } return lineas; }

FUNCIÓN PARA CONSTRUIR UN RECTÁNGULO A PARTIR DE LAS LÍNEAS AUXILIARES

Rectangle3d RectanguloAPartirDeAuxiliares(List<Line> lineasAux) { Rectangle3d rec; //variable que vamos a devolver List<Point3d> verRec = new List<Point3d>(); //vertices del plano del rectangulo Plane pl; //plano del rectángulo // este bucle nos sirve para encontrar los vertices del rectangulo for (int j = 0; j < lineasAux.Count - 1; j++) { bool hayInterseccion; double paramLinea1, paramLinea2; hayInterseccion = Rhino.Geometry.Intersect.Intersection. LineLine(lineasAux[j], lineasAux[j + 1], out paramLinea1, out paramLinea2, 0, false); p038


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

if(hayInterseccion && (paramLinea2 <= 1)) { //añadimos 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 el nuevo rectangulo return rec = new Rectangle3d(pl, verRec[0].DistanceTo(verRec[1]), verRec[1].DistanceTo(verRec[2])); }

FUNCIÓN PARA CONSTRUIR UN VECTOR A PARTIR DE DOS PUNTOS

Vector3d Vector2Points(Point3d ptoA, Point3d ptoB) { Vector3d vec = new Vector3d(ptoB.X - ptoA.X, ptoB.Y - ptoA.Y, ptoB.Z - ptoA.Z); return vec; }

p039


manual de scripting con grasshopper Miguel Vidal Guillermo RamĂ­rez

p040


ANEXOS


ANEXO 1 Estructura de RhinocCommon


RHINOCOMMON RHINO Rhino Rhino.ApplicationSettings Rhino.Collections CurveList Rhino.Commands Rhino. Display CustomDisplay Text3d Rhino.DocObjects RhinoObject Rhino.DocObjects.Custom Rhino.DocObjects.Tables Rhino.FileIO Rhino. Geometry Point3d Vector3d Box Brep Curve Polyline Rectangle3d Surface Rhino. Geometry.Collections BrepFace BrepEdge Rhino. Geometry.Intersect CurveIntersection Intersection IntersectionEvent Rhino.Input Rhino.Input.Custom Rhino.Plugins Rhino.Render Rhino.Render.Custom Rhino.Runtime Rhino.Runtime.InteropWrapper Rhino.UI

GRASHOPPER GRASHOPPER_IO GH_ISerializable Interface GH_IO.Serialization GH_IO.Types GH_IO.UserInterface GRASHOPPER GH_InstanceServer Grasshopper.GUI Grasshopper.Kernel GH_Path GH_Document

NOTA: Se resaltan en negrita los NameSpace que utilizamos en los ejercicios del manual. Se muestran s贸lo las clases con las que vamos a trabajar.

RHINO PYTHON

RHINO FOR MAC


ANEXO 2 Processing 01. Estructura bรกsica de un programa de Processing 02. El lienzo y la consola 03. Algunas funciones de dibujo bรกsico 04. Algunas funciones de interacciรณn bรกsicas 05. Ejemplos de aplicaciรณn


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

01. Estructura básica de un programa de Processing

02. El lienzo y la consola

// Esta primera parte es la que se ejecuta primero cuando el programa corre. así que declararemos las variables globales al principio del código, que podrán ser llamadas en cualquier apartado del programa int y = 0;

El lienzo (canvas)

// 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 definen un bloque independiente // el bloque de la función setup se ejecuta una única vez por programa y en ella colocamos, fundamentalmente, las propiedades del dibujo de processing void setup() { size(300, 300); //tamaño del lienzo } // el bloque de la función draw se ejecuta continuamente hasta que el programa para void draw() { line(0, y, 300, y); //dibujo de una línea y = y + 4; }

Es el espacio de pantalla en el que vamos a hacer nuestro dibujo de Processing. Tiene dos propiedades. - tamaño o size - color de fondo o background Ambas propiedades se definen en la parte de setup de Processing.

int ancho = 10; int alto = 10; void setup() { size(ancho, alto); //tamaño del lienzo } x y

La consola Es la ventana en la que imprimimos textodesde el codigo de Processing. Utilizamos dos funciones: - print: escribe cadenas de caracteres de un modo continuo - println: escribe cadenas de caracteres añadiendo un salto de carro

Fuente: BEN FRY, CASEY REAS. “Processing. A programming handbook for visual designers and artists”, The MIT Press. p045


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

02. Algunas funciones básicas de dibujo en Processing Dibujar un punto

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

point (x, y); x entero o decimal: coordenada x del punto y entero o decimal: coordenada y del punto Dibujar una línea

line x1 y1 x2 y2

(x1, y1, entero o entero o entero o entero o

x1, y1); decimal: decimal: decimal: decimal:

coordenada coordenada coordenada coordenada

x y x y

del del del del

punto punto punto punto

origen origen destino destino

Dibujar un rectángulo

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 rectángulo alto entero o decimal: altura del rectángulo 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

Dibujar texto

PFont miFuente; miFuente = createFont(“FFScala”, 32); // crea automáticamente una fuente y la guarda en la carpeta “data” de nuestro dibujo de Processing textFont(miFuente);// esta función asigna el tipo de fuente con la que se va a dibujar a continuación text(“hola cocacola”, x, y); texto caracter o cadena de caracteres x entero o decimal: coordenada X del texto y entero o decimal: coordenada Y del texto Colocar una imagen

PImage p; p = loadImage(nombre); image(p, x, y); 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 p046


manual de scripting con grasshopper Miguel Vidal Guillermo RamĂ­rez

03. Propiedades del dibujo de Processing Las propiedades fundamentales de lo que dibujamos en processing son las siguientes: Color

No suavizar bordes

noSmooth();

Color de trazo

stroke(gray); stroke(gray, alpha); stroke(value1, value2, value3); stroke(value1, value2, value3, alpha); stroke(color); stroke(color, alpha); Grosor de trazo

strokeWeight (); Color de relleno

fill(); No dibujar trazo

noStroke(); No dibujar relleno

noFill(); Suavizar bordes

smooth(); p047


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

04. Algunas funciones básicas de interacción en Processing Posición del ratón

mouseX mouseY pmouseX pmouseY Eventos de ratón

mousePressed() mouseReleased() mouseMoved() mouseDragged()

p048


manual de scripting con grasshopper Miguel Vidal Guillermo Ramírez

05. Ejemplos de aplicación Dibujar una curva a partir de las coordenadas del ratón

Dibujar una interfaz de interacción con botones

void setup() { size(640, 200); background(102); }

// tamaño visor int ancho = 450; int alto = 200; //tamaño 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 draw() { stroke(255); if(mousePressed) { line(mouseX, mouseY, pmouseX, pmouseY); } }

void setup() { size(ancho, alto); background(0); noStroke(); rectMode(CORNER); } void draw() { colorRect = cBotInicial; if ((mouseX >= posX && mouseX <= posX+lado) && (mouseY >= posY && mouseY <= posY+lado)) { colorRect = cBotEncima; } p049


manual de scripting con grasshopper Miguel Vidal Guillermo RamĂ­rez

if(((mouseX >= posX && mouseX <= posX+lado) && (mouseY >= posY && mouseY <= posY+lado)) && mousePressed) { colorRect = cBotPulsado; } fill(colorRect); rect(posX, posY, lado, lado); }

p050


ANEXO 3 Glosario de tĂŠrminos


programación Proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático.

lenguaje de programación Idioma artificial diseñado para expresar instrucciones que pueden ser llevadas a cabo por máquinas, como una computadora. Como tal idioma está formado por un conjunto de símbolos y reglas sintácticas que definen su estructura y el significado de sus expresiones.

C# Lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET. Su sintaxis básica deriva de C y C++ y utiliza el modelo de objetos similar al de Java.

programación orientada a objetos Paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, entre las que se incluyen la herencia, la abstracción, el polimorfismo y el encapsulamiento.

plataforma .NET Plataforma de software, que corre principalmente en Microsoft Windows, que incluye una extensa biblioteca de clases soportada por diversos lenguajes de programación, como C# o Visual Basic.NET, y un entorno de software en el cual se ejecutan las aplicaciones (Common Language Runtime), similar a una máquina virtual de aplicaciones

script (Se traduce literalmente del inglés como “guión”, “archivo de órdenes”, sería la traducción adecuada). Se trata de un programa simple. Los scripts son casi siempre interpretados, es decir, que son ejecutados por un intérprete.

intérprete Programa infrormático capaz de analizar y ejecutar otros programas. Los intérpretes realizan la traducción a código máquina (unos y ceros) a medida que ésta es necesaria, típicamente instrucción por instrucción y sin guardar el resultado de dicha traducción. Esto hace que los programas interpretados sean más lentos, pero a cambio más flexibles para reemplazar o añadir partes del programa y, además, ofrecen al programa un entorno no dependiente de la máquina donde se ejecuta el intérprete (lo que se conoce comúnmente como máquina virtual).

RhinoCommon Es una SDK (Software Developement Kit) construída bajo la plataforma .NET para el desarrollo de plug-ins para todas las plataformas 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 o plataforma de software, hardware o plataformas similares.

Plug-in En computación, se trata de un conjunto de componentes de software que añaden capacidades especificas a una aplicación mñas grande.

máquina virtual Software que emula a una computadora y puede ejecutar programas como si fuese una computadora real.

Common Language Runtime (”entorno en tiempo de ejecución de lenguje común”) Es el entorno de ejecución para los códigos de los programas de la plataforma .NET, como C# o Visual Basic.NET. Se encarga de compilar un código intermedio al código máquina nativo. Se ejecuta sólo en Microsoft Windows. No es exactamente una máquina virtual, pero su objetivo es el mismo.

Fuente: wikipedia.org


www.frikearq.com


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.