[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28422] trunk/blender/source/blender: Pass constraint names as operator properties in constraint operators

Matt Ebb matt at mke3.net
Mon Apr 26 05:42:40 CEST 2010


Revision: 28422
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28422
Author:   broken
Date:     2010-04-26 05:42:38 +0200 (Mon, 26 Apr 2010)

Log Message:
-----------
Pass constraint names as operator properties in constraint operators

This is similar to commit revision 22078, but for constraint operators rather 
than modifiers, making it possible to use them from scripting.

Revision Links:
--------------
    http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22078

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_constraint.h
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/editors/object/object_constraint.c

Modified: trunk/blender/source/blender/blenkernel/BKE_constraint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_constraint.h	2010-04-26 02:23:13 UTC (rev 28421)
+++ trunk/blender/source/blender/blenkernel/BKE_constraint.h	2010-04-26 03:42:38 UTC (rev 28422)
@@ -130,7 +130,8 @@
 /* Constraint API function prototypes */
 struct bConstraint *constraints_get_active(struct ListBase *list);
 void constraints_set_active(ListBase *list, struct bConstraint *con);
-
+struct bConstraint *constraints_findByName(struct ListBase *list, const char *name);
+	
 struct bConstraint *add_ob_constraint(struct Object *ob, const char *name, short type);
 struct bConstraint *add_pose_constraint(struct Object *ob, struct bPoseChannel *pchan, const char *name, short type);
 

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2010-04-26 02:23:13 UTC (rev 28421)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2010-04-26 03:42:38 UTC (rev 28422)
@@ -36,6 +36,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_listbase.h"
 #include "BLI_math.h"
 #include "BLI_editVert.h"
 
@@ -4162,6 +4163,11 @@
 
 /* ......... */
 
+bConstraint *constraints_findByName(ListBase *list, const char *name)
+{
+	return BLI_findstring(list, name, offsetof(bConstraint, name));
+}
+
 /* finds the 'active' constraint in a constraint stack */
 bConstraint *constraints_get_active (ListBase *list)
 {

Modified: trunk/blender/source/blender/editors/object/object_constraint.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_constraint.c	2010-04-26 02:23:13 UTC (rev 28421)
+++ trunk/blender/source/blender/editors/object/object_constraint.c	2010-04-26 03:42:38 UTC (rev 28422)
@@ -430,28 +430,121 @@
 	}
 }
 
+
+/************************ generic functions for operators using constraint names and data context *********************/
+
+#define EDIT_CONSTRAINT_OWNER_OBJECT	0
+#define EDIT_CONSTRAINT_OWNER_BONE		1
+
+static EnumPropertyItem constraint_owner_items[] = {
+{EDIT_CONSTRAINT_OWNER_OBJECT, "OBJECT", 0, "Object", "Edit a constraint on the active object"},
+{EDIT_CONSTRAINT_OWNER_BONE, "BONE", 0, "Bone", "Edit a constraint on the active bone"},
+{0, NULL, 0, NULL, NULL}};
+
+
+static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
+{
+	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", rna_type);
+	Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
+	
+	if (!ob || ob->id.lib) return 0;
+	if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
+	
+	return 1;
+}
+
+static int edit_constraint_poll(bContext *C)
+{
+	return edit_constraint_poll_generic(C, &RNA_Constraint);
+}
+
+static void edit_constraint_properties(wmOperatorType *ot)
+{
+	RNA_def_string(ot->srna, "constraint", "", 32, "Constraint", "Name of the constraint to edit");
+	RNA_def_enum(ot->srna, "owner", constraint_owner_items, 0, "Owner", "The owner of this constraint");
+}
+
+static int edit_constraint_invoke_properties(bContext *C, wmOperator *op)
+{
+	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
+	Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
+	bConstraint *con;
+	ListBase *list;
+	
+	if (RNA_property_is_set(op->ptr, "constraint") && RNA_property_is_set(op->ptr, "owner"))
+		return 1;
+	
+	if (ptr.data) {
+		con = ptr.data;
+		RNA_string_set(op->ptr, "constraint", con->name);
+		
+		list = get_constraint_lb(ob, con, NULL);
+		
+		if (&ob->constraints == list)
+			RNA_enum_set(op->ptr, "owner", EDIT_CONSTRAINT_OWNER_OBJECT);
+		else
+			RNA_enum_set(op->ptr, "owner", EDIT_CONSTRAINT_OWNER_BONE);
+		
+		return 1;
+	}
+	
+	return 0;
+}
+
+static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Object *ob, int type)
+{
+	char constraint_name[32];
+	int owner = RNA_enum_get(op->ptr, "owner");
+	bConstraint *con;
+	ListBase *list;
+	
+	RNA_string_get(op->ptr, "constraint", constraint_name);
+	
+	if (owner == EDIT_CONSTRAINT_OWNER_OBJECT) {
+		list = &ob->constraints;
+	} else if (owner == EDIT_CONSTRAINT_OWNER_BONE) {
+		bPoseChannel *pchan= get_active_posechannel(ob);
+		if (pchan)
+			list = &pchan->constraints;
+		else
+			return NULL;
+	}
+	
+	con = constraints_findByName(list, constraint_name);
+	
+	if (con && type != 0 && con->type != type)
+		con = NULL;
+	
+	return con;
+}
+
 /* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */
 
 /* ---------- Distance-Dependent Constraints ---------- */
 /* StretchTo, Limit Distance */
 
-static int stretchto_poll(bContext *C)
+static int stretchto_reset_exec (bContext *C, wmOperator *op)
 {
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint);
-	return (ptr.id.data && ptr.data);
-}
+	Object *ob = ED_object_active_context(C);
+	bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_STRETCHTO);
+	bStretchToConstraint *data= (bStretchToConstraint *)con->data;
 
-static int stretchto_reset_exec (bContext *C, wmOperator *op)
-{
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint);
-	
 	/* just set original length to 0.0, which will cause a reset on next recalc */
-	RNA_float_set(&ptr, "original_length", 0.0f);
+	data->orglength = 0.0f;
+	ED_object_constraint_update(ob);
 	
 	WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
 	return OPERATOR_FINISHED;
 }
 
+static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	if (edit_constraint_invoke_properties(C, op))
+		return stretchto_reset_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
+}
+
 void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot)
 {
 	/* identifiers */
@@ -460,28 +553,35 @@
 	ot->description= "Reset original length of bone for Stretch To Constraint";
 	
 	ot->exec= stretchto_reset_exec;
-	ot->poll= stretchto_poll;
+	ot->invoke= stretchto_reset_invoke;
+	ot->poll= edit_constraint_poll;
 	
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	edit_constraint_properties(ot);
 }
 
 
 static int limitdistance_reset_exec (bContext *C, wmOperator *op)
 {
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint);
+	Object *ob = ED_object_active_context(C);
+	bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_DISTLIMIT);
+	bDistLimitConstraint *data= (bDistLimitConstraint *)con->data;
 	
-	/* just set distance to 0.0, which will cause a reset on next recalc */
-	RNA_float_set(&ptr, "distance", 0.0f);
+	/* just set original length to 0.0, which will cause a reset on next recalc */
+	data->dist = 0.0f;
+	ED_object_constraint_update(ob);
 	
 	WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
 	return OPERATOR_FINISHED;
 }
 
-static int limitdistance_poll(bContext *C)
+static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint);
-	return (ptr.id.data && ptr.data);
+	if (edit_constraint_invoke_properties(C, op))
+		return limitdistance_reset_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
 }
 
 void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot)
@@ -492,10 +592,12 @@
 	ot->description= "Reset limiting distance for Limit Distance Constraint";
 	
 	ot->exec= limitdistance_reset_exec;
-	ot->poll= limitdistance_poll;
+	ot->invoke= limitdistance_reset_invoke;
+	ot->poll= edit_constraint_poll;
 	
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	edit_constraint_properties(ot);
 }
 
 /* ------------- Child-Of Constraint ------------------ */
@@ -509,10 +611,9 @@
 /* ChildOf Constraint - set inverse callback */
 static int childof_set_inverse_exec (bContext *C, wmOperator *op)
 {
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint);
 	Scene *scene= CTX_data_scene(C);
-	Object *ob= ptr.id.data;
-	bConstraint *con= ptr.data;
+	Object *ob = ED_object_active_context(C);
+	bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
 	bChildOfConstraint *data= (bChildOfConstraint *)con->data;
 	bPoseChannel *pchan= NULL;
 
@@ -564,6 +665,14 @@
 	return OPERATOR_FINISHED;
 }
 
+static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	if (edit_constraint_invoke_properties(C, op))
+		return childof_set_inverse_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
+}
+
 void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot)
 {
 	/* identifiers */
@@ -572,18 +681,19 @@
 	ot->description= "Set inverse correction for ChildOf constraint";
 	
 	ot->exec= childof_set_inverse_exec;
-	ot->poll= childof_poll;
+	ot->invoke= childof_set_inverse_invoke;
+	ot->poll= edit_constraint_poll;
 	
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	edit_constraint_properties(ot);
 }
 
 /* ChildOf Constraint - clear inverse callback */
 static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
 {
-	PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint);
-	Object *ob= ptr.id.data;
-	bConstraint *con= ptr.data;
+	Object *ob = ED_object_active_context(C);
+	bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
 	bChildOfConstraint *data= (bChildOfConstraint *)con->data;
 	
 	/* simply clear the matrix */
@@ -594,6 +704,14 @@
 	return OPERATOR_FINISHED;
 }
 
+static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	if (edit_constraint_invoke_properties(C, op))
+		return childof_clear_inverse_exec(C, op);
+	else
+		return OPERATOR_CANCELLED;
+}
+
 void CONSTRAINT_OT_childof_clear_inverse (wmOperatorType *ot)
 {
 	/* identifiers */
@@ -602,10 +720,12 @@
 	ot->description= "Clear inverse correction for ChildOf constraint";
 	
 	ot->exec= childof_clear_inverse_exec;
-	ot->poll= childof_poll;
+	ot->invoke= childof_clear_inverse_invoke;
+	ot->poll= edit_constraint_poll;
 	
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	edit_constraint_properties(ot);
 }
 
 /***************************** BUTTONS ****************************/
@@ -675,7 +795,7 @@
 	/* identifiers */
 	ot->name= "Delete Constraint";
 	ot->idname= "CONSTRAINT_OT_delete";
-	ot->description= "Remove constraitn from constraint stack";

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list