"""FileOrigin registration wrappers. Wraps ``FreeCADGui.addOrigin()`` / ``removeOrigin()`` with validation and error handling. Addons implement the FileOrigin duck-typed interface directly (see Silo's ``SiloOrigin`` for the full contract). """ import FreeCAD _REQUIRED_METHODS = ("id", "name", "type", "ownsDocument") def _gui(): import FreeCADGui return FreeCADGui def register_origin(origin): """Register a FileOrigin with FreeCADGui. *origin* must be a Python object implementing at least ``id()``, ``name()``, ``type()``, and ``ownsDocument(doc)`` methods. """ missing = [m for m in _REQUIRED_METHODS if not hasattr(origin, m)] if missing: raise TypeError(f"origin is missing required methods: {', '.join(missing)}") try: _gui().addOrigin(origin) FreeCAD.Console.PrintLog(f"kindred_sdk: Registered origin '{origin.id()}'\n") except Exception as e: FreeCAD.Console.PrintWarning(f"kindred_sdk: Failed to register origin: {e}\n") def unregister_origin(origin): """Remove a previously registered FileOrigin.""" try: _gui().removeOrigin(origin) FreeCAD.Console.PrintLog(f"kindred_sdk: Unregistered origin '{origin.id()}'\n") except Exception as e: FreeCAD.Console.PrintWarning(f"kindred_sdk: Failed to unregister origin: {e}\n")