loading data with bpy.data.libraries.load(), now swaps out the strings in the list...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 24 May 2011 15:21:14 +0000 (15:21 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 24 May 2011 15:21:14 +0000 (15:21 +0000)
also raise warnings rather then errors if the datablock can't be found.

doc/python_api/examples/bpy.types.BlendDataLibraries.load.py
source/blender/python/intern/bpy_library.c

index 43e6ac90ae7bbe977dd29560b3733960c304cdbb..f78728cefc8e7ebe93a4d3418c19b7a49af453b3 100644 (file)
@@ -21,3 +21,19 @@ with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to):
 with bpy.data.libraries.load(filepath) as (data_from, data_to):
     for attr in dir(data_to):
         setattr(data_to, attr, getattr(data_from, attr))
+
+
+# the 'data_to' variables lists are 
+with bpy.data.libraries.load(filepath) as (data_from, data_to):
+    data_to.scenes = ["Scene"]
+
+
+# the loaded objects can be accessed from 'data_to' outside of the context
+# since loading the data replaces the strings for the datablocks or None
+# if the datablock could not be loaded.
+with bpy.data.libraries.load(filepath) as (data_from, data_to):
+    data_to.meshes = data_from.meshes
+# now operate directly on the loaded data
+for mesh in mdata_to.meshes:
+    if mesh is not None:
+        print(mesh.name)
index b66b210932949d97aa8596abd33ba6bd986fa3e8..08f9ef991ab8d1ca9b985b30cb8aacc40f4302b1 100644 (file)
@@ -26,6 +26,9 @@
  *  \ingroup pythonintern
  */
 
+/* nifty feature. swap out strings for RNA data */
+#define USE_RNA_DATABLOCKS
+
 #include <Python.h>
 #include <stddef.h>
 
 
 #include "bpy_util.h"
 
+#ifdef USE_RNA_DATABLOCKS
+#  include "bpy_rna.h"
+#  include "RNA_access.h"
+#endif
+
 typedef struct {
        PyObject_HEAD /* required python macro   */
        /* collection iterator spesific parts */
@@ -271,6 +279,36 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
        return ret;
 }
 
+static void bpy_lib_exit_warn_idname(BPy_Library *self, const char *name_plural, const char *idname)
+{
+       PyObject *exc, *val, *tb;
+       PyErr_Fetch(&exc, &val, &tb);
+       if (PyErr_WarnFormat(PyExc_UserWarning, 1,
+                                                "load: '%s' does not contain %s[\"%s\"]",
+                            self->abspath, name_plural, idname)) {
+               /* Spurious errors can appear at shutdown */
+               if (PyErr_ExceptionMatches(PyExc_Warning)) {
+                       PyErr_WriteUnraisable((PyObject *)self);
+               }
+       }
+       PyErr_Restore(exc, val, tb);
+}
+
+static void bpy_lib_exit_warn_type(BPy_Library *self, PyObject *item)
+{
+       PyObject *exc, *val, *tb;
+       PyErr_Fetch(&exc, &val, &tb);
+       if (PyErr_WarnFormat(PyExc_UserWarning, 1,
+                                                "load: '%s' expected a string type, not a %.200s",
+                            self->abspath, Py_TYPE(item)->tp_name)) {
+               /* Spurious errors can appear at shutdown */
+               if (PyErr_ExceptionMatches(PyExc_Warning)) {
+                       PyErr_WriteUnraisable((PyObject *)self);
+               }
+       }
+       PyErr_Restore(exc, val, tb);
+}
+
 static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
 {
        Main *mainl= NULL;
@@ -302,18 +340,41 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
                                                // printf("  %s\n", item_str);
 
                                                if(item_str) {
-                                                       if(!BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag)) {
-                                                               PyErr_Format(PyExc_KeyError,
-                                                                            "load: %s does not contain %s[\"%s\"]",
-                                                                            self->abspath, name_plural, item_str);
-                                                               err= -1;
-                                                               break;
+                                                       ID *id= BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag);
+                                                       if(id) {
+#ifdef USE_RNA_DATABLOCKS
+                                                               PointerRNA id_ptr;
+                                                               RNA_id_pointer_create(id, &id_ptr);
+                                                               Py_DECREF(item);
+                                                               item= pyrna_struct_CreatePyObject(&id_ptr);
+#endif
                                                        }
+                                                       else {
+                                                               bpy_lib_exit_warn_idname(self, name_plural, item_str);
+                                                               /* just warn for now */
+                                                               /* err = -1; */
+#ifdef USE_RNA_DATABLOCKS
+                                                               item= Py_None;
+                                                               Py_INCREF(item);
+#endif
+                                                       }
+
+                                                       /* ID or None */
                                                }
                                                else {
                                                        /* XXX, could complain about this */
+                                                       bpy_lib_exit_warn_type(self, item);
                                                        PyErr_Clear();
+
+#ifdef USE_RNA_DATABLOCKS
+                                                       item= Py_None;
+                                                       Py_INCREF(item);
+#endif
                                                }
+
+#ifdef USE_RNA_DATABLOCKS
+                                               PyList_SET_ITEM(ls, i, item);
+#endif
                                        }
                                }
                        }