From e7a2a175df006c75c859a861cb595e87531115c4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 25 Aug 2007 19:05:18 +0000 Subject: getting the armature twice would cause a weakref error and crash after 2-4 runs.. data = arm_ob.data bones = arm_ob.data.bones.values() Fixed by returning existing armatures if they exist in the weakref list. tested with FBX and BVH support. --- source/blender/python/api2_2x/Armature.c | 39 ++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'source/blender/python/api2_2x/Armature.c') diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c index e00ec339063..0a616e2b9fe 100644 --- a/source/blender/python/api2_2x/Armature.c +++ b/source/blender/python/api2_2x/Armature.c @@ -1318,7 +1318,28 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature) PyObject *maindict = NULL, *weakref = NULL; PyObject *armlist = NULL; /* list of armature weak refs */ char *list_name = ARM_WEAKREF_LIST_NAME; + int i; + + //put a weakreference in __main__ + maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); + + armlist = PyDict_GetItemString(maindict, list_name); + if(!armlist) { + printf("Oops - can't get the armature weakref list\n"); + goto RuntimeError; + } + + /* see if we alredy have it */ + for (i=0; i< PyList_Size(armlist); i++) { + py_armature = (BPy_Armature *)PyWeakref_GetObject(PyList_GET_ITEM(armlist, i)); + if (BPy_Armature_Check(py_armature) && py_armature->armature == armature) { + Py_INCREF(py_armature); + /*printf("reusing armature\n");*/ + return (PyObject *)py_armature; + } + } + /*create armature type*/ py_armature = PyObject_NEW( BPy_Armature, &Armature_Type ); @@ -1336,19 +1357,13 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature) printf("Oops - creating armature.bones\n"); goto RuntimeError; } - - //put a weakreference in __main__ - maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); - - armlist = PyDict_GetItemString(maindict, list_name); - if( armlist){ - weakref = PyWeakref_NewProxy((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc); - if (PyList_Append(armlist, weakref) == -1){ - printf("Oops - list-append failed\n"); - goto RuntimeError; - } - Py_DECREF(weakref); + + weakref = PyWeakref_NewProxy((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc); + if (PyList_Append(armlist, weakref) == -1){ + printf("Oops - list-append failed\n"); + goto RuntimeError; } + Py_DECREF(weakref); return (PyObject *) py_armature; -- cgit v1.2.3