Altre cose che si possono fare con Excel (e Dynamo)

All’inizio di questa settimana ho introdotto un paio di agili esercizi per misurarsi con l’interoperabilità tra Revit ed Excel, in particolare facendo leva sui package Bumblebee (e con un uso in supporto di Rhythm e Bimorph nella gestione delle schedule). Ci siamo fermati in lettura, con una promessa di vedere in seguito la scrittura, ma […]

All’inizio di questa settimana ho introdotto un paio di agili esercizi per misurarsi con l’interoperabilità tra Revit ed Excel, in particolare facendo leva sui package Bumblebee (e con un uso in supporto di Rhythm e Bimorph nella gestione delle schedule). Ci siamo fermati in lettura, con una promessa di vedere in seguito la scrittura, ma le cose non funzionano in modo troppo diverso. Ne approfitto però per vedere un altro paio di particolarità di Bumblebee e un altro paio di possibili applicazioni.

1. Scrivere su uno spreadsheet

Anche nel caso della scrittura, abbiamo due alternative: il nodo presente nel core e il nodo del nostro bombo. Il terzo riguarda l’esportazione di una schedule ed è stato coperto già nel primo articolo di questa serie.

1.1. Il nodo core vs. Bumblebee

In apparenza, questa volta, il nodo core che ci consente di scrivere su un foglio Excel (Data.ExportExcel) offre più possibilità di impostazione del nodo offerto da Bumblebee (Write Excel).

Oltre a richiedere in input i dati che si desidera scrivere (data) e consentire entrambi di scegliere il file tramite il suo percorso, il nodo core consente di scegliere il nome del worksheet in cui si desidera scrivere (concetto che ho coperto la volta scorsa), colonna e riga da cui si desidera partire e offre l’opzione di sovrascrivere o meno dati esistenti laddove si trovasse già qualcosa nel foglio di destinazione.

Il confronto in realtà andrebbe fatto in un altro modo, perché il nodo Bumblebee struttura a monte i dati in quel nodo BBData.

Queste sono situazioni confrontabili.

Oltre a considerazioni relative al metodo di estrazione del worksheet name, che nel caso di Bumblebee viene fatto in automatico e che abbiamo già portato avanti nelle puntate precedenti, o più arguti avranno notato che il metodo di input per colonne e righe, nel nodo Core, è leggermente anti-intuitivo per chi usa Excel: se non c’è alcun problema per le righe, anche le colonne devono essere inserite come integer, anziché con la lettera che siamo abituati a utilizzare.

Veramente comodo, grazie.

Trasformare una lettera dell’alfabeto in un numero intero sarebbe stata un’operazione di una banalità estrema, all’interno del nodo, e ce lo dimostra Bumblebee. I suoi input sono richiesti con la sintassi che ci si aspetta di utilizzare in Excel (B2, C5 ecc.) e ci offre il nodo Cell Index per la conversione in numeri.

Il nodo BB Data richiede quindi, oltre ai dati, lo Sheet Name di destinazione e l’origine da cui si desidera iniziare a scrivere (condensando quindi in un solo input ciò che nel nodo core appare come startRow (la riga iniziale) e startCol (la colonna iniziale).
Esattamente come accadeva per il nodo di lettura, l’input a ByColumn avrà l’effetto di transporre la lista in entrata, cosa che nel nodo core deve essere fatta con nodo a parte.

Ovviamente è possibile scrivere su diversi worksheet semplicemente lavorando bene con le liste di input. Trovate l’illustrazione di alcuni esempi nel primer.

1.3. Aggiungere uno Sheet

Potete aggiungere i dati ad un nuovo sheet creandolo direttamente con il nodo di scrittura: è sufficiente impostare manualmente uno SheetName che non trova riscontro all’interno dello spreadsheet.


2. Formattare uno Spreadsheet secondo un filtro

Buona parte del motivo che ci sta spingendo a utilizzare Dynamo per interagire con Excel non è tanto il desiderio di fare tutto con Dynamo, impulso che personalmente disapprovo fortemente, bensì fa leva sulla possibilità di continuare a utilizzare le stesse analisi, le stesse interrogazioni che Dynamo ci sta consentendo di fare sul modello e trasmettere le nostre analisi all’esterno, magari ad una terza parte che non utilizza Revit.

La formattazione condizionale è quella funzione in Excel che ci consente di usare la formattazione in modo intelligente, per sottolineare informazioni, e funziona esattamente come i filtri all’interno di Revit. Poco sorprendente quindi che si possa usare lo stesso workflow usato per creare un filtro all’interno di una vista, e trasferirne i principi ad un nodo di Bumblebee che in teoria ci consentirà di applicare la formattazione condizionale allo spreadsheet.

2.1. Creare un filtro in Revit

Ne ho parlato già nel primo articolo (punto 1.3), ma è tempo di approfondire il concetto, perché la creazione di filtri con Dynamo all’interno di Revit funziona fino ad un certo punto e non è priva di stranezze.

I nodi che ci consentono di operare nell’ambito degli override grafici sono i seguenti:

Il workflow è apparentemente analogo a quello che viene seguito creando manualmente un filtro:

  1. Si crea la condizione di selezione, ovvero il filtro vero e proprio, tramite il nodo ParameterFilterElement.ByRules, che richiede un nome, le categorie e la regola;
  2. La regola, richiesta come input al nodo precedente, viene creata da FilterRule.ByRuleType, che a sua volta richiede il valore di riferimento (value), il parametro da controllare rispetto a quel valore (parameter) e la condizione da verifcare (type) ovvero il tipo di operatore condizionale che si desidera utilizzare (uguale, maggiore, maggiore uguale, minore ecc.);
  3. A quel punto, la condizione viene applicata a specifiche categorie e, dandole un nome, si ottiene il filtro vero e proprio, ma bisogna ancora dire a Revit a quale vista associarlo e cosa fare una volta che ha filtrato gli elementi: il nodo di creazione effettiva del filtro si limita quindi a creare il filtro insieme a tutti gli altri filtri (consultabili in Revit sotto al tab View, bizzarramente, e non sotto al tab Manage dove ogni volta mi aspetto di trovarli) e per aggiungerlo alla vista, il nodo è View.SetFilterOverrides. Chiaramente questo nodo, oltre al filtro, ha bisogno di sapere cosa deve fare nella vista una volta che ha isolato gli elementi che rispettano le regole del filtro;
  4. Gli override vengono impostati dal corposo nodo OverrideGraphicSettings.ByProperties, nel quale è possibile impostare nel dettaglio colori, pattern e stili di linea.

I filtri presenti nel modello possono essere anche interrogati usando il nodo All Elements of Type, perché si trovano nell’elenco degli Element Types sotto il nome di ParameterfilterElement.

Se i filtri sono stati associati a una vista, è anche possibile recuperarli con lo specifico nodo View.Filters, che in input richiede la vista specifica.

Gli elementi possono essere raccolti come normalmente viene fatto (All elements olf Category e All Elements of Category, ad esempio, se si tratta di un parametro di istanza, oppure Element.ElementType oppure All Elements of Type se si sta associando il filtro a un parametro di tipo).

Come si vedeva, aggiungere il filtro alla categoria è l’unico passaggio che manca per la creazione effettiva del filtro. Ce lo ritroviamo insieme a tutti gli altri.

Attenzione, perché ogni volta che viene lanciato lo script la condizione viene nuovamente aggiunta e c’è il rischio che vi troviate rapidamente in questa condizione.

Aggiungere il filtro alla vista è un’operazione relativamente semplice, il nodo View.AddFilter fa quello di mestiere, ma quello che otteniamo non è ancora quello che ci aspettiamo. D’altronde non abbiamo detto da nessuna parte cosa ci aspettiamo che faccia il filtro, una volta selezionati gli elementi.

Gli override vengono impostati dal nodo OverrideGraphicSettings.ByProperties che per qualche motivo non è trovabile, né con la ricerca normale né con quella di Monocle. Lo trovate in libreria sotto ai nodi relativi a Revit, nella categoria Filter, sottocategoria OverrideGraphicSettings e si chiama semplicemente ByProperties.

I settaggi grafici riguardano:

  • colori, che è possibile selezionare in mille modi diversi (il mio preferito è la palette);
  • i fill pattern, che si selezionano nel menu a tendina di uno specifico nodo  che ci elenca tutti quelli a disposizione nel modello;
  • i line pattern, che si selezionano nello stesso modo;
  • il peso delle linee di proiezione e taglio (cutLineWeight e projectionLineWeight);
  • la trasparenza, da impostare con un integer da 0 a 100;
  • il livello di dettaglio, che ha un nodo apposito (lasciare a Undefined se non si desidera sovrascrivere nulla da quel punto di vista);
  • l’halftone che vuole semplicemente una booleana.

La situazione finale dovrebbe essere questa:

2.2. Formattazione condizionale in Excel

La stessa condizione può essere utilizzata come condizione per la formattazione di celle nel nostro spreadsheet. Il nodo che ci consente di farlo (Conditionally Format Excel) è nel package Bumblebee e richiede come input il path del file, il nome dello sheet, il range cui applicare la formattazione.

La condizione effettiva, insieme all’override grafico, viene impostata nel nodo Cell value Format Condition. Esattamente come è successo per i filtri nella vista, procedendo a ritroso ci troviamo quindi a impostare da una parte la condizione, che richiede il tipo di operatore (a scelta nel menu a tendina tra Equal, Greated, GreaterEqual, Less, LessEqual, NotBetween, NotEqual), il valore da verificare e lo stile grafico da applicare una volta verificata la condizione.

Lo stile grafico a sua volta richiede lo stile di riempimento delle celle, lo stile di testo e lo stile di bordo.

Il risultato finale dovrebbe essere qualcosa del genere:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.