Constraints Py-Api:

Fixed up Py-API access to PyConstraints. Also updated docs to reflect these changes.
This commit is contained in:
2008-03-16 06:28:40 +00:00
parent e3d0508882
commit eab07f7322
2 changed files with 111 additions and 30 deletions

View File

@@ -1391,11 +1391,40 @@ static PyObject *script_getter( BPy_Constraint * self, int type )
bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
switch( type ) {
// FIXME!!!
//case EXPP_CONSTR_TARGET:
// return Object_CreatePyObject( con->tar );
//case EXPP_CONSTR_BONE:
// return PyString_FromString( con->subtarget );
case EXPP_CONSTR_TARGET:
case EXPP_CONSTR_BONE:
{
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_PYTHON);
bConstraintTarget *ct;
PyObject *tlist=NULL, *val;
if (cti) {
/* change space of targets */
if (cti->get_constraint_targets) {
ListBase targets = {NULL, NULL};
int num_tars=0, i=0;
/* get targets, and create py-list for use temporarily */
num_tars= cti->get_constraint_targets(self->con, &targets);
if (num_tars) {
tlist= PyList_New(num_tars);
for (ct=targets.first; ct; ct=ct->next, i++) {
if (type == EXPP_CONSTR_BONE)
val= PyString_FromString(ct->subtarget);
else
val= Object_CreatePyObject(ct->tar);
PyList_SET_ITEM(tlist, i, val);
}
}
if (cti->flush_constraint_targets)
cti->flush_constraint_targets(self->con, &targets, 1);
}
}
return tlist;
}
case EXPP_CONSTR_SCRIPT:
return Text_CreatePyObject( con->text );
case EXPP_CONSTR_PROPS:
@@ -1410,25 +1439,73 @@ static int script_setter( BPy_Constraint *self, int type, PyObject *value )
bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
switch( type ) {
// FIXME!!!
//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_TARGET:
case EXPP_CONSTR_BONE:
{
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_PYTHON);
bConstraintTarget *ct;
int ok= 0;
if (cti) {
/* change space of targets */
if (cti->get_constraint_targets) {
ListBase targets = {NULL, NULL};
int num_tars=0, i=0;
/* get targets, and extract values from the given list */
num_tars= cti->get_constraint_targets(self->con, &targets);
if (num_tars) {
if ((PySequence_Check(value) == 0) || (PySequence_Size(value) != num_tars)) {
char errorstr[64];
sprintf(errorstr, "expected sequence of %d integer(s)", num_tars);
return EXPP_ReturnIntError(PyExc_TypeError, errorstr);
}
for (ct=targets.first; ct; ct=ct->next, i++) {
PyObject *val= PySequence_ITEM(value, i);
if (type == EXPP_CONSTR_BONE) {
char *name = PyString_AsString(val);
if (name == NULL) {
// hrm... should we break here instead?
ok = EXPP_ReturnIntError(PyExc_TypeError,
"expected string arg as member of list");
Py_DECREF(val);
break;
}
BLI_strncpy(ct->subtarget, name, sizeof(ct->subtarget));
}
else {
Object *obj = (( BPy_Object * )val)->object;
if ( !BPy_Object_Check(value) ) {
// hrm... should we break here instead?
ok = EXPP_ReturnIntError(PyExc_TypeError,
"expected BPy object argument as member of list");
Py_DECREF(val);
break;
}
ct->tar = obj;
}
Py_DECREF(val);
}
}
/* only flush changes to real constraints if all were successful */
if ((cti->flush_constraint_targets) && (ok == 0))
cti->flush_constraint_targets(self->con, &targets, 0);
}
}
return ok;
}
break;
case EXPP_CONSTR_SCRIPT: {
Text *text = (( BPy_Text * )value)->text;
if( !BPy_Object_Check( value ) )

View File

@@ -36,12 +36,16 @@ Or to print all the constraints attached to each bone in a pose::
@type Settings: readonly dictionary
@var Settings: Constant dict used for changing constraint settings.
- Used for all constraints
- TARGET (Object) (Note: not used by Limit Location (LIMITLOC),
Limit Rotation (LIMITROT), Limit Scale (LIMITSIZE))
- BONE (string): name of Bone sub-target (for armature targets) (Note: not
used by Stretch To (STRETCHTO), Limit Location (LIMITLOC), Limit Rotation
(LIMITROT), Limit Scale (LIMITSIZE), Follow Path (FOLLOWPATH), Clamp To (CLAMPTO))
- Used for all single-target constraints
(TRACKTO, FOLLOWPATH, COPYROT, COPYLOC, COPYSIZE, ACTION, LOCKTRACK, STRETCHTO, FLOOR, CLAMPTO, CHILDOF, TRANSFORM)
- TARGET (Object): target object
- BONE (string): name of Bone sub-target (for Armature targets), or name of Vertex Group sub-target
(for Geometry targets)
- Used for all multiple-target constraints
(PYTHON)
- TARGET (list of Objects): list of target objects, with one list slot = one target slot
- BONE (list of strings): list of names of Bone sub-target (for Armature targets) or name of Vertex Group
sub-targets (for Geometry targets)
- Used by some constraints:
- OWNERSPACE (int): for TRACKTO, COPYLOC, COPYROT, COPYSIZE, LIMITLOC, LIMITROT, LIMITSIZE, PYTHON, TRANSFORM
If the owner is an object, values are SPACE_WORLD, SPACE_LOCAL