[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32807] trunk/blender/source/blender: bugfix [#24477] Can easily create bones with duplicate names

Campbell Barton ideasman42 at gmail.com
Mon Nov 1 08:20:05 CET 2010


Revision: 32807
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32807
Author:   campbellbarton
Date:     2010-11-01 08:19:41 +0100 (Mon, 01 Nov 2010)

Log Message:
-----------
bugfix [#24477] Can easily create bones with duplicate names
- fixed this error 7 different functions (deform groups, uv layers & similar).
- support for numbers over 999.
- renamed splitIDname() to BLI_split_name_num(), moved to BLI_path_utils

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/blenkernel/intern/nla.c
    trunk/blender/source/blender/blenlib/BLI_path_util.h
    trunk/blender/source/blender/blenlib/intern/path_util.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/transform/transform_orientations.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2010-11-01 02:22:20 UTC (rev 32806)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2010-11-01 07:19:41 UTC (rev 32807)
@@ -67,7 +67,6 @@
 void free_main(struct Main *mainvar);
 void tag_main(struct Main *mainvar, int tag);
 
-int splitIDname(char *name, char *left, int *nr);
 void rename_id(struct ID *id, char *name);
 void name_uiprefix_id(char *name, struct ID *id);
 void test_idbutton(char *name);

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-11-01 02:22:20 UTC (rev 32806)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-11-01 07:19:41 UTC (rev 32807)
@@ -2249,69 +2249,56 @@
 	return 0;
 }
 
+static int cd_layer_find_dupe(CustomData *data, const char *name, int type, int index)
+{
+	int i;
+	/* see if there is a duplicate */
+	for(i=0; i<data->totlayer; i++) {
+		if(i != index) {
+			CustomDataLayer *layer= &data->layers[i];
+			
+			if(CustomData_is_property_layer(type)) {
+				if(CustomData_is_property_layer(layer->type) && strcmp(layer->name, name)==0) {
+					return 1;
+				}
+			}
+			else{
+				if(i!=index && layer->type==type && strcmp(layer->name, name)==0) {
+					return 1;
+				}
+			}
+		}
+	}
+	
+	return 0;
+}
+
 void CustomData_set_layer_unique_name(CustomData *data, int index)
 {
-	char tempname[64];
-	int number, i, type;
-	char *dot, *name;
-	CustomDataLayer *layer, *nlayer= &data->layers[index];
+	CustomDataLayer *nlayer= &data->layers[index];
 	const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
 
 	if (!typeInfo->defaultname)
 		return;
 
-	type = nlayer->type;
-	name = nlayer->name;
-
-	if (name[0] == '\0')
+	if (nlayer->name[0] == '\0')
 		BLI_strncpy(nlayer->name, typeInfo->defaultname, sizeof(nlayer->name));
-	
-	/* see if there is a duplicate */
-	for(i=0; i<data->totlayer; i++) {
-		layer = &data->layers[i];
-		
-		if(CustomData_is_property_layer(type)){
-			if(i!=index && CustomData_is_property_layer(layer->type) && 
-				strcmp(layer->name, name)==0)
-					break;	
-		
-		}
-		else{
-			if(i!=index && layer->type==type && strcmp(layer->name, name)==0)
-				break;
-		}
-	}
 
-	if(i == data->totlayer)
-		return;
-
-	/* strip off the suffix */
-	dot = strchr(nlayer->name, '.');
-	if(dot) *dot=0;
-	
-	for(number=1; number <=999; number++) {
-		sprintf(tempname, "%s.%03d", nlayer->name, number);
-
-		for(i=0; i<data->totlayer; i++) {
-			layer = &data->layers[i];
-			
-			if(CustomData_is_property_layer(type)){
-				if(i!=index && CustomData_is_property_layer(layer->type) && 
-					strcmp(layer->name, tempname)==0)
-
-				break;
+	if(cd_layer_find_dupe(data, nlayer->name, nlayer->type, index)) {
+		/* note: this block is used in other places, when changing logic apply to all others, search this message */
+		char	tempname[sizeof(nlayer->name)];
+		char	left[sizeof(nlayer->name)];
+		int		number;
+		int		len= BLI_split_name_num(left, &number, nlayer->name);
+		do {	/* nested while loop looks bad but likely it wont run most times */
+			while(BLI_snprintf(tempname, sizeof(tempname), "%s.%03d", left, number) >= sizeof(tempname)) {
+				if(len > 0)	left[--len]= '\0';	/* word too long */
+				else		number= 0;			/* reset, must be a massive number */
 			}
-			else{
-				if(i!=index && layer->type==type && strcmp(layer->name, tempname)==0)
-					break;
-			}
-		}
-
-		if(i == data->totlayer) {
-			BLI_strncpy(nlayer->name, tempname, sizeof(nlayer->name));
-			return;
-		}
-	}	
+		} while(number++, cd_layer_find_dupe(data, tempname, nlayer->type, index));
+		
+		BLI_strncpy(nlayer->name, tempname, sizeof(nlayer->name));
+	}
 }
 
 int CustomData_verify_versions(struct CustomData *data, int index)

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2010-11-01 02:22:20 UTC (rev 32806)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2010-11-01 07:19:41 UTC (rev 32807)
@@ -304,14 +304,23 @@
 	return (flip_index==-1 && use_default) ? index : flip_index;
 }
 
-void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+static int defgroup_find_name_dupe(const char *name, bDeformGroup *dg, Object *ob)
 {
 	bDeformGroup *curdef;
-	int number;
-	int exists = 0;
-	char tempname[64];
-	char *dot;
 	
+	for (curdef = ob->defbase.first; curdef; curdef=curdef->next) {
+		if (dg!=curdef) {
+			if (!strcmp(curdef->name, name)) {
+				return 1;
+			}
+		}
+	}
+
+	return 0;
+}
+
+void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+{	
 	if (!ob)
 		return;
 		
@@ -320,45 +329,24 @@
 		/* give it default name first */
 		strcpy (dg->name, "Group");
 	}	
-		
-	/* See if we even need to do this */
-	for (curdef = ob->defbase.first; curdef; curdef=curdef->next) {
-		if (dg!=curdef) {
-			if (!strcmp(curdef->name, dg->name)) {
-				exists = 1;
-				break;
-			}
-		}
-	}
-	
-	if (!exists)
-		return;
 
-	/*	Strip off the suffix */
-	dot=strchr(dg->name, '.');
-	if (dot)
-		*dot=0;
-	
-	for (number = 1; number <=999; number++) {
-		sprintf (tempname, "%s.%03d", dg->name, number);
-		
-		exists = 0;
-		for (curdef=ob->defbase.first; curdef; curdef=curdef->next) {
-			if (dg!=curdef) {
-				if (!strcmp (curdef->name, tempname)) {
-					exists = 1;
-					break;
-				}
+	if(defgroup_find_name_dupe(dg->name, dg, ob)) {
+		/* note: this block is used in other places, when changing logic apply to all others, search this message */
+		char	tempname[sizeof(dg->name)];
+		char	left[sizeof(dg->name)];
+		int		number;
+		int		len= BLI_split_name_num(left, &number, dg->name);
+		do {	/* nested while loop looks bad but likely it wont run most times */
+			while(BLI_snprintf(tempname, sizeof(tempname), "%s.%03d", left, number) >= sizeof(tempname)) {
+				if(len > 0)	left[--len]= '\0';	/* word too long */
+				else		number= 0;			/* reset, must be a massive number */
 			}
-		}
-		if (!exists) {
-			BLI_strncpy (dg->name, tempname, 32);
-			return;
-		}
-	}	
+		} while(number++, defgroup_find_name_dupe(tempname, dg, ob));
+
+		BLI_strncpy(dg->name, tempname, sizeof(dg->name));
+	}
 }
 
-
 /* finds the best possible flipped name. For renaming; check for unique names afterwards */
 /* if strip_number: removes number extensions */
 void flip_side_name (char *name, const char *from_name, int strip_number)

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2010-11-01 02:22:20 UTC (rev 32806)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2010-11-01 07:19:41 UTC (rev 32807)
@@ -984,35 +984,6 @@
 	BLI_dynstr_free(pupds);
 }
 
-
-/* used by buttons.c library.c mball.c */
-int splitIDname(char *name, char *left, int *nr)
-{
-	int a;
-	
-	*nr= 0;
-	strncpy(left, name, 21);
-	
-	a= strlen(name);
-	if(a>1 && name[a-1]=='.') return a;
-	
-	while(a--) {
-		if( name[a]=='.' ) {
-			left[a]= 0;
-			*nr= atol(name+a+1);
-			return a;
-		}
-		if( isdigit(name[a])==0 ) break;
-		
-		left[a]= 0;
-	}
-
-	for(a= 0; name[a]; a++)
-		left[a]= name[a];
-
-	return a;
-}
-
 static void sort_alpha_id(ListBase *lb, ID *id)
 {
 	ID *idtest;
@@ -1092,7 +1063,7 @@
 		memset(in_use, 0, sizeof(in_use));
 
 		/* get name portion, number portion ("name.number") */
-		left_len= splitIDname(name, left, &nr);
+		left_len= BLI_split_name_num(left, &nr, name);
 
 		/* if new name will be too long, truncate it */
 		if(nr > 999 && left_len > 16) {
@@ -1109,7 +1080,7 @@
 					(idtest->lib == NULL) &&
 					(*name == *(idtest->name+2)) &&
 					(strncmp(name, idtest->name+2, left_len)==0) &&
-					(splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
+					(BLI_split_name_num(leftest, &nrtest, idtest->name+2) == left_len)
 			) {
 				if(nrtest < sizeof(in_use))
 					in_use[nrtest]= 1;	/* mark as used */

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2010-11-01 02:22:20 UTC (rev 32806)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2010-11-01 07:19:41 UTC (rev 32807)
@@ -330,8 +330,8 @@
 	int basis1nr, basis2nr;
 	char basis1name[32], basis2name[32];
 
-	splitIDname(ob1->id.name+2, basis1name, &basis1nr);
-	splitIDname(ob2->id.name+2, basis2name, &basis2nr);
+	BLI_split_name_num(basis1name, &basis1nr, ob1->id.name+2);
+	BLI_split_name_num(basis2name, &basis2nr, ob2->id.name+2);
 
 	if(!strcmp(basis1name, basis2name)) return is_basis_mball(ob1);
 	else return 0;
@@ -352,7 +352,7 @@
 	int basisnr, obnr;
 	char basisname[32], obname[32];
 	
-	splitIDname(active_object->id.name+2, basisname, &basisnr);
+	BLI_split_name_num(basisname, &basisnr, active_object->id.name+2);
 
 	/* XXX recursion check, see scene.c, just too simple code this next_object() */
 	if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
@@ -361,7 +361,7 @@
 	while(next_object(&sce_iter, 1, &base, &ob)) {
 		if (ob->type==OB_MBALL) {
 			if(ob!=active_object){
-				splitIDname(ob->id.name+2, obname, &obnr);
+				BLI_split_name_num(obname, &obnr, ob->id.name+2);
 
 				/* Object ob has to be in same "group" ... it means, that it has to have
 				 * same base of its name */
@@ -394,8 +394,8 @@
 	MetaElem *ml=NULL;
 	int basisnr, obnr;
 	char basisname[32], obname[32];
-	
-	splitIDname(basis->id.name+2, basisname, &basisnr);
+
+	BLI_split_name_num(basisname, &basisnr, basis->id.name+2);
 	totelem= 0;
 
 	/* XXX recursion check, see scene.c, just too simple code this next_object() */
@@ -415,7 +415,7 @@
 				else ml= mb->elems.first;
 			}
 			else{
-				splitIDname(ob->id.name+2, obname, &obnr);
+				BLI_split_name_num(obname, &obnr, ob->id.name+2);
 
 				/* object ob has to be in same "group" ... it means, that it has to have
 				 * same base of its name */
@@ -1572,7 +1572,7 @@
 	invert_m4_m4(obinv, ob->obmat);
 	a= 0;
 	
-	splitIDname(ob->id.name+2, obname, &obnr);
+	BLI_split_name_num(obname, &obnr, ob->id.name+2);
 	
 	/* make main array */
 	next_object(&sce_iter, 0, 0, 0);
@@ -1593,7 +1593,7 @@
 				char name[32];
 				int nr;
 				
-				splitIDname(bob->id.name+2, name, &nr);
+				BLI_split_name_num(name, &nr, bob->id.name+2);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list