Ordinare layers su livelli

Buongiorno e buon anno a tutti!

Ho un bel quesito per tutti voi… Sono alla ricerca di un modo per poter salvare i 4 layers in figura su 4 livelli differenti, scegliendo se ordinarli ad esempio dall’alto verso il basso (o viceversa) ed per poi esportarli (ad esempio in formato dxf o altri).

Con Grasshopper non sono riuscito a realizzare questa cosa… Qualcuno ha qualche idea su come ottenere questo risultato?

Eventualmente sarebbe anche interessante poter decidere se salvare più layers di 1 unico livello (ad esempio per quei 4 layers in figura salvare i primi 2 in un primo livello e i secondi 2 in un secondo livello).

Esempio.3dm (150,3 KB)

Ciao Marco e auguri!
Temo che definire “Layer” i 4 gruppi di geometrie, non aiuti.
Per chi usa Rhino in inglese e dovendo trattare un problema di assegnazione a un “Layer”… . :wink:

Direi che la soluzione più indolore sia usare un add-on tipo Human (immagine sotto) e creare attributi e poi fare un bake.


Oppure uno script in Python specifico per il bake. Prende una condizione True/False gestita dal Button e fa il bake di geometrie in un layer specificato. Se il layer non esiste lo crea. Allegato.

Quanto a come ordinare curve complanari in liste separate e poi gestire la successione delle liste è abbastanza facile. I numeri per indicare che si parte da una lista disordinata di curve su diversi piani. La strategia è di fare un sorting basato sulla componente Z del punto P che è a parametro 0.5 per tutte le curve e poi suddividere la lista in sottoliste. Ovviamente il criterio di creazione delle sottoliste è cosa che può essere raffinato. Qui ho usato brutalmente un pannello… una volta ottenute le liste separate le abbini al componente bake-Python con destinazioni su diversi layer.
La successione nella lista di layer sarà quella in cui appariranno in Rhino.


BakePython.gh (3,5 KB)

Anche così?

1 Mi Piace

Grazie ad entrambi per gli ottimi suggerimenti!

Utilizzando il modello di @leopoldomonzani riesco ad ottenere e visualizzare i 5 layers con 13 linee ciascuno.

Sto cercando di inserirlo all’interno dello script di @giuseppe ma con scarso successo (ho provato anche con Human)… come si fa a fargli capire che ci sono (in questo caso) 5 layers e deve salvarli in 5 livelli “Layer 1, Layer 2 … 5”? Credo vada collegato qualcosa alla L dello script in modo da avere una lista di nomi numerati in automatico, ma non trovo il modo giusto…

Test.gh (11,1 KB)

Se usi le definizioni mie o di Leo non ti serve il "Bake " di Human alla fine.
Il motivo per cui ho usato una tecnica di sorting è perché si ottiene implicitamente un valore crescente per curve appartenenti allo stesso Z.
Basta costruire il nome layer (input L del componente Python) con la convenzione che “Layer0” è il più basso e il gioco è fatto. Li trovi anche belli ordinati nei layer di Rhino.


Puoi sostituire al mio pannello usato per segmentare la lista delle curve (ho detto che era una soluzione brutale) la più elegante alternativa di Leo basata sulla similarità dei Set.

1 Mi Piace

Grazie Giuseppe!

Seguendo le tue indicazioni sono riuscito a creare i vari layer 0…5, i quali però sono stati realizzati prendendo le z dal basso verso l’alto.
Se invece volessi realizzare i layers nel verso opposto (alto-basso) cosa dovrei fare?

Edit: Andando ad osservare ciascun layer ho osservato che le linee sono state create in questo ordine, è normale? Non ha seguito l’ordine di partenza (prima le centrali e poi i bordi o viceversa)… Così sono disordinate insomma…

Questo:
ReverseSort
Così il primo layer (Layer0) sarà il più alto in Z

Non è una cosa che hai chiesto… o così almeno mi pare… Che “ordine” dovrebbero seguire? Quello con cui sono state create in Rhino? Pessima idea. Un copia incolla scompaginerebbe tutto.
Se dunque vuoi una definizione che lavori su un set di curve che devono essere divise per Z crescente o decrescente e mantenere nella lista un ordine negli item (quale?) bisogna sapere tutto prima.
Come ti ho già detto, inizierei con il cambiare i termini del post per una lettura più chiara.
Avrei scritto così.
Titolo: Ordinare set uguali di curve complanari su layer diversi (crescenti o decrescenti).
Inoltre, le liste devono essere organizzate così da contenere come primo elemento di lista il perimetro e le curve interne in successione da un bordo a quello opposto. (Esempio per il quale hai immagine a seguire).

Il primo passo per Programmare (GH, Py C#…non cambia) è saper fare le domande giuste.
Pare facile ma non lo è. :smile:
Richiede avere chiaro il problema che si vuole risolvere. Te lo dico per risparmiarti ore di tentativi.
Andare per “affinamenti successivi” non funziona.
Come da immagine le curve interne a ogni perimetro sono ordinate, nell’output su ogni layer di Rhino, rispetto alla distanza da un punto di coordinate 0,0,0. Se vuoi un diverso punto dovrai studiare una diversa strategia.

1 Mi Piace

Perfetto grazie!

Non mi è chiara una cosa, questo “-1” cosa rappresenta?

Non ero a conoscenza della cosa, finora non mi era mai capitato, pensavo che l’ordine di creazione in rhino poi rimanesse inalterato… in ogni caso ho notato che al momento dell’esportazione delle curve in un formato (ad es. dxf), l’ordine delle curve contenute in ciascun layer viene esattamente ribaltato (le prime diventano ultime e viceversa). Sei a conoscenza della cosa? E’ risolvibile in qualche modo?

Ho provato a replicare quanto hai fatto ma mi esce questo warning, a cosa può essere dovuto?
Test.gh (17,9 KB)

Ho notato un problema: le curve non vengono selezionate correttamente.
Ho apportato una modifica che sembra risolvere il problema.
-1 ultimo elemento della lista
-2 penultimo elemento della lista
ecc.
Test l.gh (25,0 KB)


Per l’ordinamento delle curve sui singoli piani ho introdotto questa modifica per evitare ordinamenti errati nel caso in cui il punto di riferimento si trovasse all’interno dei rettangoli.
Test m.gh (24,8 KB)

Aggiornamento.
Per un corretto ordinamento anche delle linee inclinate.
E correzione di un bug.
Test n.gh (24,6 KB)

Grazie mille Leopoldo,

ho i seguenti dubbi:

  1. In questo modo i layers vengono creati in ordine dal basso verso l’alto. Come si fa a crearli al contrario, ossia dall’alto verso il basso?
  2. In questo modo l’ordine in cui vengono create le linee in ciascun layer è: prima il bordo e poi le linee interne. E’ possibile fare il contrario, ossia prima il riempimento e poi il contorno esterno?

Sì, certo.
Test o.gh (24,5 KB)

È necessario modificare anche il collegamento che gestisce l’esportazione, altrimenti l’ordinamento non viene rispettato in Rhino…
Test p.gh (24,8 KB)

Ovviamente per invertire l’ordine di entrambe le liste si può connettere un Reverse ai layer precedentemente ordinati.