diff --git a/rhino/elemente.py b/rhino/elemente.py index 28d469c..1d1a1f3 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -4005,18 +4005,24 @@ def _regenerate_element_body(doc, element_id, src_obj, meta, geom, geschoss_name cutouts.append(cutout) opening_jobs.append((op_meta, eff_pt, uk)) if cutouts: + # Performance: alle Cutouts in EINEM BooleanDifference-Call pro + # Schicht subtrahieren (statt N Einzel-Diffs). Bei 3-schichtiger + # Wand mit 2 Oeffnungen reduziert das 6 BoolDiff-Ops auf 3. + # Toleranz fix 0.001 m = 1 mm. Architektur-Genauigkeit reicht das, + # und Boolean-Diff laeuft mit groesserer Toleranz spuerbar schneller + # als mit z.B. 0.0001. + tol = 0.001 new_layer_breps = [] for (brep, color, lname) in layer_breps: if brep is None: new_layer_breps.append((None, color, lname)); continue - for cut in cutouts: - try: - diff = rg.Brep.CreateBooleanDifference( - [brep], [cut], 0.001) - if diff and len(diff) > 0: - brep = diff[0] - except Exception as ex: - print("[ELEMENTE] BoolDiff layer:", ex) + try: + diff = rg.Brep.CreateBooleanDifference( + [brep], cutouts, tol) + if diff and len(diff) > 0: + brep = diff[0] + except Exception as ex: + print("[ELEMENTE] BoolDiff layer:", ex) new_layer_breps.append((brep, color, lname)) layer_breps = new_layer_breps