[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21554] branches/blender2.5/blender/source /blender: calling operators from python was raising an error without returning an error value .

Campbell Barton ideasman42 at gmail.com
Mon Jul 13 10:33:52 CEST 2009


Revision: 21554
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21554
Author:   campbellbarton
Date:     2009-07-13 10:33:51 +0200 (Mon, 13 Jul 2009)

Log Message:
-----------
calling operators from python was raising an error without returning an error value.

brecht, switched the order back to fix this, added an argument for WM_operatortype_find() to fail without printing an error.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/interface/interface.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
    branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -2273,7 +2273,7 @@
 	uiBut *but;
 	wmOperatorType *ot;
 	
-	ot= WM_operatortype_find(opname);
+	ot= WM_operatortype_find(opname, 0);
 
 	if(!str) {
 		if(ot) str= ot->name;

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_layout.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -515,7 +515,7 @@
 void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context)
 {
 	uiBlock *block= layout->root->block;
-	wmOperatorType *ot= WM_operatortype_find(idname);
+	wmOperatorType *ot= WM_operatortype_find(idname, 0);
 	uiBut *but;
 	int w;
 
@@ -550,7 +550,7 @@
 
 static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval)
 {
-	wmOperatorType *ot= WM_operatortype_find(opname);
+	wmOperatorType *ot= WM_operatortype_find(opname, 0);
 	PointerRNA ptr;
 	PropertyRNA *prop;
 
@@ -593,7 +593,7 @@
 
 void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
 {
-	wmOperatorType *ot= WM_operatortype_find(opname);
+	wmOperatorType *ot= WM_operatortype_find(opname, 0);
 	PointerRNA ptr;
 	PropertyRNA *prop;
 
@@ -1213,7 +1213,7 @@
 
 void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname)
 {
-	wmOperatorType *ot= WM_operatortype_find(opname);
+	wmOperatorType *ot= WM_operatortype_find(opname, 0);
 	MenuItemLevel *lvl;
 
 	if(!ot || !ot->srna) {

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -2812,7 +2812,7 @@
 	
 	handle= ui_popup_block_create(C, NULL, NULL, func, NULL, arg);
 	handle->popup= 1;
-	handle->optype= (opname)? WM_operatortype_find(opname): NULL;
+	handle->optype= (opname)? WM_operatortype_find(opname, 0): NULL;
 	handle->opcontext= opcontext;
 	
 	UI_add_popup_handlers(C, &window->handlers, handle);

Modified: branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_text/space_text.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/editors/space_text/space_text.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -286,7 +286,8 @@
 
 	WM_keymap_add_item(keymap, "TEXT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
 #ifndef DISABLE_PYTHON
-	WM_keymap_add_item(keymap, "TEXT_OT_line_console", RETKEY, KM_PRESS, KM_SHIFT, 0); /* python operator - space_text.py */
+	WM_keymap_add_item(keymap, "TEXT_OT_console_exec", RETKEY, KM_PRESS, KM_SHIFT, 0); /* python operator - space_text.py */
+	WM_keymap_add_item(keymap, "TEXT_OT_console_autocomplete", RETKEY, KM_PRESS, KM_ALT, 0); /* python operator - space_text.py */
 #endif
 
 	WM_keymap_add_item(keymap, "TEXT_OT_line_number", KM_TEXTINPUT, KM_ANY, KM_ANY, 0);

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -68,7 +68,7 @@
 		return NULL;
 	}
 
-	ot= WM_operatortype_find(opname);
+	ot= WM_operatortype_find(opname, 1);
 	if (ot == NULL) {
 		PyErr_Format( PyExc_SystemError, "Operator \"%s\"could not be found", opname);
 		return NULL;
@@ -130,12 +130,19 @@
 	PyObject *ret;
 	wmOperatorType *ot;
 	
-	if ((ret = PyObject_GenericGetAttr((PyObject *)self, pyname))) {
-		/* do nothing, this accounts for methoddef's add and remove */
-	}
-	else if ((ot= WM_operatortype_find(name))) {
+	/* First look for the operator, then our own methods if that fails.
+	 * when methods are searched first, PyObject_GenericGetAttr will raise an error
+	 * each time we want to call an operator, we could clear the error but I prefer
+	 * not to since calling operators is a lot more common then adding and removing. - Campbell */
+	
+	if ((ot= WM_operatortype_find(name, 1))) {
 		ret = PyCFunction_New( pyop_base_call_meth, pyname); /* set the name string as self, PyCFunction_New incref's self */
 	}
+	else if ((ret = PyObject_GenericGetAttr((PyObject *)self, pyname))) {
+		/* do nothing, this accounts for methoddef's add and remove
+		 * An exception is raised when PyObject_GenericGetAttr fails
+		 * but its ok because its overwritten below */
+	}
 	else {
 		PyErr_Format( PyExc_AttributeError, "Operator \"%s\" not found", name);
 		ret= NULL;
@@ -170,7 +177,7 @@
 	char *name = _PyUnicode_AsString(pyname);
 	wmOperatorType *ot;
 	
-	if ((ot= WM_operatortype_find(name))) {
+	if ((ot= WM_operatortype_find(name, 1))) {
 		BPy_StructRNA *pyrna;
 		PointerRNA ptr;
 		

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-07-13 08:33:51 UTC (rev 21554)
@@ -132,7 +132,7 @@
 void		WM_operator_free		(struct wmOperator *op);
 void		WM_operator_stack_clear(struct bContext *C);
 
-wmOperatorType *WM_operatortype_find(const char *idname);
+wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
 wmOperatorType *WM_operatortype_exists(const char *idname);
 wmOperatorType *WM_operatortype_first(void);
 void		WM_operatortype_append	(void (*opfunc)(wmOperatorType*));

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -393,7 +393,7 @@
 /* invokes operator in context */
 int WM_operator_name_call(bContext *C, const char *opstring, int context, PointerRNA *properties)
 {
-	wmOperatorType *ot= WM_operatortype_find(opstring);
+	wmOperatorType *ot= WM_operatortype_find(opstring, 0);
 	wmWindow *window= CTX_wm_window(C);
 	wmEvent *event;
 	
@@ -723,7 +723,7 @@
 			printf("wm_handler_operator_call error\n");
 	}
 	else {
-		wmOperatorType *ot= WM_operatortype_find(event->keymap_idname);
+		wmOperatorType *ot= WM_operatortype_find(event->keymap_idname, 0);
 
 		if(ot)
 			retval= wm_operator_invoke(C, ot, event, properties);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2009-07-13 00:40:20 UTC (rev 21553)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2009-07-13 08:33:51 UTC (rev 21554)
@@ -82,7 +82,7 @@
 
 /* ************ operator API, exported ********** */
 
-wmOperatorType *WM_operatortype_find(const char *idname)
+wmOperatorType *WM_operatortype_find(const char *idname, int quiet)
 {
 	wmOperatorType *ot;
 	
@@ -90,7 +90,10 @@
 		if(strncmp(ot->idname, idname, OP_MAX_TYPENAME)==0)
 		   return ot;
 	}
-	printf("search for unknown operator %s\n", idname);
+	
+	if(!quiet)
+		printf("search for unknown operator %s\n", idname);
+	
 	return NULL;
 }
 
@@ -137,7 +140,7 @@
 
 int WM_operatortype_remove(const char *idname)
 {
-	wmOperatorType *ot = WM_operatortype_find(idname);
+	wmOperatorType *ot = WM_operatortype_find(idname, 0);
 
 	if (ot==NULL)
 		return 0;
@@ -190,7 +193,7 @@
 
 void WM_operator_properties_create(PointerRNA *ptr, const char *opstring)
 {
-	wmOperatorType *ot= WM_operatortype_find(opstring);
+	wmOperatorType *ot= WM_operatortype_find(opstring, 0);
 
 	if(ot)
 		RNA_pointer_create(NULL, ot->srna, NULL, ptr);





More information about the Bf-blender-cvs mailing list