Commit: 061ea400a0248b286396b6b9acbef35fd8d93f18 Author: Bastien Montagne Date: Mon Mar 17 17:34:56 2014 +0100 https://developer.blender.org/rB061ea400a0248b286396b6b9acbef35fd8d93f18
First step toward a basic units py API (exposes all supported unti systems & types, and str_to_value/value_to_str functions). Also adds a skeletton of unittest file for it! Reviewers: campbellbarton CC: carter2422 Differential Revision: https://developer.blender.org/D416 =================================================================== M release/scripts/modules/bpy/utils.py M source/blender/blenkernel/BKE_unit.h M source/blender/python/intern/CMakeLists.txt M source/blender/python/intern/bpy.c M source/blender/python/intern/bpy_interface.c A source/blender/python/intern/bpy_interface.h A source/blender/python/intern/bpy_utils_units.c A source/blender/python/intern/bpy_utils_units.h A source/tests/bl_pyapi_units.py =================================================================== diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py index ce1efa4..5621af2 100644 --- a/release/scripts/modules/bpy/utils.py +++ b/release/scripts/modules/bpy/utils.py @@ -44,6 +44,7 @@ __all__ = ( "script_paths", "smpte_from_frame", "smpte_from_seconds", + "units", "unregister_class", "unregister_module", "user_resource", @@ -58,6 +59,7 @@ from _bpy import ( ) from _bpy import script_paths as _bpy_script_paths from _bpy import user_resource as _user_resource +from _bpy import _utils_units as units import bpy as _bpy import os as _os diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h index 07aeced..853a8db 100644 --- a/source/blender/blenkernel/BKE_unit.h +++ b/source/blender/blenkernel/BKE_unit.h @@ -61,17 +61,19 @@ const char *bUnit_GetNameDisplay(void *usys_pt, int index); double bUnit_GetScaler(void *usys_pt, int index); /* aligned with PropertyUnit */ -#define B_UNIT_NONE 0 -#define B_UNIT_LENGTH 1 -#define B_UNIT_AREA 2 -#define B_UNIT_VOLUME 3 -#define B_UNIT_MASS 4 -#define B_UNIT_ROTATION 5 -#define B_UNIT_TIME 6 -#define B_UNIT_VELOCITY 7 -#define B_UNIT_ACCELERATION 8 -#define B_UNIT_CAMERA 9 -#define B_UNIT_TYPE_TOT 10 +enum { + B_UNIT_NONE = 0, + B_UNIT_LENGTH = 1, + B_UNIT_AREA = 2, + B_UNIT_VOLUME = 3, + B_UNIT_MASS = 4, + B_UNIT_ROTATION = 5, + B_UNIT_TIME = 6, + B_UNIT_VELOCITY = 7, + B_UNIT_ACCELERATION = 8, + B_UNIT_CAMERA = 9, + B_UNIT_TYPE_TOT = 10, +}; #ifdef __cplusplus } diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index 0605f40..d85ec18 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -68,6 +68,7 @@ set(SRC bpy_rna_callback.c bpy_traceback.c bpy_util.c + bpy_utils_units.c stubs.c gpu.h @@ -80,6 +81,7 @@ set(SRC bpy_app_oiio.h bpy_app_translations.h bpy_driver.h + bpy_interface.h bpy_intern_string.h bpy_library.h bpy_operator.h @@ -91,6 +93,7 @@ set(SRC bpy_rna_callback.h bpy_traceback.h bpy_util.h + bpy_utils_units.h ../BPY_extern.h ) diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index 8910482..a40a047 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -49,6 +49,7 @@ #include "bpy_props.h" #include "bpy_library.h" #include "bpy_operator.h" +#include "bpy_utils_units.h" #include "MEM_guardedalloc.h" @@ -334,6 +335,7 @@ void BPy_init_modules(void) /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */ PyModule_AddObject(mod, "ops", BPY_operator_module()); PyModule_AddObject(mod, "app", BPY_app_struct()); + PyModule_AddObject(mod, "_utils_units", BPY_utils_units_struct()); /* bpy context */ RNA_pointer_create(NULL, &RNA_Context, (void *)BPy_GetContext(), &ctx_ptr); diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 045acc6..69f376d 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -59,6 +59,7 @@ #include "bpy_path.h" #include "bpy_util.h" #include "bpy_traceback.h" +#include "bpy_interface.h" #include "bpy_intern_string.h" #include "DNA_text_types.h" @@ -566,23 +567,14 @@ void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr) PyGILState_Release(gilstate); } - -/* return -1 on error, else 0 */ -int BPY_button_exec(bContext *C, const char *expr, double *value, const bool verbose) +/* return -1 on error, else 0 + * Note it is caller's responsibility to acquire & release GIL! + */ +int bpy_button_exec(const char *expr, double *value) { - PyGILState_STATE gilstate; PyObject *py_dict, *mod, *retval; int error_ret = 0; PyObject *main_mod = NULL; - - if (!value || !expr) return -1; - - if (expr[0] == '\0') { - *value = 0.0; - return error_ret; - } - - bpy_context_set(C, &gilstate); PyC_MainModule_Backup(&main_mod); @@ -597,9 +589,9 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const bool ver PyErr_Print(); PyErr_Clear(); } - + retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict); - + if (retval == NULL) { error_ret = -1; } @@ -625,7 +617,7 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const bool ver val = PyFloat_AsDouble(retval); } Py_DECREF(retval); - + if (val == -1 && PyErr_Occurred()) { error_ret = -1; } @@ -636,7 +628,29 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const bool ver *value = val; } } - + + PyC_MainModule_Restore(main_mod); + + return error_ret; +} + +/* return -1 on error, else 0 */ +int BPY_button_exec(bContext *C, const char *expr, double *value, const bool verbose) +{ + PyGILState_STATE gilstate; + int error_ret = 0; + + if (!value || !expr) return -1; + + if (expr[0] == '\0') { + *value = 0.0; + return error_ret; + } + + bpy_context_set(C, &gilstate); + + error_ret = bpy_button_exec(expr, value); + if (error_ret) { if (verbose) { BPy_errors_to_report(CTX_wm_reports(C)); @@ -646,10 +660,8 @@ int BPY_button_exec(bContext *C, const char *expr, double *value, const bool ver } } - PyC_MainModule_Restore(main_mod); - bpy_context_clear(C, &gilstate); - + return error_ret; } diff --git a/source/blender/python/intern/bpy_interface.h b/source/blender/python/intern/bpy_interface.h new file mode 100644 index 0000000..31e0ea2 --- /dev/null +++ b/source/blender/python/intern/bpy_interface.h @@ -0,0 +1,32 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Bastien Montagne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __BPY_INTERFACE_H__ +#define __BPY_INTERFACE_H__ + +/** \file blender/python/intern/bpy_interface.h + * \ingroup pythonintern + */ + +int bpy_button_exec(const char *expr, double *value); + +#endif /* __BPY_INTERFACE_H__ */ diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c new file mode 100644 index 0000000..e37c2ff --- /dev/null +++ b/source/blender/python/intern/bpy_utils_units.c @@ -0,0 +1,455 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Bastien Montagne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/python/intern/bpy_utils_units.c + * \ingroup pythonintern + * + * This file defines a singleton py object accessed via 'bpy.utils.units', + * which exposes various data and functions useful in units handling. + */ + +/* Future-proof, See https://docs.python.org/3/c-api/arg.html#strings-and-buffers */ +#define PY_SSIZE_T_CLEAN + +#include <Python.h> +/* XXX Why bloody hell isn't that included in Python.h???? */ +#include <structmember.h> + +#include "BLI_utildefines.h" +#include "BLI_string.h" +#include "BLI_ghash.h" + +#include "BPY_extern.h" +#include "bpy_utils_units.h" +#include "bpy_interface.h" + +#include "MEM_guardedalloc.h" + +#include "BKE_unit.h" + +#include "RNA_types.h" +#include "RNA_access.h" + +typedef struct +{ + PyObject_HEAD + /* A "named tuple" (StructSequence actually...) containing all C-defined unit systems. */ + PyObject *systems; + /* A "named tuple" (StructSequence actually...) containing all C-defined unit categories (types). */ + PyObject *categories; +} BlenderUtilsUnits; + +/* Our singleton instance pointer */ +static BlenderUtilsUnits *_units = NULL; + + +/***** C-defined systems and types *****/ + +static PyTypeObject BlenderUtilsUnitsSystemsType; +static PyTypeObject BlenderUtilsUnitsCategoriesType; + +/* XXX Maybe better as externs of BKE_unit.h ? */ +static const char *_usystems[] = { + "NONE", + "METRIC", + "IMPERIAL", + NULL, +}; + +static const char *_ucategories[] = { + "NONE", + "LENGTH", + "AREA", + "VOLUME", + "MASS", + "ROTATION", + "TIME", + "VELOCITY", + "ACCELERATION", + "CAMERA", + NULL, +}; + +/* These fields are just empty placeholders, actual values get set in app_translations_struct(). + * This allows us to avoid many handwriting, and above all, to keep all systems/categories definition stuff in + * BKE_unit.h! + */ +static PyStructSequence_Field utils_units_systems_fields[sizeof(_usystems) / sizeof(*_usystems)] = {{NULL}}; +static PyStructSequence_Field utils_units_categories_fields[sizeof(_ucategories) / sizeof(*_ucategories)] = {{NULL}}; + +static PyStructSequence_Desc utils_units_systems_desc = { + (char *)"bpy.utils.units.systems", /* name */ + (char *)"This named tuple contains all pre-defined unit systems", /* doc */ + utils_units_systems_fields, / @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-blender-cvs
