[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51796] trunk/blender/source/blender: add IDP_MergeGroup(dst, src, overwrite) function,
Campbell Barton
ideasman42 at gmail.com
Wed Oct 31 20:07:27 CET 2012
Revision: 51796
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51796
Author: campbellbarton
Date: 2012-10-31 19:07:25 +0000 (Wed, 31 Oct 2012)
Log Message:
-----------
add IDP_MergeGroup(dst, src, overwrite) function,
like PyDict_Merge()
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_idprop.h
trunk/blender/source/blender/blenkernel/intern/idprop.c
trunk/blender/source/blender/python/generic/idprop_py_api.c
trunk/blender/source/blender/python/generic/idprop_py_api.h
Modified: trunk/blender/source/blender/blenkernel/BKE_idprop.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_idprop.h 2012-10-31 18:47:49 UTC (rev 51795)
+++ trunk/blender/source/blender/blenkernel/BKE_idprop.h 2012-10-31 19:07:25 UTC (rev 51796)
@@ -154,6 +154,12 @@
#endif
;
+void IDP_MergeGroup(IDProperty *dest, IDProperty *src, const int do_overwrite)
+#ifdef __GNUC__
+__attribute__((nonnull))
+#endif
+;
+
/**
* This function has a sanity check to make sure ID properties with the same name don't
* get added to the group.
Modified: trunk/blender/source/blender/blenkernel/intern/idprop.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/idprop.c 2012-10-31 18:47:49 UTC (rev 51795)
+++ trunk/blender/source/blender/blenkernel/intern/idprop.c 2012-10-31 19:07:25 UTC (rev 51796)
@@ -492,6 +492,30 @@
}
}
+/*
+ * If a property is missing in \a dest, add it.
+ */
+void IDP_MergeGroup(IDProperty *dest, IDProperty *src, const int do_overwrite)
+{
+ IDProperty *prop;
+
+ if (do_overwrite) {
+ for (prop = src->data.group.first; prop; prop = prop->next) {
+ IDProperty *copy = IDP_CopyProperty(prop);
+ IDP_ReplaceInGroup(dest, copy);
+ }
+ }
+ else {
+ for (prop = src->data.group.first; prop; prop = prop->next) {
+ if (IDP_GetPropertyFromGroup(dest, prop->name) == NULL) {
+ IDProperty *copy = IDP_CopyProperty(prop);
+ dest->len++;
+ BLI_addtail(&dest->data.group, copy);
+ }
+ }
+ }
+}
+
/* returns 0 if an id property with the same name exists and it failed,
* or 1 if it succeeded in adding to the group.*/
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
Modified: trunk/blender/source/blender/python/generic/idprop_py_api.c
===================================================================
--- trunk/blender/source/blender/python/generic/idprop_py_api.c 2012-10-31 18:47:49 UTC (rev 51795)
+++ trunk/blender/source/blender/python/generic/idprop_py_api.c 2012-10-31 19:07:25 UTC (rev 51796)
@@ -43,10 +43,6 @@
#include "py_capi_utils.h"
#endif
-extern PyTypeObject BPy_IDArray_Type;
-extern PyTypeObject BPy_IDGroup_Iter_Type;
-extern PyTypeObject BPy_IDGroup_Type;
-
/*********************** ID Property Main Wrapper Stuff ***************/
/* ----------------------------------------------------------------------------
@@ -809,17 +805,28 @@
PyObject *pkey, *pval;
Py_ssize_t i = 0;
- if (!PyDict_Check(value)) {
+ if (BPy_IDGroup_Check(value)) {
+ BPy_IDProperty *other = (BPy_IDProperty *)value;
+ if (UNLIKELY(self->prop == other->prop)) {
+ Py_RETURN_NONE;
+ }
+
+ /* XXX, possible one is inside the other */
+ IDP_MergeGroup(self->prop, other->prop, TRUE);
+ }
+ else if (PyDict_Check(value)) {
+ while (PyDict_Next(value, &i, &pkey, &pval)) {
+ BPy_IDGroup_Map_SetItem(self, pkey, pval);
+ if (PyErr_Occurred()) return NULL;
+ }
+ }
+ else {
PyErr_Format(PyExc_TypeError,
- "expected a dict not a %.200s",
+ "expected a dict or an IDPropertyGroup type, not a %.200s",
Py_TYPE(value)->tp_name);
return NULL;
}
- while (PyDict_Next(value, &i, &pkey, &pval)) {
- BPy_IDGroup_Map_SetItem(self, pkey, pval);
- if (PyErr_Occurred()) return NULL;
- }
Py_RETURN_NONE;
}
Modified: trunk/blender/source/blender/python/generic/idprop_py_api.h
===================================================================
--- trunk/blender/source/blender/python/generic/idprop_py_api.h 2012-10-31 18:47:49 UTC (rev 51795)
+++ trunk/blender/source/blender/python/generic/idprop_py_api.h 2012-10-31 19:07:25 UTC (rev 51796)
@@ -32,6 +32,17 @@
struct IDProperty;
struct BPy_IDGroup_Iter;
+extern PyTypeObject BPy_IDArray_Type;
+extern PyTypeObject BPy_IDGroup_Iter_Type;
+extern PyTypeObject BPy_IDGroup_Type;
+
+#define BPy_IDArray_Check(v) (PyObject_TypeCheck(v, &BPy_IDArray_Type))
+#define BPy_IDArray_CheckExact(v) (Py_TYPE(v) == &BPy_IDArray_Type)
+#define BPy_IDGroup_Iter_Check(v) (PyObject_TypeCheck(v, &BPy_IDGroup_Iter_Type))
+#define BPy_IDGroup_Iter_CheckExact(v) (Py_TYPE(v) == &BPy_IDGroup_Iter_Type)
+#define BPy_IDGroup_Check(v) (PyObject_TypeCheck(v, &BPy_IDGroup_Type))
+#define BPy_IDGroup_CheckExact(v) (Py_TYPE(v) == &BPy_IDGroup_Type)
+
typedef struct BPy_IDProperty {
PyObject_VAR_HEAD
struct ID *id; /* can be NULL */
More information about the Bf-blender-cvs
mailing list