Volume interno tra superfici

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.

1 Mi Piace

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

3 Mi Piace

Sei Fantastico. Appena provo ti do un feedback. Grazie Ricc

nel frattempo riesci a spiegare brevemente come funziona?

La mia con Anemone funziona così.

4 Mi Piace

Bravo Leo, anche tu porti a casa il risultato. Prediligo possibilmente soluzioni indipendenti. Ad ogni modo grazie ad entrambi.


Ricc, mancano i locali indicati in viola.

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…

1 Mi Piace