Così forse è più comprensibile. Con il termine “esteso di 2” (la griglia non si vede …) intendo “incrementa il boundingbox” perchè piani verticali e orizzontali posti agli estremi possono costituire eccezioni del metodo proposto.
Se non è necessaria una precisione assoluta si può dare uno spessore agli elementi di taglio.
Con l’unione booleana si creano i volumi interni, quindi si elimina facilmente la “buccia”.
Non so se può funzionare sempre.
volumi b.gh (24,9 KB)
Generalizzato per funzionare con superfici:
brep splits.gh (20,8 KB)
private void RunScript(List<Surface> s, ref object R)
{
// Creazione boundingbox globale contenente tutte le superfici
Rhino.Geometry.BoundingBox bbox = Rhino.Geometry.BoundingBox.Empty;
int n = s.Count;
for(int i = 0;i < n;i++){
Surface surf = s[i];
bbox.Union(surf.GetBoundingBox(true));
}
// Aumentato boundingbox per avere margine negli step finali
double d = bbox.Diagonal.Length;
bbox.Inflate(+d / 100);
// Esteso tutte le superfici per assicurare una completa intersezione con il bbox
for(int i = 0;i < n;i++){
s[i] = s[i].Extend(IsoStatus.East, d, true);
s[i] = s[i].Extend(IsoStatus.North, d, true);
s[i] = s[i].Extend(IsoStatus.South, d, true);
s[i] = s[i].Extend(IsoStatus.West, d, true);
}
// Creata lista con tutti i frammenti da "tagliare"
List<Brep> breps = new List<Brep>();
breps.Add(bbox.ToBrep());
// Ciclo iterativo, uno per ogni "cutter", per ogni superficie di taglio
for(int i = 0;i < n;i++){
Brep cutter = s[i].ToBrep();
// Lista dove tenere i risultati dei tagli
List<Brep> breps2 = new List<Brep>();
// Operazione solida "split" per ogni frammento da tagliare con l'attuale cutter
foreach(Brep brep in breps){
Brep[] results = Rhino.Geometry.Brep.CreateBooleanSplit(brep, cutter, 0.01);
if(results.Length == 0){
// il cutter non ha intersecato il frammento, il frammento viene tenuto intero per i prossimi cicli
breps2.Add(brep);
}else{
// il cutter ha intersecato il frammento, vengono tenuti i nuovi sotto-frammenti risultanti
foreach(Brep result in results){
breps2.Add(result);
}
}
}
breps = breps2;
}
List<Brep> results2 = new List<Brep>();
// rimpicciolimento bbox
bbox.Inflate(-d / 100);
// salvata ogni brep che viene contenuta completamente dal bbox iniziale
// in questo punto tutti i frammenti brep esterni perimetrali avranno una propria bbox che interseca con la bbox iniziale esattamente di "d"
foreach(Brep brep in breps){
if(bbox.Contains(brep.GetBoundingBox(true))){
results2.Add(brep);
}
}
R = results2;
}
EDIT: aggiunti commenti nel codice qua ^ , @luca.filippone
Sei Fantastico. Appena provo ti do un feedback. Grazie Ricc
nel frattempo riesci a spiegare brevemente come funziona?
La mia con Anemone funziona così.
Bravo Leo, anche tu porti a casa il risultato. Prediligo possibilmente soluzioni indipendenti. Ad ogni modo grazie ad entrambi.
A spanne mi sembra di capire che non hai selezionato le superfici, e per quello che non crea quei volumi…
Puoi passarmi il file con il problema? Altrimenti non riesco a capire cosa non sta funzionando…
E’ il tuo file. Non c’è nulla di mio. Comunque si, ho visto che non sono in rosso. Ok grazie, metto che hai risolto, buona giornata a tutti
Ah , si, avevo internalizzato tutte superfici nuove, quindi non sta realmente usando le geometrie che avevi fornito te.
Cmq non l’ho testato molto, se c’è da sistemare fallo sapere…