diff --git a/rhino/elemente.py b/rhino/elemente.py index 408e447..0f6156c 100644 --- a/rhino/elemente.py +++ b/rhino/elemente.py @@ -2751,6 +2751,43 @@ class _ClusterVolumeSelectHandler(Rhino.UI.MouseCallback): _STICKY_CLUSTER_SELECT = "_dossier_cluster_select_handler" +def _prewarm_native_libs(): + """Beim Plugin-Start native OpenNURBS-Operationen einmal triggern damit + der lazy-loaded native Code geladen ist. Eliminiert den First-Call-Lag + bei der ersten echten Wand-Verbindung (Boolean-Union, Curve.Offset, + Extrusion.Create — alle laden ihren native code beim ersten Aufruf).""" + try: + # Dummy Curve-Offset (laedt native offset code) + line = rg.LineCurve(rg.Point3d(0, 0, 0), rg.Point3d(1, 0, 0)) + try: line.Offset(rg.Plane.WorldXY, 0.1, 0.001, + rg.CurveOffsetCornerStyle.Sharp) + except Exception: pass + # Dummy Extrusion (laedt native extrude code) + try: + poly = rg.Polyline([rg.Point3d(0, 0, 0), rg.Point3d(1, 0, 0), + rg.Point3d(1, 1, 0), rg.Point3d(0, 1, 0), + rg.Point3d(0, 0, 0)]) + pc = rg.PolylineCurve(poly) + ext = rg.Extrusion.Create(pc, 1.0, True) + if ext is not None: + ext.ToBrep() + except Exception: pass + # Dummy Boolean-Union (laedt native boolean code — DAS war wahrscheinlich + # der grosse First-Call-Lag bei Wand-Verbindung) + try: + b1 = rg.Brep.CreateFromBox(rg.BoundingBox( + rg.Point3d(0, 0, 0), rg.Point3d(1, 1, 1))) + b2 = rg.Brep.CreateFromBox(rg.BoundingBox( + rg.Point3d(0.5, 0, 0), rg.Point3d(1.5, 1, 1))) + if b1 and b2: + rg.Brep.CreateBooleanUnion([b1, b2], 0.001) + rg.Brep.CreateBooleanDifference([b1], [b2], 0.001) + except Exception: pass + print("[ELEMENTE] Native libs pre-warmed (offset/extrude/boolean)") + except Exception as ex: + print("[ELEMENTE] prewarm:", ex) + + def install_cluster_select_handler(): """Idempotent: alten Handler disable, neuen installieren.""" try: @@ -17421,6 +17458,13 @@ def _install_listeners(bridge): install_cluster_select_handler() except Exception as ex: print("[ELEMENTE] cluster-select install:", ex) + # Pre-Warm: native OpenNURBS-Libraries beim Plugin-Start laden um den + # First-Call-Lag zu vermeiden (User-Meldung: beim ersten Wand-Verbinden + # haengt das UI kurz, danach nicht mehr → native code wird lazy-loaded). + try: + _prewarm_native_libs() + except Exception as ex: + print("[ELEMENTE] prewarm native:", ex) def _bridge_factory():