[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24302] trunk/blender: Make Links (Ctrl+L) back

Campbell Barton ideasman42 at gmail.com
Wed Nov 4 11:25:57 CET 2009


Revision: 24302
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24302
Author:   campbellbarton
Date:     2009-11-04 11:25:57 +0100 (Wed, 04 Nov 2009)

Log Message:
-----------
Make Links (Ctrl+L) back
- split into 2 operators: object.make_links_data() & object.make_links_scene since they are quite different.
- added reusable functions RNA_group_itemf & RNA_scene_itemf which can be used for any operator that takes ID data (easy to add more types Mesh, Text etc)
- DummyRNA_NULL_items for dynamic items so each operator need not define its own empty enum.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2009-11-04 09:55:24 UTC (rev 24301)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2009-11-04 10:25:57 UTC (rev 24302)
@@ -479,8 +479,10 @@
         layout.item_booleanO("object.duplicate", "linked", True, text="Duplicate Linked")
         layout.itemO("object.delete", text="Delete...")
         layout.itemO("object.proxy_make", text="Make Proxy...")
+        layout.itemM("VIEW3D_MT_make_links", text="Make Links...")
         layout.item_menu_enumO("object.make_local", "type", text="Make Local...")
         layout.itemM("VIEW3D_MT_make_single_user")
+        layout.itemM("VIEW3D_MT_make_links")
 
         layout.itemS()
 
@@ -604,6 +606,18 @@
         props = layout.itemO("object.make_single_user", properties=True, text="Animation")
         props.animation = True
 
+
+class VIEW3D_MT_make_links(bpy.types.Menu):
+    bl_label = "Make Links"
+
+    def draw(self, context):
+        layout = self.layout
+        
+        layout.item_menu_enumO("object.make_links_scene", "type", text="Objects to Scene...")
+
+        layout.items_enumO("object.make_links_data", property="type") # inline
+
+
 # ********** Vertex paint menu **********
 
 
@@ -1600,6 +1614,7 @@
 bpy.types.register(VIEW3D_MT_object_constraints)
 bpy.types.register(VIEW3D_MT_object_showhide)
 bpy.types.register(VIEW3D_MT_make_single_user)
+bpy.types.register(VIEW3D_MT_make_links)
 
 
 bpy.types.register(VIEW3D_MT_sculpt) # Sculpt Menu

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2009-11-04 09:55:24 UTC (rev 24301)
+++ trunk/blender/source/blender/editors/object/object_add.c	2009-11-04 10:25:57 UTC (rev 24302)
@@ -678,31 +678,8 @@
 	ED_object_add_generic_props(ot, FALSE);
 }
 
-/* add dupligroup */
-static EnumPropertyItem *add_dupligroup_itemf(bContext *C, PointerRNA *ptr, int *free)
-{
-	EnumPropertyItem *item= NULL, item_tmp;
-	int totitem= 0;
-	int i= 0;
-	Group *group;
-
-	memset(&item_tmp, 0, sizeof(item_tmp));
-
-	for(group= CTX_data_main(C)->group.first; group; group= group->id.next) {
-		item_tmp.identifier= item_tmp.name= group->id.name+2;
-		item_tmp.value= i++;
-		RNA_enum_item_add(&item, &totitem, &item_tmp);
-	}
-
-	RNA_enum_item_end(&item, &totitem);
-	*free= 1;
-
-	return item;
-}
-
 static int group_instance_add_exec(bContext *C, wmOperator *op)
 {
-	/* XXX, using an enum for library lookups is a bit dodgy */
 	Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "type"));
 
 	int view_align, enter_editmode;
@@ -728,9 +705,6 @@
 void OBJECT_OT_group_instance_add(wmOperatorType *ot)
 {
 	PropertyRNA *prop;
-	static EnumPropertyItem prop_group_dummy_types[] = {
-		{0, NULL, 0, NULL, NULL}
-	};
 
 	/* identifiers */
 	ot->name= "Add Group Instance";
@@ -746,8 +720,8 @@
 	ot->flag= 0;
 
 	/* properties */
-	prop= RNA_def_enum(ot->srna, "type", prop_group_dummy_types, 0, "Type", "");
-	RNA_def_enum_funcs(prop, add_dupligroup_itemf);
+	prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", "");
+	RNA_def_enum_funcs(prop, RNA_group_itemf);
 	ED_object_add_generic_props(ot, FALSE);
 }
 

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h	2009-11-04 09:55:24 UTC (rev 24301)
+++ trunk/blender/source/blender/editors/object/object_intern.h	2009-11-04 10:25:57 UTC (rev 24302)
@@ -60,6 +60,8 @@
 void OBJECT_OT_slow_parent_clear(struct wmOperatorType *ot);
 void OBJECT_OT_make_local(struct wmOperatorType *ot);
 void OBJECT_OT_make_single_user(struct wmOperatorType *ot);
+void OBJECT_OT_make_links_scene(struct wmOperatorType *ot);
+void OBJECT_OT_make_links_data(struct wmOperatorType *ot);
 void OBJECT_OT_move_to_layer(struct wmOperatorType *ot);
 
 /* object_edit.c */

Modified: trunk/blender/source/blender/editors/object/object_ops.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_ops.c	2009-11-04 09:55:24 UTC (rev 24301)
+++ trunk/blender/source/blender/editors/object/object_ops.c	2009-11-04 10:25:57 UTC (rev 24302)
@@ -92,6 +92,8 @@
 	WM_operatortype_append(OBJECT_OT_slow_parent_clear);
 	WM_operatortype_append(OBJECT_OT_make_local);
 	WM_operatortype_append(OBJECT_OT_make_single_user);
+	WM_operatortype_append(OBJECT_OT_make_links_scene);
+	WM_operatortype_append(OBJECT_OT_make_links_data);
 	WM_operatortype_append(OBJECT_OT_move_to_layer);
 
 	WM_operatortype_append(OBJECT_OT_select_inverse);
@@ -290,6 +292,9 @@
 
 	kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", UKEY, KM_PRESS, 0, 0);
 	RNA_string_set(kmi->ptr, "name", "VIEW3D_MT_make_single_user");
+    
+	kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", LKEY, KM_PRESS, KM_CTRL, 0);
+	RNA_string_set(kmi->ptr, "name", "VIEW3D_MT_make_links");
 
 	WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
 	WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move_linked", DKEY, KM_PRESS, KM_ALT, 0);

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2009-11-04 09:55:24 UTC (rev 24301)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2009-11-04 10:25:57 UTC (rev 24302)
@@ -72,6 +72,7 @@
 #include "BKE_object.h"
 #include "BKE_report.h"
 #include "BKE_sca.h"
+#include "BKE_scene.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
 
@@ -83,6 +84,7 @@
 
 #include "RNA_access.h"
 #include "RNA_define.h"
+#include "RNA_enum_types.h"
 
 #include "ED_anim_api.h"
 #include "ED_armature.h"
@@ -92,10 +94,6 @@
 
 #include "object_intern.h"
 
-/* ************* XXX **************** */
-static int pupmenu(const char *msg) {return 0;}
-static int pupmenu_col(const char *msg, int val) {return 0;}
-
 /*********************** Make Vertex Parent Operator ************************/
 
 static int vertex_parent_set_poll(bContext *C)
@@ -1132,97 +1130,77 @@
 #endif
 }
 
+static int make_links_scene_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "type"));
 
-void make_links(bContext *C, wmOperator *op, Scene *scene, View3D *v3d, short event)
+	if(scene_to==NULL) {
+		BKE_report(op->reports, RPT_ERROR, "Scene not found");
+		return OPERATOR_CANCELLED;
+	}
+
+	if(scene_to == CTX_data_scene(C)) {
+		BKE_report(op->reports, RPT_ERROR, "Can't link objects into the same scene");
+		return OPERATOR_CANCELLED;
+	}
+
+	CTX_DATA_BEGIN(C, Base*, base, selected_bases)
+	{
+		if(!object_in_scene(base->object, scene_to)) {
+			Base *nbase= MEM_mallocN( sizeof(Base), "newbase");
+			*nbase= *base;
+			BLI_addhead( &(scene_to->base), nbase);
+			id_us_plus((ID *)base->object);
+		}
+	}
+	CTX_DATA_END;
+
+	ED_anim_dag_flush_update(C);
+
+	/* one day multiple scenes will be visible, then we should have some update function for them */
+	return OPERATOR_FINISHED;
+}
+
+enum {
+	MAKE_LINKS_OBDATA = 1,
+	MAKE_LINKS_MATERIALS,
+	MAKE_LINKS_ANIMDATA,
+	MAKE_LINKS_DUPLIGROUP,
+};
+
+static int make_links_data_exec(bContext *C, wmOperator *op)
 {
-	Object *ob, *obt;
-	Base *base, *nbase, *sbase;
-	Scene *sce = NULL;
+	int event = RNA_int_get(op->ptr, "type");
+	Object *ob;
 	ID *id;
 	int a;
-	short nr=0;
-	char *strp;
 
-	if(!(ob=OBACT)) return;
+	ob= CTX_data_active_object(C);
 
-	if(event==1) {
-		IDnames_to_pupstring(&strp, NULL, NULL, &(G.main->scene), 0, &nr);
-		
-		if(nr == -2) {
-			MEM_freeN(strp);
+	CTX_DATA_BEGIN(C, Object*, obt, selected_editable_objects) {
+		if(ob != obt) {
+			switch(event) {
+			case MAKE_LINKS_OBDATA: /* obdata */
+				id= obt->data;
+				id->us--;
 
-// XXX			activate_databrowse((ID *)scene, ID_SCE, 0, B_INFOSCE, &(G.curscreen->scenenr), link_to_scene );
-			
-			return;			
-		}
-		else {
-			event= pupmenu_col(strp, 20);
-			MEM_freeN(strp);
-		
-			if(event<= 0) return;
-		
-			nr= 1;
-			sce= G.main->scene.first;
-			while(sce) {
-				if(nr==event) break;
-				nr++;
-				sce= sce->id.next;
-			}
-			if(sce==scene) {
-				BKE_report(op->reports, RPT_ERROR, "This is the current scene");
-				return;
-			}
-			if(sce==0 || sce->id.lib) return;
-			
-			/* remember: is needed below */
-			event= 1;
-		}
-	}
+				id= ob->data;
+				id_us_plus(id);
+				obt->data= id;
 
-	/* All non group linking */
-	for(base= FIRSTBASE; base; base= base->next) {
-		if(event==1 || base != BASACT) {
-			
-			obt= base->object;
+				/* if amount of material indices changed: */
+				test_object_materials(obt->data);
 
-			if(TESTBASE(v3d, base)) {
-				
-				if(event==1) {		/* to scene */
-					
-					/* test if already linked */
-					sbase= sce->base.first;
-					while(sbase) {
-						if(sbase->object==base->object) break;
-						sbase= sbase->next;
-					}
-					if(sbase) {	/* remove */
-						continue;
-					}
-					
-					nbase= MEM_mallocN( sizeof(Base), "newbase");
-					*nbase= *base;
-					BLI_addhead( &(sce->base), nbase);
-					id_us_plus((ID *)base->object);
+				obt->recalc |= OB_RECALC_DATA;
+				break;
+			case MAKE_LINKS_MATERIALS:
+				/* new approach, using functions from kernel */
+				for(a=0; a<ob->totcol; a++) {
+					Material *ma= give_current_material(ob, a+1);
+					assign_material(obt, ma, a+1);	/* also works with ma==NULL */
 				}
-			}
-			if(TESTBASELIB(v3d, base)) {
-				if(event==2 || event==5) {  /* obdata */
-					if(ob->type==obt->type) {
-						
-							id= obt->data;
-							id->us--;
-							
-							id= ob->data;
-							id_us_plus(id);
-							obt->data= id;
-							
-							/* if amount of material indices changed: */
-							test_object_materials(obt->data);
-
-							obt->recalc |= OB_RECALC_DATA;
-						}
-					}
-				else if(event==4) {  /* ob ipo */
+				break;
+			case MAKE_LINKS_ANIMDATA:
 #if 0 // XXX old animation system
 					if(obt->ipo) obt->ipo->id.us--;
 					obt->ipo= ob->ipo;
@@ -1231,67 +1209,75 @@
 						do_ob_ipo(scene, obt);
 					}
 #endif // XXX old animation system
+				break;
+			case MAKE_LINKS_DUPLIGROUP:
+				if(ob->dup_group) ob->dup_group->id.us--;
+				obt->dup_group= ob->dup_group;
+				if(obt->dup_group) {
+					id_us_plus((ID *)obt->dup_group);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list