2010-01-19 00:59:36 +00:00
/**
* $ Id $
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2010-01-19 00:59:36 +00:00
*
* Contributor ( s ) : Campbell Barton
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2011-02-14 04:15:25 +00:00
# include <Python.h>
2010-01-19 00:59:36 +00:00
# include "bpy_props.h"
# include "bpy_rna.h"
2010-02-01 10:51:34 +00:00
# include "bpy_util.h"
2010-01-19 00:59:36 +00:00
2011-01-07 18:36:47 +00:00
# include "BLI_utildefines.h"
2010-01-19 00:59:36 +00:00
# include "RNA_define.h" /* for defining our own rna */
2010-02-02 23:03:56 +00:00
# include "RNA_enum_types.h"
2010-01-19 00:59:36 +00:00
# include "MEM_guardedalloc.h"
2010-09-01 14:13:48 +00:00
# include "../generic/py_capi_utils.h"
2011-02-13 10:52:18 +00:00
static EnumPropertyItem property_flag_items [ ] = {
2010-02-01 22:04:33 +00:00
{ PROP_HIDDEN , " HIDDEN " , 0 , " Hidden " , " " } ,
2010-02-02 00:02:55 +00:00
{ PROP_ANIMATABLE , " ANIMATABLE " , 0 , " Animateable " , " " } ,
2010-02-01 22:04:33 +00:00
{ 0 , NULL , 0 , NULL , NULL } } ;
2011-02-13 10:52:18 +00:00
static EnumPropertyItem property_flag_enum_items [ ] = {
2010-12-13 09:10:16 +00:00
{ PROP_HIDDEN , " HIDDEN " , 0 , " Hidden " , " " } ,
{ PROP_ANIMATABLE , " ANIMATABLE " , 0 , " Animateable " , " " } ,
{ PROP_ENUM_FLAG , " ENUM_FLAG " , 0 , " Enum Flag " , " " } ,
{ 0 , NULL , 0 , NULL , NULL } } ;
2010-02-01 22:04:33 +00:00
/* subtypes */
2011-02-13 10:52:18 +00:00
static EnumPropertyItem property_subtype_string_items [ ] = {
2010-02-01 22:04:33 +00:00
{ PROP_FILEPATH , " FILE_PATH " , 0 , " File Path " , " " } ,
{ PROP_DIRPATH , " DIR_PATH " , 0 , " Directory Path " , " " } ,
{ PROP_FILENAME , " FILENAME " , 0 , " Filename " , " " } ,
{ PROP_NONE , " NONE " , 0 , " None " , " " } ,
{ 0 , NULL , 0 , NULL , NULL } } ;
2011-02-13 10:52:18 +00:00
static EnumPropertyItem property_subtype_number_items [ ] = {
2010-02-01 22:04:33 +00:00
{ PROP_UNSIGNED , " UNSIGNED " , 0 , " Unsigned " , " " } ,
{ PROP_PERCENTAGE , " PERCENTAGE " , 0 , " Percentage " , " " } ,
{ PROP_FACTOR , " FACTOR " , 0 , " Factor " , " " } ,
{ PROP_ANGLE , " ANGLE " , 0 , " Angle " , " " } ,
{ PROP_TIME , " TIME " , 0 , " Time " , " " } ,
{ PROP_DISTANCE , " DISTANCE " , 0 , " Distance " , " " } ,
{ PROP_NONE , " NONE " , 0 , " None " , " " } ,
{ 0 , NULL , 0 , NULL , NULL } } ;
2011-02-13 10:52:18 +00:00
static EnumPropertyItem property_subtype_array_items [ ] = {
2010-02-01 22:04:33 +00:00
{ PROP_COLOR , " COLOR " , 0 , " Color " , " " } ,
{ PROP_TRANSLATION , " TRANSLATION " , 0 , " Translation " , " " } ,
{ PROP_DIRECTION , " DIRECTION " , 0 , " Direction " , " " } ,
{ PROP_VELOCITY , " VELOCITY " , 0 , " Velocity " , " " } ,
{ PROP_ACCELERATION , " ACCELERATION " , 0 , " Acceleration " , " " } ,
{ PROP_MATRIX , " MATRIX " , 0 , " Matrix " , " " } ,
{ PROP_EULER , " EULER " , 0 , " Euler " , " " } ,
{ PROP_QUATERNION , " QUATERNION " , 0 , " Quaternion " , " " } ,
{ PROP_AXISANGLE , " AXISANGLE " , 0 , " Axis Angle " , " " } ,
{ PROP_XYZ , " XYZ " , 0 , " XYZ " , " " } ,
{ PROP_COLOR_GAMMA , " COLOR_GAMMA " , 0 , " Color Gamma " , " " } ,
2010-03-10 20:33:57 +00:00
{ PROP_LAYER , " LAYER " , 0 , " Layer " , " " } ,
2010-02-01 22:04:33 +00:00
{ PROP_NONE , " NONE " , 0 , " None " , " " } ,
{ 0 , NULL , 0 , NULL , NULL } } ;
2010-09-08 10:43:36 +00:00
/* PyObject's */
static PyObject * pymeth_BoolProperty = NULL ;
static PyObject * pymeth_BoolVectorProperty = NULL ;
static PyObject * pymeth_IntProperty = NULL ;
static PyObject * pymeth_IntVectorProperty = NULL ;
static PyObject * pymeth_FloatProperty = NULL ;
static PyObject * pymeth_FloatVectorProperty = NULL ;
static PyObject * pymeth_StringProperty = NULL ;
static PyObject * pymeth_EnumProperty = NULL ;
static PyObject * pymeth_PointerProperty = NULL ;
static PyObject * pymeth_CollectionProperty = NULL ;
static PyObject * pymeth_RemoveProperty = NULL ;
2010-09-10 02:46:29 +00:00
/* operators and classes use this so it can store the args given but defer
* running it until the operator runs where these values are used to setup
* the default args for that operator instance */
2010-09-08 10:43:36 +00:00
static PyObject * bpy_prop_deferred_return ( PyObject * func , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
PyObject * ret = PyTuple_New ( 2 ) ;
2010-09-08 10:43:36 +00:00
PyTuple_SET_ITEM ( ret , 0 , func ) ;
Py_INCREF ( func ) ;
if ( kw = = NULL )
kw = PyDict_New ( ) ;
else
Py_INCREF ( kw ) ;
2010-01-19 00:59:36 +00:00
PyTuple_SET_ITEM ( ret , 1 , kw ) ;
2010-09-08 10:43:36 +00:00
2010-01-19 00:59:36 +00:00
return ret ;
}
2010-09-10 02:46:29 +00:00
/* this define runs at the start of each function and deals with
* returning a deferred property ( to be registed later ) */
2010-09-08 08:48:40 +00:00
# define BPY_PROPDEF_HEAD(_func) \
if ( PyTuple_GET_SIZE ( args ) = = 1 ) { \
PyObject * ret ; \
self = PyTuple_GET_ITEM ( args , 0 ) ; \
args = PyTuple_New ( 0 ) ; \
2010-09-08 10:43:36 +00:00
ret = BPy_ # # _func ( self , args , kw ) ; \
2010-09-08 08:48:40 +00:00
Py_DECREF ( args ) ; \
return ret ; \
} \
2010-09-08 10:43:36 +00:00
else if ( PyTuple_GET_SIZE ( args ) > 1 ) { \
2010-09-08 08:48:40 +00:00
PyErr_SetString ( PyExc_ValueError , " all args must be keywords " ) ; \
return NULL ; \
} \
2010-09-09 06:06:37 +00:00
srna = srna_from_self ( self , # _func " (...): " ) ; \
2010-09-08 10:43:36 +00:00
if ( srna = = NULL ) { \
if ( PyErr_Occurred ( ) ) \
return NULL ; \
return bpy_prop_deferred_return ( ( void * ) pymeth_ # # _func , kw ) ; \
} \
2010-09-08 08:48:40 +00:00
2010-10-22 13:02:41 +00:00
/* terse macros for error checks shared between all funcs cant use function
* calls because of static strins passed to pyrna_set_to_enum_bitfield */
2010-12-13 09:10:16 +00:00
# define BPY_PROPDEF_CHECK(_func, _property_flag_items) \
2010-10-22 13:02:41 +00:00
if ( id_len > = MAX_IDPROP_NAME ) { \
PyErr_Format ( PyExc_TypeError , # _func " (): '%.200s' too long, max length is %d " , id , MAX_IDPROP_NAME - 1 ) ; \
return NULL ; \
} \
if ( RNA_def_property_free_identifier ( srna , id ) = = - 1 ) { \
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , # _func " (): '%s' is defined as a non-dynamic type " , id ) ; \
2010-10-22 13:02:41 +00:00
return NULL ; \
} \
2010-12-13 09:10:16 +00:00
if ( pyopts & & pyrna_set_to_enum_bitfield ( _property_flag_items , pyopts , & opts , # _func " (options={...}): " ) ) \
2010-10-22 13:02:41 +00:00
return NULL ; \
2010-12-13 09:10:16 +00:00
# define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \
BPY_PROPDEF_CHECK ( _func , _property_flag_items ) \
2010-10-22 13:02:41 +00:00
if ( pysubtype & & RNA_enum_value_from_id ( _subtype , pysubtype , & subtype ) = = 0 ) { \
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , # _func " (subtype='%s'): invalid subtype " , pysubtype ) ; \
2010-10-22 13:02:41 +00:00
return NULL ; \
} \
2010-09-08 08:48:40 +00:00
2011-02-15 11:43:35 +00:00
# define BPY_PROPDEF_NAME_DOC \
" :arg name: Name used in the user interface. \n " \
" :type name: string \n " \
# define BPY_PROPDEF_DESC_DOC \
" :arg description: Text used for the tooltip and api documentation. \n " \
" :type description: string \n " \
2010-06-05 15:31:55 +00:00
#if 0
2010-02-17 21:58:08 +00:00
static int bpy_struct_id_used ( StructRNA * srna , char * identifier )
{
PointerRNA ptr ;
RNA_pointer_create ( NULL , srna , NULL , & ptr ) ;
return ( RNA_struct_find_property ( & ptr , identifier ) ! = NULL ) ;
}
2010-06-05 15:31:55 +00:00
# endif
2010-02-17 21:58:08 +00:00
2010-01-19 00:59:36 +00:00
/* Function that sets RNA, NOTE - self is NULL when called from python, but being abused from C so we can pass the srna allong
* This isnt incorrect since its a python object - but be careful */
2010-09-09 06:29:44 +00:00
static char BPy_BoolProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: BoolProperty(name= \" \" , description= \" \" , default=False, options={'ANIMATABLE'}, subtype='NONE') \n "
2010-02-01 22:04:33 +00:00
" \n "
" Returns a new boolean property definition. \n "
2010-01-22 02:04:25 +00:00
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_BoolProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( BoolProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-12-03 17:05:21 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " options " , " subtype " , NULL } ;
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-02-01 22:04:33 +00:00
int def = 0 ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-01-19 00:59:36 +00:00
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssiO!s:BoolProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & def , & PySet_Type , & pyopts , & pysubtype ) )
2010-01-19 00:59:36 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( BoolProperty , property_flag_items , property_subtype_number_items )
2010-10-19 07:23:34 +00:00
2010-02-01 22:04:33 +00:00
prop = RNA_def_property ( srna , id , PROP_BOOLEAN , subtype ) ;
RNA_def_property_boolean_default ( prop , def ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_BoolVectorProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: BoolVectorProperty(name= \" \" , description= \" \" , default=(False, False, False), options={'ANIMATABLE'}, subtype='NONE', size=3) \n "
2010-02-01 10:51:34 +00:00
" \n "
2010-02-01 22:04:33 +00:00
" Returns a new vector boolean property definition. \n "
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
" :arg default: sequence of booleans the length of *size*. \n "
" :type default: sequence \n "
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2010-03-10 20:33:57 +00:00
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
" :arg size: Vector dimensions in [1, and " STRINGIFY ( PYRNA_STACK_ARRAY ) " ]. \n "
" :type size: int \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_BoolVectorProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-02-01 10:51:34 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( BoolVectorProperty )
2010-02-01 10:51:34 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " options " , " subtype " , " size " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-02-01 10:51:34 +00:00
int def [ PYRNA_STACK_ARRAY ] = { 0 } ;
2010-02-01 22:04:33 +00:00
int size = 3 ;
2010-02-01 10:51:34 +00:00
PropertyRNA * prop ;
PyObject * pydef = NULL ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssOO!si:BoolVectorProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & pydef , & PySet_Type , & pyopts , & pysubtype , & size ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( BoolVectorProperty , property_flag_items , property_subtype_array_items )
2010-02-01 10:51:34 +00:00
if ( size < 1 | | size > PYRNA_STACK_ARRAY ) {
2010-10-03 01:44:00 +00:00
PyErr_Format ( PyExc_TypeError , " BoolVectorProperty(size=%d): size must be between 0 and " STRINGIFY ( PYRNA_STACK_ARRAY ) , size ) ;
2010-02-01 10:51:34 +00:00
return NULL ;
}
2010-09-01 14:13:48 +00:00
if ( pydef & & PyC_AsArray ( def , pydef , size , & PyBool_Type , " BoolVectorProperty(default=sequence) " ) < 0 )
2010-02-01 10:51:34 +00:00
return NULL ;
2010-02-01 22:04:33 +00:00
// prop= RNA_def_boolean_array(srna, id, size, pydef ? def:NULL, name, description);
prop = RNA_def_property ( srna , id , PROP_BOOLEAN , subtype ) ;
RNA_def_property_array ( prop , size ) ;
if ( pydef ) RNA_def_property_boolean_array_default ( prop , def ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-02-01 10:51:34 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-02-01 10:51:34 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_IntProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: IntProperty(name= \" \" , description= \" \" , default=0, min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, step=1, options={'ANIMATABLE'}, subtype='NONE') \n "
2010-01-22 02:04:25 +00:00
" \n "
2010-02-01 22:04:33 +00:00
" Returns a new int property definition. \n "
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_IntProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( IntProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " min " , " max " , " soft_min " , " soft_max " , " step " , " options " , " subtype " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-01-19 00:59:36 +00:00
int min = INT_MIN , max = INT_MAX , soft_min = INT_MIN , soft_max = INT_MAX , step = 1 , def = 0 ;
PropertyRNA * prop ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssiiiiiiO!s:IntProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & def , & min , & max , & soft_min , & soft_max , & step , & PySet_Type , & pyopts , & pysubtype ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( IntProperty , property_flag_items , property_subtype_number_items )
2010-01-19 00:59:36 +00:00
2010-02-01 22:04:33 +00:00
prop = RNA_def_property ( srna , id , PROP_INT , subtype ) ;
RNA_def_property_int_default ( prop , def ) ;
RNA_def_property_range ( prop , min , max ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
2010-09-02 14:43:22 +00:00
RNA_def_property_ui_range ( prop , MAX2 ( soft_min , min ) , MIN2 ( soft_max , max ) , step , 3 ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_IntVectorProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: IntVectorProperty(name= \" \" , description= \" \" , default=(0, 0, 0), min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, options={'ANIMATABLE'}, subtype='NONE', size=3) \n "
2010-02-01 10:51:34 +00:00
" \n "
2010-02-01 22:04:33 +00:00
" Returns a new vector int property definition. \n "
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
" :arg default: sequence of ints the length of *size*. \n "
" :type default: sequence \n "
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2010-03-10 20:33:57 +00:00
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
" :arg size: Vector dimensions in [1, and " STRINGIFY ( PYRNA_STACK_ARRAY ) " ]. \n "
" :type size: int \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_IntVectorProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-02-01 10:51:34 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( IntVectorProperty )
2010-02-01 10:51:34 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " min " , " max " , " soft_min " , " soft_max " , " step " , " options " , " subtype " , " size " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-02-01 10:51:34 +00:00
int min = INT_MIN , max = INT_MAX , soft_min = INT_MIN , soft_max = INT_MAX , step = 1 , def [ PYRNA_STACK_ARRAY ] = { 0 } ;
2010-02-01 22:04:33 +00:00
int size = 3 ;
2010-02-01 10:51:34 +00:00
PropertyRNA * prop ;
PyObject * pydef = NULL ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssOiiiiiO!si:IntVectorProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & pydef , & min , & max , & soft_min , & soft_max , & step , & PySet_Type , & pyopts , & pysubtype , & size ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( IntVectorProperty , property_flag_items , property_subtype_array_items )
2010-02-01 10:51:34 +00:00
if ( size < 1 | | size > PYRNA_STACK_ARRAY ) {
2010-10-03 01:44:00 +00:00
PyErr_Format ( PyExc_TypeError , " IntVectorProperty(size=%d): size must be between 0 and " STRINGIFY ( PYRNA_STACK_ARRAY ) , size ) ;
2010-02-01 10:51:34 +00:00
return NULL ;
}
2010-09-01 14:13:48 +00:00
if ( pydef & & PyC_AsArray ( def , pydef , size , & PyLong_Type , " IntVectorProperty(default=sequence) " ) < 0 )
2010-02-01 10:51:34 +00:00
return NULL ;
2010-02-01 22:04:33 +00:00
prop = RNA_def_property ( srna , id , PROP_INT , subtype ) ;
RNA_def_property_array ( prop , size ) ;
if ( pydef ) RNA_def_property_int_array_default ( prop , def ) ;
RNA_def_property_range ( prop , min , max ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
2010-09-02 14:43:22 +00:00
RNA_def_property_ui_range ( prop , MAX2 ( soft_min , min ) , MIN2 ( soft_max , max ) , step , 3 ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-02-01 10:51:34 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-02-01 10:51:34 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_FloatProperty_doc [ ] =
2010-02-02 23:03:56 +00:00
" .. function:: FloatProperty(name= \" \" , description= \" \" , default=0.0, min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', unit='NONE') \n "
2010-01-22 02:04:25 +00:00
" \n "
2010-02-01 22:04:33 +00:00
" Returns a new float property definition. \n "
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE']. \n "
2010-02-02 23:03:56 +00:00
" :type subtype: string \n "
" :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION']. \n "
2011-02-15 11:43:35 +00:00
" :type unit: string \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_FloatProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( FloatProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " min " , " max " , " soft_min " , " soft_max " , " step " , " precision " , " options " , " subtype " , " unit " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-01-19 00:59:36 +00:00
float min = - FLT_MAX , max = FLT_MAX , soft_min = - FLT_MAX , soft_max = FLT_MAX , step = 3 , def = 0.0f ;
2010-02-01 22:04:33 +00:00
int precision = 2 ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-02-02 23:03:56 +00:00
char * pyunit = NULL ;
int unit = PROP_UNIT_NONE ;
2010-02-01 22:04:33 +00:00
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssffffffiO!ss:FloatProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & def , & min , & max , & soft_min , & soft_max , & step , & precision , & PySet_Type , & pyopts , & pysubtype , & pyunit ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-01-19 00:59:36 +00:00
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( FloatProperty , property_flag_items , property_subtype_number_items )
2010-02-01 22:04:33 +00:00
2010-02-02 23:03:56 +00:00
if ( pyunit & & RNA_enum_value_from_id ( property_unit_items , pyunit , & unit ) = = 0 ) {
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , " FloatProperty(unit='%s'): invalid unit " ) ;
2010-02-02 23:03:56 +00:00
return NULL ;
}
prop = RNA_def_property ( srna , id , PROP_FLOAT , subtype | unit ) ;
2010-02-01 22:04:33 +00:00
RNA_def_property_float_default ( prop , def ) ;
RNA_def_property_range ( prop , min , max ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
2010-09-02 14:43:22 +00:00
RNA_def_property_ui_range ( prop , MAX2 ( soft_min , min ) , MIN2 ( soft_max , max ) , step , precision ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_FloatVectorProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: FloatVectorProperty(name= \" \" , description= \" \" , default=(0.0, 0.0, 0.0), min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', size=3) \n "
2010-02-01 22:04:33 +00:00
" \n "
" Returns a new vector float property definition. \n "
2010-01-22 02:04:25 +00:00
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
" :arg default: sequence of floats the length of *size*. \n "
" :type default: sequence \n "
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2010-03-10 20:33:57 +00:00
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
" :arg size: Vector dimensions in [1, and " STRINGIFY ( PYRNA_STACK_ARRAY ) " ]. \n "
" :type size: int \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_FloatVectorProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( FloatVectorProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " min " , " max " , " soft_min " , " soft_max " , " step " , " precision " , " options " , " subtype " , " size " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-01-19 00:59:36 +00:00
float min = - FLT_MAX , max = FLT_MAX , soft_min = - FLT_MAX , soft_max = FLT_MAX , step = 3 , def [ PYRNA_STACK_ARRAY ] = { 0.0f } ;
2010-02-01 22:04:33 +00:00
int precision = 2 , size = 3 ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
PyObject * pydef = NULL ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-01-19 00:59:36 +00:00
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|ssOfffffiO!si:FloatVectorProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & pydef , & min , & max , & soft_min , & soft_max , & step , & precision , & PySet_Type , & pyopts , & pysubtype , & size ) )
2010-01-19 00:59:36 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( FloatVectorProperty , property_flag_items , property_subtype_array_items )
2010-02-01 22:04:33 +00:00
2010-02-01 10:51:34 +00:00
if ( size < 1 | | size > PYRNA_STACK_ARRAY ) {
2010-10-03 01:44:00 +00:00
PyErr_Format ( PyExc_TypeError , " FloatVectorProperty(size=%d): size must be between 0 and " STRINGIFY ( PYRNA_STACK_ARRAY ) , size ) ;
2010-01-19 00:59:36 +00:00
return NULL ;
}
2010-09-01 14:13:48 +00:00
if ( pydef & & PyC_AsArray ( def , pydef , size , & PyFloat_Type , " FloatVectorProperty(default=sequence) " ) < 0 )
2010-02-01 10:51:34 +00:00
return NULL ;
2010-01-19 00:59:36 +00:00
2010-02-01 22:04:33 +00:00
prop = RNA_def_property ( srna , id , PROP_FLOAT , subtype ) ;
RNA_def_property_array ( prop , size ) ;
if ( pydef ) RNA_def_property_float_array_default ( prop , def ) ;
RNA_def_property_range ( prop , min , max ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
2010-09-02 14:43:22 +00:00
RNA_def_property_ui_range ( prop , MAX2 ( soft_min , min ) , MIN2 ( soft_max , max ) , step , precision ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_StringProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: StringProperty(name= \" \" , description= \" \" , default= \" \" , maxlen=0, options={'ANIMATABLE'}, subtype='NONE') \n "
2010-02-01 22:04:33 +00:00
" \n "
" Returns a new string property definition. \n "
2010-01-22 02:04:25 +00:00
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
" :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILENAME', 'NONE']. \n "
2011-02-15 11:43:35 +00:00
" :type subtype: string \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_StringProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( StringProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " name " , " description " , " default " , " maxlen " , " options " , " subtype " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " , * def = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-02-01 22:04:33 +00:00
int maxlen = 0 ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
char * pysubtype = NULL ;
int subtype = PROP_NONE ;
2010-01-19 00:59:36 +00:00
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#|sssiO!s:StringProperty " , ( char * * ) kwlist , & id , & id_len , & name , & description , & def , & maxlen , & PySet_Type , & pyopts , & pysubtype ) )
2010-01-19 00:59:36 +00:00
return NULL ;
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_SUBTYPE_CHECK ( StringProperty , property_flag_items , property_subtype_string_items )
2010-02-01 22:04:33 +00:00
prop = RNA_def_property ( srna , id , PROP_STRING , subtype ) ;
2010-06-24 21:28:33 +00:00
if ( maxlen ! = 0 ) RNA_def_property_string_maxlength ( prop , maxlen + 1 ) ; /* +1 since it includes null terminator */
2010-02-01 22:04:33 +00:00
if ( def ) RNA_def_property_string_default ( prop , def ) ;
RNA_def_property_ui_text ( prop , name , description ) ;
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2011-01-16 10:36:27 +00:00
static EnumPropertyItem * enum_items_from_py ( PyObject * seq_fast , PyObject * def , int * defvalue , const short is_enum_flag )
2010-01-19 00:59:36 +00:00
{
EnumPropertyItem * items = NULL ;
PyObject * item ;
int seq_len , i , totitem = 0 ;
2010-12-13 09:10:16 +00:00
short def_used = 0 ;
const char * def_cmp = NULL ;
2010-01-19 00:59:36 +00:00
2011-01-16 10:36:27 +00:00
seq_len = PySequence_Fast_GET_SIZE ( seq_fast ) ;
2010-12-13 09:10:16 +00:00
if ( is_enum_flag ) {
if ( seq_len > RNA_ENUM_BITFLAG_SIZE ) {
PyErr_SetString ( PyExc_TypeError , " EnumProperty(...): maximum " STRINGIFY ( RNA_ENUM_BITFLAG_SIZE ) " members for a ENUM_FLAG type property " ) ;
return NULL ;
}
if ( def & & ! PySet_Check ( def ) ) {
PyErr_Format ( PyExc_TypeError , " EnumProperty(...): default option must be a 'set' type when ENUM_FLAG is enabled, not a '%.200s' " , Py_TYPE ( def ) - > tp_name ) ;
return NULL ;
}
}
else {
if ( def ) {
def_cmp = _PyUnicode_AsString ( def ) ;
if ( def_cmp = = NULL ) {
PyErr_Format ( PyExc_TypeError , " EnumProperty(...): default option must be a 'str' type when ENUM_FLAG is disabled, not a '%.200s' " , Py_TYPE ( def ) - > tp_name ) ;
return NULL ;
}
}
}
/* blank value */
* defvalue = 0 ;
2010-01-19 00:59:36 +00:00
for ( i = 0 ; i < seq_len ; i + + ) {
EnumPropertyItem tmp = { 0 , " " , 0 , " " , " " } ;
2011-01-16 10:36:27 +00:00
item = PySequence_Fast_GET_ITEM ( seq_fast , i ) ;
if ( PyTuple_Check ( item ) = = 0 ) {
2010-12-13 09:10:16 +00:00
PyErr_SetString ( PyExc_TypeError , " EnumProperty(...): expected a sequence of tuples for the enum items " ) ;
2010-01-19 00:59:36 +00:00
if ( items ) MEM_freeN ( items ) ;
return NULL ;
}
if ( ! PyArg_ParseTuple ( item , " sss " , & tmp . identifier , & tmp . name , & tmp . description ) ) {
2010-12-13 09:10:16 +00:00
PyErr_SetString ( PyExc_TypeError , " EnumProperty(...): expected an identifier, name and description in the tuple " ) ;
2010-01-19 00:59:36 +00:00
return NULL ;
}
2010-12-13 09:10:16 +00:00
if ( is_enum_flag ) {
tmp . value = 1 < < i ;
if ( def & & PySet_Contains ( def , PyTuple_GET_ITEM ( item , 0 ) ) ) {
* defvalue | = tmp . value ;
def_used + + ;
}
}
else {
tmp . value = i ;
if ( def & & def_used = = 0 & & strcmp ( def_cmp , tmp . identifier ) = = 0 ) {
* defvalue = tmp . value ;
def_used + + ; /* only ever 1 */
}
}
2010-01-19 00:59:36 +00:00
2010-12-13 09:10:16 +00:00
RNA_enum_item_add ( & items , & totitem , & tmp ) ;
2010-01-19 00:59:36 +00:00
}
RNA_enum_item_end ( & items , & totitem ) ;
2010-12-13 09:10:16 +00:00
if ( is_enum_flag ) {
/* strict check that all set members were used */
if ( def & & def_used ! = PySet_GET_SIZE ( def ) ) {
MEM_freeN ( items ) ;
PyErr_Format ( PyExc_TypeError , " EnumProperty(..., default={...}): set has %d unused member(s) " , PySet_GET_SIZE ( def ) - def_used ) ;
return NULL ;
}
}
else {
if ( def & & def_used = = 0 ) {
MEM_freeN ( items ) ;
PyErr_Format ( PyExc_TypeError , " EnumProperty(..., default= \' %s \' ): not found in enum members " , def ) ;
return NULL ;
}
}
2011-01-16 10:36:27 +00:00
2010-01-19 00:59:36 +00:00
return items ;
}
2010-09-09 06:29:44 +00:00
static char BPy_EnumProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: EnumProperty(items, name= \" \" , description= \" \" , default= \" \" , options={'ANIMATABLE'}) \n "
2010-01-22 02:04:25 +00:00
" \n "
" Returns a new enumerator property definition. \n "
" \n "
2011-02-15 11:43:35 +00:00
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-12-13 09:10:16 +00:00
" :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 "
" :type default: string or set \n "
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE', 'ENUM_FLAG']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2011-02-07 08:13:28 +00:00
" :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 "
2011-02-15 11:43:35 +00:00
" :type items: sequence of string triplets \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_EnumProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( EnumProperty )
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " items " , " name " , " description " , " default " , " options " , NULL } ;
2010-12-13 09:10:16 +00:00
const char * id = NULL , * name = " " , * description = " " ;
PyObject * def = NULL ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-02-01 22:04:33 +00:00
int defvalue = 0 ;
2011-01-16 10:36:27 +00:00
PyObject * items , * items_fast ;
2010-01-19 00:59:36 +00:00
EnumPropertyItem * eitems ;
PropertyRNA * prop ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
2010-12-13 09:10:16 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#O|ssOO!:EnumProperty " , ( char * * ) kwlist , & id , & id_len , & items , & name , & description , & def , & PySet_Type , & pyopts ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-01-19 00:59:36 +00:00
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_CHECK ( EnumProperty , property_flag_enum_items )
2010-01-19 00:59:36 +00:00
2011-01-16 10:36:27 +00:00
if ( ! ( items_fast = PySequence_Fast ( items , " EnumProperty(...): expected a sequence of tuples for the enum items " ) ) ) {
return NULL ;
}
eitems = enum_items_from_py ( items_fast , def , & defvalue , ( opts & PROP_ENUM_FLAG ) ! = 0 ) ;
Py_DECREF ( items_fast ) ;
2010-01-19 00:59:36 +00:00
if ( ! eitems )
return NULL ;
2011-01-16 10:08:20 +00:00
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 ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
MEM_freeN ( eitems ) ;
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-03-16 17:20:15 +00:00
static StructRNA * pointer_type_from_py ( PyObject * value , const char * error_prefix )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2011-01-26 12:44:09 +00:00
srna = srna_from_self ( value , " " ) ;
2010-01-19 00:59:36 +00:00
if ( ! srna ) {
2011-01-26 12:44:09 +00:00
if ( PyErr_Occurred ( ) ) {
PyObject * msg = PyC_ExceptionBuffer ( ) ;
char * msg_char = _PyUnicode_AsString ( msg ) ;
2011-02-16 02:51:56 +00:00
PyErr_Format ( PyExc_TypeError , " %.200s expected an RNA type derived from PropertyGroup, failed with: %s " , error_prefix , msg_char ) ;
2011-01-26 12:44:09 +00:00
Py_DECREF ( msg ) ;
}
else {
2011-02-16 02:51:56 +00:00
PyErr_Format ( PyExc_TypeError , " %.200s expected an RNA type derived from PropertyGroup, failed with type '%s' " , error_prefix , Py_TYPE ( value ) - > tp_name ) ;
2011-01-26 12:44:09 +00:00
}
2010-01-19 00:59:36 +00:00
return NULL ;
}
2011-02-16 02:51:56 +00:00
if ( ! RNA_struct_is_a ( srna , & RNA_PropertyGroup ) ) {
2011-02-18 06:04:05 +00:00
PyErr_Format ( PyExc_TypeError , " %.200s expected an RNA type derived from PropertyGroup " , error_prefix ) ;
2010-01-19 00:59:36 +00:00
return NULL ;
}
return srna ;
}
2010-09-09 06:29:44 +00:00
static char BPy_PointerProperty_doc [ ] =
2011-02-15 11:43:35 +00:00
" .. function:: PointerProperty(type= \" \" , description= \" \" , options={'ANIMATABLE'}) \n "
2010-01-22 02:04:25 +00:00
" \n "
" Returns a new pointer property definition. \n "
" \n "
2011-02-16 02:51:56 +00:00
" :arg type: A subclass of :class:`bpy.types.PropertyGroup`. \n "
2011-02-15 11:43:35 +00:00
" :type type: class \n "
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2011-02-15 11:43:35 +00:00
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_PointerProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( PointerProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " type " , " name " , " description " , " options " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
StructRNA * ptype ;
PyObject * type = Py_None ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#O|ssO!:PointerProperty " , ( char * * ) kwlist , & id , & id_len , & type , & name , & description , & PySet_Type , & pyopts ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-01-19 00:59:36 +00:00
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_CHECK ( PointerProperty , property_flag_items )
2010-01-19 00:59:36 +00:00
2010-03-16 17:20:15 +00:00
ptype = pointer_type_from_py ( type , " PointerProperty(...): " ) ;
2010-01-19 00:59:36 +00:00
if ( ! ptype )
return NULL ;
prop = RNA_def_pointer_runtime ( srna , id , ptype , name , description ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_CollectionProperty_doc [ ] =
2010-02-02 00:02:55 +00:00
" .. function:: CollectionProperty(items, type= \" \" , description= \" \" , default= \" \" , options={'ANIMATABLE'}) \n "
2010-01-22 02:04:25 +00:00
" \n "
" Returns a new collection property definition. \n "
" \n "
2011-02-16 02:51:56 +00:00
" :arg type: A subclass of :class:`bpy.types.PropertyGroup`. \n "
2011-02-15 11:43:35 +00:00
" :type type: class \n "
BPY_PROPDEF_NAME_DOC
BPY_PROPDEF_DESC_DOC
2010-02-02 00:02:55 +00:00
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE']. \n "
2010-02-01 22:04:33 +00:00
" :type options: set \n "
2011-02-15 11:43:35 +00:00
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_CollectionProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-01-19 00:59:36 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
BPY_PROPDEF_HEAD ( CollectionProperty )
2010-01-19 00:59:36 +00:00
2010-09-08 10:43:36 +00:00
if ( srna ) {
2010-02-16 16:47:41 +00:00
static const char * kwlist [ ] = { " attr " , " type " , " name " , " description " , " options " , NULL } ;
2010-12-03 17:05:21 +00:00
const char * id = NULL , * name = " " , * description = " " ;
2010-10-19 07:23:34 +00:00
int id_len ;
2010-01-19 00:59:36 +00:00
PropertyRNA * prop ;
StructRNA * ptype ;
PyObject * type = Py_None ;
2010-02-01 22:04:33 +00:00
PyObject * pyopts = NULL ;
int opts = 0 ;
2010-10-19 07:23:34 +00:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s#O|ssO!:CollectionProperty " , ( char * * ) kwlist , & id , & id_len , & type , & name , & description , & PySet_Type , & pyopts ) )
2010-02-01 22:04:33 +00:00
return NULL ;
2010-01-19 00:59:36 +00:00
2010-12-13 09:10:16 +00:00
BPY_PROPDEF_CHECK ( CollectionProperty , property_flag_items )
2010-01-19 00:59:36 +00:00
2010-03-16 17:20:15 +00:00
ptype = pointer_type_from_py ( type , " CollectionProperty(...): " ) ;
2010-01-19 00:59:36 +00:00
if ( ! ptype )
return NULL ;
prop = RNA_def_collection_runtime ( srna , id , ptype , name , description ) ;
2010-02-01 22:04:33 +00:00
if ( pyopts ) {
if ( opts & PROP_HIDDEN ) RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2010-02-02 00:02:55 +00:00
if ( ( opts & PROP_ANIMATABLE ) = = 0 ) RNA_def_property_clear_flag ( prop , PROP_ANIMATABLE ) ;
2010-02-01 22:04:33 +00:00
}
2010-09-06 15:54:08 +00:00
RNA_def_property_duplicate_pointers ( srna , prop ) ;
2010-01-19 00:59:36 +00:00
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-01-19 00:59:36 +00:00
}
2010-09-09 06:29:44 +00:00
static char BPy_RemoveProperty_doc [ ] =
2010-05-08 23:34:54 +00:00
" .. function:: RemoveProperty(attr) \n "
" \n "
" Removes a dynamically defined property. \n "
" \n "
" :arg attr: Property name. \n "
2011-02-15 11:43:35 +00:00
" :type attr: string \n "
;
2010-09-09 06:29:44 +00:00
static PyObject * BPy_RemoveProperty ( PyObject * self , PyObject * args , PyObject * kw )
2010-05-08 23:34:54 +00:00
{
StructRNA * srna ;
2010-09-08 10:43:36 +00:00
if ( PyTuple_GET_SIZE ( args ) = = 1 ) {
PyObject * ret ;
self = PyTuple_GET_ITEM ( args , 0 ) ;
args = PyTuple_New ( 0 ) ;
ret = BPy_RemoveProperty ( self , args , kw ) ;
Py_DECREF ( args ) ;
return ret ;
}
else if ( PyTuple_GET_SIZE ( args ) > 1 ) {
PyErr_SetString ( PyExc_ValueError , " all args must be keywords " ) ; \
return NULL ;
}
2010-05-08 23:34:54 +00:00
srna = srna_from_self ( self , " RemoveProperty(...): " ) ;
if ( srna = = NULL & & PyErr_Occurred ( ) ) {
return NULL ; /* self's type was compatible but error getting the srna */
}
else if ( srna = = NULL ) {
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_TypeError , " RemoveProperty(): struct rna not available for this type " ) ;
2010-05-08 23:34:54 +00:00
return NULL ;
}
else {
static const char * kwlist [ ] = { " attr " , NULL } ;
char * id = NULL ;
if ( ! PyArg_ParseTupleAndKeywords ( args , kw , " s:RemoveProperty " , ( char * * ) kwlist , & id ) )
return NULL ;
2010-05-09 00:06:35 +00:00
if ( RNA_def_property_free_identifier ( srna , id ) ! = 1 ) {
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , " RemoveProperty(): '%s' not a defined dynamic property " , id ) ;
2010-05-08 23:34:54 +00:00
return NULL ;
}
}
2010-09-08 10:43:36 +00:00
Py_RETURN_NONE ;
2010-05-08 23:34:54 +00:00
}
2010-01-19 00:59:36 +00:00
static struct PyMethodDef props_methods [ ] = {
2010-01-22 02:04:25 +00:00
{ " BoolProperty " , ( PyCFunction ) BPy_BoolProperty , METH_VARARGS | METH_KEYWORDS , BPy_BoolProperty_doc } ,
2010-02-01 10:51:34 +00:00
{ " BoolVectorProperty " , ( PyCFunction ) BPy_BoolVectorProperty , METH_VARARGS | METH_KEYWORDS , BPy_BoolVectorProperty_doc } ,
2010-01-22 02:04:25 +00:00
{ " IntProperty " , ( PyCFunction ) BPy_IntProperty , METH_VARARGS | METH_KEYWORDS , BPy_IntProperty_doc } ,
2010-02-01 10:51:34 +00:00
{ " IntVectorProperty " , ( PyCFunction ) BPy_IntVectorProperty , METH_VARARGS | METH_KEYWORDS , BPy_IntVectorProperty_doc } ,
2010-01-22 02:04:25 +00:00
{ " FloatProperty " , ( PyCFunction ) BPy_FloatProperty , METH_VARARGS | METH_KEYWORDS , BPy_FloatProperty_doc } ,
{ " FloatVectorProperty " , ( PyCFunction ) BPy_FloatVectorProperty , METH_VARARGS | METH_KEYWORDS , BPy_FloatVectorProperty_doc } ,
{ " StringProperty " , ( PyCFunction ) BPy_StringProperty , METH_VARARGS | METH_KEYWORDS , BPy_StringProperty_doc } ,
{ " EnumProperty " , ( PyCFunction ) BPy_EnumProperty , METH_VARARGS | METH_KEYWORDS , BPy_EnumProperty_doc } ,
{ " PointerProperty " , ( PyCFunction ) BPy_PointerProperty , METH_VARARGS | METH_KEYWORDS , BPy_PointerProperty_doc } ,
{ " CollectionProperty " , ( PyCFunction ) BPy_CollectionProperty , METH_VARARGS | METH_KEYWORDS , BPy_CollectionProperty_doc } ,
2010-05-08 23:34:54 +00:00
2010-09-08 10:43:36 +00:00
{ " RemoveProperty " , ( PyCFunction ) BPy_RemoveProperty , METH_VARARGS | METH_KEYWORDS , BPy_RemoveProperty_doc } ,
2010-01-19 00:59:36 +00:00
{ NULL , NULL , 0 , NULL }
} ;
static struct PyModuleDef props_module = {
PyModuleDef_HEAD_INIT ,
" bpy.props " ,
2010-01-22 02:04:25 +00:00
" This module defines properties to extend blenders internal data, the result of these functions "
" is used to assign properties to classes registered with blender and can't be used directly. " ,
2010-01-19 00:59:36 +00:00
- 1 , /* multiple "initialization" just copies the module dict. */
props_methods ,
NULL , NULL , NULL , NULL
} ;
PyObject * BPY_rna_props ( void )
{
PyObject * submodule ;
2010-09-08 10:43:36 +00:00
PyObject * submodule_dict ;
2010-01-19 00:59:36 +00:00
submodule = PyModule_Create ( & props_module ) ;
2010-08-14 05:33:20 +00:00
PyDict_SetItemString ( PyImport_GetModuleDict ( ) , props_module . m_name , submodule ) ;
2010-01-19 00:59:36 +00:00
/* INCREF since its its assumed that all these functions return the
* module with a new ref like PyDict_New , since they are passed to
* PyModule_AddObject which steals a ref */
Py_INCREF ( submodule ) ;
2010-09-08 10:43:36 +00:00
/* api needs the PyObjects internally */
submodule_dict = PyModule_GetDict ( submodule ) ;
# define ASSIGN_STATIC(_name) pymeth_##_name = PyDict_GetItemString(submodule_dict, #_name)
ASSIGN_STATIC ( BoolProperty ) ;
ASSIGN_STATIC ( BoolVectorProperty ) ;
ASSIGN_STATIC ( IntProperty ) ;
ASSIGN_STATIC ( IntVectorProperty ) ;
ASSIGN_STATIC ( FloatProperty ) ;
ASSIGN_STATIC ( FloatVectorProperty ) ;
ASSIGN_STATIC ( StringProperty ) ;
ASSIGN_STATIC ( EnumProperty ) ;
ASSIGN_STATIC ( PointerProperty ) ;
ASSIGN_STATIC ( CollectionProperty ) ;
ASSIGN_STATIC ( RemoveProperty ) ;
2010-01-19 00:59:36 +00:00
return submodule ;
}