[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40735] trunk/blender/source/blender: support for object data material assignment in python

Campbell Barton ideasman42 at gmail.com
Sat Oct 1 19:54:33 CEST 2011


Revision: 40735
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40735
Author:   campbellbarton
Date:     2011-10-01 17:54:33 +0000 (Sat, 01 Oct 2011)
Log Message:
-----------
support for object data material assignment in python
eg:
 bpy.context.object.data.materials[0] = bpy.data.materials["SomeMaterial"]

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_ID.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_curve.c
    trunk/blender/source/blender/makesrna/intern/rna_internal.h
    trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    trunk/blender/source/blender/makesrna/intern/rna_meta.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2011-10-01 17:54:33 UTC (rev 40735)
@@ -778,7 +778,7 @@
 int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr);
 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr);
 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr);
-int RNA_property_collection_assign_int(PointerRNA *ptr, PropertyRNA *prop, const int key, PointerRNA *assign_ptr);
+int RNA_property_collection_assign_int(PointerRNA *ptr, PropertyRNA *prop, const int key, const PointerRNA *assign_ptr);
 int RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr);
 
 /* efficient functions to set properties for arrays */

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -314,6 +314,14 @@
 	return prop->len;
 }
 
+int rna_IDMaterials_assign_int(PointerRNA *ptr, int key, PointerRNA *assign_ptr)
+{
+	ID *id=           ptr->id.data;
+	Material *mat_id= assign_ptr->id.data;
+	assign_material_id(id, mat_id, key + 1);
+	return 1;
+}
+
 #else
 
 static void rna_def_ID_properties(BlenderRNA *brna)

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -1095,6 +1095,9 @@
 		if(cprop->item_type)
 			return cprop->item_type;
 	}
+	else {
+		BLI_assert(0);
+	}
 
 	return &RNA_UnknownType;
 }
@@ -2865,7 +2868,7 @@
 }
 
 /* zero return is an assignment error */
-int RNA_property_collection_assign_int(PointerRNA *ptr, PropertyRNA *prop, const int key, PointerRNA *assign_ptr)
+int RNA_property_collection_assign_int(PointerRNA *ptr, PropertyRNA *prop, const int key, const PointerRNA *assign_ptr)
 {
 	CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(prop);
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_curve.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_curve.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_curve.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -1428,7 +1428,8 @@
 	RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
 	RNA_def_property_struct_type(prop, "Material");
 	RNA_def_property_ui_text(prop, "Materials", "");
-	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */	
+	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */
+	RNA_def_property_collection_funcs(prop, 0, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int");
 }
 
 static void rna_def_curve_nurb(BlenderRNA *brna)

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal.h	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal.h	2011-10-01 17:54:33 UTC (rev 40735)
@@ -382,6 +382,9 @@
 struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
 void rna_mtex_texture_slots_clear(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
 
+
+int rna_IDMaterials_assign_int(struct PointerRNA *ptr, int key, struct PointerRNA *assign_ptr);
+
 #endif /* RNA_INTERNAL_H */
 
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2011-10-01 17:54:33 UTC (rev 40735)
@@ -102,7 +102,7 @@
 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
 typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
 typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
-typedef int (*PropCollectionAssignIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *assign_ptr);
+typedef int (*PropCollectionAssignIntFunc)(struct PointerRNA *ptr, int key, const struct PointerRNA *assign_ptr);
 
 /* Container - generic abstracted container of RNA properties */
 typedef struct ContainerRNA {

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -1942,6 +1942,7 @@
 	RNA_def_property_struct_type(prop, "Material");
 	RNA_def_property_ui_text(prop, "Materials", "");
 	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */
+	RNA_def_property_collection_funcs(prop, 0, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int");
 
 	/* Mesh Draw Options for Edit Mode*/
 	

Modified: trunk/blender/source/blender/makesrna/intern/rna_meta.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_meta.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/makesrna/intern/rna_meta.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -330,7 +330,8 @@
 	RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
 	RNA_def_property_struct_type(prop, "Material");
 	RNA_def_property_ui_text(prop, "Materials", "");
-	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */	
+	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */
+	RNA_def_property_collection_funcs(prop, 0, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int");
 	
 	/* anim */
 	rna_def_animdata_common(srna);

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2011-10-01 17:51:47 UTC (rev 40734)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2011-10-01 17:54:33 UTC (rev 40735)
@@ -1922,6 +1922,21 @@
 	return test;
 }
 
+
+#define PYRNA_PROP_COLLECTION_ABS_INDEX(ret_err)                              \
+	/* notice getting the length of the collection is avoided unless negative \
+	 * index is used or to detect internal error with a valid index.          \
+	 * This is done for faster lookups. */                                    \
+	if(keynum < 0) {                                                          \
+		keynum_abs += RNA_property_collection_length(&self->ptr, self->prop); \
+		if(keynum_abs < 0) {                                                  \
+			PyErr_Format(PyExc_IndexError,                                    \
+			             "bpy_prop_collection[%d]: out of range.", keynum);   \
+			return ret_err;                                                   \
+		}                                                                     \
+	}                                                                         \
+
+
 /* internal use only */
 static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum)
 {
@@ -1930,18 +1945,8 @@
 
 	PYRNA_PROP_CHECK_OBJ(self)
 
-	/* notice getting the length of the collection is avoided unless negative index is used
-	 * or to detect internal error with a valid index.
-	 * This is done for faster lookups. */
-	if(keynum < 0) {
-		keynum_abs += RNA_property_collection_length(&self->ptr, self->prop);
+	PYRNA_PROP_COLLECTION_ABS_INDEX(NULL);
 
-		if(keynum_abs < 0) {
-			PyErr_Format(PyExc_IndexError, "bpy_prop_collection[%d]: out of range.", keynum);
-			return NULL;
-		}
-	}
-
 	if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum_abs, &newptr)) {
 		return pyrna_struct_CreatePyObject(&newptr);
 	}
@@ -1963,6 +1968,28 @@
 	}
 }
 
+/* values type must have been already checked */
+static int pyrna_prop_collection_ass_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum, PyObject *value)
+{
+	Py_ssize_t keynum_abs= keynum;
+	const PointerRNA *ptr= (value == Py_None) ? (&PointerRNA_NULL) : &((BPy_StructRNA *)value)->ptr;
+
+	PYRNA_PROP_CHECK_INT(self)
+
+	PYRNA_PROP_COLLECTION_ABS_INDEX(-1);
+
+	if(RNA_property_collection_assign_int(&self->ptr, self->prop, keynum_abs, ptr) == 0) {
+
+		PyErr_Format(PyExc_IndexError,
+		             "bpy_prop_collection[index] = value: "
+		             "failed assignment (unknown reason)", keynum);
+
+		return -1;
+	}
+
+	return 0;
+}
+
 static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int keynum)
 {
 	int len;
@@ -2173,6 +2200,128 @@
 	}
 }
 
+/* generic check to see if a PyObject is compatible with a collection
+ * -1 on failier, 0 on success, sets the error */
+static int pyrna_prop_collection_type_check(BPy_PropertyRNA *self, PyObject *value)
+{
+	StructRNA *prop_srna;
+
+	if(value == Py_None) {
+		if (RNA_property_flag(self->prop) & PROP_NEVER_NULL) {
+			PyErr_Format(PyExc_TypeError,
+						 "bpy_prop_collection[key] = value: invalid, "
+						 "this collection doesnt support None assignment");
+			return -1;
+		}
+		else {
+			return 0; /* None is OK */
+		}
+	}
+	else if (BPy_StructRNA_Check(value) == 0) {
+		PyErr_Format(PyExc_TypeError,
+		             "bpy_prop_collection[key] = value: invalid, "
+		             "expected a StructRNA type or None, not a %.200s",
+		             Py_TYPE(value)->tp_name);
+		return -1;
+	}
+	else if((prop_srna= RNA_property_pointer_type(&self->ptr, self->prop))) {
+		StructRNA *value_srna= ((BPy_StructRNA *)value)->ptr.type;
+		if (RNA_struct_is_a(value_srna, prop_srna) == 0) {
+			PyErr_Format(PyExc_TypeError,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list