[Bf-blender-cvs] [a92bdfe] master: Armature select similar: children, immediate-children en sibligns selection.

Michał Ziobro noreply at git.blender.org
Tue Feb 2 00:41:59 CET 2016


Commit: a92bdfe0c917d28c82c1cdd120f9985a1b7d6f51
Author: Michał Ziobro
Date:   Tue Feb 2 00:28:34 2016 +0100
Branches: master
https://developer.blender.org/rBa92bdfe0c917d28c82c1cdd120f9985a1b7d6f51

Armature select similar: children, immediate-children en sibligns selection.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D1750

===================================================================

M	source/blender/editors/armature/armature_select.c

===================================================================

diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c
index efbf8a4..f4771f6 100644
--- a/source/blender/editors/armature/armature_select.c
+++ b/source/blender/editors/armature/armature_select.c
@@ -744,7 +744,10 @@ enum {
 	SIMEDBONE_DIRECTION,
 	SIMEDBONE_PREFIX,
 	SIMEDBONE_SUFFIX,
-	SIMEDBONE_LAYER
+	SIMEDBONE_LAYER,
+	SIMEDBONE_CHILDREN,
+	SIMEDBONE_CHILDREN_IMMEDIATE,
+	SIMEDBONE_SIBLINGS
 };
 
 static EnumPropertyItem prop_similar_types[] = {
@@ -753,6 +756,9 @@ static EnumPropertyItem prop_similar_types[] = {
 	{SIMEDBONE_PREFIX, "PREFIX", 0, "Prefix", ""},
 	{SIMEDBONE_SUFFIX, "SUFFIX", 0, "Suffix", ""},
 	{SIMEDBONE_LAYER, "LAYER", 0, "Layer", ""},
+	{SIMEDBONE_CHILDREN, "CHILDREN", 0, "Children", ""},
+	{SIMEDBONE_CHILDREN_IMMEDIATE, "CHILDREN_IMMEDIATE", 0, "Immediate children", ""},
+	{SIMEDBONE_SIBLINGS, "SIBLINGS", 0, "Siblings", ""},
 	{0, NULL, 0, NULL, NULL}
 };
 
@@ -855,6 +861,57 @@ static void select_similar_suffix(bArmature *arm, EditBone *ebone_act)
 	}
 }
 
+static void is_ancestor(EditBone * bone, EditBone * ancestor)
+{
+	if(bone->temp.ebone == ancestor || bone->temp.ebone == NULL)
+		return;
+
+	if(bone->temp.ebone->temp.ebone != NULL && bone->temp.ebone->temp.ebone != ancestor)
+		is_ancestor(bone->temp.ebone, ancestor);
+
+	bone->temp.ebone = bone->temp.ebone->temp.ebone;
+}
+
+static void select_similar_children(bArmature *arm, EditBone *ebone_act)
+{
+	EditBone *ebone_iter;
+
+	for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+		ebone_iter->temp.ebone = ebone_iter->parent;
+	}
+
+	for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next){
+		is_ancestor(ebone_iter, ebone_act);
+
+		if(ebone_iter->temp.ebone == ebone_act && EBONE_SELECTABLE(arm, ebone_iter))
+			ED_armature_ebone_select_set(ebone_iter, true);
+	}
+}
+
+static void select_similar_children_immediate(bArmature *arm, EditBone *ebone_act)
+{
+	EditBone *ebone_iter;
+	for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+		if(ebone_iter->parent == ebone_act && EBONE_SELECTABLE(arm, ebone_iter)) {
+			ED_armature_ebone_select_set(ebone_iter, true);
+		}
+	}
+}
+
+static void select_similar_siblings(bArmature *arm, EditBone *ebone_act)
+{
+	EditBone *ebone_iter;
+
+	if(ebone_act->parent == NULL)
+		return;
+
+	for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+		if(ebone_iter->parent == ebone_act->parent && EBONE_SELECTABLE(arm, ebone_iter)) {
+			ED_armature_ebone_select_set(ebone_iter, true);
+		}
+	}
+}
+
 static int armature_select_similar_exec(bContext *C, wmOperator *op)
 {
 	Object *obedit = CTX_data_edit_object(C);
@@ -887,6 +944,15 @@ static int armature_select_similar_exec(bContext *C, wmOperator *op)
 		case SIMEDBONE_LAYER:
 			select_similar_layer(arm, ebone_act);
 			break;
+		case SIMEDBONE_CHILDREN:
+			select_similar_children(arm, ebone_act);
+			break;
+		case SIMEDBONE_CHILDREN_IMMEDIATE:
+			select_similar_children_immediate(arm, ebone_act);
+			break;
+		case SIMEDBONE_SIBLINGS:
+			select_similar_siblings(arm, ebone_act);
+			break;
 	}
 
 	WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);




More information about the Bf-blender-cvs mailing list