[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11375] trunk/blender/source/blender/ python/api2_2x: == PyAPI - Constraints Space Conversion Access ==

Joshua Leung aligorith at gmail.com
Thu Jul 26 14:15:55 CEST 2007


Revision: 11375
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11375
Author:   aligorith
Date:     2007-07-26 14:15:55 +0200 (Thu, 26 Jul 2007)

Log Message:
-----------
== PyAPI - Constraints Space Conversion Access ==

Now, for the constraints that support Constraint Space Conversion, those settings can now be set from the PyAPI too. 

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/Constraint.c
    trunk/blender/source/blender/python/api2_2x/doc/Constraint.py

Modified: trunk/blender/source/blender/python/api2_2x/Constraint.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Constraint.c	2007-07-26 10:15:06 UTC (rev 11374)
+++ trunk/blender/source/blender/python/api2_2x/Constraint.c	2007-07-26 12:15:55 UTC (rev 11375)
@@ -43,6 +43,7 @@
 #include "BKE_library.h"
 #include "BKE_action.h"
 #include "BKE_armature.h"
+#include "BKE_constraint.h"
 #include "BLI_blenlib.h"
 #include "BIF_editconstraint.h"
 #include "BSE_editipo.h"
@@ -437,6 +438,118 @@
 	Py_RETURN_NONE;
 }
 
+/******************************************************************************/
+/* Constraint Space Conversion get/set procedures 						*/
+/* 		- Individual constraint procedures should call these 				*/
+/******************************************************************************/
+
+static PyObject *constspace_getter( BPy_Constraint * self, int type )
+{
+	bConstraint *con= (bConstraint *)(self->con);
+	
+	/* depends on type being asked for
+	 * NOTE: not all constraints support all space types 
+	 */
+	if (type == EXPP_CONSTR_OWNSPACE) {
+		switch (con->type) {
+			/* all of these support this... */
+			case CONSTRAINT_TYPE_PYTHON:
+			case CONSTRAINT_TYPE_LOCLIKE:
+			case CONSTRAINT_TYPE_ROTLIKE:
+			case CONSTRAINT_TYPE_SIZELIKE:
+			case CONSTRAINT_TYPE_TRACKTO:
+			case CONSTRAINT_TYPE_LOCLIMIT:
+			case CONSTRAINT_TYPE_ROTLIMIT:
+			case CONSTRAINT_TYPE_SIZELIMIT:
+			case CONSTRAINT_TYPE_TRANSFORM:
+				return PyInt_FromLong( (long)con->ownspace );
+		}
+	}
+	else if (type == EXPP_CONSTR_TARSPACE) {
+		switch (con->type) {
+			/* all of these support this... */
+			case CONSTRAINT_TYPE_PYTHON:
+			case CONSTRAINT_TYPE_ACTION:
+			case CONSTRAINT_TYPE_LOCLIKE:
+			case CONSTRAINT_TYPE_ROTLIKE:
+			case CONSTRAINT_TYPE_SIZELIKE:
+			case CONSTRAINT_TYPE_TRACKTO:
+			case CONSTRAINT_TYPE_TRANSFORM:
+				return PyInt_FromLong( (long)con->tarspace );
+		}
+	}
+	
+	/* raise error if failed */
+	return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+}
+
+static int constspace_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+	bConstraint *con= (bConstraint *)(self->con);
+	
+	/* depends on type being asked for
+	 * NOTE: not all constraints support all space types 
+	 */
+	if (type == EXPP_CONSTR_OWNSPACE) {
+		switch (con->type) {
+			/* all of these support this... */
+			case CONSTRAINT_TYPE_PYTHON:
+			case CONSTRAINT_TYPE_LOCLIKE:
+			case CONSTRAINT_TYPE_ROTLIKE:
+			case CONSTRAINT_TYPE_SIZELIKE:
+			case CONSTRAINT_TYPE_TRACKTO:
+			case CONSTRAINT_TYPE_LOCLIMIT:
+			case CONSTRAINT_TYPE_ROTLIMIT:
+			case CONSTRAINT_TYPE_SIZELIMIT:
+			case CONSTRAINT_TYPE_TRANSFORM:
+			{
+				/* only copy depending on ownertype */
+				if (self->pchan) {
+					return EXPP_setIValueClamped( value, &con->ownspace, 
+							CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' );
+				}
+				else {
+					return EXPP_setIValueClamped( value, &con->ownspace, 
+							CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' );
+				}
+			}
+				break;
+		}
+	}
+	else if (type == EXPP_CONSTR_TARSPACE) {
+		switch (con->type) {
+			/* all of these support this... */
+			case CONSTRAINT_TYPE_PYTHON:
+			case CONSTRAINT_TYPE_ACTION:
+			case CONSTRAINT_TYPE_LOCLIKE:
+			case CONSTRAINT_TYPE_ROTLIKE:
+			case CONSTRAINT_TYPE_SIZELIKE:
+			case CONSTRAINT_TYPE_TRACKTO:
+			case CONSTRAINT_TYPE_TRANSFORM:
+			{
+				Object *tar;
+				char subtarget[32];
+				
+				tar= get_constraint_target(con, &subtarget);
+				
+				/* only copy depending on target-type */
+				if (tar && subtarget[0]) {
+					return EXPP_setIValueClamped( value, &con->tarspace, 
+							CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' );
+				}
+				else if (tar) {
+					return EXPP_setIValueClamped( value, &con->tarspace, 
+							CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' );
+				}
+			}
+				break;
+		}
+	}
+	
+	/* raise error if failed */
+	return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+}
+
 /*****************************************************************************/
 /* Specific constraint get/set procedures                                    */
 /*****************************************************************************/
@@ -1574,6 +1687,13 @@
 				"This constraint has been removed!" );
 	
 	setting = PyInt_AsLong( key );
+	
+	/* bypass doing settings of individual constraints, if we're just doing
+	 * constraint space access-stuff 
+	 */
+	if ((setting==EXPP_CONSTR_OWNSPACE) || (setting==EXPP_CONSTR_TARSPACE)) {
+		return constspace_getter( self, setting );
+	}
 	switch( self->con->type ) {
 		case CONSTRAINT_TYPE_NULL:
 			Py_RETURN_NONE;
@@ -1632,67 +1752,76 @@
 				"This constraint has been removed!" );
 	
 	key_int = PyInt_AsLong( key );
-	switch( self->con->type ) {
-	case CONSTRAINT_TYPE_KINEMATIC:
-		result = kinematic_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_ACTION:
-		result = action_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_TRACKTO:
-		result = trackto_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_STRETCHTO:
-		result = stretchto_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_FOLLOWPATH:
-		result = followpath_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_LOCKTRACK:
-		result = locktrack_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_MINMAX:
-		result = floor_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_LOCLIKE:
-		result = locatelike_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_ROTLIKE:
-		result = rotatelike_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_SIZELIKE:
-		result = sizelike_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_ROTLIMIT:
-		result = rotlimit_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_LOCLIMIT:
-		result = loclimit_setter( self, key_int, arg );
-		break;
-	case CONSTRAINT_TYPE_SIZELIMIT:
-		result = sizelimit_setter( self, key_int, arg);
-		break;
-	case CONSTRAINT_TYPE_RIGIDBODYJOINT:
-		result = rigidbody_setter( self, key_int, arg);
-		break;
-	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_CHILDOF:
-		result = childof_setter( self, key_int, arg);
-		break;
-	case CONSTRAINT_TYPE_TRANSFORM:
-		result = transf_setter( self, key_int, arg);
-		break;
-	case CONSTRAINT_TYPE_NULL:
-		return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
-	default:
-		return EXPP_ReturnIntError( PyExc_RuntimeError,
-				"unsupported constraint setting" );
+	
+	/* bypass doing settings of individual constraints, if we're just doing
+	 * constraint space access-stuff 
+	 */
+	if ((key_int==EXPP_CONSTR_OWNSPACE) || (key_int==EXPP_CONSTR_TARSPACE)) {
+		result = constspace_setter( self, key_int, arg );
 	}
+	else {
+		switch( self->con->type ) {
+		case CONSTRAINT_TYPE_KINEMATIC:
+			result = kinematic_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_ACTION:
+			result = action_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_TRACKTO:
+			result = trackto_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_STRETCHTO:
+			result = stretchto_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_FOLLOWPATH:
+			result = followpath_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_LOCKTRACK:
+			result = locktrack_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_MINMAX:
+			result = floor_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_LOCLIKE:
+			result = locatelike_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_ROTLIKE:
+			result = rotatelike_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_SIZELIKE:
+			result = sizelike_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_ROTLIMIT:
+			result = rotlimit_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_LOCLIMIT:
+			result = loclimit_setter( self, key_int, arg );
+			break;
+		case CONSTRAINT_TYPE_SIZELIMIT:
+			result = sizelimit_setter( self, key_int, arg);
+			break;
+		case CONSTRAINT_TYPE_RIGIDBODYJOINT:
+			result = rigidbody_setter( self, key_int, arg);
+			break;
+		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_CHILDOF:
+			result = childof_setter( self, key_int, arg);
+			break;
+		case CONSTRAINT_TYPE_TRANSFORM:
+			result = transf_setter( self, key_int, arg);
+			break;
+		case CONSTRAINT_TYPE_NULL:
+			return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+		default:
+			return EXPP_ReturnIntError( PyExc_RuntimeError,
+					"unsupported constraint setting" );
+		}
+	}
 	if( !result && self->pchan )
 		update_pose_constraint_flags( self->obj->pose );
 	return result;

Modified: trunk/blender/source/blender/python/api2_2x/doc/Constraint.py
===================================================================
--- trunk/blender/source/blender/python/api2_2x/doc/Constraint.py	2007-07-26 10:15:06 UTC (rev 11374)
+++ trunk/blender/source/blender/python/api2_2x/doc/Constraint.py	2007-07-26 12:15:55 UTC (rev 11375)
@@ -42,6 +42,13 @@
 		- 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 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
+			If the owner is a bone, values are SPACE_WORLD, SPACE_POSE, SPACE_PARLOCAL, SPACE_LOCAL
+		- TARGETSPACE (int): for TRACKTO, COPYLOC, COPYROT, COPYSIZE, PYTHON, TRANSFORM, ACTION
+			If the owner is an object, values are SPACE_WORLD, SPACE_LOCAL
+			If the owner is a bone, values are SPACE_WORLD, SPACE_POSE, SPACE_PARLOCAL, SPACE_LOCAL
 	- Used by IK Solver (IKSOLVER) constraint:
 		- TOLERANCE (float): clamped to [0.0001:1.0]
 		- ITERATIONS (int): clamped to [1,10000]





More information about the Bf-blender-cvs mailing list