[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