[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24349] trunk/blender/source/blender/ editors: enter editmode when adding objects even if the object is not in an active layer ,

Campbell Barton ideasman42 at gmail.com
Thu Nov 5 15:25:18 CET 2009


Revision: 24349
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24349
Author:   campbellbarton
Date:     2009-11-05 15:25:08 +0100 (Thu, 05 Nov 2009)

Log Message:
-----------
enter editmode when adding objects even if the object is not in an active layer,
useful for python but in rare cases this also happens for users.

Active layer getting out of sync is an old bug but hard find when it happens.
This at least fixes segfaulting on adding objects.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/mesh/editmesh_add.c
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_edit.c

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2009-11-05 12:40:14 UTC (rev 24348)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2009-11-05 14:25:08 UTC (rev 24349)
@@ -74,6 +74,7 @@
 #define EM_FREEUNDO		2
 #define EM_WAITCURSOR	4
 #define EM_DO_UNDO		8
+#define EM_IGNORE_LAYER	16
 void ED_object_exit_editmode(struct bContext *C, int flag);
 void ED_object_enter_editmode(struct bContext *C, int flag);
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_add.c	2009-11-05 12:40:14 UTC (rev 24348)
+++ trunk/blender/source/blender/editors/mesh/editmesh_add.c	2009-11-05 14:25:08 UTC (rev 24349)
@@ -1317,9 +1317,8 @@
 
 	if(obedit==NULL || obedit->type!=OB_MESH) {
 		/* create editmode */
-		ED_object_add_type(C, OB_MESH, view_align, FALSE);
-		ED_object_enter_editmode(C, EM_DO_UNDO);
-		obedit= CTX_data_edit_object(C);
+		obedit= ED_object_add_type(C, OB_MESH, view_align, FALSE);
+		ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
 		newob = 1;
 	}
 	else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2009-11-05 12:40:14 UTC (rev 24348)
+++ trunk/blender/source/blender/editors/object/object_add.c	2009-11-05 14:25:08 UTC (rev 24349)
@@ -196,7 +196,7 @@
 	DAG_scene_sort(scene);
 
 	if(enter_editmode)
-		ED_object_enter_editmode(C, 0);
+		ED_object_enter_editmode(C, EM_IGNORE_LAYER);
 
 	return ob;
 }
@@ -342,9 +342,8 @@
 	ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
 	
 	if(obedit==NULL || obedit->type!=OB_CURVE) {
-		ED_object_add_type(C, OB_CURVE, view_align, TRUE);
+		obedit= ED_object_add_type(C, OB_CURVE, view_align, TRUE);
 		newob = 1;
-		obedit= CTX_data_edit_object(C);
 
 		if(type & CU_PRIM_PATH)
 			((Curve*)obedit->data)->flag |= CU_PATH|CU_3D;
@@ -427,12 +426,11 @@
 	ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
 	
 	if(obedit==NULL || obedit->type!=OB_SURF) {
-		ED_object_add_type(C, OB_SURF, view_align, TRUE);
+		obedit= ED_object_add_type(C, OB_SURF, view_align, TRUE);
 		newob = 1;
 	}
 	else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
 	
-	obedit= CTX_data_edit_object(C);
 	nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
 	editnurb= curve_get_editcurve(obedit);
 	BLI_addtail(editnurb, nu);
@@ -488,12 +486,11 @@
 	ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
 	
 	if(obedit==NULL || obedit->type!=OB_MBALL) {
-		ED_object_add_type(C, OB_MBALL, view_align, TRUE);
+		obedit= ED_object_add_type(C, OB_MBALL, view_align, TRUE);
 		newob = 1;
 	}
 	else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
 	
-	obedit= CTX_data_edit_object(C);
 	elem= (MetaElem*)add_metaball_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
 	mball= (MetaBall*)obedit->data;
 	BLI_addtail(mball->editelems, elem);
@@ -556,8 +553,7 @@
 	if(obedit && obedit->type==OB_FONT)
 		return OPERATOR_CANCELLED;
 
-	ED_object_add_type(C, OB_FONT, view_align, enter_editmode);
-	obedit= CTX_data_active_object(C);
+	obedit= ED_object_add_type(C, OB_FONT, view_align, enter_editmode);
 	
 	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
 	
@@ -593,9 +589,8 @@
 	ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
 	
 	if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) {
-		ED_object_add_type(C, OB_ARMATURE, view_align, TRUE);
+		obedit= ED_object_add_type(C, OB_ARMATURE, view_align, TRUE);
 		ED_object_enter_editmode(C, 0);
-		obedit= CTX_data_edit_object(C);
 		newob = 1;
 	}
 	else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);

Modified: trunk/blender/source/blender/editors/object/object_edit.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_edit.c	2009-11-05 12:40:14 UTC (rev 24348)
+++ trunk/blender/source/blender/editors/object/object_edit.c	2009-11-05 14:25:08 UTC (rev 24349)
@@ -371,25 +371,29 @@
 void ED_object_enter_editmode(bContext *C, int flag)
 {
 	Scene *scene= CTX_data_scene(C);
-	Base *base= CTX_data_active_base(C);
+	Base *base= NULL;
 	Object *ob;
 	ScrArea *sa= CTX_wm_area(C);
 	View3D *v3d= NULL;
 	int ok= 0;
 	
 	if(scene->id.lib) return;
-	if(base==NULL) return;
 	
 	if(sa && sa->spacetype==SPACE_VIEW3D)
 		v3d= sa->spacedata.first;
 	
-	if(v3d && (base->lay & v3d->lay)==0) return;
-	else if(!v3d && (base->lay & scene->lay)==0) return;
+	if((flag & EM_IGNORE_LAYER)==0) {
+		if(v3d && (base->lay & v3d->lay)==0) return;
+		else if(!v3d && (base->lay & scene->lay)==0) return;
+		base= CTX_data_active_base(C); /* active layer checked here for view3d */
+	}
+	else {
+		base= scene->basact;
+	}
 
+	if (ELEM3(NULL, base, base->object, base->object->data)) return;
+
 	ob = base->object;
-
-	if(ob==NULL) return;
-	if(ob->data==NULL) return;
 	
 	if (object_data_is_libdata(ob)) {
 		error_libdata();





More information about the Bf-blender-cvs mailing list