[Bf-blender-cvs] [7eb539c] master: Sort vertex groups by Armature Hierarchy

gaiaclary noreply at git.blender.org
Wed Jul 16 14:04:28 CEST 2014


Commit: 7eb539c04bc8865cab52b88a956a1a944cb023ed
Author: gaiaclary
Date:   Mon Jul 14 20:35:46 2014 +0200
https://developer.blender.org/rB7eb539c04bc8865cab52b88a956a1a944cb023ed

Sort vertex groups by Armature Hierarchy

Sort vertex groups by Armature Hierarchy

Reviewers: mont29

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

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

M	release/scripts/startup/bl_ui/properties_data_mesh.py
M	source/blender/editors/object/object_vgroup.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 41cf93f..422e463 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -29,7 +29,8 @@ class MESH_MT_vertex_group_specials(Menu):
     def draw(self, context):
         layout = self.layout
 
-        layout.operator("object.vertex_group_sort", icon='SORTALPHA')
+        layout.operator("object.vertex_group_sort", icon='SORTALPHA').sort_type="ALPHANUMERIC"
+        layout.operator("object.vertex_group_sort", icon='ARMATURE_DATA', text="Sort by Bone Hierarchy").sort_type="BONE_HIERARCHY"
         layout.operator("object.vertex_group_copy", icon='COPY_ID')
         layout.operator("object.vertex_group_copy_to_linked", icon='LINK_AREA')
         layout.operator("object.vertex_group_copy_to_selected", icon='LINK_AREA')
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 9d27cf2..5c50bd7 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -62,6 +62,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_editmesh.h"
+#include "BKE_modifier.h"
 #include "BKE_report.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_object_deform.h"
@@ -4323,7 +4324,7 @@ static int vgroup_do_remap(Object *ob, const char *name_array, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
-static int vgroup_sort(void *def_a_ptr, void *def_b_ptr)
+static int vgroup_sort_alphanumeric(void *def_a_ptr, void *def_b_ptr)
 {
 	bDeformGroup *def_a = (bDeformGroup *)def_a_ptr;
 	bDeformGroup *def_b = (bDeformGroup *)def_b_ptr;
@@ -4331,18 +4332,56 @@ static int vgroup_sort(void *def_a_ptr, void *def_b_ptr)
 	return BLI_natstrcmp(def_a->name, def_b->name);
 }
 
+static void vgroup_sort_bone_hierarchy(Object *ob, ListBase *bonebase)
+{
+	if (bonebase == NULL) {
+		Object *armobj = modifiers_isDeformedByArmature(ob);
+		if (armobj != NULL) {
+			bonebase = &((struct bArmature *)armobj->data)->bonebase;
+		}
+	}
+
+	if (bonebase != NULL) {
+		Bone *bone;
+		for (bone = bonebase->last; bone; bone = bone->prev) {
+			bDeformGroup *dg = defgroup_find_name(ob, bone->name);
+			vgroup_sort_bone_hierarchy(ob, &bone->childbase);
+
+			if (dg != NULL) {
+				BLI_remlink(&ob->defbase, dg);
+				BLI_addhead(&ob->defbase, dg);
+			}
+		}
+	}
+
+	return;
+}
+
+enum {
+	SORT_TYPE_ALPHANUMERIC  = 0,
+	SORT_TYPE_BONEHIERARCHY = 1
+};
+
 static int vertex_group_sort_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = ED_object_context(C);
 	char *name_array;
 	int ret;
+	int sort_type = RNA_enum_get(op->ptr, "sort_type");
 
 	/*init remapping*/
 	name_array = vgroup_init_remap(ob);
 
 	/*sort vgroup names*/
-	BLI_sortlist(&ob->defbase, vgroup_sort);
-
+	switch(sort_type) {
+		case SORT_TYPE_ALPHANUMERIC: 
+			BLI_sortlist(&ob->defbase, vgroup_sort_alphanumeric);
+			break;
+		case SORT_TYPE_BONEHIERARCHY:
+			vgroup_sort_bone_hierarchy(ob, NULL);
+			break;
+	}
+	
 	/*remap vgroup data to map to correct names*/
 	ret = vgroup_do_remap(ob, name_array, op);
 
@@ -4358,9 +4397,15 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op)
 
 void OBJECT_OT_vertex_group_sort(wmOperatorType *ot)
 {
+	static EnumPropertyItem vgroup_sort_type[] = {
+			{SORT_TYPE_ALPHANUMERIC, "ALPHANUMERIC", 0, "Alphanumeric", ""},
+			{SORT_TYPE_BONEHIERARCHY, "BONE_HIERARCHY", 0, "Bone Hierarchy", ""},
+			{0, NULL, 0, NULL, NULL}
+	};
+
 	ot->name = "Sort Vertex Groups";
 	ot->idname = "OBJECT_OT_vertex_group_sort";
-	ot->description = "Sort vertex groups alphabetically";
+	ot->description = "Sort vertex groups";
 
 	/* api callbacks */
 	ot->poll = vertex_group_poll;
@@ -4368,6 +4413,8 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot)
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	RNA_def_enum(ot->srna, "sort_type", vgroup_sort_type, SORT_TYPE_ALPHANUMERIC, "Sort type", "Sort type");
 }
 
 static int vgroup_move_exec(bContext *C, wmOperator *op)




More information about the Bf-blender-cvs mailing list