loading data with bpy.data.libraries.load(), now swaps out the strings in the list to load with the actual datablocks, this is convenient because it saves the script author having to find them after.

also raise warnings rather then errors if the datablock can't be found.
This commit is contained in:
Campbell Barton
2011-05-24 15:21:14 +00:00
parent a8cb91e64a
commit 357ce16958
2 changed files with 83 additions and 6 deletions

View 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): with bpy.data.libraries.load(filepath) as (data_from, data_to):
for attr in dir(data_to): for attr in dir(data_to):
setattr(data_to, attr, getattr(data_from, attr)) 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)

View File

@@ -26,6 +26,9 @@
* \ingroup pythonintern * \ingroup pythonintern
*/ */
/* nifty feature. swap out strings for RNA data */
#define USE_RNA_DATABLOCKS
#include <Python.h> #include <Python.h>
#include <stddef.h> #include <stddef.h>
@@ -47,6 +50,11 @@
#include "bpy_util.h" #include "bpy_util.h"
#ifdef USE_RNA_DATABLOCKS
# include "bpy_rna.h"
# include "RNA_access.h"
#endif
typedef struct { typedef struct {
PyObject_HEAD /* required python macro */ PyObject_HEAD /* required python macro */
/* collection iterator spesific parts */ /* collection iterator spesific parts */
@@ -271,6 +279,36 @@ static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
return ret; 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)) static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
{ {
Main *mainl= NULL; Main *mainl= NULL;
@@ -302,18 +340,41 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
// printf(" %s\n", item_str); // printf(" %s\n", item_str);
if(item_str) { if(item_str) {
if(!BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag)) { ID *id= BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag);
PyErr_Format(PyExc_KeyError, if(id) {
"load: %s does not contain %s[\"%s\"]", #ifdef USE_RNA_DATABLOCKS
self->abspath, name_plural, item_str); PointerRNA id_ptr;
err= -1; RNA_id_pointer_create(id, &id_ptr);
break; 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 { else {
/* XXX, could complain about this */ /* XXX, could complain about this */
bpy_lib_exit_warn_type(self, item);
PyErr_Clear(); PyErr_Clear();
#ifdef USE_RNA_DATABLOCKS
item= Py_None;
Py_INCREF(item);
#endif
} }
#ifdef USE_RNA_DATABLOCKS
PyList_SET_ITEM(ls, i, item);
#endif
} }
} }
} }