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

Reply via email to