== PyConstraints - BPy API Access ==
authorJoshua Leung <aligorith@gmail.com>
Mon, 18 Jun 2007 10:39:50 +0000 (10:39 +0000)
committerJoshua Leung <aligorith@gmail.com>
Mon, 18 Jun 2007 10:39:50 +0000 (10:39 +0000)
The BPy Access to PyConstraints. I have not implemented the setter for the PyC-ID-Properties access as I'm not too sure how this should be done.

Also fixed a few typos in the py-docs for the Limit Scale constraint.

source/blender/python/api2_2x/Constraint.c
source/blender/python/api2_2x/doc/Constraint.py

index 71dbef5f2d55dbcafc9d19f431ef2368075c6461..feb9e63e5b8f0cb5a5a58368ebd8438a2d6717ef 100644 (file)
@@ -36,6 +36,7 @@
 #include "DNA_effect_types.h"
 #include "DNA_vec_types.h"
 #include "DNA_curve_types.h"
+#include "DNA_text_types.h"
 
 #include "BKE_main.h"
 #include "BKE_global.h"
 #include "blendef.h"
 #include "mydevice.h"
 
+#include "IDProp.h"
 #include "Object.h"
 #include "NLA.h"
+#include "Text.h"
 #include "gen_utils.h"
 
 enum constraint_constants {
@@ -126,6 +129,9 @@ enum constraint_constants {
        EXPP_CONSTR_LIMLOCALBONE,
        EXPP_CONSTR_LIMLOCALNOPAR,
        
+       EXPP_CONSTR_SCRIPT,
+       EXPP_CONSTR_PROPS,
+               
        EXPP_CONSTR_RB_TYPE,
        EXPP_CONSTR_RB_BALL,
        EXPP_CONSTR_RB_HINGE,
@@ -1211,6 +1217,63 @@ static int sizelimit_setter( BPy_Constraint *self, int type, PyObject *value )
        }
 }
 
+static PyObject *script_getter( BPy_Constraint * self, int type )
+{
+       bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
+
+       switch( type ) {
+       case EXPP_CONSTR_TARGET:
+               return Object_CreatePyObject( con->tar );
+       case EXPP_CONSTR_BONE:
+               return PyString_FromString( con->subtarget );
+       case EXPP_CONSTR_SCRIPT:
+               return Text_CreatePyObject( con->text );
+       case EXPP_CONSTR_PROPS:
+               return BPy_Wrap_IDProperty( NULL, con->prop, NULL);
+       default:
+               return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+       }
+}
+
+static int script_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+       bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
+
+       switch( type ) {
+       case EXPP_CONSTR_TARGET: {
+               Object *obj = (( BPy_Object * )value)->object;
+               if( !BPy_Object_Check( value ) )
+                       return EXPP_ReturnIntError( PyExc_TypeError, 
+                                       "expected BPy object argument" );
+               con->tar = obj;
+               return 0;
+               }
+       case EXPP_CONSTR_BONE: {
+               char *name = PyString_AsString( value );
+               if( !name )
+                       return EXPP_ReturnIntError( PyExc_TypeError,
+                                       "expected string arg" );
+
+               BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) );
+
+               return 0;
+               }
+       case EXPP_CONSTR_SCRIPT: {
+               Text *text = (( BPy_Text * )value)->text;
+               if( !BPy_Object_Check( value ) )
+                       return EXPP_ReturnIntError( PyExc_TypeError, 
+                                       "expected BPy text argument" );
+               con->text = text;
+               return 0;
+               }
+       case EXPP_CONSTR_PROPS:
+               return EXPP_ReturnIntError( PyExc_RuntimeError,
+                                       "setting ID-Properties of PyConstraints this way is not supported" );
+       default:
+               return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+       }
+}
+
 
 static PyObject *rigidbody_getter( BPy_Constraint * self, int type)
 {
@@ -1380,8 +1443,9 @@ static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key )
                        return rigidbody_getter( self, setting );
                case CONSTRAINT_TYPE_CLAMPTO:
                        return clampto_getter( self, setting );
-               case CONSTRAINT_TYPE_CHILDOF:   /* Unimplemented */
                case CONSTRAINT_TYPE_PYTHON:
+                       return script_getter( self, setting );
+               case CONSTRAINT_TYPE_CHILDOF:   /* Unimplemented */
                default:
                        return EXPP_ReturnPyObjError( PyExc_KeyError,
                                        "unknown constraint type" );
@@ -1447,10 +1511,12 @@ static int Constraint_setData( BPy_Constraint * self, PyObject * key,
        case CONSTRAINT_TYPE_CLAMPTO:
                result = clampto_setter( self, key_int, arg);
                break;
+       case CONSTRAINT_TYPE_PYTHON:
+               result = script_setter( self, key_int, arg);
+               break;
        case CONSTRAINT_TYPE_NULL:
                return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
        case CONSTRAINT_TYPE_CHILDOF:   /* Unimplemented */
-       case CONSTRAINT_TYPE_PYTHON:
        default:
                return EXPP_ReturnIntError( PyExc_RuntimeError,
                                "unsupported constraint setting" );
@@ -2117,7 +2183,11 @@ static PyObject *M_Constraint_SettingsDict( void )
                                PyInt_FromLong( EXPP_CONSTR_LIMLOCALBONE ) );
                PyConstant_Insert( d, "LIMIT_LOCAL_NOPARENT",
                                PyInt_FromLong( EXPP_CONSTR_LIMLOCALNOPAR ) );
-
+               
+               PyConstant_Insert( d, "SCRIPT",
+                               PyInt_FromLong( EXPP_CONSTR_SCRIPT ) );
+               PyConstant_Insert( d, "PROPERTIES",
+                               PyInt_FromLong( EXPP_CONSTR_PROPS ) );
 
                PyConstant_Insert( d, "CONSTR_RB_TYPE",
                                PyInt_FromLong( EXPP_CONSTR_RB_TYPE ) );
index 2176c9903c2a11f44640391b0b812746b555ea1e..99409439d0c576e35ecd25936b0f16c1b178007b 100644 (file)
@@ -32,7 +32,7 @@ Or to print all the constraints attached to each bone in a pose::
        for comparison with L{Constraint.type}.  Values are
        TRACKTO, IKSOLVER, FOLLOWPATH, COPYROT, COPYLOC, COPYSIZE, ACTION,
        LOCKTRACK, STRETCHTO, FLOOR, LIMITLOC, LIMITROT, LIMITSIZE, CLAMPTO, 
-       NULL
+       PYTHON, NULL
 
 @type Settings: readonly dictionary
 @var Settings: Constant dict used for changing constraint settings.
@@ -117,12 +117,15 @@ Or to print all the constraints attached to each bone in a pose::
        - Used by Limit Scale (LIMITSIZE) constraint:
                - LIMIT (bitfield): any combination of LIMIT_XMIN, LIMIT_XMAX,
                        LIMIT_YMIN, LIMIT_YMAX, LIMIT_ZMIN, LIMIT_ZMAX
-               - XMIN (float): clamped to [-1000.0,1000.0]
-               - XMAX (float): clamped to [-1000.0,1000.0]
-               - YMIN (float): clamped to [-1000.0,1000.0]
-               - YMAX (float): clamped to [-1000.0,1000.0]
-               - ZMIN (float): clamped to [-1000.0,1000.0]
-               - ZMAX (float): clamped to [-1000.0,1000.0]
+               - XMIN (float): clamped to [0.0001,1000.0]
+               - XMAX (float): clamped to [0.0001,1000.0]
+               - YMIN (float): clamped to [0.0001,1000.0]
+               - YMAX (float): clamped to [0.0001,1000.0]
+               - ZMIN (float): clamped to [0.0001,1000.0]
+               - ZMAX (float): clamped to [0.0001,1000.0]
+       - Used by Python Script (PYTHON) constraint:
+               - SCRIPT (Text): script to use
+               - PROPERTIES (IDProperties): ID-Properties of constraint
 
 """