From 0cc06364e81d56475d1b97b71a0991915207bd6c Mon Sep 17 00:00:00 2001 From: karim Date: Sat, 30 May 2026 23:39:59 +0200 Subject: [PATCH] Pre-warm OpenNURBS native libs am Plugin-Start MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim install_listeners() werden dummy Curve.Offset, Extrusion.Create und Brep.CreateBooleanUnion/Difference Aufrufe gemacht damit der lazy-loaded native code geladen ist. Soll den First-Call-Lag bei der ersten echten Wand-Operation reduzieren. In der Praxis hilft das bei der Tech-Drawing-Failure nicht (das ist eine Rhino-interne Limitation der Hidden-Line-Analyse die mit rapid brep Delete+Add nicht klar kommt) — aber schadet auch nicht und kann andere Cold-Start-Edge-Cases verbessern. --- rhino/elemente.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) 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():