diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/python/intern/bpy_operator.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/python/intern/bpy_operator.c')
-rw-r--r-- | source/blender/python/intern/bpy_operator.c | 676 |
1 files changed, 349 insertions, 327 deletions
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index ff6bd3840e9..1e979ad1d0b 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -59,385 +59,407 @@ static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id) { - const char *opname = _PyUnicode_AsString(value); - if (opname == NULL) { - PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id); - return NULL; - } - - wmOperatorType *ot = WM_operatortype_find(opname, true); - if (ot == NULL) { - PyErr_Format(PyExc_KeyError, "%s(\"%s\") not found", py_fn_id, opname); - return NULL; - } - return ot; + const char *opname = _PyUnicode_AsString(value); + if (opname == NULL) { + PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id); + return NULL; + } + + wmOperatorType *ot = WM_operatortype_find(opname, true); + if (ot == NULL) { + PyErr_Format(PyExc_KeyError, "%s(\"%s\") not found", py_fn_id, opname); + return NULL; + } + return ot; } static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) { - wmOperatorType *ot; - const char *opname; - PyObject *context_dict = NULL; /* optional args */ - PyObject *context_dict_back; - const char *context_str = NULL; - PyObject *ret; - - int context = WM_OP_EXEC_DEFAULT; - - /* XXX Todo, work out a better solution for passing on context, - * could make a tuple from self and pack the name and Context into it... */ - bContext *C = (bContext *)BPy_GetContext(); - - if (C == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); - return NULL; - } - - if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str)) { - return NULL; - } - - ot = WM_operatortype_find(opname, true); - - if (ot == NULL) { - PyErr_Format(PyExc_AttributeError, - "Polling operator \"bpy.ops.%s\" error, " - "could not be found", opname); - return NULL; - } - - if (context_str) { - if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { - char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); - PyErr_Format(PyExc_TypeError, - "Calling operator \"bpy.ops.%s.poll\" error, " - "expected a string enum in (%s)", - opname, enum_str); - MEM_freeN(enum_str); - return NULL; - } - } - - if (context_dict == NULL || context_dict == Py_None) { - context_dict = NULL; - } - else if (!PyDict_Check(context_dict)) { - PyErr_Format(PyExc_TypeError, - "Calling operator \"bpy.ops.%s.poll\" error, " - "custom context expected a dict or None, got a %.200s", - opname, Py_TYPE(context_dict)->tp_name); - return NULL; - } - - context_dict_back = CTX_py_dict_get(C); - CTX_py_dict_set(C, (void *)context_dict); - Py_XINCREF(context_dict); /* so we done loose it */ - - /* main purpose of this function */ - ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False; - - /* restore with original context dict, probably NULL but need this for nested operator calls */ - Py_XDECREF(context_dict); - CTX_py_dict_set(C, (void *)context_dict_back); - - return Py_INCREF_RET(ret); + wmOperatorType *ot; + const char *opname; + PyObject *context_dict = NULL; /* optional args */ + PyObject *context_dict_back; + const char *context_str = NULL; + PyObject *ret; + + int context = WM_OP_EXEC_DEFAULT; + + /* XXX Todo, work out a better solution for passing on context, + * could make a tuple from self and pack the name and Context into it... */ + bContext *C = (bContext *)BPy_GetContext(); + + if (C == NULL) { + PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); + return NULL; + } + + if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str)) { + return NULL; + } + + ot = WM_operatortype_find(opname, true); + + if (ot == NULL) { + PyErr_Format(PyExc_AttributeError, + "Polling operator \"bpy.ops.%s\" error, " + "could not be found", + opname); + return NULL; + } + + if (context_str) { + if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { + char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); + PyErr_Format(PyExc_TypeError, + "Calling operator \"bpy.ops.%s.poll\" error, " + "expected a string enum in (%s)", + opname, + enum_str); + MEM_freeN(enum_str); + return NULL; + } + } + + if (context_dict == NULL || context_dict == Py_None) { + context_dict = NULL; + } + else if (!PyDict_Check(context_dict)) { + PyErr_Format(PyExc_TypeError, + "Calling operator \"bpy.ops.%s.poll\" error, " + "custom context expected a dict or None, got a %.200s", + opname, + Py_TYPE(context_dict)->tp_name); + return NULL; + } + + context_dict_back = CTX_py_dict_get(C); + CTX_py_dict_set(C, (void *)context_dict); + Py_XINCREF(context_dict); /* so we done loose it */ + + /* main purpose of this function */ + ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False; + + /* restore with original context dict, probably NULL but need this for nested operator calls */ + Py_XDECREF(context_dict); + CTX_py_dict_set(C, (void *)context_dict_back); + + return Py_INCREF_RET(ret); } static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) { - wmOperatorType *ot; - int error_val = 0; - PointerRNA ptr; - int operator_ret = OPERATOR_CANCELLED; - - const char *opname; - const char *context_str = NULL; - PyObject *kw = NULL; /* optional args */ - PyObject *context_dict = NULL; /* optional args */ - PyObject *context_dict_back; - - /* note that context is an int, python does the conversion in this case */ - int context = WM_OP_EXEC_DEFAULT; - int is_undo = false; - - /* XXX Todo, work out a better solution for passing on context, - * could make a tuple from self and pack the name and Context into it... */ - bContext *C = (bContext *)BPy_GetContext(); - - if (C == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); - return NULL; - } - - if (!PyArg_ParseTuple(args, "sO|O!si:_bpy.ops.call", - &opname, &context_dict, &PyDict_Type, &kw, &context_str, &is_undo)) - { - return NULL; - } - - ot = WM_operatortype_find(opname, true); - - if (ot == NULL) { - PyErr_Format(PyExc_AttributeError, - "Calling operator \"bpy.ops.%s\" error, " - "could not be found", opname); - return NULL; - } - - if (!pyrna_write_check()) { - PyErr_Format(PyExc_RuntimeError, - "Calling operator \"bpy.ops.%s\" error, " - "can't modify blend data in this state (drawing/rendering)", - opname); - return NULL; - } - - if (context_str) { - if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { - char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); - PyErr_Format(PyExc_TypeError, - "Calling operator \"bpy.ops.%s\" error, " - "expected a string enum in (%s)", - opname, enum_str); - MEM_freeN(enum_str); - return NULL; - } - } - - if (context_dict == NULL || context_dict == Py_None) { - context_dict = NULL; - } - else if (!PyDict_Check(context_dict)) { - PyErr_Format(PyExc_TypeError, - "Calling operator \"bpy.ops.%s\" error, " - "custom context expected a dict or None, got a %.200s", - opname, Py_TYPE(context_dict)->tp_name); - return NULL; - } - - context_dict_back = CTX_py_dict_get(C); - - CTX_py_dict_set(C, (void *)context_dict); - Py_XINCREF(context_dict); /* so we done loose it */ - - if (WM_operator_poll_context((bContext *)C, ot, context) == false) { - const char *msg = CTX_wm_operator_poll_msg_get(C); - PyErr_Format(PyExc_RuntimeError, - "Operator bpy.ops.%.200s.poll() %.200s", - opname, msg ? msg : "failed, context is incorrect"); - CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */ - error_val = -1; - } - else { - WM_operator_properties_create_ptr(&ptr, ot); - WM_operator_properties_sanitize(&ptr, 0); - - if (kw && PyDict_Size(kw)) { - error_val = pyrna_pydict_to_props(&ptr, kw, false, "Converting py args to operator properties: "); - } - - if (error_val == 0) { - ReportList *reports; - - reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList"); - BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD); /* own so these don't move into global reports */ + wmOperatorType *ot; + int error_val = 0; + PointerRNA ptr; + int operator_ret = OPERATOR_CANCELLED; + + const char *opname; + const char *context_str = NULL; + PyObject *kw = NULL; /* optional args */ + PyObject *context_dict = NULL; /* optional args */ + PyObject *context_dict_back; + + /* note that context is an int, python does the conversion in this case */ + int context = WM_OP_EXEC_DEFAULT; + int is_undo = false; + + /* XXX Todo, work out a better solution for passing on context, + * could make a tuple from self and pack the name and Context into it... */ + bContext *C = (bContext *)BPy_GetContext(); + + if (C == NULL) { + PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); + return NULL; + } + + if (!PyArg_ParseTuple(args, + "sO|O!si:_bpy.ops.call", + &opname, + &context_dict, + &PyDict_Type, + &kw, + &context_str, + &is_undo)) { + return NULL; + } + + ot = WM_operatortype_find(opname, true); + + if (ot == NULL) { + PyErr_Format(PyExc_AttributeError, + "Calling operator \"bpy.ops.%s\" error, " + "could not be found", + opname); + return NULL; + } + + if (!pyrna_write_check()) { + PyErr_Format(PyExc_RuntimeError, + "Calling operator \"bpy.ops.%s\" error, " + "can't modify blend data in this state (drawing/rendering)", + opname); + return NULL; + } + + if (context_str) { + if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { + char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); + PyErr_Format(PyExc_TypeError, + "Calling operator \"bpy.ops.%s\" error, " + "expected a string enum in (%s)", + opname, + enum_str); + MEM_freeN(enum_str); + return NULL; + } + } + + if (context_dict == NULL || context_dict == Py_None) { + context_dict = NULL; + } + else if (!PyDict_Check(context_dict)) { + PyErr_Format(PyExc_TypeError, + "Calling operator \"bpy.ops.%s\" error, " + "custom context expected a dict or None, got a %.200s", + opname, + Py_TYPE(context_dict)->tp_name); + return NULL; + } + + context_dict_back = CTX_py_dict_get(C); + + CTX_py_dict_set(C, (void *)context_dict); + Py_XINCREF(context_dict); /* so we done loose it */ + + if (WM_operator_poll_context((bContext *)C, ot, context) == false) { + const char *msg = CTX_wm_operator_poll_msg_get(C); + PyErr_Format(PyExc_RuntimeError, + "Operator bpy.ops.%.200s.poll() %.200s", + opname, + msg ? msg : "failed, context is incorrect"); + CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */ + error_val = -1; + } + else { + WM_operator_properties_create_ptr(&ptr, ot); + WM_operator_properties_sanitize(&ptr, 0); + + if (kw && PyDict_Size(kw)) { + error_val = pyrna_pydict_to_props( + &ptr, kw, false, "Converting py args to operator properties: "); + } + + if (error_val == 0) { + ReportList *reports; + + reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList"); + BKE_reports_init(reports, + RPT_STORE | RPT_OP_HOLD); /* own so these don't move into global reports */ #ifdef BPY_RELEASE_GIL - /* release GIL, since a thread could be started from an operator - * that updates a driver */ - /* note: I have not seen any examples of code that does this - * so it may not be officially supported but seems to work ok. */ - { - PyThreadState *ts = PyEval_SaveThread(); + /* release GIL, since a thread could be started from an operator + * that updates a driver */ + /* note: I have not seen any examples of code that does this + * so it may not be officially supported but seems to work ok. */ + { + PyThreadState *ts = PyEval_SaveThread(); #endif - operator_ret = WM_operator_call_py(C, ot, context, &ptr, reports, is_undo); + operator_ret = WM_operator_call_py(C, ot, context, &ptr, reports, is_undo); #ifdef BPY_RELEASE_GIL - /* regain GIL */ - PyEval_RestoreThread(ts); - } + /* regain GIL */ + PyEval_RestoreThread(ts); + } #endif - error_val = BPy_reports_to_error(reports, PyExc_RuntimeError, false); + error_val = BPy_reports_to_error(reports, PyExc_RuntimeError, false); - /* operator output is nice to have in the terminal/console too */ - if (!BLI_listbase_is_empty(&reports->list)) { - BPy_reports_write_stdout(reports, NULL); - } + /* operator output is nice to have in the terminal/console too */ + if (!BLI_listbase_is_empty(&reports->list)) { + BPy_reports_write_stdout(reports, NULL); + } - BKE_reports_clear(reports); - if ((reports->flag & RPT_FREE) == 0) { - MEM_freeN(reports); - } - else { - /* The WM is now responsible for running the modal operator, - * show reports in the info window. */ - reports->flag &= ~RPT_OP_HOLD; - } - } + BKE_reports_clear(reports); + if ((reports->flag & RPT_FREE) == 0) { + MEM_freeN(reports); + } + else { + /* The WM is now responsible for running the modal operator, + * show reports in the info window. */ + reports->flag &= ~RPT_OP_HOLD; + } + } - WM_operator_properties_free(&ptr); + WM_operator_properties_free(&ptr); #if 0 - /* if there is some way to know an operator takes args we should use this */ - { - /* no props */ - if (kw != NULL) { - PyErr_Format(PyExc_AttributeError, - "Operator \"%s\" does not take any args", - opname); - return NULL; - } - - WM_operator_name_call(C, opname, WM_OP_EXEC_DEFAULT, NULL); - } + /* if there is some way to know an operator takes args we should use this */ + { + /* no props */ + if (kw != NULL) { + PyErr_Format(PyExc_AttributeError, + "Operator \"%s\" does not take any args", + opname); + return NULL; + } + + WM_operator_name_call(C, opname, WM_OP_EXEC_DEFAULT, NULL); + } #endif - } + } - /* restore with original context dict, probably NULL but need this for nested operator calls */ - Py_XDECREF(context_dict); - CTX_py_dict_set(C, (void *)context_dict_back); + /* restore with original context dict, probably NULL but need this for nested operator calls */ + Py_XDECREF(context_dict); + CTX_py_dict_set(C, (void *)context_dict_back); - if (error_val == -1) { - return NULL; - } + if (error_val == -1) { + return NULL; + } - /* when calling bpy.ops.wm.read_factory_settings() bpy.data's main pointer is freed by clear_globals(), - * further access will crash blender. setting context is not needed in this case, only calling because this - * function corrects bpy.data (internal Main pointer) */ - BPY_modules_update(C); + /* when calling bpy.ops.wm.read_factory_settings() bpy.data's main pointer is freed by clear_globals(), + * further access will crash blender. setting context is not needed in this case, only calling because this + * function corrects bpy.data (internal Main pointer) */ + BPY_modules_update(C); - /* needed for when WM_OT_read_factory_settings us called from within a script */ - bpy_import_main_set(CTX_data_main(C)); - - /* return operator_ret as a bpy enum */ - return pyrna_enum_bitfield_to_py(rna_enum_operator_return_items, operator_ret); + /* needed for when WM_OT_read_factory_settings us called from within a script */ + bpy_import_main_set(CTX_data_main(C)); + /* return operator_ret as a bpy enum */ + return pyrna_enum_bitfield_to_py(rna_enum_operator_return_items, operator_ret); } static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args) { - wmOperatorType *ot; - PointerRNA ptr; - - const char *opname; - PyObject *kw = NULL; /* optional args */ - bool all_args = true; - bool macro_args = true; - int error_val = 0; - - char *buf = NULL; - PyObject *pybuf; - - bContext *C = (bContext *)BPy_GetContext(); - - if (C == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Context is None, cant get the string representation of this object."); - return NULL; - } - - if (!PyArg_ParseTuple( - args, "s|O!O&O&:_bpy.ops.as_string", - &opname, &PyDict_Type, &kw, - PyC_ParseBool, &all_args, - PyC_ParseBool, ¯o_args)) - { - return NULL; - } - - ot = WM_operatortype_find(opname, true); - - if (ot == NULL) { - PyErr_Format(PyExc_AttributeError, - "_bpy.ops.as_string: operator \"%.200s\" " - "could not be found", opname); - return NULL; - } - - /* WM_operator_properties_create(&ptr, opname); */ - /* Save another lookup */ - RNA_pointer_create(NULL, ot->srna, NULL, &ptr); - - if (kw && PyDict_Size(kw)) { - error_val = pyrna_pydict_to_props(&ptr, kw, false, "Converting py args to operator properties: "); - } - - if (error_val == 0) { - buf = WM_operator_pystring_ex(C, NULL, all_args, macro_args, ot, &ptr); - } - - WM_operator_properties_free(&ptr); - - if (error_val == -1) { - return NULL; - } - - if (buf) { - pybuf = PyUnicode_FromString(buf); - MEM_freeN(buf); - } - else { - pybuf = PyUnicode_FromString(""); - } - - return pybuf; + wmOperatorType *ot; + PointerRNA ptr; + + const char *opname; + PyObject *kw = NULL; /* optional args */ + bool all_args = true; + bool macro_args = true; + int error_val = 0; + + char *buf = NULL; + PyObject *pybuf; + + bContext *C = (bContext *)BPy_GetContext(); + + if (C == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "Context is None, cant get the string representation of this object."); + return NULL; + } + + if (!PyArg_ParseTuple(args, + "s|O!O&O&:_bpy.ops.as_string", + &opname, + &PyDict_Type, + &kw, + PyC_ParseBool, + &all_args, + PyC_ParseBool, + ¯o_args)) { + return NULL; + } + + ot = WM_operatortype_find(opname, true); + + if (ot == NULL) { + PyErr_Format(PyExc_AttributeError, + "_bpy.ops.as_string: operator \"%.200s\" " + "could not be found", + opname); + return NULL; + } + + /* WM_operator_properties_create(&ptr, opname); */ + /* Save another lookup */ + RNA_pointer_create(NULL, ot->srna, NULL, &ptr); + + if (kw && PyDict_Size(kw)) { + error_val = pyrna_pydict_to_props( + &ptr, kw, false, "Converting py args to operator properties: "); + } + + if (error_val == 0) { + buf = WM_operator_pystring_ex(C, NULL, all_args, macro_args, ot, &ptr); + } + + WM_operator_properties_free(&ptr); + + if (error_val == -1) { + return NULL; + } + + if (buf) { + pybuf = PyUnicode_FromString(buf); + MEM_freeN(buf); + } + else { + pybuf = PyUnicode_FromString(""); + } + + return pybuf; } static PyObject *pyop_dir(PyObject *UNUSED(self)) { - GHashIterator iter; - PyObject *list; - int i; + GHashIterator iter; + PyObject *list; + int i; - WM_operatortype_iter(&iter); - list = PyList_New(BLI_ghash_len(iter.gh)); + WM_operatortype_iter(&iter); + list = PyList_New(BLI_ghash_len(iter.gh)); - for (i = 0; !BLI_ghashIterator_done(&iter); BLI_ghashIterator_step(&iter), i++) { - wmOperatorType *ot = BLI_ghashIterator_getValue(&iter); - PyList_SET_ITEM(list, i, PyUnicode_FromString(ot->idname)); - } + for (i = 0; !BLI_ghashIterator_done(&iter); BLI_ghashIterator_step(&iter), i++) { + wmOperatorType *ot = BLI_ghashIterator_getValue(&iter); + PyList_SET_ITEM(list, i, PyUnicode_FromString(ot->idname)); + } - return list; + return list; } static PyObject *pyop_getrna_type(PyObject *UNUSED(self), PyObject *value) { - wmOperatorType *ot; - if ((ot = ot_lookup_from_py_string(value, "get_rna_type")) == NULL) { - return NULL; - } - - PointerRNA ptr; - RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr); - BPy_StructRNA *pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); - return (PyObject *)pyrna; + wmOperatorType *ot; + if ((ot = ot_lookup_from_py_string(value, "get_rna_type")) == NULL) { + return NULL; + } + + PointerRNA ptr; + RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr); + BPy_StructRNA *pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); + return (PyObject *)pyrna; } static struct PyMethodDef bpy_ops_methods[] = { - {"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL}, - {"call", (PyCFunction) pyop_call, METH_VARARGS, NULL}, - {"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL}, - {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL}, - {"get_rna_type", (PyCFunction) pyop_getrna_type, METH_O, NULL}, - {"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL}, - {NULL, NULL, 0, NULL}, + {"poll", (PyCFunction)pyop_poll, METH_VARARGS, NULL}, + {"call", (PyCFunction)pyop_call, METH_VARARGS, NULL}, + {"as_string", (PyCFunction)pyop_as_string, METH_VARARGS, NULL}, + {"dir", (PyCFunction)pyop_dir, METH_NOARGS, NULL}, + {"get_rna_type", (PyCFunction)pyop_getrna_type, METH_O, NULL}, + {"macro_define", (PyCFunction)PYOP_wrap_macro_define, METH_VARARGS, NULL}, + {NULL, NULL, 0, NULL}, }; static struct PyModuleDef bpy_ops_module = { - PyModuleDef_HEAD_INIT, - "_bpy.ops", - NULL, - -1, /* multiple "initialization" just copies the module dict. */ - bpy_ops_methods, - NULL, NULL, NULL, NULL, + PyModuleDef_HEAD_INIT, + "_bpy.ops", + NULL, + -1, /* multiple "initialization" just copies the module dict. */ + bpy_ops_methods, + NULL, + NULL, + NULL, + NULL, }; PyObject *BPY_operator_module(void) { - PyObject *submodule; + PyObject *submodule; - submodule = PyModule_Create(&bpy_ops_module); + submodule = PyModule_Create(&bpy_ops_module); - return submodule; + return submodule; } |