MotionBuilder Python Clean Character From Scene with FBDelete()
This is a script that came about while researching and writing examples for my previous post on FBDelete(). This bit of script will go through a number of constructors within the FBSystem() class.
Here is a list of the classes in which our list will go through:
- fb.FBSystem().Scene.Constraints
- fb.FBSystem().Scene.Handles
- fb.FBSystem().Scene.UserObjects
- fb.FBSystem().Scene.ControlSets
- fb.FBSystem().Scene.CharacterExtensions,
- fb.FBSystem().Scene.Characters
- fb.FBSystem().Scene.Materials
- fb.FBSystem().Scene.Shaders
- fb.FBSystem().Scene.Textures
- fb.FBSystem().Scene.Folders
- fb.FBSystem().Scene.Groups,
- fb.FBSystem().Scene.ObjectPoses
- fb.FBSystem().Scene.CharacterPoses
- fb.FBSystem().Scene.KeyingGroups
- fb.FBSystem().Scene.Notes
- fb.FBSystem().Scene.VideoClips
- fb.FBSystem().Scene.Components
It’s worth noting that there is an order in which you should go through this operators to prevent MotionBulder from Crashing or the script to error out. The above order is what I found works.
import pyfbsdk as fb import pyfbsdk_additions as fba def removechar(namespace): ##Create A List Of All The Scene Eelements We Want To Deal With First ##Some Of The Order Is Important As To Not Have MoBu Crash lFBList = [fb.FBSystem().Scene.Constraints, fb.FBSystem().Scene.Handles, fb.FBSystem().Scene.UserObjects, fb.FBSystem().Scene.ControlSets, fb.FBSystem().Scene.CharacterExtensions, fb.FBSystem().Scene.Characters, fb.FBSystem().Scene.Materials, fb.FBSystem().Scene.Shaders, fb.FBSystem().Scene.Textures, fb.FBSystem().Scene.Folders, fb.FBSystem().Scene.Groups, fb.FBSystem().Scene.ObjectPoses, fb.FBSystem().Scene.CharacterPoses, fb.FBSystem().Scene.KeyingGroups, fb.FBSystem().Scene.Notes, fb.FBSystem().Scene.VideoClips, fb.FBSystem().Scene.Components] ##With Each Item In Our List lFBList for item in lFBList: ##Create An Empty List That We Will Store To lRemovelist = [] ##For Every Thing Returned Per Item Within Our lFBList for i in item: ##Look To See If Our "namespace" Provided Exists Within The Items LongName if namespace in i.LongName: ##If Found Store The Item To Our List lRemovelist lRemovelist.extend([i]) ##If Not Found Skip else: pass ##Take Every Item We Stored In Our List lRemovelist for item in lRemovelist: ##Delete It item.FBDelete()
A big thanks to Marcus Krautwurst, as he worked out the order in which to prevent crashes as well as Alex Forsythe for reworking the script. Alex’s script is a little beyond my current way of scripting but it was great to break it down and learn from it. Researching the map and lambda function proved to be really interesting.
I hope this helps.
I couldn’t get this to work so after a waybackmachine search on Marcus Krautwurst website, I found a comment by Rig_Vader, that said this:
FBSystem().Scene.NamespaceDeleteContent(‘MyNamespace’, FBPlugModificationFlag.kFBPlugAllContent, True)
and this works amazingly. so leaving this there for the next person 😀