Pre-warm OpenNURBS native libs am Plugin-Start

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.
This commit is contained in:
2026-05-30 23:39:59 +02:00
parent 5c7611ad40
commit 0cc06364e8
+44
View File
@@ -2751,6 +2751,43 @@ class _ClusterVolumeSelectHandler(Rhino.UI.MouseCallback):
_STICKY_CLUSTER_SELECT = "_dossier_cluster_select_handler" _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(): def install_cluster_select_handler():
"""Idempotent: alten Handler disable, neuen installieren.""" """Idempotent: alten Handler disable, neuen installieren."""
try: try:
@@ -17421,6 +17458,13 @@ def _install_listeners(bridge):
install_cluster_select_handler() install_cluster_select_handler()
except Exception as ex: except Exception as ex:
print("[ELEMENTE] cluster-select install:", 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(): def _bridge_factory():