Functionality is exposed
to Python via a wrapper around the actual MotionBuilder object.
For example b = FBButton() creates:
- A button in the UI.
- A Python wrapper you reference with b.
Once the two objects are created, the
following states can arise:
- Normally, both the object and the wrapper
are bound together, enabling you to access the MotionBuilder object
via the Python wrapper.
- If the MotionBuilder object is destroyed
(deleted from the scene) and the Python wrapper still exists in
the global namespace, then if you try to access it, the Python exception unbind.UnbindWrapperError is thrown.
See PropertyDrop.py for
an example showing how the Tool.OnUnbindSDK event can register a
callback that unregisters the tool from the scene as soon as the
tool becomes unbound.
- If the Python wrapper has been destroyed
(by executing another script, or resetting all names in the global
namespace), but the MotionBuilder object still exists, then nothing
happens. The MotionBuilder object still exists, and you can get
another wrapper for it, for example by using FBGetModelByName.
You can register a callback
on an object to be notified if it ever becomes unbound.
For an example of unbinding,
see Unbind_example.py.
It creates a tool and adds a label to it. It then calls DestroyTool, which deletes all the
UI controls in the tool. But the Python wrappers (for the tool and
label) are still accessible, and if you access the label caption
property an exception is thrown.
You can also see the unbind error as
follows:
- Add a cube to a scene and select it.
Use the UI, or type in the work area: myCube
= FBModelCube("Cube0")
- Delete the cube.
- If you now access the cube in the work
area, for example: myCube.Name, this
works because the cube persists in the undo system..
- Now do undoable operations in the scene
which will replace the cube, for example by adding objects to the
scene. After adding a number of objects, myCube.Name will
throw an UnboundWrapperError.