[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20176] trunk/blender/source/blender/ python/api2_2x: [#18735] Particle vertex group API for Python
Campbell Barton
ideasman42 at gmail.com
Tue May 12 23:41:04 CEST 2009
Revision: 20176
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20176
Author: campbellbarton
Date: 2009-05-12 23:41:04 +0200 (Tue, 12 May 2009)
Log Message:
-----------
[#18735] Particle vertex group API for Python
from Alberto Santos (dnakhain)
Changed "None" to "" for returning an unset vertex group.
"" is a valid name for a vertex group this is asking for trouble.
Modified Paths:
--------------
trunk/blender/source/blender/python/api2_2x/Particle.c
trunk/blender/source/blender/python/api2_2x/doc/Particle.py
Modified: trunk/blender/source/blender/python/api2_2x/Particle.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Particle.c 2009-05-12 21:27:01 UTC (rev 20175)
+++ trunk/blender/source/blender/python/api2_2x/Particle.c 2009-05-12 21:41:04 UTC (rev 20176)
@@ -67,6 +67,8 @@
static PyObject *Part_SetMat( BPy_PartSys * self, PyObject * args );
static PyObject *Part_GetMat( BPy_PartSys * self, PyObject * args );
static PyObject *Part_GetSize( BPy_PartSys * self, PyObject * args );
+static PyObject *Part_GetVertGroup( BPy_PartSys * self, PyObject * args );
+static PyObject *Part_SetVertGroup( BPy_PartSys * self, PyObject * args );
static int Part_setSeed( BPy_PartSys * self, PyObject * args );
static PyObject *Part_getSeed( BPy_PartSys * self );
static int Part_setType( BPy_PartSys * self, PyObject * args );
@@ -276,6 +278,10 @@
METH_VARARGS, "() - Get particles size in a list"},
{"getAge", ( PyCFunction ) Part_GetAge,
METH_VARARGS, "() - Get particles life in a list"},
+ {"getVertGroup", ( PyCFunction ) Part_GetVertGroup,
+ METH_VARARGS, "() - Get the vertex group which affects a particles attribute"},
+ {"setVertGroup", ( PyCFunction ) Part_SetVertGroup,
+ METH_VARARGS, "() - Set the vertex group to affect a particles attribute"},
{NULL, NULL, 0, NULL}
};
@@ -1134,6 +1140,44 @@
return ChildTypes;
}
+/* create the Blender.Particle.VertexGroups constant dict */
+
+static PyObject *Particle_VertexGroupsDict( void )
+{
+ PyObject *VertexGroups = PyConstant_New( );
+
+ if( VertexGroups ) {
+ BPy_constant *c = ( BPy_constant * ) VertexGroups;
+
+ PyConstant_Insert( c, "EFFECTOR",
+ PyInt_FromLong( 11 ) );
+ PyConstant_Insert( c, "TANROT",
+ PyInt_FromLong( 10 ) );
+ PyConstant_Insert( c, "TANVEL",
+ PyInt_FromLong( 9 ) );
+ PyConstant_Insert( c, "SIZE",
+ PyInt_FromLong( 8 ) );
+ PyConstant_Insert( c, "ROUGHE",
+ PyInt_FromLong( 7 ) );
+ PyConstant_Insert( c, "ROUGH2",
+ PyInt_FromLong( 6 ) );
+ PyConstant_Insert( c, "ROUGH1",
+ PyInt_FromLong( 5 ) );
+ PyConstant_Insert( c, "KINK",
+ PyInt_FromLong( 4 ) );
+ PyConstant_Insert( c, "CLUMP",
+ PyInt_FromLong( 3 ) );
+ PyConstant_Insert( c, "LENGHT",
+ PyInt_FromLong( 2 ) );
+ PyConstant_Insert( c, "VELOCITY",
+ PyInt_FromLong( 1 ) );
+ PyConstant_Insert( c, "DENSITY",
+ PyInt_FromLong( 0 ) );
+ }
+ return VertexGroups;
+}
+
+
/* create the Blender.Particle.ChildKink constant dict */
static PyObject *Particle_ChildKinkDict( void )
@@ -1227,6 +1271,7 @@
PyObject *Rotation;
PyObject *AngularV;
PyObject *ChildTypes;
+ PyObject *VertexGroups;
PyObject *ChildKinks;
PyObject *ChildKinkAxes;
@@ -1243,6 +1288,7 @@
Integrator = Particle_IntegratorDict();
Rotation = Particle_RotationDict();
AngularV = Particle_AngularVDict();
+ VertexGroups = Particle_VertexGroupsDict();
ChildTypes = Particle_ChildTypeDict();
ChildKinks = Particle_ChildKinkDict();
ChildKinkAxes = Particle_ChildKinkAxisDict();
@@ -1268,6 +1314,8 @@
PyModule_AddObject( submodule, "ROTATION", Rotation );
if( AngularV )
PyModule_AddObject( submodule, "ANGULARV", AngularV );
+ if( VertexGroups )
+ PyModule_AddObject( submodule, "VERTEXGROUPS", VertexGroups );
if( ChildTypes )
PyModule_AddObject( submodule, "CHILDTYPE", ChildTypes );
if( ChildKinks )
@@ -1854,7 +1902,112 @@
return mat;
}
+static PyObject *Part_GetVertGroup( BPy_PartSys * self, PyObject * args ){
+ PyObject *list;
+ char errstr[128];
+ bDeformGroup *defGroup = NULL;
+ Object *obj = self->object;
+ int vg_attribute = 0;
+ int vg_number = 0;
+ int count;
+ PyObject *vg_neg;
+ PyObject *vg_name;
+ if( !obj )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "particle system must be linked to an object first" );
+
+ if( obj->type != OB_MESH )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "linked object is not a mesh" );
+
+ if( !PyArg_ParseTuple( args, "i", &vg_attribute ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected integer argument" );
+
+ if( vg_attribute < 0 || vg_attribute > PSYS_TOT_VG-1 ){
+ sprintf ( errstr, "expected int argument in [0,%d]", PSYS_TOT_VG-1 );
+ return EXPP_ReturnPyObjError( PyExc_TypeError, errstr );
+ }
+
+ /*search*/
+ vg_number = self->psys->vgroup[vg_attribute];
+ count = 1;
+ defGroup = obj->defbase.first;
+ while(count<vg_number && defGroup){
+ defGroup = defGroup->next;
+ count++;
+ }
+
+ /*vg_name*/
+ if (defGroup && vg_number>0)
+ vg_name = PyString_FromString( defGroup->name );
+ else
+ vg_name = PyString_FromString( "" );
+
+ /*vg_neg*/
+ vg_neg = PyInt_FromLong( ((long)( self->psys->vg_neg & (1<<vg_attribute) )) > 0 );
+
+ list = PyList_New( 2 );
+ PyList_SET_ITEM( list, 0, vg_name );
+ PyList_SET_ITEM( list, 1, vg_neg );
+
+ return list;
+}
+
+static PyObject *Part_SetVertGroup( BPy_PartSys * self, PyObject * args ){
+ char errstr[128];
+ bDeformGroup *defGroup;
+ Object *obj = self->object;
+ char *vg_name = NULL;
+ int vg_attribute = 0;
+ int vg_neg = 0;
+ int vg_number = 0;
+ int count;
+
+ if( !obj )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "particle system must be linked to an object first" );
+
+ if( obj->type != OB_MESH )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "linked object is not a mesh" );
+
+ if( !PyArg_ParseTuple( args, "sii", &vg_name, &vg_attribute, &vg_neg ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected one string and two integers arguments" );
+
+ if( vg_attribute < 0 || vg_attribute > PSYS_TOT_VG-1 ){
+ sprintf ( errstr, "expected int argument in [0,%d]", PSYS_TOT_VG-1 );
+ return EXPP_ReturnPyObjError( PyExc_TypeError, errstr );
+ }
+
+ /*search*/
+ count = 1;
+ defGroup = obj->defbase.first;
+ while (defGroup){
+ if (strcmp(vg_name,defGroup->name)==0)
+ vg_number = count;
+ defGroup = defGroup->next;
+ count++;
+ }
+
+ /*vgroup*/
+ self->psys->vgroup[vg_attribute] = vg_number;
+
+ /*vg_neg*/
+ if (vg_neg){
+ self->psys->vg_neg |= (1<<vg_attribute);
+ }else{
+ self->psys->vg_neg &= ~(1<<vg_attribute);
+ }
+
+ psys_flush_settings( self->psys->part, PSYS_ALLOC, 1 );
+
+ Py_RETURN_NONE;
+}
+
+
/*****************************************************************************/
/* Function: Set/Get Seed */
/*****************************************************************************/
Modified: trunk/blender/source/blender/python/api2_2x/doc/Particle.py
===================================================================
--- trunk/blender/source/blender/python/api2_2x/doc/Particle.py 2009-05-12 21:27:01 UTC (rev 20175)
+++ trunk/blender/source/blender/python/api2_2x/doc/Particle.py 2009-05-12 21:41:04 UTC (rev 20176)
@@ -340,3 +340,24 @@
@rtype: list of floats
@return: list of floats or list of tuples if id is not zero (size,id) or None if system is disabled.
"""
+
+ def getVertGroup(attribute):
+ """
+ Get vertex group name and negation bit assigned to affect parameter attribute.
+ A list of string and integer (vertex group name, negation bit).
+ @type attribute: int
+ @param attribute: Particle.VERTEXGROUPS([ 'DENSITY' | 'VELOCITY' | ... ])
+ @rtype: list of objects
+ @return: first element is the vg name and second the negation bit
+ """
+ def setVertGroup(name,attribute,negated):
+ """
+ Set vertex group and negation bit to affect particles system attribute.
+ @type name: string
+ @param name: Name of the vertex group
+ @type attribute: int
+ @param attribute: Particle.VERTEXGROUPS([ 'DENSITY' | 'VELOCITY' | ... ])
+ @type negated: int
+ @param negated: Negate the effect of the vertex group
+ @return: None
+ """
More information about the Bf-blender-cvs
mailing list