diff --git a/src/py/bbctrl/Planner.py b/src/py/bbctrl/Planner.py index fe27066..c967611 100644 --- a/src/py/bbctrl/Planner.py +++ b/src/py/bbctrl/Planner.py @@ -30,7 +30,22 @@ import math import re import time from collections import deque -import camotics.gplan as gplan # pylint: disable=no-name-in-module,import-error +# camotics.gplan is heavy (loads a C++ extension that pulls in libstdc++, +# boost::python, etc.). Defer it: bbctrl can listen on HTTP and serve +# the UI without ever touching the planner. Lazy-load the first time +# Planner.init() runs, which is when the user actually queues motion. +gplan = None +def _load_gplan(): + global gplan + if gplan is None: + try: + import bbctrl.Trace as _T + with _T.span('imports.camotics_gplan'): + import camotics.gplan as _gplan # pylint: disable=no-name-in-module,import-error + except Exception: + import camotics.gplan as _gplan # pylint: disable=no-name-in-module,import-error + gplan = _gplan + return gplan import bbctrl.Cmd as Cmd from bbctrl.CommandQueue import CommandQueue @@ -329,7 +344,7 @@ class Planner(): if stop: self.ctrl.mach.stop() - self.planner = gplan.Planner() + self.planner = _load_gplan().Planner() self.planner.set_resolver(self._get_var_cb) # TODO logger is global and will not work correctly in demo mode self.planner.set_logger(self._log_cb, 1, 'LinePlanner:3')