Agrupar y filtrar datos


¿Alguna vez ha deseado tener un mayor control sobre los datos u objetos dentro de Grasshopper? Por ejemplo, ¿alguna vez ha querido seleccionar solo los objetos del modelo a los que se ha aplicado un determinado material (por ejemplo, vidrio)? O tal vez ha querido eliminar todas las superficies del modelo que estuvieran en una capa específica y cuya área fuera inferior a un valor determinado. ¿Lo ha podido hacer (fácilmente)?

Grasshopper 1 para Rhino 8 incluye nuevos componentes que le ayudarán a gestionar sus datos de forma más eficaz.

Para explicar cómo funcionan estos nuevos componentes, lo mejor es empezar con un ejemplo sencillo. En este modelo de masas hay BREP que representan la envolvente exterior de los edificios y las superficies que representan los pisos. Los objetos se han colocado en distintas capas y se les han asignado distintos colores en función del tipo de uso (oficina, residencial, etc.).

La mayoría de los objetos también tienen algunos metadatos adjuntos, como entradas de texto de usuario.

Empecemos este tutorial calculando la superficie total de cada edificio en nuestro modelo de masas. Tenemos tres masas de construcción en nuestro modelo. Cada una de las placas de suelo tienen asignado un número de identificación de edificio (Building ID) como entrada de texto de usuario.

Agrupar contenido

Para empezar, abramos el editor Grasshopper y hagamos clic en File -> New Document para empezar una nueva definición.

Para calcular la superficie total de cada edificio, primero debemos hacer referencia a todas las plantas del modelo de Rhino en nuestra definición de Grasshopper.

Este tutorial trata sobre el filtrado de datos. Como hemos organizado nuestro modelo por capas, podemos filtrar los pisos utilizando la entrada Layer del componente Query Model Objects (que se encuentra en la ficha Rhino y en la subcategoría Object). Utilizando el asterisco “*” después de la palabra Floors, seleccionará todos los objetos de las subcapas Floors.

Al pasar el ratón por encima del parámetro de salida Objects, vemos que tenemos 31 superficies que representan cada una de las placas de suelo del modelo.

A continuación, tenemos que agrupar cada una de estas placas de suelo utilizando el identificador del edificio (Building ID) como criterio de agrupación. Utilizaremos el componente Group Content (que se encuentra en la pestaña Rhino y en la subcategoría Content) y conectaremos la salida del componente de consulta a la entrada Content.

Este componente utiliza la entrada Key para determinar cómo agrupar el contenido en diferentes ramas de árbol de datos. Al hacer clic con el botón derecho del ratón en la entrada Key, aparecerán varias opciones.

Select Type - En este desplegable puede seleccionar si desea agrupar el contenido por clave de texto de usuario o por atributo de tipo de datos. En este caso, queremos agrupar los objetos en función del valor de texto de usuario de idenficador del edificio, por lo que debemos seleccionar “User Text” en el menú desplegable.

Select Property/Key - Según la selección del menú desplegable anterior, el control de vista en árbol mostrará una lista de propiedades o claves disponibles que puede utilizar como criterios de filtrado. Podemos seleccionar la clave “Building ID” para este ejemplo.

Si se observa la salida de Content, todos los pisos se han separado en diferentes ramas según el número de identificación de edificio. La salida Values devuelve una lista de todos los valores clave únicos que ha encontrado en el contenido. En este caso vemos una lista de tres valores (1, 2 y 3) que corresponden a los valores de ID únicos que se encontraron en la lista de contenido, así como las ramas del árbol de datos de los contenidos agrupados.

El último paso de este proceso consiste en sumar toda el área de cada rama de nuestro árbol de datos. Dado que todas nuestras superficies de suelo ahora están separadas en diferentes ramas, es bastante fácil pasar la salida del componente Group Content a un componente Area y luego sumar todos esos valores utilizando el componente Mass Addition.

A partir de la definición de Grasshopper anterior, podemos determinar que:

  • Edificio 1 = 43.622 pies cuadrados
  • Edificio 2 = 36.626 pies cuadrados
  • Edificio 3 = 5.736 pies cuadrados

Lo bueno de este flujo de trabajo es lo fácil que resulta cambiar los criterios de agrupación. Por ejemplo, supongamos que desea determinar el total de pies cuadrados de los distintos tipos de uso (residencial, oficina, comercial, etc.) en lugar de simplemente el total de pies cuadrados de cada edificio. En este caso, solo tenemos que cambiar la propiedad Key a “Use Type” (Tipo de uso). Todo lo demás se puede quedar igual.

Cambiando el criterio de agrupación a “Use Type”, la suma total de pies cuadrados es la siguiente:

  • Comercial = 21.740 pies cuadrados
  • Educativo = 5.736 pies cuadrados
  • Uso mixto = 11.326 pies cuadrados
  • Oficina = 23.972 pies cuadrados
  • Residencial = 23.210 pies cuadrados

Filtrar contenido

Además de agrupar, también podemos filtrar contenidos en función de si se cumple una determinada condición. Normalmente, una condición de filtrado comparará una propiedad de objeto con otra y devolverá un valor booleano (Verdadero o Falso). Piense, ¿es x igual a y? ¿O es x mayor o igual que y? También podemos combinar esas reglas en expresiones más complejas utilizando operadores.

Así pues, con nuestro modelo existente, crearemos una serie de filtros que separarán las placas de suelo según los siguientes criterios:

  1. El tipo de uso debe ser del tipo “Oficina” Y
  2. La superficie debe ser superior a 2.250 pies cuadrados Y
  3. La superficie también debe ser inferior a 2.500 pies cuadrados

Empecemos creando una nueva definición de Grasshopper. En el menú de Grasshopper, haga clic en File -> New Document. Al igual que en el ejemplo anterior, utilizaremos el componente Query Model Objects con el filtro Layer definido en “Floors” para hacer referencia a todos las superficies de suelo en nuestro documento Grasshopper. La salida debería contener 31 superficies que representan cada una de las placas de suelo del modelo.

A continuación, crearemos un filtro que defina nuestra primera condición anterior: filtrar todas las placas de suelo cuyo tipo de uso sea igual al tipo “Oficina”. En la ficha Rhino y en la subcategoría Content, hay algunos filtros que pueden comprobar la igualdad. Sin embargo, para este tutorial, empezaremos añadiendo un componente Match Text Filter a nuestro lienzo.

El filtro Match Text Filter es un componente increíblemente potente y flexible para la comparación de textos. En este filtro queremos pasar por cada placa de suelo y extraer el valor asignado a la entrada de texto de usuario “Use Type”. A continuación, compararemos ese valor para ver si coincide con la palabra “Oficina” y filtraremos los objetos debidamente.

El componente Match Text Filter tiene tres modos de funcionamiento. Si hace clic con el botón derecho del ratón en el centro del componente Match Text Filter, verá una lista con los tres modos:

En este ejemplo, solo nos interesan los valores de texto que equivalen (Equals) a la palabra “Oficina”. Así pues, seleccionaremos el modo Equals en el menú del botón derecho del componente Match Text Filter.

A continuación, tenemos que especificar la entrada Key para determinar cómo filtrar el contenido. De nuevo, al igual que en el ejemplo anterior, podemos hacer clic con el botón derecho en la entrada Key y seleccionar “User Text” en el menú desplegable y, a continuación, seleccionar “Use Type” en el control de vista en árbol.

El último paso es definir la entrada Pattern del componente Match Text Filter para definir con qué valor de texto lo vamos a comparar. Para este ejemplo, queremos comprobar si el valor Use Type es igual a la palabra “Oficina” para poder añadir un panel de texto con esa palabra a la entrada Pattern.

Ahora que hemos creado un filtro, tenemos que añadir un componente Filter Content a nuestro lienzo para realizar la acción de filtrado real. El contenido que queremos filtrar son las 31 BREP que nos devuelve el componente Query Model Objects. Y el filtro que queremos usar es el que acabamos de crear usando el componente Match Text Filter.

Observando el resultado, ahora solo tenemos 10 superficies que se ajustan a nuestros criterios de filtrado (es decir, aquellas placas de suelo que corresponden al tipo de uso “Oficina”). Sin embargo, aún no hemos terminado. También queríamos filtrar las placas de suelo en función de las que tuvieran una superficie superior a 2.250 pero inferior a 2.500 pies cuadrados.

Vamos a añadir un componente Greater Than Filter y colocarlo debajo del componente Match Text Filter. Al igual que antes, tenemos que configurar la entrada Key para definir qué valor queremos comparar en este filtro. En este caso, queremos configurar Key para que busque el valor de texto de usuario Area. Para ello, haga clic con el botón derecho del ratón en la entrada Key y seleccione “Area” en el control de la vista en árbol.

A continuación, debemos definir un valor numérico con el que comparar nuestro valor de área. Añadiremos un Numeric Slider (control deslizante numérico, que se encuentra en la pestaña Params y en la subcategoría Input) y definiremos el valor en 2.250. Puede definir el mínimo y el máximo que quiera para este control deslizante, hemos elegido los valores 2.000 y 2.500 respectivamente.

Ahora hemos creado un filtro que comprueba las placas de suelo de más de 2.250 pies cuadrados. Crearemos otro que busque placas de suelo de menos de 2.500 pies cuadrados.

Añada un componente Smaller Than Filter debajo del Greater Than Filter que acabamos de crear. Defina la entrada Key en el valor de texto de usuario Area. Selecciona el control deslizante que acabamos de crear y copie/pegue otro en el lienzo. Defina el valor del nuevo control deslizante en 2.500 y conecte su salida a la entrada Value del componente Smaller Than Filter.

Ahora tenemos tres filtros en nuestra definición que coinciden con los criterios que hemos definido anteriormente. Sin embargo, tenemos que combinarlos para que los tres filtros tengan que ser TRUE para que el contenido se filtre correctamente. Para ello, vamos a utilizar el componente Intersection Filter.

El filtro de intersección permite combinar varios filtros y devolverá TRUE solo si todos los filtros de entrada se calculan como TRUE. Manteniendo pulsada la tecla MAYÚS, conecte la salida de los tres filtros a la entrada Filters del componente Intersection Filter.

Por último, sustituya el componente Match Text Filter que está conectado a la entrada Filter del componente Filter Content por la salida del componente Intersection Filter. Su definición tendría que quedar como en la imagen.

Verá que ahora solo se muestran 5 superficies desde el componente Filter Content. Estas 5 placas de suelo se corresponden con el tipo de uso “Oficina” y también son mayores de 2,250 pies cuadrados y menores de 2,500 pies cuadrados.

Pruébelo