Dynamo / Vasari. Custom node Multiple Closest Point to Point Collection.

CP to Grid Ej1 watch3d

Les comenté que participé en un Workshop en Sigradi 2013 en la UTFSM de Valparaíso donde se enseñó el plugin Dynamo para los softwares Vasari/Revit. En ese entonces tuve problemas para relacionar mi grilla de puntos que controlaba mi sistema de fachada con la grilla de puntos del análisis solar realizado con Vasari (Ian Keough muy amablemente, realizó en el mismo workshop un custom node para poder leer los datos del análisis solar desde el archivo .csv generado por Vasari). Varios compañeros probaron el relacionar su geometría con el análisis solar y la solución rápida fue igualar el tamaño de la grilla del análisis solar con la grilla de nuestros componentes a través de prueba y error  (vasari ofrece un slider que controla la “resolución” del análisis, que determina el tamaño de la grilla a analizar).

La manera correcta de solucionar este tipo de problemas, es que para cada componente se debería buscar el punto de análisis solar más cercano y utilizar ese valor de radiación solar (si la grilla de análisis es muy fina o cambia mucho de un valor a otro, se pueden seleccionar varios puntos cercanos en la grilla de análisis y promediar los valores). Este tipo de operaciones, en Grasshopper es fácil de realizar utilizando los componentes de Closest Point CP o Closests Point CP, pero no existen dichos nodos en Dynamo , por lo que me propuse crear mi propio Custom Node que permitiera la funcionalidad de encontrar y seleccionar los puntos mas cercanos a una grilla de puntos.

Mi primera aproximación fue realizarlo por fuerza bruta: encontrar todas las distancias entre todos los puntos, ordenar las distancias y quedarme con la primera distancia que correspondería al punto mas cercano. Pude obtener las distancias, pero no encontré forma de utilizar el mismo proceso de ordenamiento de las distancias para ordernar los puntos (ordenamiento sincrónico o synchronously sync que ofrece por defecto el componente “Sort” de Grasshopper y que Dynamo no lo tiene o yo no sé como hacerlo (recuerden que estoy aprendiendo el software). Esto sumado a que el método por fuerza bruta de medir todas las distancias entre todos los puntos era muy lento, me llevo a tomar otro camino.

Gracias a la ayuda de Steve Elliot en el foro oficial de Dynamo, pude comprender mejor como funciona la creación de nodos que sirven como funciones para otros nodos y pude construir mi propio nodo que encuentra la mínima distancia entre puntos y que a su vez me sirvió como “función” para mapear y encontrar el punto más cercano a una grilla. Lo pueden encontrar en el “Online Package Search” con el nombre “Closest Point CP Simple”.

Este componente permite utilizar múltiples puntos atractores de la siguiente forma:

CP to Grid Ej1

En este simple ejemplo lo que hago es conectar con una linea los puntos de la grilla con su punto más cercano.

Esta sería la funcionalidad más básica, pero realicé un segundo Custom Node recreando la misma funcionalidad del componente que hay en Grasshopper, en donde no sólo se entrega el punto, si no que ademas la distancia al punto y lo mas importante, el index de la posición en la lista original del punto en cuestión (ya verán para que se utiliza esto).

Para sacar la distancia hice un post proceso al “nodo CP simple” y medí directamente la distancia entre el punto entregado por el “nodo CP simple” y la grilla (esto es extraño, porque para encontrar el punto más cercano, ya utilicé una función de “minimum distance”, pero ocupé esa función para ordenar y obtener los puntos más cercanos, pero no pude ver u obtener ese valor de distancia como número, por lo que me queda la sensación de que se puede obtener ese valor en el paso previo y no como un post proceso).

Para obtener los index también tuve que recurrir a un post proceso al “nodo CP simple” y comparé los puntos obtenidos con la lista de puntos original y guardé la posición (index) de estos elementos en una lista nueva cuando estos puntos son iguales. Tuve que hacer un nodo con un script Python para este proceso, ya que no pude hacerlo con los nodos de Dynamo (creo que aun no comprendo bien el manejo y operaciones con sublistas) y descubrí que en Python es muy fácil realizar operaciones iterativas entre sublistas.

Finalmente con el nodo funcionando (“Closes Point CP” en el “Online Packages Search”), se pueden realizar cosas como esto:

CP to Grid Ej2 modelo

CP to Grid Ej2

Si se fijan, para cada punto atractor coloqué una familia de revit distinta, según el punto más cercano correspondiente  y pude saber que familia es la que corresponde para cada punto de la grilla, utilizando la lista de indices obtenida. Además se utilicé la distancia a cada punto para controlar el parámetro de altura (Height) de cada familia. Este es un ejemplo sencillo y esto de seleccionar y ordenar por indices no solo funciona con tipos de familias,  puede ser lo cualquier cosa, como una lista de parámetros, números, strings, curvas, puntos, etc… Con respecto a lo mismo, dejo pendiente el ejemplo de como usar este custom node para asociar los puntos y valores de radiación de una grilla de análisis solar a una lista de componentes que no necesariamente corresponde a la grilla de análisis.

CP nodes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s