Raggruppare e filtrare i dati


Raggruppamento e filtro

Desidereresti una maggiore granularità dei dati o degli oggetti all’interno di Grasshopper? Ad esempio, hai mai voluto selezionare solo gli oggetti del modello a cui è applicato un particolare materiale (ad esempio, vetro)? Oppure desideri rimuovere tutte le superfici del modello che si trovano su un livello specifico e la cui area è inferiore a un determinato valore. Potresti farlo (facilmente)?

Grasshopper 1 per Rhino 8 presenta nuovi componenti che ti aiuteranno a gestire i dati in modo più efficace.

Per spiegare il funzionamento di questi nuovi componenti, è meglio iniziare con un semplice esempio. In questo [ modello di massa] (GroupingAndFiltering.3dm), esistono BREP che rappresentano l’involucro esterno degli edifici e superfici che fungono da piani. Gli oggetti sono stati posizionati su diversi livelli e sono stati assegnati colori diversi in base al tipo di utilizzo (ufficio, residenziale, ecc.).

La maggior parte degli oggetti presenta anche alcuni meta dati allegati come voci di testo dell’utente. È possibile trovare questi dati selezionando un oggetto nel modello e aprendo il pannello Proprietà dell’oggetto. Nella parte superiore del pannello, sono presenti diverse icone. Fare clic sull’etichetta Attributo testo utente.

Iniziamo questo tutorial calcolando l’area complessiva di ogni edificio nel modello di massa. Il nostro modello presenta tre masse edilizie. A ciascuna delle piastre di piano è stato assegnato un numero di ID edificio come voce di testo dell’utente.

Raggruppamento di contenuti

Per iniziare, apriamo l’editor di Grasshopper e facciamo clic su File -> Nuovo documento per avviare una nuova definizione.

Per trovare la superficie complessiva di ogni edificio, dobbiamo innanzitutto fare riferimento a tutti i piani del modello di Rhino nella definizione di Grasshopper.

Questo tutorial è dedicato al filtro dei dati. Poiché abbiamo organizzato il modello per livelli, possiamo filtrare i pavimenti usando l’input Layer del componente Query Model Objects (che si trova nel pannello Rhino, nella sottocategoria Object). Utilizzando il carattere jolly “*” dopo la parola Pavimenti, verranno selezionati tutti gli oggetti dei sottolivelli Pavimenti.

Passando il mouse sul parametro di output Oggetti, abbiamo 31 superfici che rappresentano ciascuna delle piastre del pavimento nel nostro modello.

Successivamente, è necessario raggruppare ciascuna di queste piastre utilizzando l’ID edificio come criterio di raggruppamento. Utilizziamo il componente Group Content (che si trova nella pannello Rhino e nella sottocategoria Content) e colleghiamo l’output del componente query all’input Content.

Questo componente utilizza l’input Key per determinare come raggruppare il contenuto in diversi rami dell’albero dei dati. Facendo clic con il pulsante destro del mouse sull’input Key, vengono presentate alcune opzioni.

Seleziona tipo - In questo menu a discesa è possibile selezionare il tipo di dati che si desidera suddividere in gruppi diversi. In questo caso, vogliamo raggruppare tutte le superfici che rappresentano i pavimenti, quindi possiamo selezionare Oggetto modello dal menu a discesa, poiché questi pavimenti sono oggetti nel nostro modello di Rhino.

Select Property/Key - In base alla selezione del menu a discesa precedente, il controllo ad albero visualizza un elenco di proprietà o chiavi disponibili che possono essere utilizzate come criteri di filtro. In questo caso, vogliamo trovare il nodo Testo utente nel controllo della vista ad albero e fare clic sull’icona “più” accanto ad esso per espandere tutti i suoi nodi figli. Vogliamo raggruppare le superfici in base al loro ID edificio, quindi selezioniamo il nodo figlio nell’albero.

Osservando l’output di Content, tutti i piani sono stati separati in rami diversi in base al numero ID dell’edificio. L’output Values restituisce un elenco di tutti i valori chiave univoci trovati nel contenuto. In questo caso vediamo un elenco di tre valori (1, 2 e 3) che corrispondono ai valori ID univoci trovati nell’elenco dei contenuti e ai rami dell’albero dei dati dei contenuti raggruppati.

L’ultimo passo di questo processo consiste nel sommare tutte le aree su ogni ramo del nostro albero dei dati. Poiché tutte le superfici del pavimento sono ora separate in rami diversi, è abbastanza facile passare l’output del componente Group Content in un componente Area e quindi sommare tutti i valori utilizzando un componente Mass Addition.

Dalla definizione di Grasshopper sopra riportata, possiamo determinare che:

  • Building 1 = 43,622 sf
  • Building 2 = 36,626 sf
  • Building 3 = 5,736 sf

Il bello di questo flusso di lavoro è la facilità con cui è possibile modificare i criteri di raggruppamento. Ad esempio, supponiamo di voler determinare la metratura totale dei diversi tipi di utilizzo (residenziale, ufficio, commerciale, ecc.) piuttosto che semplicemente la metratura totale di ciascun edificio. In questo scenario, è sufficiente modificare la proprietà Key in “Use Type”. Tutto il resto può rimanere invariato.

Cambiando il criterio di raggruppamento in “Use Type”, la somma dei metri quadrati totali è la seguente:

  • Commercial = 21,740 sf
  • Educational = 5,736 sf
  • Mixed Use = 11,326 sf
  • Office = 23,972 sf
  • Residential = 23,210 sf

Filtrare il contenuto

Oltre al raggruppamento, possiamo anche filtrare i contenuti in base al compimento di una determinata condizione. In genere, la condizione di un filtro confronta una proprietà dell’oggetto con un’altra e restituisce un valore booleano (Vero o Falso). Pensiamo x è uguale a y? Oppure x è maggiore o uguale a y? Possiamo anche combinare queste regole in espressioni più complesse utilizzando gli operatori.

Quindi, prendiamo il nostro modello esistente e creiamo una serie di filtri che separino le piastre del pavimento in base ai seguenti criteri:

  1. Il tipo di utilizzo deve essere di tipo “Office” E
  2. La superficie del pavimento deve essere superiore a 2.250 piedi quadrati E
  3. La superficie del pavimento deve essere inferiore a 2.500 piedi quadrati

Iniziamo creando una nuova definizione di Grasshopper. Nel menu File di Grasshopper, fare clic su File -> New Document. Come nell’esempio precedente, usiamo il componente Query Model Objects con il filtro Layer impostato su “Floors” per fare riferimento a tutte le superfici del pavimento nel nostro documento Grasshopper. L’output dovrebbe contenere 31 superfici che rappresentano ciascuna delle piastre del pavimento nel nostro modello.

Quindi, creiamo un filtro che definisca la nostra prima condizione: filtrare tutte le piastre il cui tipo di utilizzo è uguale al tipo “Office”. Nella scheda Rhino e nella sottocategoria Contenuto sono disponibili diversi filtri, alcuni dei quali possono verificare l’uguaglianza. Tuttavia, per questa esercitazione, iniziamo con l’aggiunta di un componente Match Text Filter sulla nostra tela.

Il filtro Match Text Filter è un componente incredibilmente potente e flessibile per il confronto di testi. In questo filtro vogliamo esaminare ogni piastra ed estrarre il valore assegnato alla voce di testo dell’utente “Use Type”. Confronteremo quindi questo valore per vedere se corrisponde alla parola “Office” e filtreremo gli oggetti di conseguenza.

Il filtro Match Text Filter presenta tre modalità di funzionamento. Facendo clic con il tasto destro del mouse al centro del componente Match Text Filter, viene visualizzato un elenco di tre modalità:

In questo esempio, siamo interessati solo ai valori di testo Equal e “Office”. Quindi, selezioniamo la modalità Equals nel menu del tasto destro del mouse del filtro Match Text Filter.

Successivamente, occorre specificare l’input Key per determinare come filtrare il contenuto. Anche in questo caso, come nell’esempio precedente, possiamo fare clic con il tasto destro del mouse sull’input Key e selezionare “Model Object” dal menu a discesa e selezionare “User Text” e quindi “Use Type” dal controllo della visualizzazione ad albero.

L’ultimo passo consiste nel definire l’input Pattern del filtro Match Text Filter per definire il valore di testo da confrontare. In questo esempio, si vuole verificare se il valore Use Type è uguale alla parola “Office”. Aggiungiamo un pannello di testo con questa parola e colleghiamolo all’ingresso Pattern.

Ora che abbiamo creato un filtro, dobbiamo aggiungere un componente Filter Content alla nostra tela per eseguire l’azione di filtro vera e propria. Il contenuto che vogliamo filtrare sono i 31 BREP restituiti dal componente Query Model Objects. Il filtro che vogliamo utilizzare è quello appena creato con il filtro Match Text Filter.

Osservando l’output, ora abbiamo solo 10 superfici che corrispondono ai nostri criteri di filtro (cioè le piastre dei piani che corrispondono al tipo di utilizzo “Office”). Tuttavia, non abbiamo ancora finito. Volevamo inoltre filtrare le piastre in base alle superfici superiori a 2.250 ma inferiori a 2.500 mq.

Aggiungiamo un componente Greater Than Filter e posizioniamolo sotto il nostro componente Match Text Filter. Come in precedenza, dobbiamo impostare l’input Key per definire il valore che vogliamo confrontare in questo filtro. In questo caso, vogliamo impostare la chiave in modo che guardi il valore del testo utente Area. Quindi, fate clic con il pulsante destro del mouse sull’input Key e selezionate “User Text” e poi “Area” dal controllo ad albero.

Successivamente, è necessario definire un valore numerico con cui confrontare il valore dell’area. Aggiungiamo Numeric Slider (che si trova nella scheda Params e nella sottocategoria Input) e impostiamo il valore a 2.250. Il minimo e il massimo di questo cursore possono essere impostati a piacere, ma io ho scelto i valori di 2.000 e 2.500 rispettivamente.

Ora abbiamo creato un filtro che controlla le piastre di dimensioni superiori a 2.250 metri quadrati. Creiamone un altro che cerchi le piastre di dimensioni inferiori a 2.500 m².

Aggiungere un componente Smaller Than Filter sotto il filtro più grande appena creato. Impostare l’input Key sul valore di testo dell’utente dell’area. Selezionare il cursore appena creato e copiarne/incollarne un altro sulla tela. Impostate il valore di questo nuovo cursore a 2.500 e collegate la sua uscita all’ingresso Value del filtro Smaller Than Filter.

Ora abbiamo tre filtri nella nostra definizione che corrispondono ai criteri definiti in precedenza. Tuttavia, è necessario combinarli insieme, in modo che tutti e tre i filtri siano veri affinché il contenuto sia filtrato correttamente. Per farlo, utilizziamo il componente Intersection Filter.

Il filtro Intersezione consente di combinare più filtri insieme e restituisce VERO solo se tutti i filtri di ingresso hanno valore VERO. Tenendo premuto il tasto SHIFT, collegare l’uscita dei tre filtri all’ingresso Filters del filtro di intersezione.

Infine, sostituire il filtro Match Text Filter collegato all’ingresso Filter del componente Filter Content con l’uscita del filtro Intersection. La definizione dovrebbe apparire come l’immagine seguente.

Nota: ora abbiamo solo 5 BREP restituiti dal componente Filter Content. Queste sono le 5 piastre che corrispondono alla tipologia d’uso “Office” e che hanno una superficie superiore a 2.250 m² ma inferiore a 2.500 m².

Provalo

Ulteriori informazioni

Guarda il nostro video Discover Grasshopper Data Types o visita la pagina Novità New in Rhino 8 per una panoramica di queste funzioni.

Per sapere come utilizzare gli altri componenti dei tipi di dati, consulta le guide seguenti: