martedì, aprile 15, 2014

Dynamo Google hangout



A questo link potete assistere al primo incontro periodico che porta al grande pubblico le novità che riguardano il mondo di Dynamo, in particolare i fondatori Ian e Zach che spiegano le origini di questo add-in per Revit e la direzione che sta prendendo questo progetto ormai destinato ad essere una piattaforma autonoma che si potrà interfacciare con un numero crescente di software (versione 0.7.0).
Fanno ben sperare alcune delle caratterstiche che si possono vedere quali la "Zero Touch Import" che permette di avere disponibili come nodi di Dynamo le funzioni pubbliche dentro delle librerie (.dll) sviluppate da altri, senza nessuna fatica, ed ancora la possibilità di estendere le potenzialità di Dynamo con l'integrazione di DesignScript, un progetto parallelo per lo sviluppo di un linguaggio di programmazione orientato alla creazione di forme geometriche complesse, che consentirà di avere racchiuso in un solo blocco di codice interi script o strutture di nodi che nelle versioni precedenti di Dyanmo avrebbero richesto molto più tempo.
Da ultimo ma non per importanza, l'intera libreria delle geometrie e delle operazioni possibili sulle superifici di Dynamo è stata ampliata andando ad attingere direttamente dal core di Inventor.

Questo amplia una volta di più le possibilità di modellazione di Revit col quale Dynamo si interfaccia da sempre, proprio come spiega Ian e dimostra Zach in un esempio. Anche il flusso di lavoro dalla concezione della forma alla modellazione e quindi ingegnerizzazione della stessa, stanno per subire un profondo cambiamento, in velocità e controllo, Dynamo è l'anello mancante che permetterà il passaggio dall'analisi concettuale alla fattibilità dell'idea in un modo che non era stato possibile solo fino a poco tempo fa.

domenica, aprile 06, 2014

Dynamo - Transform on Curve

E' appena stata distribuita la nuova release stabile di Dynamo (0.6.3) che porta molte novità e amplia le possibilità offerte agli utenti finali. Tra queste mi ha particolarmente colpito l'integrazione con DesignScript nella versione beta 0.7 (da qui si può scaricare il manuale), un progetto parallelo che conoscevo già ma che integrato con Dynamo lo rende davvero interessante anche per gli utenti Revit.
Si tratta di un nuovo linguaggio di programmazione (un misto di C# e Python per quanto riguarda la sintassi) che permette di scrivere due tipologie di codici: uno Imperativo, di tipo tradizionale, e uno Associativo.
Per capire di cosa si tratta basti pensare che con un codice di tipo associativo ora si ha a che fare con qualcosa di "vivo" che mantiene valide le relazioni tra le variabili e non c'è bisogno di ridefinirle per aggiornare i risultati: in pratica la bidirezionalità a cui siamo abituati in Revit la troviamo ora anche fra le righe di codice!

In questi giorni stavo giocando con un particolare tipo di nodo, il Transform on Curve, cioè un nodo in grado di restituire un oggetto Transform per un determinato parametro normalizzato su una curva.
Un oggetto Transform si compone di un'origine e di una terna di vettori che descrivono lo spazio in coordinate locali.
Un transform può essere qualcosa di molto particolare come uno spostamento, una rotazione, un ingrandimento ad esempio....

Per realizzare questo esempio ho tracciato con una linea di modello un arco di circonferenza centrato sull'origine all'interno di una famiglia di massa.
In particolare il nodo Transform on Curve non funziona per curve di modello ma per le curve geometriche associate (è un problema noto agli sviluppatori), in ogni caso è aggirabile ricavando la curva geometrica associata alla curva di modello con l'apposito nodo.

Per questo esempio ho considerato un range di parametri normalizzati in 10 step ottenuto con una sintassi propria del nodo number e un nodo formula per normalizzarlo:



Sullo sfondo di Dynamo già da questo punto è possibile individuare cosa siano i Transform lungo la curva: una terna di vettori locali (x=rosso, y=verde, z=blu, regola della mano destra) con origine lungo la curva.




Con il nodo Reference point by Length, utilizzando stavolta la curva di modello si possono creare dei punti di riferimento associati alla curva per meglio visualizzare la suddivisione.


Successivamente ho creato dei punti con il nodo Reference point by normal che consente di creare dei punti di riferimento partendo da dei punti di riferimento esistenti ad una distanza da questi secondo un determinato vettore. I punti sono quelli lungo la curva e la normale è definita per ciascun punto come la componente Y del transform corrispondente.



Da qui poi ho creato una serie di punti di riferimento che avessero un incremento in Z semplicemente utilizzando un transform con un range di vettori in base Z.


Per concludere ho realizzato dei raggi e una linea di riferimento per poter generare una superficie.
Si potrebbe complicare l'esempio introducendo delle funzioni per quanto riguarda la distanza nel nodo Reference Point By Normal e il range di vettori Z per il transform XYZ.










mercoledì, marzo 19, 2014

RVT Links into RFA Families




Just fooling around with groups... no actual use comes to mind, yet interesting though :)

giovedì, marzo 13, 2014

Any ideas what has just happen to my ribbon bar?


Sometimes Revit bites you... I couldn't complete the editing of the floor, any ideas?

domenica, marzo 09, 2014

Auto Floor Maker 2 - External Command





Con questo external command ho raggruppato le funzionalità di tutti i miei lavori sulla creazione automatica dei pavimenti. Ora da una semplice selezione di locali e porte è possibile associare anche il tipo di pavimento che si desidera in un apposito form.



Da ora in avanti proverò a distribuire le add-in gratuitamente e con la formula  pay what you want (paga ciò che vuoi).

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

puntorevit@gmail.com


Se ritenete che le mie add-in siano di una qualche utilità e volete che continui con il mio lavoro potete dimostrarlo pagando quello che volete tramite PayPal:

puntorevit@gmail.com

Questo il file DLL e questa l'ADDIN (da sbloccare con il tasto destro) da copiare qui:

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


sabato, marzo 08, 2014

Door Threshold External Command - Update


Questo il file DLL da sostituire a quello precedente, qui invece il codice sorgente.

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

puntorevit@gmail.com

Grazie in modo particolare a Luca Vocella che ha contribuito con la sua esperienza a farmi ragionare su questo problema permettendomi di leggere il suo codice.
In effetti ho poi preferito prendere una strada diversa.
In particolare ho applicato il suo suggerimento per quanto riguarda l'estrapolazione degli Edge utilizzando la possibilità di RollBack delle transaction (ossia il poter eseguire dei comandi che modificano il database senza poi effettivamente finalizzarli, quindi usando il RollBack in luogo del Commit).
Quello che svolge il comando è semplice: l'utente deve selezionare le porte con una finestra di selezione e poi assegnare il tipo di pavimento nel form successivo.
Per ciascuna porta viene ricavato il muro host il quale viene abbassato di due piedi rispetto al suo livello attuale (potrebbe non funzionare se il punto di inserimento della porta è al di sotto di due piedi rispetto al livello) e vengono create due liste di curve: una contenente le curve corrispondenti agli edge del muro con la porta  (A), e l'altra contenente le curve corrispondenti agli edge del muro senza porta (B).
Questo proprio grazie al metodo di RollBack per cui si può cambiare il valore di offset dal livello di base del muro ed eliminare una porta solo per ricavare le informazioni sulle curve che servono senza di fatto cambiare veramente il modello, geniale non è vero?
La parte "difficile" è stata quella relativa alla restituzione delle curve relative alla sola porta: per ciascuna curva della lista A, si confronta il punto medio con ciascuno dei punti medi delle curve della lista B.
Se da questo confronto non c'è corrispondenza significa che la curva è relativa alla porta che si sta analizzando e se la quota Z del punto medio è uguale a quella del punto di inserimento della porta viene aggiunta alla lista C che verrà ordinata con l'algoritmo di Jeremy Tammik per poi creare il pavimento in una nuova transazione.




martedì, febbraio 11, 2014

Door Threshold - External Command


UPDATE: AUTO FLOOR MAKER 2


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

puntorevit@gmail.com
 

Recentemente mi è stato chiesto di provare ad implementare un'interfaccia per la selezione del tipo di pavimento per Auto Floor Maker che avevo sviluppato in precedenza.
Subito dopo è arrivata la richiesta per modellare la porzione di pavimento anche nel vano porta.
Per mantenere il più possibile quanto avevo scritto del codice precedente, ho solo quindi aggiunto una nuova procedura per le soglie delle porte e il form di selezione dei tipi di pavimento.
Il passo finale sarà quello di integrare tutto in unico form dove si potrà decidere se creare i pavimenti sulla finitura dei muri o fino al nucleo e si potranno selezionare tipi diversi per il pavimento dei locali e quello delle soglie.
Un grazie particolare a Luca Vocella di eVox Bill of Quantities e altri plugin molto avanzati per il mondo Revit, che mi ha illuminato sulla creazione dei combobox e mi ha dato il suo preziosissimo punto di vista sull'algoritmo per le soglie, mettendo in luce i punti deboli e lasciando margini per un possibile miglioramento di tutta la procedura.
Come sempre ho fatto tesoro di un articolo di Jeremy Tammik che ha gentilmente reso pubblico un algoritmo di ordinamento dei segmenti di un loop senza il quale non sarei stato in grado di portare a termine questo compito.

Intanto questo è il codice per il comando che crea le soglie sotto le porte e questo sono il file DLL e ADDIN che vanno copiati qui:

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

Ricordarsi di sbloccare i file: tasto destro, proprietà, annulla blocco.

sabato, febbraio 01, 2014

3D DWG to RFA - Divide and conquer macros




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

puntorevit@gmail.com


Dopo aver completato la modellazione di tutti gli edifici ho dovuto separarli uno per uno per avere la possibilità di eseguire comandi come il View Depth Override che, altrimenti, con un'unica famiglia di massa (che chiamerò MA-0.rfa) non servirebbero a niente.
La procedura che ho elaborato è la seguente:

  1. Per ogni Form nella famiglia MA-0, registrare in un file CSV esterno su una riga l'ID dell'oggetto, le coordinate XYZ del punto di minimo del suo BoundingBoxXYZ e un numero incrementale per una famiglia segnaposto del tipo MA-NNN.rfa
  2. Creare le N copie segnaposto del file MA-0 contenenti esattamente gli stessi oggetti con lo stesso ID di MA-0
  3. Aprire ciascuno dei file segnaposto secondo l'ordine del file CSV, selezionare un oggetto con il suo ID e spostarlo in modo che il punto di minimo del suo BoundingBoxXYZ coincida con l'origine della famiglia
  4. Eliminare tutti gli altri oggetti e salvare la famiglia.
  5. Utilizzando lo stesso file CSV si possono poi posizionare le famiglie all'interno del modello come già mostrato da Jeremy Tammik sul suo blog a più riprese, ma sto pensando di utilizzare Dynamo, giusto per vedere come integrarlo all'interno della procedura.
La prima cosa interessante che ho scoperto è in che modo Revit gestisce due o più forme che vengono combinate tra loro con join geometry (unisci geometria) e cut (taglia), nel caso dei vuoti.
I vuoti non sono classificati come Form, almeno internamente la loro categoria di appartenenza è "null".
Quando si filtrano gli Element per la categoria interna OST_MassForm, che corrisponde alla categoria forme delle masse, si ottiene un conteggio "doppio" nel senso che gli elementi di questa categoria possono essere sia Form solidi semplici, sia GeomCombination, risultanti dalla combinazione appunto di membri come i Form e i Void; in sostanza questi due tipi di elementi hanno proprietà simili ma diverse e vanno gestiti in modo opportuno. Dopo qualche tentativo andato male su un file di prova molto piccolo, ho deciso di semplificare eliminando i void da una copia di MA-0 (che ho chiamato solamente MA-) da utilizzare come base per le operazioni successive, è un punto su cui devo ancora lavorare per un ulteriore affinamento della procedura.
Il BoundingBoxXYZ è una proprietà degli elementi ma dipende dalla vista, eseguendo una macro da una vista 3D si ottiene quello che serve per determinare la posizione dello spazio di ciascun oggetto che andrà scritta scomponendola nelle sue coordinate XYZ all'interno di un file CSV. L'unità di misura è quella interna di Revit (ft) ma si può pensare di convertirla in metri anche se non è strettamente necessario per questo scopo (il file CSV è infatti un passaggio necessario per riposizionare successivamente le famiglie all'interno del modello).
Per stabilire il numero di copie segnaposto necessarie basta selezionare tutti gli oggetti presenti in MA-.rfa della categoria Form, la duplicazione si può ottenere con un file batch di poche righe, da modificare secondo le proprie esigenze:


pushd %~dp0
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set TESTFOLDER=MA
md "%TESTFOLDER%"
set /a times=2
FOR /L %%i IN (1,1,%times%) DO (
        copy "MA-.rfa" ".\%TESTFOLDER%" 
cd ".\%TESTFOLDER%"
ren "MA-.rfa" "MA-%%i.rfa"
cd ".."
)

Basta copiare e incollare in un editor di .txt e salvare con estensione .bat all'interno della cartella dove si trova il file MA-.rfa, successivamente verrà creata una cartella MA all'interno della quale verranno create delle copie con indice incrementale di MA-.rfa. La prima riga consente l'esecuzione anche su percorsi di rete. La duplicazione di 712 file è avvenuta in una manciata di secondi, ha richiesto però uno spazio libero di circa 8GB.


Un'altra cosa interessante che ho scoperto è la possibilità di caricare in background nella sessione di Revit, altri documenti, senza quindi renderli visibili all'utente (proprio come avviene quando si apre un modello con dei file collegati al suo interno: i file collegati vengono caricati nella sessione corrente di Revit ma non sono modificabili). In questo caso, dato che i file non sono collegati, possono anche essere modificati e salvati.
Questa caratteristica mi ha poi fatto venire in mente delle possibili applicazioni per delle operazioni veramente tediose quando si opera con i file collegati, e sarà oggetto prossimamente di qualche riflessione più attenta.

Una volta che il primo file MA-1 è caricato, dal file CSV si ottiene il valore dell'ID dell'oggetto e lo si sposta nell'origine passando ancora per l'Element associato all'ID (si sarebbe potuto anche ottenere lo spostamento direttamente dal file CSV, ma in questo modo occorrono meno righe di codice).
Per lo spostamento si  ricorre a ElementTransformUtils.MoveElement che consente di specificare l'ID dell'oggetto da spostare all'interno di uno specifico documento e il vettore di spostamento (in questo caso dal punto di minimo del BoundingBoxXYZ all'origine). Successivamente si eliminano tutti gli altri oggetti Form escludendo l'ID che deriva dal file CSV. Il documento viene chiuso e quindi direttamente salvato.
Operando ciclicamente su tutte le copie MA-1, MA-2,..., MA-712 ci sono volute 12 ore e 30 minuti e ulteriori 4GB di spazio perché purtroppo non tutti gli oggetti sono stati eliminati, infatti i file MA-NNN.rfa sono passati da una dimensione iniziale di circa 12MB a circa 6MB, ma sono state mantenute anche le copie di backup MA-NNN.0001.rfa.
Ho creato poi un'altra macro molto simile alla precedente dove ho sostanzialmente mantenuto solo la parte in cui vengono eliminati gli oggetti con ID diverso da quello derivante dal file CSV e questa volta sembra aver sortito gli effetti desiderati riducendo la dimensione a circa 850kB (si potrebbe forse fare qualcosa di meglio ma ho notato che manualmente non si ottengono risultati sensibilmente migliori, per cui mi accontento).
Questo secondo passaggio riesce a gestire circa 2/3 file al minuto, quindi poco meno di 6 ore per tutti i file con una stima di circa 600MB di spazio totale richiesto.

Ecco le macro, suggerimenti e critiche sono ben accetti.

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

View Depth Override 2D


View Depth Override 3D


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

sabato, dicembre 21, 2013

Revit Add Ons

Tim Grimm di Revit Add-ons mi ha fatto una bella sorpresa offrendosi di ospitare gratuitamente un banner che rimanda al mio blog per darmi più visibilità.


Revit Add-ons è letteralmente una miniera di strumenti per Revit, sia a pagamento sia gratuiti, che permettono di migliorare il nostro flusso di lavoro con il software. Le recensioni sono essenziali e ben fatte e contribuiscono molto a sensibilizzare e guidare gli utenti alla scelta degli strumenti migliori per il loro lavoro senza troppi giri di parole.

Thanks Tim!

venerdì, dicembre 20, 2013

View Depth Override - Alcune considerazioni



Il grande Jeremy Tammik di The Building Coder mi ha fatto l'onore di pubblicare sul suo blog il mio codice relativo al View Depth Override sia per viste 2D sia per viste 3D.
Nei commenti, un lettore di nome Ning, ha delle perplessità riguardo alle coordinate che ho utilizzato nel codice, questa la mia risposta nel tentativo di dipanare i suoi dubbi.
E' una breve storia (ancora non conclusa per altro) del processo che mi ha condotto a determinate scelte per impostare il codice, la scrivo in inglese (perdonate gli erroracci) ma se qualcuno non capisse posso tradurla in italiano nei commenti... ogni aiuto o suggerimento in tal senso è ben accetto!

Questo quanto chiede Ning:

"hi Paolo and Jeremy,

i'm trying to understand that 3DView Depth Override stuff, by using my own simplified code, works OK for plan / section / elevation views, but i have trouble to understand the coordinate system in terms of relationship between 3DView's Cropbox and Outline used in BoundingBoxIntersectsFilter, i assume the followings:
1) Boundingbox of 3DView's Cropbox is in coordinate system on top of the computer screen in which Z is perpendicular to the computer screen
2) Outline used in BoundingBoxIntersectsFilter is in Revit coordinate system

a bit description in your blog will be great, perhaps Jeremy can give a more technical detailed explanation in the future"

Questa la mia risposta:

Hi Ning,
sorry for the late reply, I'll try to make myself clear about what you're asking.
When I tried to code this macro I was at the beginning of my "API journey" and I'm sure I wouldn't be making the same choices if I had to do it again from scratch.
You're assumptions are correct: View BoundingBox has to be transformed into absolute coordinates to work properly as an Outline.
All started with 2D views: view coordinates are realtive to each view and there are three vectors defining the space: the RightDirection (let's say local x axis), the UpDirection (local y axis) and ViewDirection (local z axis, which is orthogonal to the screen as you mentioned).
That said, I guess one can obtain the Outline necessary to the BoundingBoxFilter from here, taking a shortcut and simplyfing the code a bit, but still, you need to convert from local to absolute coordinates to build a proper Outline.
This is also important to implement the subfunction called "Integral", which collects all ElementIds in a series of smaller BoundingBoxes (200 subdivisions for each one of the three segments of the main BoundingBox), because in case of views that are not parallel to the edges of the screen, a single BoundingBox would generate errors in the selection.
When I began to study a macro for 3D views I decided to restrict the code only for perspective views because that made more sense to me; I tried to reuse as much as possible the code I had for 2D views, but I took a different approach to determine the Bounding Box: I choosed to consider the entire Bounding Box of the model (this is the part where Jeremy's blog comes in), then I rotated (it's better say projected, transformed) this overall BoundingBox "parellel" to the perspective view (but keeping the top and the bottom faces parallel to the ground) and then execute the same code for 2D Views.
It's a work in progress though, I couldn't find the Bounding Box of a perspective view as I did before for a 2D view, and that's an issue still opened since I hadn't look into it since I published the code. I'm open to all the help I can get :)
I hope this helped you in a better understanding of what's behind the code.

Cheers


-Paolo


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

puntorevit@gmail.com

mercoledì, dicembre 18, 2013

External Command: Site XYZ Family In & Out



Questo external command esporta le coordinate delle famiglie riferite alle coordinate del Survey Base Point e per differenziarlo da quello precedente il file CSV ha un suffisso "-Site" ma viene sempre salvato sul desktop con il nome del progetto.

Ovviamente il comando considera la project location corrente e non tutte le altre che possono essere presenti.

Qui si trova il codice, qui la DLL, e qui l'ADDIN, i file sono da copaire 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

External command: XYZ Family In & Out - Update






Ho apportato qualche modifica al codice del post precedente, la versione aggiornata si può trovare qui ed ora consente di aggiornare la posizione delle famiglie modificando il file CSV associato al progetto.
Ho corretto l'esportazione che ora utilizza il punto come separatore decimale così non si confonde con la "," del CSV.
Quando si vuole modificare una famiglia su host da CSV potrebbero verificarsi risultati inattesi poichè prevale la relazione che intercorre tra host e famiglia (quindi lo spostamento c'è ma avviene lungo l'host).

Qui invece l'external command con DLL e ADDIN che vanno copiati in questa directory:

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ì, dicembre 16, 2013

External Command: Family XYZ Location Point to CSV


Questo comando esterno permette di ricavare un file CSV contenente per ciascuna riga le informazioni relative alle sole famiglie con un singolo punto di inserimento che vengono selezionate:

[Category] , [Family Name] , [ID] , [X] , [Y] , [Z]

Il file CSV viene salvato sul desktop con il nome del file del progetto. Con qualche modifica si può fare per tutte le famiglie di questo tipo senza intervenire con la selezione manuale.

Qui si può leggere il codice sorgente, da qui si può scaricare il file DLL e il relativo ADDIN che vanno copiati in questa directory:

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

mercoledì, dicembre 11, 2013

External Commands: Miter Joint By Picking - Lines Chain Total Length






Su richiesta ecco gli external commands di queste due macro che avevo pubblicato in precedenza qui e qui.

Lines Chain Total Length (addin) (dll)

Wall Miter Joint by Picking: (addin) (dll)

Tutti i file sono da copiare in questa directory:

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

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

lunedì, dicembre 09, 2013

Formule utili per parametrizzare una tangente a due archi


Può tornare utile per parametrizzare dei profili o dei tracciati.

Update:

Nel caso si volesse trovare l'altra tangente non speculare a quella precedente, il metodo grafico da utilizzare è lo stesso ma le formule cambiano leggermente:



Chain Dimension

Per oggetti modello (muri e linee) esiste la possibilità di restituire la lunghezza totale di una concatenazione di elementi.
Questa funzionalità però non esiste per le linee di dettaglio, con questa macro è possibile ottenere la lunghezza delle linee selezionate (sia di modello sia di dettaglio), sia concatenate sia separate.
La macro tiene conto dell'unità di misura del progetto e restituisce il valore in metri se il sistema utilizzato è quello metrico e in piedi se è imperiale. Se serve posso fare l'external command.

Filled region on 3D Views - My EUR RTC 2013 Trick



Durante il Revit Technology Conference 2013 a Delft c'è stata una sessione di "Tips and Tricks", e alla fine ognuno poteva contribuire con un proprio suggerimento se lo desiderava.
Io ho descritto la procedura per inserire una filled region in tavola, ma senza Revit sotto mano, solo raccontadolo a parole, questo il vecchio post a cui facevo riferimento.
Sono stato deriso, preso per pazzo, criticato... io però credo sia worthsharing, meritevole di essere condiviso.

Un piccolo video per dimostrare un'applicazione possibile, come ad esempio creare delle filled region per delle viste 3D, senza ricorrere a stratagemmi più complessi.

giovedì, dicembre 05, 2013

Miter joint by picking






In questo video si vede come si possa cambiare il tipo di join terminali dei muri semplicemente cliccandoci sopra. Credit a Harry Mattison di Boost Your BIM da cui ho preso spunto.

WallJoinMiterByPick source code