[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24914] trunk/blender/source/blender: fix for adding drivers to constraints via python.

Campbell Barton ideasman42 at gmail.com
Thu Nov 26 10:48:53 CET 2009


Revision: 24914
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24914
Author:   campbellbarton
Date:     2009-11-26 10:48:53 +0100 (Thu, 26 Nov 2009)

Log Message:
-----------
fix for adding drivers to constraints via python.
the RNA constraint api was checking the current context when getting the constraint driver path and renaming constraints.
this made scripts not work properly so changed this to search for the constraint pose channel user within the object (if the object its self is not the user).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_constraint.c
    trunk/blender/source/blender/makesrna/intern/rna_constraint.c

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2009-11-26 09:40:37 UTC (rev 24913)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2009-11-26 09:48:53 UTC (rev 24914)
@@ -92,6 +92,7 @@
 
 /* constraints */
 struct ListBase *get_active_constraints(struct Object *ob);
+struct ListBase *get_constraint_lb(struct Object *ob, struct bConstraint *con, struct bPoseChannel **pchan_r);
 struct bConstraint *get_active_constraint(struct Object *ob);
 
 void object_test_constraints(struct Object *ob);

Modified: trunk/blender/source/blender/editors/object/object_constraint.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_constraint.c	2009-11-26 09:40:37 UTC (rev 24913)
+++ trunk/blender/source/blender/editors/object/object_constraint.c	2009-11-26 09:48:53 UTC (rev 24914)
@@ -98,6 +98,33 @@
 	return NULL;
 }
 
+ListBase *get_constraint_lb (Object *ob, bConstraint *con, bPoseChannel **pchan_r)
+{
+	if(pchan_r)
+		*pchan_r= NULL;
+
+	if (ELEM(NULL, ob, con))
+		return NULL;
+
+	if((BLI_findindex(&ob->constraints, con) != -1)) {
+		return &ob->constraints;
+	}
+	else if(ob->pose) {
+		bPoseChannel *pchan;
+		for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+			if((BLI_findindex(&pchan->constraints, con) != -1)) {
+
+				if(pchan_r)
+					*pchan_r= pchan;
+
+				return &pchan->constraints;
+			}
+		}
+	}
+
+	return NULL;
+}
+
 /* single constraint */
 bConstraint *get_active_constraint (Object *ob)
 {

Modified: trunk/blender/source/blender/makesrna/intern/rna_constraint.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_constraint.c	2009-11-26 09:40:37 UTC (rev 24913)
+++ trunk/blender/source/blender/makesrna/intern/rna_constraint.c	2009-11-26 09:48:53 UTC (rev 24914)
@@ -92,6 +92,8 @@
 
 #ifdef RNA_RUNTIME
 
+#include <stdio.h>
+
 #include "BKE_animsys.h"
 #include "BKE_action.h"
 #include "BKE_constraint.h"
@@ -168,7 +170,7 @@
 	/* make sure name is unique */
 	if (ptr->id.data) {
 		Object *ob= ptr->id.data;
-		ListBase *list= get_active_constraints(ob);
+		ListBase *list = get_constraint_lb(ob, con, NULL);
 		
 		/* if we have the list, check for unique name, otherwise give up */
 		if (list)
@@ -183,19 +185,17 @@
 {
 	Object *ob= ptr->id.data;
 	bConstraint *con= ptr->data;
-	bPoseChannel *pchan= get_active_posechannel(ob);
-	ListBase *actlist= get_active_constraints(ob);
-	short inList = 0;
+	bPoseChannel *pchan;
+	ListBase *lb = get_constraint_lb(ob, con, &pchan);
+
+	if(lb == NULL)
+		printf("rna_Constraint_path: internal error, constraint '%s' not found in object '%s'\n", con->name, ob->id.name);
+
+	if(pchan) {
+		return BLI_sprintfN("pose.bones[\"%s\"].constraints[\"%s\"]", pchan->name, con->name);
+	}
 	
-	/* check if constraint is in the given list */
-	if (actlist)
-		inList= (BLI_findindex(actlist, con) != -1);
-	
-	/* if constraint is in the list, the list is for the active bone... */
-	if ((inList) && (actlist != &ob->constraints) && (pchan))
-		return BLI_sprintfN("pose.bones[\"%s\"].constraints[\"%s\"]", pchan->name, con->name);
-	else
-		return BLI_sprintfN("constraints[\"%s\"]", con->name);
+	return BLI_sprintfN("constraints[\"%s\"]", con->name);
 }
 
 static void rna_Constraint_update(bContext *C, PointerRNA *ptr)





More information about the Bf-blender-cvs mailing list