[Bf-python] cyclic dependency errors using Blender.Library

Martin Poirier theeth at yahoo.com
Fri Dec 18 02:05:00 CET 2009


Can't you append the scene itself (all objects will follow automatically), than link all objects in it to the destination scene and unlink the appended scene?

Martin

--- On Thu, 12/17/09, Goat Man <goatman.py at gmail.com> wrote:

> From: Goat Man <goatman.py at gmail.com>
> Subject: [Bf-python] cyclic dependency errors using Blender.Library
> To: "Blender Foundation Python list" <bf-python at blender.org>
> Received: Thursday, December 17, 2009, 6:51 PM
> I can not find any documentation how to
> append an entire scene using Blender.Library or the newer
> libData module that will always avoid cyclic dependency
> errors.  The cyclic errors are caused when a dependent
> object is loaded before the object it needs to reference. 
> For example the object may be the child of the other, or a
> modifier might reference it.
> 
> 
> Library.Datablocks('Object')this
> function seems to return object names in random order, not
> their order of dependence.
> so simply iterating through the names, and calling:
> Library.Load(obname, 'Object',0) will cause the
> cyclic dependency errors.
> 
> 
> Currently i am using this very ugly workaround to peek into
> a blend file before loading it, checking every object in the
> scene and finding the dependency order, this gets saved to a
> pickled file, which is then read and gives Library.Load the
> proper order.  There must be a better way.
> 
> 
> import Blender, bpy, random, pickle
> 
> def inspect():
>     r = {}
>     order = []
>     objects = {}
>     for bo in bpy.data.scenes.active.objects:
>         r[ bo.name ] = []
> 
>         order.append( bo.name )
>         objects[ bo.name ] = bo
> 
>     ##################################
>     for bo in bpy.data.scenes.active.objects:
> 
> 
>         if bo.parent:
>             deps = r[ bo.parent.name ]
>             if bo.name not in deps:
>                 deps.append( bo.name )
> 
>                 #print 'parent-dependent
> ->', bo.parent.name, bo.name
> 
>         for mod in bo.modifiers:
>             print mod
>             try:
> 
>                 mbo =
> mod[Blender.Modifier.Settings.OBJECT]
>                 deps = r[ mbo.name ]
>                 if bo.name not in
> deps:
>                     deps.append( bo.name )
> 
>                     #print
> 'mod-dependent ->', mbo.name, bo.name
> 
>             except: pass
> 
>         for cns in bo.constraints:
>             print cns
> 
>             target = None
>             try: target = cns[
> Blender.Constraint.Settings.TARGET ]
>             except: pass
>             if target:
>                 deps = r[ target.name ]
> 
>                 if bo.name not in
> deps:
>                     deps.append( bo.name )
>                     print 'cns-dependent
> ->', target.name, bo.name
> 
> 
>         #if bo.type == 'Mesh': print bo.name; print bo.modifiers[0]
> 
>     #random.shuffle( order )
>     while True:
>         #for p in range(4):
>         stop = True
> 
>         for n1 in r:
>             curidx = order.index( n1 )
>             for n2 in r:
>                 if n1 != n2:
>                     deps = r[n2]
>                     if n1 in deps:
>                         idx =
> order.index( n2 )
> 
>                         if curidx <
> idx:
>                             stop =
> False
>                             curidx =
> idx+1
>                            
> order.remove( n1 )
>                            
> order.insert( idx+1, n1 )
> 
>                             #print
> 'new idxs', order.index(n1), order.index(n2)
>                         elif curidx ==
> idx: print 'this is a bug'
> 
>         #print order
>         if stop: break
> 
>     #print order
> 
>     preempties = []
>     postempties = []
>     empties = []
>     armatures = []
>     meshes = []
>     lattices = []
>     lights = []
>     cameras = []
>     others = []
>     for n in order:
> 
>         ob = objects[n]
>         t = ob.type
>         if t == 'Armature': armatures.append(
> n )
>         elif t == 'Empty':
>             empties.append( n )
>             if ob.emptyShape == 4:        #
> single arrow
> 
>                 postempties.append( n )
>             else: preempties.append( n ) 
>         elif t == 'Lattice': lattices.append(
> n )
>         elif t == 'Lamp': lights.append( n )
>         elif t == 'Camera': cameras.append( n
> )
> 
>         elif t == 'Mesh': meshes.append( n )
>         else: others.append( n )
> 
>     ## this simple rule works ##
>     loadorder = preempties + armatures + postempties +
> lattices + lights + meshes + others
> 
>     dump = { 
>         'load-order' : loadorder,
>         'empties' : empties,
>         'armatures' : armatures,
>         'meshes' : meshes,
>         'lattices' : lattices,
> 
>         'lights'    : lights,
>         'cameras' : cameras
>     }
>     return dump
> pickle.dump( inspect(),
> open('/tmp/blend-inspection','wb'), -1 )
> Blender.Quit()
> 
> 
> 
> 
> -----Inline Attachment Follows-----
> 
> _______________________________________________
> Bf-python mailing list
> Bf-python at blender.org
> http://lists.blender.org/mailman/listinfo/bf-python
> 


      __________________________________________________________________
Looking for the perfect gift? Give the gift of Flickr! 

http://www.flickr.com/gift/



More information about the Bf-python mailing list