===Python API===
More Modifier API changes: * add Blender.Modifier.Settings dict with constants for modifier types * add mod.type attribute, which returns type of the Modifier * add some internal consistency checks in ModSeq_remove
This commit is contained in:
@@ -75,6 +75,7 @@ struct ID; /*keep me up here */
|
|||||||
#include "Mathutils.h"
|
#include "Mathutils.h"
|
||||||
#include "Mesh.h"
|
#include "Mesh.h"
|
||||||
#include "Metaball.h"
|
#include "Metaball.h"
|
||||||
|
#include "Modifier.h"
|
||||||
#include "NMesh.h"
|
#include "NMesh.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "Group.h"
|
#include "Group.h"
|
||||||
@@ -871,6 +872,7 @@ void M_Blender_Init(void)
|
|||||||
PyDict_SetItemString(dict, "Mesh", Mesh_Init());
|
PyDict_SetItemString(dict, "Mesh", Mesh_Init());
|
||||||
PyDict_SetItemString(dict, "Metaball", Metaball_Init());
|
PyDict_SetItemString(dict, "Metaball", Metaball_Init());
|
||||||
PyDict_SetItemString(dict, "Mathutils", Mathutils_Init());
|
PyDict_SetItemString(dict, "Mathutils", Mathutils_Init());
|
||||||
|
PyDict_SetItemString(dict, "Modifier", Modifier_Init());
|
||||||
PyDict_SetItemString(dict, "NMesh", NMesh_Init());
|
PyDict_SetItemString(dict, "NMesh", NMesh_Init());
|
||||||
PyDict_SetItemString(dict, "Noise", Noise_Init());
|
PyDict_SetItemString(dict, "Noise", Noise_Init());
|
||||||
PyDict_SetItemString(dict, "Object", Object_Init());
|
PyDict_SetItemString(dict, "Object", Object_Init());
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ enum mod_constants {
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
static PyObject *Modifier_getName( BPy_Modifier * self );
|
static PyObject *Modifier_getName( BPy_Modifier * self );
|
||||||
static int Modifier_setName( BPy_Modifier * self, PyObject *arg );
|
static int Modifier_setName( BPy_Modifier * self, PyObject *arg );
|
||||||
|
static PyObject *Modifier_getType( BPy_Modifier * self );
|
||||||
|
|
||||||
static PyObject *Modifier_getKeys( BPy_Modifier * self );
|
static PyObject *Modifier_getKeys( BPy_Modifier * self );
|
||||||
static PyObject *Modifier_moveUp( BPy_Modifier * self );
|
static PyObject *Modifier_moveUp( BPy_Modifier * self );
|
||||||
@@ -137,6 +138,9 @@ static PyGetSetDef BPy_Modifier_getseters[] = {
|
|||||||
{"name",
|
{"name",
|
||||||
(getter)Modifier_getName, (setter)Modifier_setName,
|
(getter)Modifier_getName, (setter)Modifier_setName,
|
||||||
"Modifier name", NULL},
|
"Modifier name", NULL},
|
||||||
|
{"type",
|
||||||
|
(getter)Modifier_getType, (setter)NULL,
|
||||||
|
"Modifier type", NULL},
|
||||||
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
|
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -275,6 +279,20 @@ static int Modifier_setName( BPy_Modifier * self, PyObject * attr )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return the type of this modifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
static PyObject *Modifier_getType( BPy_Modifier * self )
|
||||||
|
{
|
||||||
|
if (self->md==NULL )
|
||||||
|
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
||||||
|
"This modifier has been removed!" );
|
||||||
|
|
||||||
|
return PyInt_FromLong( self->md->type );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* move the modifier up in the stack
|
* move the modifier up in the stack
|
||||||
*/
|
*/
|
||||||
@@ -771,35 +789,9 @@ static int boolean_setter( ModifierData *ptr, int type, PyObject *value )
|
|||||||
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
|
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *hook_getter( ModifierData *ptr, int type )
|
/*
|
||||||
{
|
* get data from a modifier
|
||||||
Py_RETURN_NONE;
|
*/
|
||||||
}
|
|
||||||
|
|
||||||
static int hook_setter( ModifierData *ptr, int type, PyObject *value )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *softbody_getter( ModifierData *ptr, int type )
|
|
||||||
{
|
|
||||||
Py_RETURN_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int softbody_setter( ModifierData *ptr, int type, PyObject *value )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *array_getter( ModifierData *ptr, int type )
|
|
||||||
{
|
|
||||||
Py_RETURN_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int array_setter( ModifierData *ptr, int type, PyObject *value )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key )
|
static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key )
|
||||||
{
|
{
|
||||||
@@ -837,14 +829,11 @@ static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key )
|
|||||||
return decimate_getter( self->md, type );
|
return decimate_getter( self->md, type );
|
||||||
case eModifierType_Wave:
|
case eModifierType_Wave:
|
||||||
return wave_getter( self->md, type );
|
return wave_getter( self->md, type );
|
||||||
case eModifierType_Hook:
|
|
||||||
return hook_getter( self->md, type );
|
|
||||||
case eModifierType_Softbody:
|
|
||||||
return softbody_getter( self->md, type );
|
|
||||||
case eModifierType_Boolean:
|
case eModifierType_Boolean:
|
||||||
return boolean_getter( self->md, type );
|
return boolean_getter( self->md, type );
|
||||||
|
case eModifierType_Hook:
|
||||||
|
case eModifierType_Softbody:
|
||||||
case eModifierType_Array:
|
case eModifierType_Array:
|
||||||
return array_getter( self->md, type );
|
|
||||||
case eModifierType_None:
|
case eModifierType_None:
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
@@ -880,14 +869,11 @@ static int Modifier_setData( BPy_Modifier * self, PyObject * key,
|
|||||||
return decimate_setter( self->md, type, arg );
|
return decimate_setter( self->md, type, arg );
|
||||||
case eModifierType_Wave:
|
case eModifierType_Wave:
|
||||||
return wave_setter( self->md, type, arg );
|
return wave_setter( self->md, type, arg );
|
||||||
case eModifierType_Hook:
|
|
||||||
return hook_setter( self->md, type, arg );
|
|
||||||
case eModifierType_Softbody:
|
|
||||||
return softbody_setter( self->md, type, arg );
|
|
||||||
case eModifierType_Boolean:
|
case eModifierType_Boolean:
|
||||||
return boolean_setter( self->md, type, arg );
|
return boolean_setter( self->md, type, arg );
|
||||||
|
case eModifierType_Hook:
|
||||||
|
case eModifierType_Softbody:
|
||||||
case eModifierType_Array:
|
case eModifierType_Array:
|
||||||
return array_setter( self->md, type, arg );
|
|
||||||
case eModifierType_None:
|
case eModifierType_None:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1036,82 +1022,50 @@ static PyObject *ModSeq_append( BPy_ModSeq *self, PyObject *args )
|
|||||||
return Modifier_CreatePyObject( self->obj, self->obj->modifiers.last );
|
return Modifier_CreatePyObject( self->obj, self->obj->modifiers.last );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove an existing modifier a new modifier at the end of the list */
|
/* remove an existing modifier */
|
||||||
|
|
||||||
static PyObject *ModSeq_remove( BPy_ModSeq *self, PyObject *args )
|
static PyObject *ModSeq_remove( BPy_ModSeq *self, PyObject *args )
|
||||||
{
|
{
|
||||||
PyObject *pyobj;
|
PyObject *pyobj;
|
||||||
Object *obj;
|
Object *obj;
|
||||||
ModifierData *md_v, *md;
|
ModifierData *md_v, *md;
|
||||||
if( !PyArg_ParseTuple( args, "O!", &Modifier_Type, &pyobj ) ) {
|
|
||||||
return ( EXPP_ReturnPyObjError( PyExc_TypeError, "expected a modifier as an argument" ) );
|
/* check that argument is a modifier */
|
||||||
}
|
if( !PyArg_ParseTuple( args, "O!", &Modifier_Type, &pyobj ) )
|
||||||
obj = ( ( BPy_Modifier * ) pyobj )->obj;
|
return EXPP_ReturnPyObjError( PyExc_TypeError,
|
||||||
|
"expected a modifier as an argument" );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check that modseq and modifier refer to the same object (this is
|
||||||
|
* more for user sanity than anything else)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if( self->obj != ( ( BPy_Modifier * ) pyobj )->obj )
|
||||||
|
return EXPP_ReturnPyObjError( PyExc_AttributeError,
|
||||||
|
"modifier does not belong to this object" );
|
||||||
|
|
||||||
md_v = ( ( BPy_Modifier * ) pyobj )->md;
|
md_v = ( ( BPy_Modifier * ) pyobj )->md;
|
||||||
|
|
||||||
|
|
||||||
if (md_v==NULL)
|
if (md_v==NULL)
|
||||||
return (EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
||||||
"This modifier has alredy been removed!" ));
|
"This modifier has already been removed!" );
|
||||||
|
|
||||||
|
/* verify the modifier is still in the object's modifier */
|
||||||
|
obj = self->obj;
|
||||||
for (md=obj->modifiers.first; md; md=md->next)
|
for (md=obj->modifiers.first; md; md=md->next)
|
||||||
if (md==md_v)
|
if (md==md_v)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!md)
|
if (!md)
|
||||||
return (EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
||||||
"This modifier is not in its object list, this should never happen!" ));
|
"This modifier is no longer in the object's stack" );
|
||||||
|
|
||||||
|
/* do the actual removal */
|
||||||
BLI_remlink(&(obj->modifiers), md_v);
|
BLI_remlink(&(obj->modifiers), md_v);
|
||||||
modifier_free(md_v);
|
modifier_free(md_v);
|
||||||
( ( BPy_Modifier * ) pyobj )->md= NULL;
|
( ( BPy_Modifier * ) pyobj )->md= NULL;
|
||||||
return EXPP_incr_ret( Py_None );
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* simple method to implement pseudo module constants
|
|
||||||
*/
|
|
||||||
|
|
||||||
static PyObject *ModSeq_typeConst( BPy_Modifier *self_unused, void *type )
|
|
||||||
{
|
|
||||||
return PyInt_FromLong( (long)type );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/* Python BPy_ModSeq attributes get/set structure: */
|
|
||||||
/*****************************************************************************/
|
|
||||||
static PyGetSetDef BPy_ModSeq_getseters[] = {
|
|
||||||
{"SUBSURF",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Subsurf},
|
|
||||||
{"ARMATURE",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Armature},
|
|
||||||
{"LATTICE",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Lattice},
|
|
||||||
{"CURVE",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Curve},
|
|
||||||
{"BUILD",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Build},
|
|
||||||
{"MIRROR",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Mirror},
|
|
||||||
{"DECIMATE",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Decimate},
|
|
||||||
{"WAVE",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Wave},
|
|
||||||
{"BOOLEAN",
|
|
||||||
(getter)ModSeq_typeConst, (setter)NULL,
|
|
||||||
NULL, (void *)eModifierType_Boolean},
|
|
||||||
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Python BPy_ModSeq methods table: */
|
/* Python BPy_ModSeq methods table: */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -1187,7 +1141,7 @@ PyTypeObject ModSeq_Type = {
|
|||||||
/*** Attribute descriptor and subclassing stuff ***/
|
/*** Attribute descriptor and subclassing stuff ***/
|
||||||
BPy_ModSeq_methods, /* struct PyMethodDef *tp_methods; */
|
BPy_ModSeq_methods, /* struct PyMethodDef *tp_methods; */
|
||||||
NULL, /* struct PyMemberDef *tp_members; */
|
NULL, /* struct PyMemberDef *tp_members; */
|
||||||
BPy_ModSeq_getseters, /* struct PyGetSetDef *tp_getset; */
|
NULL, /* struct PyGetSetDef *tp_getset; */
|
||||||
NULL, /* struct _typeobject *tp_base; */
|
NULL, /* struct _typeobject *tp_base; */
|
||||||
NULL, /* PyObject *tp_dict; */
|
NULL, /* PyObject *tp_dict; */
|
||||||
NULL, /* descrgetfunc tp_descr_get; */
|
NULL, /* descrgetfunc tp_descr_get; */
|
||||||
@@ -1224,3 +1178,51 @@ PyObject *ModSeq_CreatePyObject( Object *obj )
|
|||||||
pymod->obj = obj;
|
pymod->obj = obj;
|
||||||
return ( PyObject * ) pymod;
|
return ( PyObject * ) pymod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *M_Modifier_SettingsDict( void )
|
||||||
|
{
|
||||||
|
PyObject *S = PyConstant_New( );
|
||||||
|
|
||||||
|
if( S ) {
|
||||||
|
BPy_constant *d = ( BPy_constant * ) S;
|
||||||
|
|
||||||
|
PyConstant_Insert( d, "SUBSURF",
|
||||||
|
PyInt_FromLong( eModifierType_Subsurf ) );
|
||||||
|
PyConstant_Insert( d, "ARMATURE",
|
||||||
|
PyInt_FromLong( eModifierType_Armature ) );
|
||||||
|
PyConstant_Insert( d, "LATTICE",
|
||||||
|
PyInt_FromLong( eModifierType_Lattice ) );
|
||||||
|
PyConstant_Insert( d, "CURVE",
|
||||||
|
PyInt_FromLong( eModifierType_Curve ) );
|
||||||
|
PyConstant_Insert( d, "BUILD",
|
||||||
|
PyInt_FromLong( eModifierType_Build ) );
|
||||||
|
PyConstant_Insert( d, "MIRROR",
|
||||||
|
PyInt_FromLong( eModifierType_Mirror ) );
|
||||||
|
PyConstant_Insert( d, "DECIMATE",
|
||||||
|
PyInt_FromLong( eModifierType_Decimate ) );
|
||||||
|
PyConstant_Insert( d, "WAVE",
|
||||||
|
PyInt_FromLong( eModifierType_Wave ) );
|
||||||
|
PyConstant_Insert( d, "BOOLEAN",
|
||||||
|
PyInt_FromLong( eModifierType_Boolean ) );
|
||||||
|
}
|
||||||
|
return S;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Function: Modifier_Init */
|
||||||
|
/*****************************************************************************/
|
||||||
|
PyObject *Modifier_Init( void )
|
||||||
|
{
|
||||||
|
PyObject *submodule;
|
||||||
|
PyObject *SettingsTypes = M_Modifier_SettingsDict( );
|
||||||
|
|
||||||
|
if( PyType_Ready( &ModSeq_Type ) < 0 || PyType_Ready( &Modifier_Type ) < 0 )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
submodule = Py_InitModule3( "Blender.Modifier", NULL, "Modifer module" );
|
||||||
|
|
||||||
|
if( SettingsTypes )
|
||||||
|
PyModule_AddObject( submodule, "Settings", SettingsTypes );
|
||||||
|
|
||||||
|
return submodule;
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ extern PyTypeObject Modifier_Type;
|
|||||||
* prototypes
|
* prototypes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
PyObject *Modifier_Init( void );
|
||||||
PyObject *Modifier_CreatePyObject( Object *obj, ModifierData *md );
|
PyObject *Modifier_CreatePyObject( Object *obj, ModifierData *md );
|
||||||
ModifierData *Modifier_FromPyObject( PyObject * py_obj );
|
ModifierData *Modifier_FromPyObject( PyObject * py_obj );
|
||||||
int Modifier_CheckPyObject( PyObject * py_obj );
|
int Modifier_CheckPyObject( PyObject * py_obj );
|
||||||
|
|||||||
@@ -15,10 +15,21 @@ Example::
|
|||||||
mods = ob.modifiers # get the object's modifiers
|
mods = ob.modifiers # get the object's modifiers
|
||||||
for mod in mods:
|
for mod in mods:
|
||||||
print mod,mod.name # print each modifier and its name
|
print mod,mod.name # print each modifier and its name
|
||||||
mod = mods.append(mod.SUBSURF) # add a new subsurf modifier
|
mod = mods.append(Modifier.Settings.SUBSURF) # add a new subsurf modifier
|
||||||
mod[mod.keys().LEVELS] = 3 # set subsurf subdivision levels to 3
|
mod[mod.keys().LEVELS] = 3 # set subsurf subdivision levels to 3
|
||||||
"""
|
|
||||||
|
|
||||||
|
@type Settings: readonly dictionary
|
||||||
|
@var Settings: Various constants used by Modifier objects:
|
||||||
|
- ARMATURE - type value for Armature modifiers
|
||||||
|
- BOOLEAN - type value for Boolean modifiers
|
||||||
|
- BUILD - type value for Build modifiers
|
||||||
|
- CURVE - type value for Curve modifiers
|
||||||
|
- DECIMATE - type value for Decimate modifiers
|
||||||
|
- LATTICE - type value for Lattice modifiers
|
||||||
|
- SUBSURF - type value for Subsurf modifiers
|
||||||
|
- WAVE - type value for Wave modifiers
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
class ModSeq:
|
class ModSeq:
|
||||||
"""
|
"""
|
||||||
@@ -57,6 +68,10 @@ class Modifier:
|
|||||||
===================
|
===================
|
||||||
This object provides access to a modifier for a particular object.
|
This object provides access to a modifier for a particular object.
|
||||||
@ivar name: The name of this modifier. 31 chars max.
|
@ivar name: The name of this modifier. 31 chars max.
|
||||||
|
@type name: string
|
||||||
|
@ivar type: The type of this modifier. Read-only. The returned value
|
||||||
|
matches the types in L{Settings}.
|
||||||
|
@type type: int
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __getitem__(key):
|
def __getitem__(key):
|
||||||
|
|||||||
Reference in New Issue
Block a user