I am working more and more with motionbuilder and one recent challenge involved dealing with

"referencing"* rigs. One of the biggest challenges here was to "de-ref"* an entire rig, which means I have to delete a large number of objects.

Sounds simple right? Unfortunately simple things are never easy in motionbuilder. 


The reason is because there are dependencies between different objects, that are not properly garbagecollected. Thats bad, hence the crash.

Here is a solution that you should not be proud of, but it works. The key is to delete objects by their type in a very specific order.

* There is no real referencing in motionbuilder :)













def DeleteNameSpace(myNameSpace):
 lScene = FBSystem().Scene

 myList = []
 myName = "%s:"%myNameSpace
 
 
 for node in FBSystem().Scene.Constraints: 
  if ( myName in node.LongName ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )

 del myList[:]
 for node in FBSystem().Scene.Handles: 
  if ( myName in node.LongName ):
   myList.append(node)

 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.UserObjects: 
  if ( myName in node.LongName ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.ControlSets: 
  if ( myName in node.LongName ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.CharacterExtensions: 
  if ( myName in node.LongName ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Characters: 
  if ( myName in node.LongName ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Components: 
  if myName in node.LongName and isinstance (node , FBModel ):
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Materials : 
  if myName in node.LongName :
   myList.append(node)
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Shaders : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Textures : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Folders : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Groups : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.ObjectPoses : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.CharacterPoses : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )
 
 del myList[:]
 for node in FBSystem().Scene.Components : 
  if myName in node.LongName :
   myList.append(node)   
 map( FBComponent.FBDelete, myList )