[Bf-blender-cvs] [061ea40] temp-pyapi-units: First step toward a basic units py API (exposes all supported unti systems & types, and str_to_value/value_to_str functions).

Bastien Montagne noreply at git.blender.org
Mon Jun 16 20:25:48 CEST 2014


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. @@




More information about the Bf-blender-cvs mailing list