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
+               """


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to