[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33462] trunk/blender/source/blender/ python/intern/bpy_rna.c: disallow setting RNA attributes while drawing, this is bad practice so enforcing here has the benifit of making sure people are not m

Doug Hammond doughammond at hamsterfight.co.uk
Tue Dec 7 22:48:30 CET 2010


Actually, the bigger problem that I just forgot about is that using blender
lamps in LuxRender is now completely broken too.

Cheers,
Doug.


On 7 December 2010 19:43, Doug Hammond <doughammond at hamsterfight.co.uk>wrote:

> Is there an alternative mechanism for achieving the same result available?
> From this revision onwards I've lost the ability to set the object's colour
> from the LuxRender material editor, which is something our users find really
> useful.
>
> TBH, I'm a bit peeved that something like this would be disabled without
> discussion with addon developers and without a reasonable alternative API in
> place.
>
>
> Cheers,
> Doug.
>
>
> On 4 December 2010 06:25, Campbell Barton <ideasman42 at gmail.com> wrote:
>
>> Revision: 33462
>>
>> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33462
>> Author:   campbellbarton
>> Date:     2010-12-04 07:25:36 +0100 (Sat, 04 Dec 2010)
>>
>> Log Message:
>> -----------
>> disallow setting RNA attributes while drawing, this is bad practice so
>> enforcing here has the benifit of making sure people are not manipulating
>> blender scene data in a drawing panel for eg.
>>
>> This is ifdef'd and may be disabled later on, or only enabled in debug
>> mode.
>>
>> This applies to setting any RNA value that has an ID and is not a screen
>> or window-manager datablock.
>>
>> Some addons break this rule and need fixing but from my tests blender UI
>> scripts are ok.
>>
>> Modified Paths:
>> --------------
>>    trunk/blender/source/blender/python/intern/bpy_rna.c
>>
>> Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
>> ===================================================================
>> --- trunk/blender/source/blender/python/intern/bpy_rna.c        2010-12-04
>> 06:21:08 UTC (rev 33461)
>> +++ trunk/blender/source/blender/python/intern/bpy_rna.c        2010-12-04
>> 06:25:36 UTC (rev 33462)
>> @@ -50,6 +50,7 @@
>>  #include "DNA_anim_types.h"
>>  #include "ED_keyframing.h"
>>
>> +#define USE_PEDANTIC_WRITE
>>  #define USE_MATHUTILS
>>  #define USE_STRING_COERCE
>>
>> @@ -67,7 +68,32 @@
>>
>>  /* bpyrna vector/euler/quat callbacks */
>>  static int mathutils_rna_array_cb_index= -1; /* index for our callbacks
>> */
>> +#ifdef USE_PEDANTIC_WRITE
>> +static short rna_disallow_writes= FALSE;
>>
>> +static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
>> +{
>> +       ID *id= ptr->id.data;
>> +       if(id) {
>> +               const short idcode= GS(id->name);
>> +               if(!ELEM(idcode, ID_WM, ID_SCR)) { /* may need more added
>> here */
>> +                       const char *idtype= BKE_idcode_to_name(idcode);
>> +                       const char *pyname;
>> +                       if(key && PyUnicode_Check(key)) pyname=
>> _PyUnicode_AsString(key);
>> +                       else
>>      pyname= "<UNKNOWN>";
>> +
>> +                       /* make a nice string error */
>> +                       assert(idtype != NULL);
>> +                       PyErr_Format(PyExc_RuntimeError, "Writing to ID
>> classes in this context is not allowed: %.200s, %.200s datablock, error
>> setting %.200s.%.200s", id->name+2, idtype,
>> RNA_struct_identifier(ptr->type), pyname);
>> +
>> +                       return TRUE;
>> +               }
>> +       }
>> +       return FALSE;
>> +}
>> +
>> +#endif
>> +
>>  /* subtype not used much yet */
>>  #define MATHUTILS_CB_SUBTYPE_EUL 0
>>  #define MATHUTILS_CB_SUBTYPE_VEC 1
>> @@ -104,7 +130,13 @@
>>        float min, max;
>>        if(self->prop==NULL)
>>                return 0;
>> -
>> +
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
>> +               return 0;
>> +       }
>> +#endif
>> +
>>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>>                PyErr_Format(PyExc_AttributeError, "bpy_prop
>> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
>> RNA_property_identifier(self->prop));
>>                return 0;
>> @@ -157,6 +189,12 @@
>>        if(self->prop==NULL)
>>                return 0;
>>
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
>> +               return 0;
>> +       }
>> +#endif
>> +
>>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>>                PyErr_Format(PyExc_AttributeError, "bpy_prop
>> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
>> RNA_property_identifier(self->prop));
>>                return 0;
>> @@ -201,7 +239,13 @@
>>
>>        if(self->prop==NULL)
>>                return 0;
>> -
>> +
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
>> +               return 0;
>> +       }
>> +#endif
>> +
>>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>>                PyErr_Format(PyExc_AttributeError, "bpy_prop
>> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
>> RNA_property_identifier(self->prop));
>>                return 0;
>> @@ -1903,6 +1947,12 @@
>>  {
>>        IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
>>
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
>> +               return -1;
>> +       }
>> +#endif
>> +
>>        if(group==NULL) {
>>                PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id
>> properties not supported for this type");
>>                return -1;
>> @@ -2727,6 +2777,12 @@
>>        char *name = _PyUnicode_AsString(pyname);
>>        PropertyRNA *prop= NULL;
>>
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname))
>> {
>> +               return -1;
>> +       }
>> +#endif
>> +
>>        if(name == NULL) {
>>                PyErr_SetString(PyExc_AttributeError, "bpy_struct:
>> __setattr__ must be a string");
>>                return -1;
>> @@ -2840,6 +2896,12 @@
>>        PropertyRNA *prop;
>>        PointerRNA r_ptr;
>>
>> +#ifdef USE_PEDANTIC_WRITE
>> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname))
>> {
>> +               return -1;
>> +       }
>> +#endif
>> +
>>        if(name == NULL) {
>>                PyErr_SetString(PyExc_AttributeError, "bpy_prop:
>> __setattr__ must be a string");
>>                return -1;
>> @@ -5080,7 +5142,11 @@
>>        PyGILState_STATE gilstate;
>>
>>        bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
>> -
>> +#ifdef USE_PEDANTIC_WRITE
>> +       /* testing, for correctness, not operator and not draw function */
>> +       const short is_readonly= strstr("draw",
>> RNA_function_identifier(func)) || !RNA_struct_is_a(ptr->type,
>> &RNA_Operator);
>> +#endif
>> +
>>        py_class= RNA_struct_py_type_get(ptr->type);
>>
>>        /* rare case. can happen when registering subclasses */
>> @@ -5177,8 +5243,19 @@
>>                                i++;
>>                        }
>>
>> +#ifdef USE_PEDANTIC_WRITE
>> +                       rna_disallow_writes= is_readonly ? TRUE:FALSE;
>> +#endif
>> +                       /* *** Main Caller *** */
>> +
>>                        ret = PyObject_Call(item, args, NULL);
>>
>> +                       /* *** Done Calling *** */
>> +
>> +#ifdef USE_PEDANTIC_WRITE
>> +                       rna_disallow_writes= FALSE;
>> +#endif
>> +
>>                        RNA_parameter_list_end(&iter);
>>                        Py_DECREF(item);
>>                        Py_DECREF(args);
>>
>>
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
>
>


More information about the Bf-committers mailing list