svn merge -r36900:37028 https://svn.blender.org/svnroot/bf-blender/trunk/blender
This commit is contained in:
@@ -114,7 +114,7 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
#if 0 /* UNUSED, currenly assignment overwrites into new properties, rather then setting in-place */
|
||||
#if 0 /* UNUSED, currenly assignment overwrites into new properties, rather than setting in-place */
|
||||
static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
|
||||
{
|
||||
switch (prop->type) {
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
#include <Python.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "compile.h" /* for the PyCodeObject */
|
||||
#include "eval.h" /* for PyEval_EvalCode */
|
||||
|
||||
#include "bpy_internal_import.h"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
@@ -51,7 +48,6 @@
|
||||
/* UNUSED */
|
||||
#include "BKE_text.h" /* txt_to_buf */
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_global.h" /* grr, only for G.main->name */
|
||||
|
||||
static Main *bpy_import_main= NULL;
|
||||
|
||||
@@ -97,7 +93,7 @@ void bpy_import_main_set(struct Main *maggie)
|
||||
/* returns a dummy filename for a textblock so we can tell what file a text block comes from */
|
||||
void bpy_text_filename_get(char *fn, size_t fn_len, Text *text)
|
||||
{
|
||||
BLI_snprintf(fn, fn_len, "%s%c%s", text->id.lib ? text->id.lib->filepath : G.main->name, SEP, text->id.name+2);
|
||||
BLI_snprintf(fn, fn_len, "%s%c%s", text->id.lib ? text->id.lib->filepath : bpy_import_main->name, SEP, text->id.name+2);
|
||||
}
|
||||
|
||||
PyObject *bpy_text_import(Text *text)
|
||||
|
||||
@@ -59,7 +59,7 @@ void bpy_text_filename_get(char *fn, size_t fn_len, struct Text *text);
|
||||
extern PyMethodDef bpy_import_meth;
|
||||
extern PyMethodDef bpy_reload_meth;
|
||||
|
||||
/* The game engine has its own Main struct, if this is set search this rather then G.main */
|
||||
/* The game engine has its own Main struct, if this is set search this rather than G.main */
|
||||
struct Main *bpy_import_main_get(void);
|
||||
void bpy_import_main_set(struct Main *maggie);
|
||||
|
||||
|
||||
@@ -93,7 +93,8 @@ PyDoc_STRVAR(Color_copy_doc,
|
||||
" :return: A copy of the color.\n"
|
||||
" :rtype: :class:`Color`\n"
|
||||
"\n"
|
||||
" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n"
|
||||
" .. note:: use this to get a copy of a wrapped color with\n"
|
||||
" no reference to the original data.\n"
|
||||
);
|
||||
static PyObject *Color_copy(ColorObject *self)
|
||||
{
|
||||
|
||||
@@ -185,7 +185,8 @@ static PyObject *Euler_zero(EulerObject * self)
|
||||
PyDoc_STRVAR(Euler_rotate_axis_doc,
|
||||
".. method:: rotate_axis(axis, angle)\n"
|
||||
"\n"
|
||||
" Rotates the euler a certain amount and returning a unique euler rotation (no 720 degree pitches).\n"
|
||||
" Rotates the euler a certain amount and returning a unique euler rotation\n"
|
||||
" (no 720 degree pitches).\n"
|
||||
"\n"
|
||||
" :arg axis: single character in ['X, 'Y', 'Z'].\n"
|
||||
" :type axis: string\n"
|
||||
@@ -247,7 +248,8 @@ static PyObject *Euler_rotate(EulerObject * self, PyObject *value)
|
||||
PyDoc_STRVAR(Euler_make_compatible_doc,
|
||||
".. method:: make_compatible(other)\n"
|
||||
"\n"
|
||||
" Make this euler compatible with another, so interpolating between them works as intended.\n"
|
||||
" Make this euler compatible with another,\n"
|
||||
" so interpolating between them works as intended.\n"
|
||||
"\n"
|
||||
" .. note:: the rotation order is not taken into account for this function.\n"
|
||||
);
|
||||
@@ -279,7 +281,8 @@ PyDoc_STRVAR(Euler_copy_doc,
|
||||
" :return: A copy of the euler.\n"
|
||||
" :rtype: :class:`Euler`\n"
|
||||
"\n"
|
||||
" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n"
|
||||
" .. note:: use this to get a copy of a wrapped euler with\n"
|
||||
" no reference to the original data.\n"
|
||||
);
|
||||
static PyObject *Euler_copy(EulerObject *self)
|
||||
{
|
||||
|
||||
@@ -195,7 +195,8 @@ PyDoc_STRVAR(C_Matrix_Rotation_doc,
|
||||
" :type angle: float\n"
|
||||
" :arg size: The size of the rotation matrix to construct [2, 4].\n"
|
||||
" :type size: int\n"
|
||||
" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
|
||||
" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object\n"
|
||||
" (optional when size is 2).\n"
|
||||
" :type axis: string or :class:`Vector`\n"
|
||||
" :return: A new rotation matrix.\n"
|
||||
" :rtype: :class:`Matrix`\n"
|
||||
@@ -407,7 +408,9 @@ PyDoc_STRVAR(C_Matrix_OrthoProjection_doc,
|
||||
"\n"
|
||||
" Create a matrix to represent an orthographic projection.\n"
|
||||
"\n"
|
||||
" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix. Or a vector for an arbitrary axis\n"
|
||||
" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'],\n"
|
||||
" where a single axis is for a 2D matrix.\n"
|
||||
" Or a vector for an arbitrary axis\n"
|
||||
" :type axis: string or :class:`Vector`\n"
|
||||
" :arg size: The size of the projection matrix to construct [2, 4].\n"
|
||||
" :type size: int\n"
|
||||
@@ -513,11 +516,13 @@ PyDoc_STRVAR(C_Matrix_Shear_doc,
|
||||
"\n"
|
||||
" Create a matrix to represent an shear transformation.\n"
|
||||
"\n"
|
||||
" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix only.\n"
|
||||
" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'],\n"
|
||||
" where a single axis is for a 2D matrix only.\n"
|
||||
" :type plane: string\n"
|
||||
" :arg size: The size of the shear matrix to construct [2, 4].\n"
|
||||
" :type size: int\n"
|
||||
" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix pass a pair of floats corrasponding with the *plane* axis.\n"
|
||||
" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix\n"
|
||||
" pass a pair of floats corrasponding with the *plane* axis.\n"
|
||||
" :type factor: float or float pair\n"
|
||||
" :return: A new shear matrix.\n"
|
||||
" :rtype: :class:`Matrix`\n"
|
||||
@@ -660,11 +665,15 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self)
|
||||
PyDoc_STRVAR(Matrix_to_euler_doc,
|
||||
".. method:: to_euler(order, euler_compat)\n"
|
||||
"\n"
|
||||
" Return an Euler representation of the rotation matrix (3x3 or 4x4 matrix only).\n"
|
||||
" Return an Euler representation of the rotation matrix\n"
|
||||
" (3x3 or 4x4 matrix only).\n"
|
||||
"\n"
|
||||
" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
|
||||
" :arg order: Optional rotation order argument in\n"
|
||||
" ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
|
||||
" :type order: string\n"
|
||||
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
|
||||
" :arg euler_compat: Optional euler argument the new euler will be made\n"
|
||||
" compatible with (no axis flipping between them).\n"
|
||||
" Useful for converting a series of matrices to animation curves.\n"
|
||||
" :type euler_compat: :class:`Euler`\n"
|
||||
" :return: Euler representation of the matrix.\n"
|
||||
" :rtype: :class:`Euler`\n"
|
||||
@@ -1174,7 +1183,8 @@ PyDoc_STRVAR(Matrix_identity_doc,
|
||||
"\n"
|
||||
" Set the matrix to the identity matrix.\n"
|
||||
"\n"
|
||||
" .. note:: An object with zero location and rotation, a scale of one, will have an identity matrix.\n"
|
||||
" .. note:: An object with zero location and rotation, a scale of one,\n"
|
||||
" will have an identity matrix.\n"
|
||||
"\n"
|
||||
" .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n"
|
||||
);
|
||||
|
||||
@@ -72,9 +72,12 @@ PyDoc_STRVAR(Quaternion_to_euler_doc,
|
||||
"\n"
|
||||
" Return Euler representation of the quaternion.\n"
|
||||
"\n"
|
||||
" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
|
||||
" :arg order: Optional rotation order argument in\n"
|
||||
" ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
|
||||
" :type order: string\n"
|
||||
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
|
||||
" :arg euler_compat: Optional euler argument the new euler will be made\n"
|
||||
" compatible with (no axis flipping between them).\n"
|
||||
" Useful for converting a series of matrices to animation curves.\n"
|
||||
" :type euler_compat: :class:`Euler`\n"
|
||||
" :return: Euler representation of the quaternion.\n"
|
||||
" :rtype: :class:`Euler`\n"
|
||||
@@ -417,7 +420,8 @@ PyDoc_STRVAR(Quaternion_copy_doc,
|
||||
" :return: A copy of the quaternion.\n"
|
||||
" :rtype: :class:`Quaternion`\n"
|
||||
"\n"
|
||||
" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n"
|
||||
" .. note:: use this to get a copy of a wrapped quaternion with\n"
|
||||
" no reference to the original data.\n"
|
||||
);
|
||||
static PyObject *Quaternion_copy(QuaternionObject *self)
|
||||
{
|
||||
|
||||
@@ -107,9 +107,11 @@ PyDoc_STRVAR(Vector_normalize_doc,
|
||||
"\n"
|
||||
" Normalize the vector, making the length of the vector always 1.0.\n"
|
||||
"\n"
|
||||
" .. warning:: Normalizing a vector where all values are zero results in all axis having a nan value (not a number).\n"
|
||||
" .. warning:: Normalizing a vector where all values are zero results\n"
|
||||
" in all axis having a nan value (not a number).\n"
|
||||
"\n"
|
||||
" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n"
|
||||
" .. note:: Normalize works for vectors of all sizes,\n"
|
||||
" however 4D Vectors w axis is left untouched.\n"
|
||||
);
|
||||
static PyObject *Vector_normalize(VectorObject *self)
|
||||
{
|
||||
@@ -565,7 +567,8 @@ PyDoc_STRVAR(Vector_angle_doc,
|
||||
"\n"
|
||||
" :arg other: another vector to compare the angle with\n"
|
||||
" :type other: :class:`Vector`\n"
|
||||
" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n"
|
||||
" :arg fallback: return this value when the angle cant be calculated\n"
|
||||
" (zero length vector)\n"
|
||||
" :type fallback: any\n"
|
||||
" :return: angle in radians or fallback when given\n"
|
||||
" :rtype: float\n"
|
||||
@@ -618,7 +621,8 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args)
|
||||
PyDoc_STRVAR(Vector_rotation_difference_doc,
|
||||
".. function:: difference(other)\n"
|
||||
"\n"
|
||||
" Returns a quaternion representing the rotational difference between this vector and another.\n"
|
||||
" Returns a quaternion representing the rotational difference between this\n"
|
||||
" vector and another.\n"
|
||||
"\n"
|
||||
" :arg other: second vector.\n"
|
||||
" :type other: :class:`Vector`\n"
|
||||
@@ -764,7 +768,8 @@ PyDoc_STRVAR(Vector_copy_doc,
|
||||
" :return: A copy of the vector.\n"
|
||||
" :rtype: :class:`Vector`\n"
|
||||
"\n"
|
||||
" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n"
|
||||
" .. note:: use this to get a copy of a wrapped vector with\n"
|
||||
" no reference to the original data.\n"
|
||||
);
|
||||
static PyObject *Vector_copy(VectorObject *self)
|
||||
{
|
||||
|
||||
@@ -239,7 +239,7 @@ void BPy_init_modules( void )
|
||||
PyObject *mod;
|
||||
|
||||
/* Needs to be first since this dir is needed for future modules */
|
||||
char *modpath= BLI_get_folder(BLENDER_SCRIPTS, "modules");
|
||||
char *modpath= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, "modules");
|
||||
if(modpath) {
|
||||
// printf("bpy: found module path '%s'.\n", modpath);
|
||||
PyObject *sys_path= PySys_GetObject("path"); /* borrow */
|
||||
|
||||
@@ -197,7 +197,7 @@ void BPY_python_start(int argc, const char **argv)
|
||||
PyImport_ExtendInittab(bpy_internal_modules);
|
||||
|
||||
/* allow to use our own included python */
|
||||
PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL));
|
||||
PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL));
|
||||
|
||||
/* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse
|
||||
* from the 'sysconfig' module which is used by 'site', so for now disable site.
|
||||
|
||||
@@ -340,7 +340,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
|
||||
// printf(" %s\n", item_str);
|
||||
|
||||
if(item_str) {
|
||||
ID *id= BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag);
|
||||
ID *id= BLO_library_append_named_part(mainl, &(self->blo_handle), item_str, code);
|
||||
if(id) {
|
||||
#ifdef USE_RNA_DATABLOCKS
|
||||
PointerRNA id_ptr;
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
|
||||
#include "../generic/py_capi_utils.h"
|
||||
|
||||
extern BPy_StructRNA *bpy_context_module;
|
||||
|
||||
static EnumPropertyItem property_flag_items[]= {
|
||||
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
|
||||
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
|
||||
@@ -741,6 +743,95 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i
|
||||
return items;
|
||||
}
|
||||
|
||||
static EnumPropertyItem *bpy_props_enum_itemf(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, int *free)
|
||||
{
|
||||
PyGILState_STATE gilstate;
|
||||
|
||||
PyObject *py_func= RNA_property_enum_py_data_get(prop);
|
||||
PyObject *self= NULL;
|
||||
PyObject *args;
|
||||
PyObject *items; /* returned from the function call */
|
||||
|
||||
EnumPropertyItem *eitems= NULL;
|
||||
int err= 0;
|
||||
|
||||
bpy_context_set(C, &gilstate);
|
||||
|
||||
args= PyTuple_New(2);
|
||||
|
||||
/* first get self */
|
||||
/* operators can store their own instance for later use */
|
||||
if(ptr->data) {
|
||||
void **instance = RNA_struct_instance(ptr);
|
||||
|
||||
if(instance) {
|
||||
if(*instance) {
|
||||
self= *instance;
|
||||
Py_INCREF(self);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(self == NULL) {
|
||||
self= pyrna_struct_CreatePyObject(ptr);
|
||||
}
|
||||
|
||||
PyTuple_SET_ITEM(args, 0, self);
|
||||
|
||||
/* now get the context */
|
||||
PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module);
|
||||
Py_INCREF(bpy_context_module);
|
||||
|
||||
items= PyObject_CallObject(py_func, args);
|
||||
|
||||
Py_DECREF(args);
|
||||
|
||||
if(items==NULL) {
|
||||
err= -1;
|
||||
}
|
||||
else {
|
||||
PyObject *items_fast;
|
||||
int defvalue_dummy=0;
|
||||
|
||||
if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): return value from the callback was not a sequence"))) {
|
||||
err= -1;
|
||||
}
|
||||
else {
|
||||
eitems= enum_items_from_py(items_fast, NULL, &defvalue_dummy, (RNA_property_flag(prop) & PROP_ENUM_FLAG)!=0);
|
||||
|
||||
Py_DECREF(items_fast);
|
||||
|
||||
if(!eitems) {
|
||||
err= -1;
|
||||
}
|
||||
}
|
||||
|
||||
Py_DECREF(items);
|
||||
}
|
||||
|
||||
if(err != -1) { /* worked */
|
||||
*free= 1;
|
||||
}
|
||||
else {
|
||||
/* since we return to C code we can't leave the error */
|
||||
PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(py_func);
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
|
||||
/* use py style error */
|
||||
fprintf(stderr, "File \"%s\", line %d, in %s\n",
|
||||
_PyUnicode_AsString(f_code->co_filename),
|
||||
f_code->co_firstlineno,
|
||||
_PyUnicode_AsString(((PyFunctionObject *)py_func)->func_name)
|
||||
);
|
||||
|
||||
eitems= DummyRNA_NULL_items;
|
||||
}
|
||||
|
||||
|
||||
bpy_context_clear(C, &gilstate);
|
||||
return eitems;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(BPy_EnumProperty_doc,
|
||||
".. function:: EnumProperty(items, name=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n"
|
||||
"\n"
|
||||
@@ -748,12 +839,19 @@ PyDoc_STRVAR(BPy_EnumProperty_doc,
|
||||
"\n"
|
||||
BPY_PROPDEF_NAME_DOC
|
||||
BPY_PROPDEF_DESC_DOC
|
||||
" :arg default: The default value for this enum, A string when *ENUM_FLAG* is disabled otherwise a set which may only contain string identifiers used in *items*.\n"
|
||||
" :arg default: The default value for this enum, A string when *ENUM_FLAG*\n"
|
||||
" is disabled otherwise a set which may only contain string identifiers\n"
|
||||
" used in *items*.\n"
|
||||
" :type default: string or set\n"
|
||||
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE', 'ENUM_FLAG'].\n"
|
||||
" :type options: set\n"
|
||||
" :arg items: sequence of enum items formatted: [(identifier, name, description), ...] where the identifier is used for python access and other values are used for the interface.\n"
|
||||
" :type items: sequence of string triplets\n"
|
||||
" :arg items: sequence of enum items formatted:\n"
|
||||
" [(identifier, name, description), ...] where the identifier is used\n"
|
||||
" for python access and other values are used for the interface.\n"
|
||||
" For dynamic values a callback can be passed which returns a list in\n"
|
||||
" the same format as the static list.\n"
|
||||
" This function must take 2 arguments (self, context)\n"
|
||||
" :type items: sequence of string triplets or a function\n"
|
||||
);
|
||||
static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
|
||||
{
|
||||
@@ -772,6 +870,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
|
||||
PropertyRNA *prop;
|
||||
PyObject *pyopts= NULL;
|
||||
int opts=0;
|
||||
short is_itemf= FALSE;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kw,
|
||||
"s#O|ssOO!:EnumProperty",
|
||||
@@ -784,26 +883,58 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
|
||||
|
||||
BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items)
|
||||
|
||||
if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items"))) {
|
||||
return NULL;
|
||||
/* items can be a list or a callable */
|
||||
if(PyFunction_Check(items)) { /* dont use PyCallable_Check because we need the function code for errors */
|
||||
PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(items);
|
||||
if(f_code->co_argcount != 2) {
|
||||
PyErr_Format(PyExc_ValueError,
|
||||
"EnumProperty(...): expected 'items' function to take 2 arguments, not %d",
|
||||
f_code->co_argcount);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(def) {
|
||||
/* note, using type error here is odd but python does this for invalid arguments */
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"EnumProperty(...): 'default' can't be set when 'items' is a function");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
is_itemf= TRUE;
|
||||
eitems= DummyRNA_NULL_items;
|
||||
}
|
||||
else {
|
||||
if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items or a function"))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0);
|
||||
eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0);
|
||||
|
||||
Py_DECREF(items_fast);
|
||||
Py_DECREF(items_fast);
|
||||
|
||||
if(!eitems)
|
||||
return NULL;
|
||||
if(!eitems) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if(opts & PROP_ENUM_FLAG) prop= RNA_def_enum_flag(srna, id, eitems, defvalue, name, description);
|
||||
else prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
|
||||
|
||||
if(is_itemf) {
|
||||
RNA_def_enum_funcs(prop, bpy_props_enum_itemf);
|
||||
RNA_def_enum_py_data(prop, (void *)items);
|
||||
/* Py_INCREF(items); */ /* watch out!, if user is tricky they can probably crash blender if they manage to free the callback, take care! */
|
||||
}
|
||||
|
||||
if(pyopts) {
|
||||
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
|
||||
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
|
||||
}
|
||||
RNA_def_property_duplicate_pointers(srna, prop);
|
||||
MEM_freeN(eitems);
|
||||
|
||||
if(is_itemf == FALSE) {
|
||||
MEM_freeN(eitems);
|
||||
}
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
@@ -2530,12 +2530,14 @@ static PyMappingMethods pyrna_struct_as_mapping= {
|
||||
PyDoc_STRVAR(pyrna_struct_keys_doc,
|
||||
".. method:: keys()\n"
|
||||
"\n"
|
||||
" Returns the keys of this objects custom properties (matches pythons dictionary function of the same name).\n"
|
||||
" Returns the keys of this objects custom properties (matches pythons\n"
|
||||
" dictionary function of the same name).\n"
|
||||
"\n"
|
||||
" :return: custom property keys.\n"
|
||||
" :rtype: list of strings\n"
|
||||
"\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes\n"
|
||||
" support custom properties.\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self)
|
||||
{
|
||||
@@ -2557,12 +2559,14 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_struct_items_doc,
|
||||
".. method:: items()\n"
|
||||
"\n"
|
||||
" Returns the items of this objects custom properties (matches pythons dictionary function of the same name).\n"
|
||||
" Returns the items of this objects custom properties (matches pythons\n"
|
||||
" dictionary function of the same name).\n"
|
||||
"\n"
|
||||
" :return: custom property key, value pairs.\n"
|
||||
" :rtype: list of key, value tuples\n"
|
||||
"\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n"
|
||||
" classes support custom properties.\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_items(BPy_PropertyRNA *self)
|
||||
{
|
||||
@@ -2584,12 +2588,14 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_struct_values_doc,
|
||||
".. method:: values()\n"
|
||||
"\n"
|
||||
" Returns the values of this objects custom properties (matches pythons dictionary function of the same name).\n"
|
||||
" Returns the values of this objects custom properties (matches pythons\n"
|
||||
" dictionary function of the same name).\n"
|
||||
"\n"
|
||||
" :return: custom property values.\n"
|
||||
" :rtype: list\n"
|
||||
"\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n"
|
||||
" classes support custom properties.\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
|
||||
{
|
||||
@@ -2688,7 +2694,8 @@ PyDoc_STRVAR(pyrna_struct_path_resolve_doc,
|
||||
"\n"
|
||||
" :arg path: path which this property resolves.\n"
|
||||
" :type path: string\n"
|
||||
" :arg coerce: optional argument, when True, the property will be converted into its python representation.\n"
|
||||
" :arg coerce: optional argument, when True, the property will be converted\n"
|
||||
" into its python representation.\n"
|
||||
" :type coerce: boolean\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
|
||||
@@ -2743,9 +2750,11 @@ PyDoc_STRVAR(pyrna_struct_path_from_id_doc,
|
||||
"\n"
|
||||
" Returns the data path from the ID to this object (string).\n"
|
||||
"\n"
|
||||
" :arg property: Optional property name which can be used if the path is to a property of this object.\n"
|
||||
" :arg property: Optional property name which can be used if the path is\n"
|
||||
" to a property of this object.\n"
|
||||
" :type property: string\n"
|
||||
" :return: The path from :class:`bpy_struct.id_data` to this struct and property (when given).\n"
|
||||
" :return: The path from :class:`bpy_struct.id_data`\n"
|
||||
" to this struct and property (when given).\n"
|
||||
" :rtype: str\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
|
||||
@@ -2827,7 +2836,8 @@ static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_struct_type_recast_doc,
|
||||
".. method:: type_recast()\n"
|
||||
"\n"
|
||||
" Return a new instance, this is needed because types such as textures can be changed at runtime.\n"
|
||||
" Return a new instance, this is needed because types\n"
|
||||
" such as textures can be changed at runtime.\n"
|
||||
"\n"
|
||||
" :return: a new instance of this object with the type initialized again.\n"
|
||||
" :rtype: subclass of :class:`bpy_struct`\n"
|
||||
@@ -3091,7 +3101,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
|
||||
* >>> bpy.types.Scene.foo= BoolProperty()
|
||||
* >>> bpy.types.Scene.foo
|
||||
* <bpy_struct, BooleanProperty("foo")>
|
||||
* ...rather then returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
|
||||
* ...rather than returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
|
||||
*
|
||||
* Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
|
||||
#if 0
|
||||
@@ -3437,7 +3447,8 @@ static PyGetSetDef pyrna_struct_getseters[]= {
|
||||
PyDoc_STRVAR(pyrna_prop_collection_keys_doc,
|
||||
".. method:: keys()\n"
|
||||
"\n"
|
||||
" Return the identifiers of collection members (matching pythons dict.keys() functionality).\n"
|
||||
" Return the identifiers of collection members\n"
|
||||
" (matching pythons dict.keys() functionality).\n"
|
||||
"\n"
|
||||
" :return: the identifiers for each member of this collection.\n"
|
||||
" :rtype: list of stings\n"
|
||||
@@ -3470,7 +3481,8 @@ static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_prop_collection_items_doc,
|
||||
".. method:: items()\n"
|
||||
"\n"
|
||||
" Return the identifiers of collection members (matching pythons dict.items() functionality).\n"
|
||||
" Return the identifiers of collection members\n"
|
||||
" (matching pythons dict.items() functionality).\n"
|
||||
"\n"
|
||||
" :return: (key, value) pairs for each member of this collection.\n"
|
||||
" :rtype: list of tuples\n"
|
||||
@@ -3511,7 +3523,8 @@ static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_prop_collection_values_doc,
|
||||
".. method:: values()\n"
|
||||
"\n"
|
||||
" Return the values of collection (matching pythons dict.values() functionality).\n"
|
||||
" Return the values of collection\n"
|
||||
" (matching pythons dict.values() functionality).\n"
|
||||
"\n"
|
||||
" :return: the members of this collection.\n"
|
||||
" :rtype: list\n"
|
||||
@@ -3525,14 +3538,17 @@ static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self)
|
||||
PyDoc_STRVAR(pyrna_struct_get_doc,
|
||||
".. method:: get(key, default=None)\n"
|
||||
"\n"
|
||||
" Returns the value of the custom property assigned to key or default when not found (matches pythons dictionary function of the same name).\n"
|
||||
" Returns the value of the custom property assigned to key or default\n"
|
||||
" when not found (matches pythons dictionary function of the same name).\n"
|
||||
"\n"
|
||||
" :arg key: The key assosiated with the custom property.\n"
|
||||
" :type key: string\n"
|
||||
" :arg default: Optional argument for the value to return if *key* is not found.\n"
|
||||
" :arg default: Optional argument for the value to return if\n"
|
||||
" *key* is not found.\n"
|
||||
" :type default: Undefined\n"
|
||||
"\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"
|
||||
" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n"
|
||||
" classes support custom properties.\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
|
||||
{
|
||||
@@ -3571,7 +3587,8 @@ PyDoc_STRVAR(pyrna_struct_as_pointer_doc,
|
||||
" :return: int (memory address).\n"
|
||||
" :rtype: int\n"
|
||||
"\n"
|
||||
" .. note:: This is intended only for advanced script writers who need to pass blender data to their own C/Python modules.\n"
|
||||
" .. note:: This is intended only for advanced script writers who need to\n"
|
||||
" pass blender data to their own C/Python modules.\n"
|
||||
);
|
||||
static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self)
|
||||
{
|
||||
@@ -3581,11 +3598,13 @@ static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self)
|
||||
PyDoc_STRVAR(pyrna_prop_collection_get_doc,
|
||||
".. method:: get(key, default=None)\n"
|
||||
"\n"
|
||||
" Returns the value of the item assigned to key or default when not found (matches pythons dictionary function of the same name).\n"
|
||||
" Returns the value of the item assigned to key or default when not found\n"
|
||||
" (matches pythons dictionary function of the same name).\n"
|
||||
"\n"
|
||||
" :arg key: The identifier for the collection member.\n"
|
||||
" :type key: string\n"
|
||||
" :arg default: Optional argument for the value to return if *key* is not found.\n"
|
||||
" :arg default: Optional argument for the value to return if\n"
|
||||
" *key* is not found.\n"
|
||||
" :type default: Undefined\n"
|
||||
);
|
||||
static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args)
|
||||
@@ -5498,7 +5517,7 @@ PyObject *BPY_rna_module(void)
|
||||
BPy_StructRNA *pyrna;
|
||||
PointerRNA ptr;
|
||||
|
||||
/* for now, return the base RNA type rather then a real module */
|
||||
/* for now, return the base RNA type rather than a real module */
|
||||
RNA_main_pointer_create(G.main, &ptr);
|
||||
pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
|
||||
|
||||
@@ -5518,7 +5537,7 @@ PyObject *BPY_rna_doc(void)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
|
||||
/* for now, return the base RNA type rather then a real module */
|
||||
/* for now, return the base RNA type rather than a real module */
|
||||
RNA_blender_rna_pointer_create(&ptr);
|
||||
|
||||
return pyrna_struct_CreatePyObject(&ptr);
|
||||
@@ -5863,7 +5882,6 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
|
||||
PyObject *py_class= (PyObject*)py_data;
|
||||
PyObject *base_class= RNA_struct_py_type_get(srna);
|
||||
PyObject *item;
|
||||
PyObject *py_arg_count;
|
||||
int i, flag, arg_count, func_arg_count;
|
||||
const char *py_class_name= ((PyTypeObject *)py_class)->tp_name; // __name__
|
||||
|
||||
@@ -5926,9 +5944,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
|
||||
func_arg_count= rna_function_arg_count(func);
|
||||
|
||||
if (func_arg_count >= 0) { /* -1 if we dont care*/
|
||||
py_arg_count= PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
|
||||
arg_count= PyLong_AsLong(py_arg_count);
|
||||
Py_DECREF(py_arg_count);
|
||||
arg_count= ((PyCodeObject *)PyFunction_GET_CODE(item))->co_argcount;
|
||||
|
||||
/* note, the number of args we check for and the number of args we give to
|
||||
* @classmethods are different (quirk of python), this is why rna_function_arg_count() doesn't return the value -1*/
|
||||
@@ -6362,11 +6378,15 @@ void pyrna_free_types(void)
|
||||
PyDoc_STRVAR(pyrna_register_class_doc,
|
||||
".. method:: register_class(cls)\n"
|
||||
"\n"
|
||||
" Register a subclass of a blender type in (:class:`Panel`, :class:`Menu`, :class:`Header`, :class:`Operator`, :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
|
||||
" Register a subclass of a blender type in (:class:`Panel`,\n"
|
||||
" :class:`Menu`, :class:`Header`, :class:`Operator`,\n"
|
||||
" :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
|
||||
"\n"
|
||||
" If the class has a *register* class method it will be called before registration.\n"
|
||||
" If the class has a *register* class method it will be called\n"
|
||||
" before registration.\n"
|
||||
"\n"
|
||||
" .. note:: :exc:`ValueError` exception is raised if the class is not a subclass of a registerable blender class.\n"
|
||||
" .. note:: :exc:`ValueError` exception is raised if the class is not a\n"
|
||||
" subclass of a registerable blender class.\n"
|
||||
"\n"
|
||||
);
|
||||
PyMethodDef meth_bpy_register_class= {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
|
||||
@@ -6492,7 +6512,8 @@ PyDoc_STRVAR(pyrna_unregister_class_doc,
|
||||
"\n"
|
||||
" Unload the python class from blender.\n"
|
||||
"\n"
|
||||
" If the class has an *unregister* class method it will be called before unregistering.\n"
|
||||
" If the class has an *unregister* class method it will be called\n"
|
||||
" before unregistering.\n"
|
||||
);
|
||||
PyMethodDef meth_bpy_unregister_class= {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
|
||||
static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/* support for inter references, currently only needed for corner case */
|
||||
#define USE_PYRNA_STRUCT_REFERENCE
|
||||
|
||||
/* use real collection iterators rather then faking with a list */
|
||||
/* use real collection iterators rather than faking with a list */
|
||||
#define USE_PYRNA_ITER
|
||||
|
||||
#else /* WITH_PYTHON_SAFETY */
|
||||
|
||||
Reference in New Issue
Block a user