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)


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

Reply via email to