venerdì, novembre 29, 2013

Auto Floor Maker - Core Boundaries





Un veloce aggiornamento: aggiungere il file .dll nella stessa cartella e sostituire il file .addin con il seguente:


AutoFloorMakerCoreBoundaries.dll

AutoFloorMaker.addin

lunedì, novembre 25, 2013

Video sulla creazione delle famiglie - Boston Revit User Group

Credit a Luke Johnson di What Revit Wants


giovedì, novembre 21, 2013

Auto Floor Maker - External Command


Per coloro i quali volessero provare Auto Floor Maker ma non hanno dimestichezza con le macro, ho creato l'External Command e il relativo addin manifest, potete usarlo a vostro rischio e pericolo :D

Se copiate i due file in questa posizione dovrebbe comparire tra gli External Command al primo riavvio di Revit 2014:

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

AutoFloorMaker.addin

AutoFloorMaker.dll

Ecco un video di come usare il comando:



Probabilmente sarà necessario togliere il blocco al file AutoFloorMaker.dll cliccando con il tasto destro > Proprietà e poi "Annulla blocco" in basso a destra e poi riavviate Revit:


Primavera - Update


Ecco un aggiornamento del progetto "primavera" di Antonio Citterio Patricia Viel and Partners.


lunedì, novembre 18, 2013

Drawing shadows - test




Ho appena scoperto la possibilità di tracciare le ombre di oggetti solidi in Revit, ho provato a giocare con il codice presente nel developer manual delle API 2014.
Interessante....

Scavare una superficie topografica



Una delle cose che non si può fare correttamente in Revit è scavare una superficie topografica, ossia creare un volume interrato e ricoprirlo di nuovo con il terreno.
Si possono creare delle famiglie in-place, oppure, più elegantemente, copiare la superficie topografica in un file esterno da collegare, ritagliare la superficie topografica seguendo l'impronta della piattaforma (pad) e impostare per quel file la profondità del retino della topografia pari alla quota dell'estradosso della soletta del volume interrato.
Nelle viste 2D si può vedere che si può intervenire facendo l'override localmente degli elementi in vista e in sezione delle superfici topografiche interessate. In questo modo si può evitare di ricorrere alle filled regione ( i retini) per mascherare la parte di terreno di riporto.

inFORM - Interacting With a Dynamic Shape Display


Fantastico!

sabato, novembre 16, 2013

3D View Tag



In questo post dal blog di Steve Stafford Revit OpEd si ricorda che non si dispone ancora di annotazioni in grado di segnalare la posizione delle viste 3D.
Ho preso spunto da qui per poter creare una macro che inserisse una famiglia di modello generico per ciascuna vista di prospettiva, orientandola correttamente e riportando il nome della vista.
Ovviamente è solo l'effetto finale quello che avevo in mente, non è per niente simile alle annotazioni di Revit che si aggiornano automaticamente con le proprietà delle viste collegate, però funziona per quello che abbiamo a disposizione ora.

Ecco il codice sorgente e la famiglia utilizzata (c'è da inserire un parametro condiviso ma credo siate in grado di ricavarlo da soli):

Codice sorgente 2014

Famiglia GM-3DView.rfa

3D View Depth Override - Update


In questo nuovo video mostro come funziona la versione del View Depth Override per le viste prospettiche.
Dato che non è possibile azionare le macro da una vista prospettica ho trovato un sistema per aggirare il problema.
Con la macro ViewListWrite viene creato un file di testo sul desktop chiamato [MyProjectName]-3DViews.txt, in cui vengono elencate per ciascuna riga le viste di prospettiva presenti nel progetto.
Con la macro ViewListRead viene eseguito il View Depth Override tante volte quante sono le viste elencate nel file di testo. Questo file di testo è editabile dall'utente ed è quindi possibile decidere su quali viste far eseguire la macro.
Il codice è migliorato dalla prima versione, grazie anche a degli spunti che ho trovato sul blog di Jeremy Tammik the Building Coder, in particolare per l'uso del Linq per determinare i punti di massimo e minimo.
Ho introdotto anche l'uso del Transform per rendere più leggibili le operazioni di calcolo dei punti del BoundingBoxXYZ orientato come la vista, la qual cosa si può felicemente applicare alla versione 2D del View Depth Override.

Si tratta sempre di un work in progress, i commenti sono bene accetti per cercare di migliorare :)

Codice sorgente:
Versione 2012
Versione 2014

venerdì, novembre 15, 2013

Step by step how to use macro code samples


Alcuni lettori non hanno molta dimestichezza con i codici delle macro che rendo pubblici e vorrebbero utilizzarli, così ho realizzato questo piccolo video per guidare passo passo nella creazione delle macro.
Nell'esempio ho utilizzato il codice di Auto Floor Sketch - Update


  1. Creare un nuovo modulo in C#
  2. Creare una nuova macro
  3. Copiare gli using statements all'inizio del codice nell'editor delle macro
  4. Copiare il codice della macro dopo quello generato automaticamente da Revit
  5. Controllare che non ci siano errori
  6. Compilare il codice
  7. Se non ci sono errori adesso si può utilizzare la macro

Gli using statements che inserisco all'inizio del codice sono generalmente i seguenti:

using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Collections;
using System.IO;
using System.Linq;


Spero possa essere utile.

giovedì, novembre 14, 2013

Auto Floor Sketch - Update


Questo è un aggiornamento della macro che ora aggiunge dei vuoti nel pavimento di finitura basati sul perimetro degli eventuali altri oggetti che definiscono le chiusure dei locali.
In particolare per i locali sottotetto considera l'altezza di calcolo dei livelli pari a zero temporaneamente per creare il pavimento sulla massima estensione possibile, dopo di che lo riporta nella posizione scelta dall'utente.
E' leggermente più lento ma è più preciso. I locali che non sono propriamente racchiusi non vengono considerati, mentre i locali ottenuti anche dalle linee di delimitazione invece si.

mercoledì, novembre 13, 2013

Ordinare Alfabeticamente i Riquadri di Definizione - Sort Scope Boxes Alphabetically

Una delle seccature maggiori in Revit riguarda l'impossibilità di ordinare alfabeticamente alcuni oggetti che invece seguono l'ordine di creazione.
Fra questi ci sono i riquadri di definizione, gli scope boxes, che quando sono molti obbligano gli utenti a scrollare in tutta la lista senza avere la possibilità di ritrovare in ordine alfabetico i nomi che sono stati assegnati ai singoli oggetti.
In realtà non è possibile fare molto da questo punto di vista se non adeguarsi a come Revit ripropone questo elenco di oggetti (a quanto pare in base all'ID dell'oggetto che, anche se può variare, purtroppo non può essere modificato direttamente dall'utente).
Per questo motivo ho creato una macro che aggiunge in automatico al nome degli scope boxes un prefisso numerico crescente che corrisponde alla posizione di ciascun oggetto nell'elenco.
Il flusso di lavoro potrebbe essere il seguente: dopo aver creato gli scope boxes che servono, si assegna contestualmente un nome significativo per poterli distinguere. Si effettua un'associazione alle viste di pianta e solo dopo si procede con la macro.

Partendo da una situazione di questo tipo, con i nomi non in ordine alfabetico:



Facendo agire la macro si ottiene questo:


In questo modo è possibile almeno rendersi conto di quale "numero" si deve usare a riferimento per quel tipo particolare di piante rendendo più rapido rintracciare gli scope boxes nell'elenco.

Di seguito il codice sorgente per Revit 2012.



venerdì, novembre 08, 2013

Superficie Topografica da linee - la mia versione



Poco tempo fa Matt Harrison di Boost Your BIM ha pubblicato sull'App Exchange di Autodesk un add-in per la creazione di superfici topografiche direttamente selezionando delle linee di modello in Revit.
Nel mio percorso per imparare ad utilizzare le API di Revit ho cercato di replicare il comportamento di questa add-in e ho aggiunto la possibilità di salvare sul desktop un file .CSV con le coordinate dei punti espresse in millimetri.
Non so se sia esattamente questo il tipo di codice che ha usato Matt, ma dall'esecuzione posso notare che il risultato è persino più preciso di quello che si otterrebbe collegando un DWG con le linee di modello.
Resta sempre la limitazione di non poter realizzare direttamente superfici concave per via dell'algoritmo di triangolazione utilizzato da Revit.



using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Collections;
using System.Diagnostics;
using System.IO;
using System.Linq;

//Constant to make a conversion from imperial to metric
const double _FeetTomm = 304.8;
//Here is how we can convert units
public static double FeetTomm(double ftValue)
{
return ftValue * _FeetTomm;
}
//New class to limit the selection only to Model Lines
public class LinePickFilter : ISelectionFilter
        {
            public bool AllowElement(Element e)
            {
                return (e.Category.Id.IntegerValue.Equals(
                    (int)BuiltInCategory.OST_Lines));
            }

            public bool AllowReference(Reference r, XYZ p)
            {
                return false;
            }
        }
//Here starts the code
public void TopoFromCurves()
{
UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;
Selection sel = uidoc.Selection;
LinePickFilter LinePickFilter = new LinePickFilter();
//Prompt the user to select lines
IList curves = sel.PickObjects(ObjectType.Element,
LinePickFilter, "Select source lines for topo surface");
IList p =new List();
//Determining the path of the .CSV file
string dtop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string path = String.Concat(dtop, "\\" +
doc.Title.Remove(doc.Title.Length - 4) + "-TopoFromLines.csv");
string output = "";
//We need to start a transaction in order to modify the database of the file
//The title will be visible in the commands list and the journal file
//the using () structure prevents bad behaviours from happening
using (Transaction t = new Transaction(doc, "Topo From Lines"))
{
t.Start();
foreach (Reference r in curves)
{
//Cast each element in the selection as ModelCurves
//to have access to specific properties
ModelCurve e = doc.GetElement(r) as ModelCurve;
foreach (XYZ q in e.GeometryCurve.Tessellate())
{
//Collect all the points from the lines
p.Add(q);
}
}
//Here writes the .CSV file converting from decimal feets to mm
//replacing the comma with a point as a decimal separator
using (StreamWriter sw = new StreamWriter(path, false))
{
foreach (XYZ v in p)
{
output = FeetTomm(v.X).ToString().Replace(",", ".") + ","
+ FeetTomm(v.Y).ToString().Replace(",", ".") + ","
+ FeetTomm(v.Z).ToString().Replace(",", ".");
sw.WriteLine(output);
}
}
//Create the TopoSurface, Refresh and commit the transaction
doc.Create.NewTopographySurface(p);
uidoc.RefreshActiveView();
t.Commit();
}
}

mercoledì, novembre 06, 2013

Trovare l'inclinazione di un piano partendo da 3 quote - metodo grafico


Trovare l'inclinazione di un pavimento è importante per evitare di ricorrere alla modifica degli elementi secondari, in questo modo saremo certi che il pavimento risultante abbia spessore costante e mantenga la capacità di fungere da host per gli elementi ringhiera, senza dare errori nelle quantità dei materiali.
Geometricamente un piano è definito quando conosciamo le quote (Z) di tre punti che vi appartengono.
Nell'immagine sopra ho riportato il metodo grafico per ottenere la linea di massima pendenza del piano.
Si può sfruttare il principio del metodo grafico anche senza conoscere le quote esatte, come spiegherò in un post successivo


lunedì, novembre 04, 2013

Linee di riferimento - Parametrizzare l'angolo di un solido



Nell'editor delle famiglie possiamo utilizzare le linee di riferimento per vincolare le linee che costituiscono il profilo di un solido di estrusione ad esempio per potere controllare l'angolo tra queste linee e dei piani di riferimento.
Il concetto chiave è che la rotazione viene controllata da un parametro angolo su un particolare oggetto, la linea di riferimento, che viene individuata dall'intersezione di due piani.
Le estremità delle linee di riferimento si possono vincolare alle intersezioni fra i piani utilizzando il comando allinea e successivamente bloccando il lucchetto che compare per stabilire il vincolo.
Per tracciare la linea di riferimento è meglio partire da un punto qualsiasi e terminare in corrispondenza dell'intersezione fra i piani di riferimento per favorire le quote automatiche (di default sono nascoste ma sono alla base della relazionalità geometrica di Revit).
Per posizionare la quota angolare invece è meglio partire dal piano di riferimento che resterà fisso e poi cliccare sulla linea di riferimento.
Quando si entra in modalità di tracciamento si deve fare attenzione a selezionare per ciascuna linea il piano di lavoro appropriato: aiutandosi con il tasto TAB e deselezionando dalla toolbar delle opzioni il concatena, si può realizzare il tipo di relazione desiderata.
Questo tipo di procedura si può seguire anche per i componenti di dettaglio.