KeyingSets: Added two operators which wrap the internal (blenkernel) KeyingSets API...
authorJoshua Leung <aligorith@gmail.com>
Fri, 20 Feb 2009 05:42:09 +0000 (05:42 +0000)
committerJoshua Leung <aligorith@gmail.com>
Fri, 20 Feb 2009 05:42:09 +0000 (05:42 +0000)
These operators - ANIM_OT_keyingset_add_new() and ANIM_OT_keyingset_add_destination() - are designed for use from PyAPI or through some other means, and as such, have not been assigned any hotkeys.
They should only be used when all the relevant settings can be supplied to them, which in ideal circumstances would be through some script used by a rigger to define all the necessary Keying Sets for their rig for example.

Whether we will be building many of the utilities for the PyAPI like this remains to be seen.

Note: the second one doesn't work yet, as there are problems with accessing certain operator props.

source/blender/editors/animation/anim_ops.c
source/blender/editors/animation/keyframing.c
source/blender/editors/include/ED_keyframing.h

index 3f69aeaf857a64c10cb23a6968e1dc3e67917d88..b51fa223eb3420292e775e3a3706a2a47027a88a 100644 (file)
@@ -382,6 +382,9 @@ void ED_operatortypes_anim(void)
        WM_operatortype_append(ANIM_OT_delete_keyframe);
        WM_operatortype_append(ANIM_OT_insert_keyframe_old);
        WM_operatortype_append(ANIM_OT_delete_keyframe_old);
+       
+       WM_operatortype_append(ANIM_OT_keyingset_add_new);
+       WM_operatortype_append(ANIM_OT_keyingset_add_destination);
 }
 
 void ED_keymap_anim(wmWindowManager *wm)
index d28bae9b12eaab18ff9cea9c2a4c2b540f5e2080..1cdebe8f14ebe337d2cff1f6f2ef05367117316c 100644 (file)
@@ -870,14 +870,139 @@ short deletekey (ID *id, const char group[], const char rna_path[], int array_in
 }
 
 /* ******************************************* */
-/* KEYFRAME MODIFICATION */
+/* KEYINGSETS */
 
-/* mode for common_modifykey */
-enum {
-       COMMONKEY_MODE_INSERT = 0,
-       COMMONKEY_MODE_DELETE,
-} eCommonModifyKey_Modes;
+/* Operators ------------------------------------------- */
+
+/* These operators are only provided for scripting/macro usage, not for direct
+ * calling from the UI since they wrap some of the data-access API code for these
+ * (defined in blenkernel) which have quite a few properties.
+ */
+
+/* ----- */
+
+static int keyingset_add_destination_exec (bContext *C, wmOperator *op)
+{
+       //PointerRNA *ptr;
+       KeyingSet *ks= NULL;
+       ID *id= NULL;
+       char rna_path[256], group_name[64]; // xxx
+       short groupmode=0, flag=0;
+       int array_index=0;
+       
+       /* get settings from operator properties */
+#if 0 // XXX - why can't we have something like this in the RNA-access API?
+       if ( (ptr = RNA_property_pointer_get(op->ptr, "keyingset")) )
+               ks= (KeyingSet *)ptr->data;
+       if ( (ptr = RNA_property_pointer_get(op->ptr, "id")) )
+               id= (ID *)ptr->id;
+#endif 
+       
+       groupmode= RNA_enum_get(op->ptr, "grouping_method");
+       RNA_string_get(op->ptr, "group_name", group_name);              
+       
+       RNA_string_get(op->ptr, "rna_path", rna_path);
+       array_index= RNA_int_get(op->ptr, "array_index");
+       
+       if (RNA_boolean_get(op->ptr, "entire_array"))
+               flag |= KSP_FLAG_WHOLE_ARRAY;
+       
+       /* if enough args are provided, call API method */
+       if (ks) {
+               BKE_keyingset_add_destination(ks, id, group_name, rna_path, array_index, flag, groupmode);
+               return OPERATOR_FINISHED;
+       }
+       else {
+               BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added.");
+               return OPERATOR_CANCELLED;
+       }       
+}
+
+void ANIM_OT_keyingset_add_destination (wmOperatorType *ot)
+{
+       // XXX: this is also defined in rna_animation.c
+       static EnumPropertyItem prop_mode_grouping_items[] = {
+               {KSP_GROUP_NAMED, "NAMED", "Named Group", ""},
+               {KSP_GROUP_NONE, "NONE", "None", ""},
+               {KSP_GROUP_KSNAME, "KEYINGSET", "Keying Set Name", ""},
+               {0, NULL, NULL, NULL}};
+       
+       /* identifiers */
+       ot->name= "Add Keying Set Destination";
+       ot->idname= "ANIM_OT_keyingset_add_destination";
+       
+       /* callbacks */
+       ot->exec= keyingset_add_destination_exec;
+       ot->poll= ED_operator_scene_editable;
+       
+       /* props */
+               /* pointers */ // xxx - do we want to directly expose these?
+       RNA_def_pointer_runtime(ot->srna, "keyingset", &RNA_KeyingSet, "Keying Set", "Keying Set to add destination to.");
+       RNA_def_pointer_runtime(ot->srna, "id", &RNA_ID, "ID", "ID-block for the destination.");
+               /* grouping */
+       RNA_def_enum(ot->srna, "grouping_method", prop_mode_grouping_items, KSP_GROUP_NAMED, "Grouping Method", "Method used to define which Group-name to use.");
+       RNA_def_string(ot->srna, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
+               /* rna-path */
+       RNA_def_string(ot->srna, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
+       RNA_def_int(ot->srna, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX);
+               /* flags */
+       RNA_def_boolean(ot->srna, "entire_array", 1, "Entire Array", "hen an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used.");
+       
+}
+/* ----- */
+
+static int keyingset_add_new_exec (bContext *C, wmOperator *op)
+{
+       Scene *sce= CTX_data_scene(C);
+       KeyingSet *ks= NULL;
+       short flag=0, keyingflag=0;
+       char name[64];
+       
+       /* get settings from operator properties */
+       RNA_string_get(op->ptr, "name", name);
+       
+       if (RNA_boolean_get(op->ptr, "absolute"))
+               flag |= KEYINGSET_ABSOLUTE;
+       if (RNA_boolean_get(op->ptr, "insertkey_needed"))
+               keyingflag |= INSERTKEY_NEEDED;
+       if (RNA_boolean_get(op->ptr, "insertkey_visual"))
+               keyingflag |= INSERTKEY_MATRIX;
+               
+       /* call the API func, and set the active keyingset index */
+       ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag);
+       
+       if (ks) {
+               sce->active_keyingset= BLI_countlist(&sce->keyingsets);
+               return OPERATOR_FINISHED;
+       }
+       else {
+               BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added.");
+               return OPERATOR_CANCELLED;
+       }
+}
+
+void ANIM_OT_keyingset_add_new (wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Add Keying Set";
+       ot->idname= "ANIM_OT_keyingset_add_new";
+       
+       /* callbacks */
+       ot->exec= keyingset_add_new_exec;
+       ot->poll= ED_operator_scene_editable;
+       
+       /* props */
+               /* name */
+       RNA_def_string(ot->srna, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
+               /* flags */
+       RNA_def_boolean(ot->srna, "absolute", 1, "Absolute", "Keying Set defines specifc paths/settings to be keyframed (i.e. is not reliant on context info)");
+               /* keying flags */
+       RNA_def_boolean(ot->srna, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
+       RNA_def_boolean(ot->srna, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
+}
 
+/* UI API --------------------------------------------- */
 
 /* Build menu-string of available keying-sets (allocates memory for string)
  * NOTE: mode must not be longer than 64 chars
@@ -918,6 +1043,17 @@ char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit)
        return str;
 }
 
+
+
+/* ******************************************* */
+/* KEYFRAME MODIFICATION */
+
+/* mode for common_modifykey */
+enum {
+       COMMONKEY_MODE_INSERT = 0,
+       COMMONKEY_MODE_DELETE,
+} eCommonModifyKey_Modes;
+
 #if 0 // XXX old keyingsets code based on adrcodes... to be restored in due course
 
 /* --------- KeyingSet Adrcode Getters ------------ */
index 78ba65d98147818d293adb4cd3d5bc52f092b100..b2846fc0bd9f453fddb0475ecb21249a0275e05f 100644 (file)
@@ -69,6 +69,13 @@ short deletekey(struct ID *id, const char group[], const char rna_path[], int ar
 /* Generate menu of KeyingSets */
 char *ANIM_build_keyingsets_menu(struct ListBase *list, short for_edit);
 
+/* KeyingSet Editing Operators:
+ *     These can add a new KeyingSet and/or add 'destinations' to the KeyingSets,
+ *     acting as a means by which they can be added outside the Outliner.
+ */
+void ANIM_OT_keyingset_add_new(struct wmOperatorType *ot);
+void ANIM_OT_keyingset_add_destination(struct wmOperatorType *ot);
+
 /* Main Keyframe Management operators: 
  *     These handle keyframes management from various spaces. They only make use of
  *     Keying Sets.