Altre cose che si possono fare con i DWG (e Dynamo)
La settimana scorsa vi ho proposto un paio di workflow di gestione dei DWG. Oggi entriamo nel merito di gestione punti e curve, cosa che ci tornerà comoda dovendo gestire elementi che vengono da Civil3d. Punti e curve sono le primitive su cui lavoro di preferenza, non amo corridor e assembly e non amo come […]
La settimana scorsa vi ho proposto un paio di workflow di gestione dei DWG. Oggi entriamo nel merito di gestione punti e curve, cosa che ci tornerà comoda dovendo gestire elementi che vengono da Civil3d. Punti e curve sono le primitive su cui lavoro di preferenza, non amo corridor e assembly e non amo come si comportano all’interno di Revit, ma cercheremo di portare a casa anche quelle. Con il grande aiuto di un amico.
1. Gestire i punti (quando ci sono)
Un punto è un’entità monodimensionale e non può esistere nel mondo reale. A Revit non piacciono le cose che non possono esistere nel mondo reale. Per questo è particolarmente utile l’analisi del nodo precedente: per intercettare gli elementi puntuali e gestirli.
L’azione principale viene però fatta dal nodo PointsFromCADLayers, che trovate documentato a questo indirizzo.
I punti in AutoCad sono oggetti bidimensionali di cui è possibile controllare lo stile le dimensioni.
Point Size
Sets the point display size. The value you enter can be relative to the screen or in absolute units. The point display size is stored in the PDSIZE system variable. Subsequent point objects that you draw use the new value.Set Size Relative to Screen
Sets the point display size as a percentage of the screen size. The point display does not change when you zoom in or out.Set Size in Absolute Units
Sets the point display size as the actual units you specify under Point Size. Points are displayed larger or smaller when you zoom in or out.
Ci importa veramente poco dei punti in AutoCAD, se non probabilmente come base per la creazione di una topografia. In questo senso, l’utilizzo di Dynamo offre pochissimi vantaggi in più rispetto alla creazione di una topografia da una semplice lista di punti. Sul workflow di lavorazione di una topografia, landarchBIM è stata certamente più esaustiva di quanto non possa essere io.
Sull’argomento, consiglio anche questo articolo di Jostein Olsen, citato peraltro anche nell’articolo di landarchBIM.
Ciò che ci interessa davvero tuttavia non è tanto AutoCAD in sé, quando la gestione dei punti fatta da Civil3d che, al contrario del precedente, lavora molto tramite la creazione dei cosiddetti gruppi di punti.
Trovate un’estensiva guida on-line, a riguardo, e ci servirà aver capito cosa siano i Point Groups quando useremo il package Civil Connection di Paolo Serra.
1.1. Gestione dei punti in Civil3d
Come già segnalato da Gimmi GIS in questo suo articolo, per chi sta muovendo i primi passi nell’uso di Dynamo per Civil3d esiste a disposizione una splendida risorsa on-line messa insieme da Frederic Classon in cui vengono raccolti alcuni script con relativo tutorial per workflow base. Uno di questi workflow riguarda appunto la gestione dei punti e si tratta del workflow in due parti relativo alla gestione del rilievo (parte 1 qui, parte 2 qui).
Potrei tranquillamente dirvi che on-line c’è il video e cavarmela così, ma siccome odio i tutorial video vediamo insieme che cosa si trova nei due script.
1.1.1. Workflow 1: superficie topografica da punti
Importazione dei dati e generazione della topografia.
La prima parte del workflow è assolutamente identica a quella che adotteremmo all’interno di Dynamo per Revit: si importa il CSV a partire da un file esterno (Data.ImportCSV), si traspone la lista e si elimina la prima sottolista che generalmente contiene le intestazioni.
A differenza di quello che potrebbe accadere in Revit (oppure esattamente come potrebbe accadere), si potrebbe presentare la necessità di lavorare ulteriormente sulla lista di elementi. Si può operare tramite String.Split, individuando il separatore che vogliamo usare per individuare le tre coordinate, e fatta questa divisione possiamo trasformare i valori in numeri effettivi (String.ToNumber). Potrebbe anche essere il caso di appiattire la lista di un livello (List.Flatten).
Rimarremo con una lista strutturata come ci occorre, dalla quale il solito GetItemAtIndex ci consentirà di estrarre le singole coordinate per i punti.
La prima differenza tra Revit e Civil3d arriva quando iniziamo a dover fare qualcosa con quei punti. Ci accorgiamo di non essere in Revit innanzitutto perché emerge la necessità di inserire un layer.
Layer? In che senso layer? Ah, già, in fondo è AutoCAD…
Dobbiamo quindi agganciare Dynamo al documento attualmente in uso (Document.Current, un nodo presente anche in Dynamo per Revit ma che non sempre dà le soddisfazioni che dovrebbe). Se non si desidera fare nulla di troppo esotico e ci si trova già nella condizione di lavoro corretta, si pesca il layer con il nodo Document.CurrentLayer (in alternativa, esistono nodi per selezionare il layer sulla base del nome esattamente come ci aspettiamo si possa fare) e su quel layer viene creato il gruppo di punti. CogoPoint.ByGeometry richiede in input quindi:
- la geometria (i punti);
- il layer (già selezionato);
- il documento (già selezionato);
- il nome, inserito come stringa;
- una descrizione, anche quella inserita come stringa.
A quel punto, dato che siamo in Civil3d, non possiamo andare da nessuna parte se non impostiamo lo stile dei punti: il nodo per farlo è DocumentExtensions.SetStyle, che funziona su una pluralità di elementi.
I punti sono stati creati, è vero, ma non sono ancora stati raggruppati.
Lo facciamo con CogoPointGroup.ByCogoPoints. Attenzione perché il passaggio precedente di creazione dei cogoPoint è necessario: il sistema non accetterà dei “semplici” punti di Dynamo come input, perché non si tratta di elementi che esistono davvero in Civil3d. Al gruppo bisogna poi dare un nome, tramite stringa, e una descrizione che nell’esempio di Frederic Classon curiosamente non viene compilato. Il documento è sempre lo stesso, nessuna sorpresa. Avremo bisogno del nome: possiamo usare la stessa stringa che abbiamo dato in input oppure ri-estrarre il nome: ogni entità può essere interrogata, con nodi specifici, per estrarne gli attributi. Rispetto a Dynamo per Revit, i nodi sono specifici: non esiste un corrispondente del nostro GetParameterByName. Ma, del resto, gli attributi sono molto meno.
Nostro obiettivo però era creare una topografia sulla base dei punti e non l’abbiamo ancora fatto. In questo esempio, lo facciamo tramite il nodo di creazione di una superficie Tin.
A TIN surface comprises the triangles that form a triangulated irregular network.
TIN lines form the triangles that make up the surface triangulation. To create TIN lines, Autodesk Civil 3D connects the surface points that are closest together. The elevation of any point in the surface is defined by interpolating the elevations of the vertices of the triangles that the point lies in.
Il nodo TinSurface.ByCogoPointGroup richiede il nome del gruppo di punti che abbiamo creato prima (attenzione, il nome, non il gruppo di punti né tantomeno i punti sparsi). Dovremo poi indicare il nome della superficie effettiva (una semplice stringa) e, come al solito, layer e documento.
A questo punto, è buona pratica impostare uno stile. Il workflow è sempre lo stesso.
Dalla TinSurface potremmo anche avere bisogno di policurve. Le estraiamo triangolando con l’apposito nodo TinSurface.Triangles.
1.1.2. Workflow 2
Il secondo workflow aggiunge un livello di complessità per aumentare la precisione e in particolare unisce i punti ricavati dal txt al concetto di breakline proprio di Civil3d. Trovate una spiegazione di cosa siano le breakline a questo indirizzo.
Breaklines are critical to creating an accurate surface model because it is the interpolation of the data, not only the data itself, that determines the shape of the model.
La prima parte è identica: importa il file txt e ripulisce la lista di punti. A questa però si unisce il tracciamento della breakline. Gli input primari sono il layer della Breakline e la distanza dei punti sulla breakline.
La collezione di tutti gli oggetti sul layer (All Objects on Layer) ci occorre come input al nodo Object.Geometry. Saranno quindi le curve che dovremo dare come input al nodo FeatureLine.ByPolyCurve, oltre al nome e al layer.
Pensate alla FeatureLine che abbiamo creato come ad una linea di costruzione. Quello che stiamo provando a fare con Dynamo qui è ciò che trovate descritto qui e, in un certo senso, molto simile a una parte del workflow che trovate descritto in questo articolo.
Ci serve quindi la geometria della curva e ce ne serve la lunghezza. Ce ne serve la lunghezza per creare una sequenza di punti (con il nodo Range, come faremmo in Revit) che parta da 0 e arrivi fino alla fine della curva, per posizionare dei punti lungo la curva con Curve.PointAtSegmentLength.
Così facendo, ci renderemo conto che in realtà ci mancano alcuni punti, come al solito, ovvero quello a testa e in coda.
I punti vanno poi uniti a tutti gli altri e vabbè, non so perché Classon usi List.Create e Flatten anziché List.Join.
La vera unione di liste che ci interessa è quella in cui combiniamo le liste del rilievo e le liste sulle Featureline.
2. Gestire i punti (quando non ci sono)
Spesso però i punti non sono più punti. Non è troppo raro che diventino dei cosini buffi e balordi come questi.
Non sarebbe troppo difficile estrarre i punti di intersezione tra quelle piccole linee rosse, se non fosse che spesso le linee sono troppo piccole e sono troppe. Si spera che per lo meno siano tutte sullo stesso layer.
Il nodo Curve.IntersectAll ci consente di superare entrambi i problemi. Prima di farlo, dobbiamo acquisire le curve del CAD ma anche questo è relativamente semplice.
CAD.CurvesFromCADLayers consente di scegliere solo alcuni layer e non richiede necessariamente di creare model curve, ma laddove lo si desideri viene offerta anche la possibilità di creare (o meno) nuovi stili di linee che corrispondano al cad da cui vengono prese. L’obiettivo è evitare di esploderlo. Esplodere i DWG è male. Quasi quanto far esplodere dei gattini.
Una volta acquisiti questi punti, possiamo farci tutto quello che vogliamo. O, quantomeno, possiamo farci tutto quello che possiamo fare normalmente con dei punti, inclusa la modellazione della topografia.
Una cosa di cui normalmente i progettisti sentono la mancanza, sono le curve di livello. Purtroppo i punti non arrivano già organizzati in sottoliste in modo che sia comodo unirli per creare le curve… per lo meno fino a quando non ci prendiamo un momento per ricordare cosa siano esattamente le curve di livello.
In geografia, con particolare riguardo alla cartografia, la curva di livello è quella curva che unisce punti con uguale quota, ovvero uguale distanza verticale dal piano di riferimento al quale è stato attribuito quota zero.
Abbiamo la coordinata z dei punti: dobbiamo semplicemente estrarla e usarla come chiave per organizzare i punti in un modo che ci sia comodo.
Ma questo è un problema che vi lascio volentieri per un altro momento.