[Bf-python] cyclic dependency errors using Blender.Library
Goat Man
goatman.py at gmail.com
Fri Dec 18 03:12:09 CET 2009
I just tried it, your right Martin, thanks!
On Fri, Dec 18, 2009 at 9:05 AM, Martin Poirier <theeth at yahoo.com> wrote:
> 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/
> _______________________________________________
> Bf-python mailing list
> Bf-python at blender.org
> http://lists.blender.org/mailman/listinfo/bf-python
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.blender.org/pipermail/bf-python/attachments/20091218/2fe76a41/attachment.html>
More information about the Bf-python
mailing list