giovedì, gennaio 30, 2014

Dynamo - XYZ from Image Definition




Try for yourself, here's the definition.
Please feedback in the comments below.



If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

3D DWG to RFA - End of step 1


It took me a while but I finished to convert each of the 712 forms from DWG to RFA.
Now I just have to figure out a way  to split them and place every single mass in the right place in the project environment.

mercoledì, gennaio 29, 2014

Dynamo - XYZ from image



Here's a little test to return XYZ points from an image, still a work in progress though. Reading a particular image file is possible to return the coordinates of black pixels and associate them to XYZ points. As you can see a couple of reflections are needed, but the code is working even if it's really slow to process a fairly small image (the example above is 100x100 pixels).

A possible application: transform a raster file into a scalable vector set of points as a base for a family or a drawing.

Stay tuned.

martedì, gennaio 28, 2014

Dynamo - CSV to XYZ





Partendo da un file CSV ho cercato di ottenere attraverso Dynamo dei punti di riferimento nell'ambiente delle masse o dei modelli generici adattivi, avevo infatti notato che esisteva già nei custom nodes un nodo che avrebbe dovuto fare al caso mio.
Tuttavia esistono due tipi di problemi: il primo banale è che non vedo all'interno della definizione del nodo  a cosa possa corrispondere l'input "multiplier", il secondo è che i valori accettati in input devono essere stringhe numeriche con la virgola per separatore decimale, la qual cosa non si presenta mai per un file CSV per non generare confusione visto che la virgola assolve la funzione di delimitatore dei valori.

Ho scritto quindi la definizione dell'esempio nel video che va copiata qui:

C:\Autodesk\Dynamo\Core\definitions

per creare le triplette XYZ a partire da un CSV. Da prima ho impostato come delimitatore la stringa che "va a capo" (ho premuto invio all'interno del campo per inserire la stringa) ed ho applicato il nodo Split String. Questo genera una lista di stringhe di dimensione pari al numero di righe del CSV.
Per poterle manipolare e ricavare le coordinate si deve applicare ancora uno Split String a ciascun elemento della lista appena creata, stavolta però utilizzando come delimitatore la virgola (è come se stessimo estraendo i valori da una riga del file CSV). Per fare questo su ogni elemento della lista occorre applicare un nodo Map, che per sintassi richiede in input una funzione e una sequenza di valori.
Personalmente ho trovato poco chiara la struttura della funzione di input f(x), perché è un nodo che rimane grigio. Quello che viene sottointeso è che la funzione in grigio viene applicata ad un elemento che deriva dalla sequenza.
Nella fattispecie si ottiene una lista di tre coordinate X[0],Y[1],Z[2] per ciascuna riga del file CSV.
Se per qualsiasi motivo il file dovesse troncarsi o avere un ritorno a capo questo genererebbe un errore nella procedura, così ho introdotto un controllo per eliminare l'ultima lista con meno di 3 elementi di coordinate.



Con Get from List composto a ParseString (un custom node per restituire correttamente i valori delle stringhe numeriche nel file CSV) si ottengono le liste dei valori di tutte le coordinate X, Y e Z, è poi banale ottenere le triplette per le entità geometriche XYZ che servono a generare i punti di riferimento in Revit.

Come precauzione i valori ottenuti dal CSV sono moltiplicati per un valore 1, cambiando il quale si può scalare il risultato del nodo (va tenuto presente che le unità di misura interne di Revit sono i piedi decimali).


If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

Dynamo - ParseString



Ho notato che la funzione presente nel core di Dynamo che consente di effettuare il parsing di una stringa di testo (convertire la "natura" della variabile da testo a numero) non funziona correttamente per i testi che hanno per separatore decimale il punto al posto della virgola.
Per questo motivo ho deciso di scrivere un nodo in grado di effettuare il parsing per "stringhe numeriche" in modo più flessibile.
Questa volta ho cercato un approccio "purista" al problema, senza ricorrere agli script dei linguaggi di programmazione, ma soltanto ricorrendo ai nodi presenti nelle daily build di Dynamo anche se è più laborioso, sicuramente mi ha fatto scoprire alcune strutture che possono tornare utili in altre circostanze.
Questa la definizione del nodo che va copiata qui:

C:\Autodesk\Dynamo\Core\definitions

Quando si inserisce una stringa che rappresenta un numero possiamo avere o un numero intero o dei decimali; per i decimali il separatore che siamo abituati ad utilizzare può essere o il punto "." oppure la virgola "," (Revit internamente usa la virgola e questo è proprio il motivo per cui il nodo String to Number presente di default produce un errore nel caso del punto come separatore decimale).

Se pensiamo però agli output più tradizionali come ad esempio un CSV, il delimitatore dei valori è una virgola e per non generare confusione si utilizza il punto per i decimali. Diventa quindi importante poter gestire correttamente qualsiasi tipo di stringa numerica.

La struttura quindi della stringa sarà:

Parte intera  - Separatore decimale - Parte decimale          

Il nodo Split String permette di creare delle liste a partire da una stringa dividendo la stessa quando incontra un delimitatore. Se inseriamo quindi una stringa numerica e una stringa contenente il separatore decimale otteniamo come risultato una lista di due elementi, rispettivamente all'indice [0] ciò che sta prima del delimitatore partendo da sinistra (la parte intera) e all'indice [1] ciò che rimane (la parte decimale), proprio perché il delimitatore può comparire una sola volta all'interno della stringa numerica.
Utilizzando Get from List è possibile estrarre la stringa corrispondente alla parte intera e quella decimale, per i quali utilizzando Stirng to Number si ottengono due numeri interi. Per ottenere il valore corretto della parte decimale basterà dividerlo per una potenza di 10, con esponente pari alla lunghezza della stringa della parte decimale. Sommando poi i valori della parte intera e di quella decimale, si ottiene il valore corretto.
Ecco un esempio, le stringhe sono comprese tra "" :

stringa numerica = "12.3456"
stringa parte intera= "12"
stringa parte decimale= "3456"
lunghezza stringa parte decimale= 4
valore parte intera = 12
valore parte decimale= 3456/10^4=0.3456
valore finale = 12+0.3456=12.3456

Per semplicità ho creato due copie della stessa procedura (anche se ammetto non sia la soluzione più elegante) una valida quando il separatore è il punto, e l'altra valida per la virgola. Per fare questo ci sono più nodi If che permettono di eseguire una serie di istruzioni piuttosto che un'altra a seconda dell'esito di un test.
In particolare se il separatore decimale esiste per la stringa numerica, la lista risultante da Split String avrà un numero di elementi maggiore di uno, in caso contrario la stringa numerica rappresenta un valore intero.
If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

Topo to CSV - External command


Prendendo spunto da un'applicazione già vista e da un possibile uso dell'External Command precedente, ho creato questo exporter per i punti delle superfici topografiche.
Viene creato un file CSV sul desktop che riporta per ciascuna riga le coordinate XYZ di un punto espresse in piedi decimali.

Questo il codice sorgente, qui invece il file DLL e l'ADDIN che vanno copiati qui:

C:\ProgramData\Autodesk\Revit\Addins\2014

Potrebbe essere utile anche consultare questo articolo per sbloccare i file .dll


If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

lunedì, gennaio 27, 2014

3D DWG to RFA - External Command




UPDATE: Solid import fixed, many thanks to Julien Benoit and Luke Johnson for the precious feedback!

Ho raggruppato le due funzionalità che ho scritto per velocizzare la conversione dei 3D in DWG verso le masse o i componenti adattivi (link ai post precedenti).
Il workflow da seguire è il seguente:

  1. importare il DWG all'interno della famiglia poizionandolo se possibile come "Origine a Origine".
  2. eseguire il comando Refercence points from 3D DWG che restituisce un punto riferimento per ciascun vertice del DWG, inoltre per ulteriore controllo, viene creato un file CSV delle coordiante dei punti con unità di misura interne di Revit (piedi decimali).
  3. Se si tratta di estrusioni rette di solidi è possibile eseguire il comando Form Extrusion by Reference points: si devono selezionare i punti di riferimento che definiscono il profilo in ordine, premere ESC quando si ha terminato (attenzione che i punti non devono sovrapporsi e che tutti i punti appartenenti ad uno stesso profilo devono avere lo stesso valore di Z). Successivamente si deve selezionare un punto di riferimento diverso per determinare la direzione dell'estrusione. La forma risultante non sarà associata ai punti di riferimento. Questo ultimo comando  si ripete ciclicamente finché non si preme due volte ESC.
Ho notato che questo modo di procedere permette di risparmiare molto tempo rispetto ai metodi tradizionali di creazione delle forme e dei profili usando gli snap 3D sui punti di riferimento.
In ogni caso per forme più complesse (ad esempio tratti curvi o solidi non generati da un unico profilo) si dispongono dei vertici necessari per ricreare le forme.

Non sono riuscito a trovare il modo per evidenziare i punti di riferimento man mano che vengono selezionati quando si crea il profilo, è sicuramente un aspetto che agevolerebbe l'usabilità del comando. Se qualcuno avesse suggerimenti in tal senso sono ben accetti.

Questo il codice sorgente, qui invece il file DLL e l'ADDIN che vanno copiati qui:

C:\ProgramData\Autodesk\Revit\Addins\2014

Potrebbe essere utile anche consultare questo articolo per sbloccare i file .dll

If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

venerdì, gennaio 24, 2014

3D DWG to RFA - Form Extrusion by Reference Points - Connecting the dots



UPDATE: EXTERNAL COMMAND

Dopo aver ottenuto i punti di riferimento l'utente può decidere come comportarsi: se utilizzare la spline by points, tracciare le linee con 3D Snap, ecc... per ricreare i profili chiusi da estrudere o gli spigoli per generare le forme.
Purtroppo però sono operazioni lente e richiedono molto tempo per essere processate.
Con questa macro invece basta selezionare in ordine i punti di riferimento che costituiscono il profilo, premere ESC per uscire (fare attenzione che il primo e l'ultimo punto non coincidano e che i punti del profilo appartengano allo stesso piano), selezionare un punto per determinare l'altezza dell'estrusione (la distanza dal piano del profilo deve essere maggiore di zero) e attendere la creazione della forma. Dopo di che si può passare alla forma successiva in modo ciclico finché non si preme di nuovo ESC per terminare.
Si tratta di un work in progress, infatti le forme così create non sono associate ai punti di riferimento e devo valutare se ne valga davvero la pena, di sicuro per questo specifico compito no, ma per altre applicazioni forse si.

Questo il codice.

mercoledì, gennaio 22, 2014

3D DWG to RFA - Quick Update




Have a look to the next step

Update from the previous post.
Transform added, lines removed, 27665 vertices in a few minutes, job done.

Here's the code


3D DWG to RFA - WIP



Recentemente mi sono trovato a dover affrontare una modellazione molto estesa di un contesto per il quale non avevo però una pianta sufficientemente ampia e dettagliata.
Sono riuscito a trovare però il modello 3DS di quello che mi interessava, convertendolo in DWG attraverso AutoCAD ho ottenuto una mesh che ho importato in una famiglia di massa.
Cercavo di ottenere una massa per creare i muri da superficie (wall by faces), purtroppo però essendo mesh non vengono riconosciuti come oggetti validi per questo particolare scopo.
Inoltre non è possibile nemmeno ottenere degli snap per ritracciare i contorni degli oggetti (senza contare che si tratta di quasi 800 edifici da restituire).
Per questi motivi ho cercato di ottenere attraverso una macro almeno i vertici di una mesh in DWG per trasformarli in punti di riferimento (reference points) e dove possibile tracciare delle linee di collegamento tra i punti per poter tagliare i tempi di restituzione.
Allo scopo mi è tornato utile questo articolo di Jeremy Tammik dove si parla di mesh triangolari derivate da facce piane in questo caso, ma i cui concetti di manipolazione si possono adattare anche per quello che sto cercando di fare.

Ho cominciato con un test molto ridotto (una scatola), e sembra funzionare discretamente bene anche se non in modo perfetto. Con un gruppo di solidi di forma più complessa invece restituisce solo alcuni dei punti (come controllato da un apposito CSV esportato per avere un ulteriore controllo), ma utilizzando l'importazione del DWG Origine a Origine, la localizzazione è corretta quindi si tratta solo di capire come registrare la traslazione del DWG una volta importato anche nei suoi vertici (probabilmente con un apposito Transform il problema si risolve). Se però la mesh iniziale è già nelle coordinate corrette questo passaggio non è necessario.

Resta un work in progress che devo approfondire.

UPDATE#1
UPDATE#2

Revit Add-on Award 2013

Tim Grimm di Revit Add-on ha rilasciato le classifiche di quelli che sono stati secondo lui (editor's choice) e secondo i lettori (people's choice) le add-on per Revit più importanti per l'anno 2013.

Ci sono anche io proprio in apertura e sono molto contento di questo perché il View Depth Override è stata la prima macro importante che ho sviluppato e che mi ha fatto scoprire da vicino le potenzialità delle API.
Spero di poter trovare ancora qualcosa di utile in futuro, ringrazio Tim per avermi assegnato la sua preferenza.


If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

venerdì, gennaio 17, 2014

Dynamo - Metric LAV





Sono riuscito a completare gli strumenti per la conversione dalle unità interne a quelle metriche (metri, centimetri e millimetri) per Lunghezze, Aree e Volumi (LAV).
I nodi sono raggruppati sotto la categoria Revit.Units e sono di due tipi a seconda che si esegua o meno la verifica delle unità di misura del documento (ho notato infatti un errore di un fattore 10 nelle formule che coinvolgono i decimali). Questo però non succede se prima si esegue la verifica delle unità di misura.
Nella figura sopra sono riportati i valori di conversione di un valore di input pari a 1 (il documento dell'esempio aveva unità di misura metriche) che di volta in volta è 1 ft oppure 1 mm per le lunghezze, 1 ft^2 o 1 mm^2 per le aree, 1 ft^3 o 1 mm^3 per i volumi.

Qui potete trovare il pacchetto completo di definizioni che vanno copiate qui:

C:\Autodesk\Dynamo\Core\definitions

If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

giovedì, gennaio 16, 2014

Dynamo - Units Conversion Check - Length


Ho fatto un veloce test per capire se fosse possibile convertire in unità interne di Revit un valore di input utente.

Per semplificare ho considerato solo le lunghezze, e solo mm e piedi.
Qui trovate la definizione del nodo, c'è un piccolo script in Python ma veramente pochissime righe di codice.

La definizione è da copiare qui:

C:\Autodesk\Dynamo\Core\definitions

If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

lunedì, gennaio 13, 2014

Dynamo - View Utilities

EDIT*: link to nodes definitions  copy to:

C:\Autodesk\Dynamo\Core\definitions




Ho fatto ancora qualche esperimento con Dynamo e ho scoperto un po' meglio come funzionano i nodi Python Script.
Cliccando con il tasto destro e poi su Edit si può modificare a piacere il funzionamento del nodo, purtroppo non conosco ancora bene la sintassi di Python e sono dovuto andare ad intuito.
Sono riuscito a scrivere qualche nodo personalizzato con pochissime righe di codice che possono essere d'aiuto per creare delle definizioni più complesse sulle viste.

Da prima ho ricavato i componenti per costruire il Transform della vista attiva (l'origine in coordinate assolute e i vettori della base che sono già normalizzati), nodi a sinistra della figura.
Successivamente ho unificato nel generico nodo Transform già presente in Dynamo i valori appena trovati per ottenere il Trasnform della vista attiva, nodo centrale della figura.
Da qui è stato possibile, utilizzando direttamente il ViewTransform appena creato e il suo Inverso, creare delle funzioni che restituissero le terne delle coordinate con riferimento assoluto o con riferimento locale per la vista, nodi a destra della figura.

Qui trovate la definizione ViewUtils.dyn

*Thanks to Julien Benoit

If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

sabato, gennaio 11, 2014

View Override Distance - Dynamo

EDIT* MajorFace.dyf copy to:

C:\Autodesk\Dynamo\Core\definitions




Ho cominciato da un paio di giorni ad esplorare più nel dettaglio Dynamo.
Da prima ho notato una grossa limitazione sulla localizzazione del programma nel senso che i parametri che possono essere restituiti al momento non sono quelli interni di Revit (come ero abituato dalle API), ma sono gli stessi parametri che troviamo a livello di interfaccia grafica utente. Questo da un lato è positivo perché permette di controllare in fretta i parametri di istanza e tipo ma è limitativo per la circolazione delle definizioni (così vengono chiamati gli script di Dynamo) perché devono essere inseriti i nomi dei parametri a livello utente e quindi diversi a seconda della lingua di installazione di Revit (o Vasari).
Per contro la restituzione dei parametri riporta i valori interni di Revit e non quelli che visualizza l'utente generando, se non altro, della confusione.
La cosa rassicurante è sapere che vengono rilasciati giornalmente degli aggiornamenti su questo server che purtroppo però è spesso molto lento e il download difficilmente va a buon fine, almeno questo è quello che è capitato a me. Si tratta di versioni sperimentali e quindi non garantite al 100%, compilate dai codici in continua evoluzione che si trovano su GitHub.
A questo link invece si possono trovare le versioni ufficiali di Dynamo.

Dopo aver preso confidenza con i nodi a disposizione, ho cercato di replicare il comportamento dell'external command del ViewDepthOverride.

Non sono riuscito a trovare il modo di estrapolare direttamente i dati relativi alla posizione spaziale delle viste ma ho trovato un work around che potrebbe essere utilizzato anche in altri ambiti.
Una delle cose migliori di Dynamo è che consente agli utenti di crearsi delle proprie funzioni personalizzate, esistono per altro dei pacchetti di  estensioni con nodi creati da altri utenti che contribuiscono di molto alla buona riuscita di tutto il progetto. In questo modo è possibile riutilizzare strutture complesse e soprattutto di rendere molto più leggibile il tutto.

Questa la definizione cui sono arrivato:

*Thanks to Julien Benoit



If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com


mercoledì, gennaio 08, 2014

View Depth Override - Polar Distance Update



Ecco un aggiornamento del codice precedente, ora la distanza degli oggetti per le viste 2D  è calcolata rispetto al piano della vista e non più dal punto di origine (opzione che rimane valida per le viste di prospettiva).
Per ragioni di grafica ho impostato il limite del grigio non più a 255 ma a 205 poiché c'è il rischio che risulti troppo chiaro in fase di stampa, ma avendo pubblicato il codice ognuno può impostarlo a piacere modificando tutte le occorrenze della variabile: 

int grey=205;

Ho fatto anche qualche modifica per la gestione degli errori, ciononostante è un lavoro preliminare e rimane valido il mio appello per ricevere feedback nei commenti.

Questo il codice sorgente, qui invece il file DLL e l'ADDIN che vanno copiati qui:

C:\ProgramData\Autodesk\Revit\Addins\2014

Potrebbe essere utile anche consultare questo articolo per sbloccare i file .dll



If you are happy with my code you can show me some gratitude paying what you want on PayPal:

puntorevit@gmail.com

View Depth Override Polar Distance - External Command




Ho cambiato del tutto approccio al problema e ho riscritto per intero il comando.
Stavolta la sostituzione grafica non è più limitata ai grigi 128 e 192, ma è un vero e proprio gradiente funzione della distanza tra gli oggetti e l'origine della vista.
Così facendo è possibile applicare praticamente lo stesso codice sia alle viste 2D sia alle prospettive.
Questa versione del comando è molto semplice, leggera e veloce nell'esecuzione ed anche più elegante nel codice.
I comandi sono 3:
  • View Depth Override - Polar Distance per le viste 2D attive
  • View Depth Override 3D - Write List per scrivere il file sul desktop con l'elenco delle viste di prospettiva
  • View Depth Override 3D - Read List per eseguire il view depth override sulle viste elencate nel file (si può editare manualmente il contenuto del file per decidere su quali viste 3D eseguire il comando che andrà lanciato da una qualsiasi altra vista)
Quando si edita il file di testo si deve mantenere il nome e il percorso sul desktop.

Una cosa importante è settare la profondità della vista poiché rappresenta la massima distanza entro cui viene calcolato il gradiente della sostituzione grafica.
Si tratta ancora di un work in progress ed esistono delle casistiche che possono portare ad un overflow (una specie di ciclo infinito), per questo nel codice ho inserito dei punti in cui le eventuali eccezioni al funzionamento riporteranno dei messaggi, nel caso prego chi intenda fare uso di questo comando di segnalarmele nei commenti.

Questo il codice sorgente, qui invece il file DLL e l'ADDIN che vanno copiati qui:

C:\ProgramData\Autodesk\Revit\Addins\2014

Potrebbe essere utile anche consultare questo articolo per sbloccare i file .dll

Ecco una dimostrazione della funzionalità, prossimamente il comando su viste 2D considererà la distanza dal piano della vista così da evitare  gradienti indesiderati su oggetti che appartengono allo stesso piano.

If you are happy with my code you can show me some gratitude paying what you want on PayPal:



puntorevit@gmail.com