Revision: 44916
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44916
Author:   campbellbarton
Date:     2012-03-16 05:03:13 +0000 (Fri, 16 Mar 2012)
Log Message:
-----------
bmesh py api:

Wrap customdata, so far you can access the data layers in a pythonic way but 
not manipulate the customdata yet.

provides dictionary like access to customdata layers, eg:
  texpoly = bm.faces.tex["UVMap"]
  print(bm.verts.shape.keys())  # un-intended pun, keys() works on all layers.
  print("MyInt" in bm.edges.int)  # __contains__
  layer = bm.faces.get("CheckForLayer")

Modified Paths:
--------------
    trunk/blender/source/blender/python/bmesh/bmesh_py_api.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.h
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_select.h
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_api.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_api.c    2012-03-16 
04:14:57 UTC (rev 44915)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_api.c    2012-03-16 
05:03:13 UTC (rev 44916)
@@ -35,6 +35,8 @@
 
 #include "bmesh_py_types.h"
 #include "bmesh_py_types_select.h"
+#include "bmesh_py_types_customdata.h"
+
 #include "bmesh_py_utils.h"
 
 #include "BLI_utildefines.h"
@@ -129,7 +131,8 @@
        PyObject *sys_modules = PySys_GetObject("modules"); /* not pretty */
 
        BPy_BM_init_types();
-       BPy_BM_init_select_types();
+       BPy_BM_init_types_select();
+       BPy_BM_init_types_customdata();
 
        mod = PyModule_Create(&BPy_BM_module_def);
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c  2012-03-16 
04:14:57 UTC (rev 44915)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c  2012-03-16 
05:03:13 UTC (rev 44916)
@@ -46,6 +46,7 @@
 
 #include "bmesh_py_types.h" /* own include */
 #include "bmesh_py_types_select.h"
+#include "bmesh_py_types_customdata.h"
 
 /* Common Flags
  * ************ */
@@ -483,7 +484,39 @@
        return BPy_BMLoop_CreatePyObject(self->bm, self->l->prev);
 }
 
+/* ElemSeq
+ * ^^^^^^^ */
 
+PyDoc_STRVAR(bpy_bmelemseq_layers_doc,
+"blah blah (read-only).\n\n:type: :class:`BMLayerAccess`"
+);
+static PyObject *bpy_bmelemseq_layers_get(BPy_BMElemSeq *self)
+{
+       char htype;
+       BPY_BM_CHECK_OBJ(self);
+
+       switch ((BMIterType)self->itype) {
+               case BM_VERTS_OF_MESH:
+                       htype = BM_VERT;
+                       break;
+               case BM_EDGES_OF_MESH:
+                       htype = BM_EDGE;
+                       break;
+               case BM_FACES_OF_MESH:
+                       htype = BM_FACE;
+                       break;
+
+                       /* TODO - LOOPS */
+
+               default:
+                       PyErr_SetString(PyExc_AttributeError, "layers attribute 
is only valid for vert/edge/face sequences");
+                       return NULL;
+                       break;
+       }
+
+       return BPy_BMLayerAccess_CreatePyObject(self->bm, htype);
+}
+
 static PyGetSetDef bpy_bmesh_getseters[] = {
     {(char *)"verts", (getter)bpy_bmelemseq_get, (setter)NULL, (char 
*)bpy_bmesh_verts_doc, (void *)BM_VERTS_OF_MESH},
     {(char *)"edges", (getter)bpy_bmelemseq_get, (setter)NULL, (char 
*)bpy_bmesh_edges_doc, (void *)BM_EDGES_OF_MESH},
@@ -592,7 +625,15 @@
     {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
 };
 
+static PyGetSetDef bpy_bmelemseq_getseters[] = {
+    {(char *)"layers",    (getter)bpy_bmelemseq_layers_get, (setter)NULL, 
(char *)bpy_bmelemseq_layers_doc, NULL},
 
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+
+
+
 /* Methods
  * ======= */
 
@@ -2549,7 +2590,7 @@
        BPy_BMEdge_Type.tp_getset    = bpy_bmedge_getseters;
        BPy_BMFace_Type.tp_getset    = bpy_bmface_getseters;
        BPy_BMLoop_Type.tp_getset    = bpy_bmloop_getseters;
-       BPy_BMElemSeq_Type.tp_getset = NULL;
+       BPy_BMElemSeq_Type.tp_getset = bpy_bmelemseq_getseters;
        BPy_BMIter_Type.tp_getset    = NULL;
 
 
@@ -2649,6 +2690,9 @@
        mod_type_add(submodule, BPy_BMIter_Type);
        mod_type_add(submodule, BPy_BMEditSelSeq_Type);
        mod_type_add(submodule, BPy_BMEditSelIter_Type);
+       mod_type_add(submodule, BPy_BMLayerAccess_Type);
+       mod_type_add(submodule, BPy_BMLayerCollection_Type);
+       mod_type_add(submodule, BPy_BMLayerItem_Type);
 
 #undef mod_type_add
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c       
2012-03-16 04:14:57 UTC (rev 44915)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c       
2012-03-16 05:03:13 UTC (rev 44916)
@@ -35,5 +35,513 @@
 #include "bmesh.h"
 
 #include "bmesh_py_types.h"
+#include "bmesh_py_types_customdata.h"
 
-/* TODO */
+#include "BKE_customdata.h"
+
+static CustomData *bpy_bm_customdata_get(BMesh *bm, char htype)
+{
+       switch (htype) {
+               case BM_VERT:  return &bm->vdata;
+               case BM_EDGE:  return &bm->edata;
+               case BM_FACE:  return &bm->pdata;
+               case BM_LOOP:  return &bm->ldata;
+       }
+
+       BLI_assert(0);
+       return NULL;
+}
+
+static CustomDataLayer *bpy_bmlayeritem_get(BPy_BMLayerItem *self)
+{
+       CustomData *data = bpy_bm_customdata_get(self->bm, self->htype);
+       return &data->layers[CustomData_get_layer_index_n(data, self->type, 
self->index)];
+}
+
+/* py-type definitions
+ * ******************* */
+
+/* getseters
+ * ========= */
+
+static PyObject *bpy_bmlayeraccess_collection_get(BPy_BMLayerAccess *self, 
void *flag)
+{
+       const int type = (int)GET_INT_FROM_POINTER(flag);
+
+       BPY_BM_CHECK_OBJ(self);
+
+       return BPy_BMLayerCollection_CreatePyObject(self->bm, self->htype, 
type);
+}
+
+static PyObject *bpy_bmlayeritem_name_get(BPy_BMLayerItem *self, void 
*UNUSED(flag))
+{
+       CustomDataLayer *layer;
+
+       BPY_BM_CHECK_OBJ(self);
+
+       layer = bpy_bmlayeritem_get(self);
+       return PyUnicode_FromString(layer->name);
+}
+
+static PyGetSetDef bpy_bmlayeraccess_getseters[] = {
+    {(char *)"deform", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_MDEFORMVERT},
+
+    {(char *)"float",  (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_PROP_FLT},
+    {(char *)"int",    (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_PROP_INT},
+    {(char *)"string", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_PROP_STR},
+
+    {(char *)"tex",   (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_MTEXPOLY},
+    {(char *)"uv",    (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_MLOOPUV},
+    {(char *)"color", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, 
(char *)NULL, (void *)CD_MLOOPCOL},
+
+    {(char *)"shape",        (getter)bpy_bmlayeraccess_collection_get, 
(setter)NULL, (char *)NULL, (void *)CD_SHAPEKEY},
+    {(char *)"bevel_weight", (getter)bpy_bmlayeraccess_collection_get, 
(setter)NULL, (char *)NULL, (void *)CD_SHAPEKEY},
+    {(char *)"crease",       (getter)bpy_bmlayeraccess_collection_get, 
(setter)NULL, (char *)NULL, (void *)CD_CREASE},
+
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+static PyGetSetDef bpy_bmlayeritem_getseters[] = {
+    /* BMESH_TODO, make writeable */
+    {(char *)"name", (getter)bpy_bmlayeritem_name_get, (setter)NULL, (char 
*)NULL, NULL},
+
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+
+/* Methods
+ * ======= */
+
+/* BMLayerCollection
+ * ----------------- */
+
+PyDoc_STRVAR(bpy_bmlayercollection_keys_doc,
+".. method:: keys()\n"
+"\n"
+"   Return the identifiers of collection members\n"
+"   (matching pythons dict.keys() functionality).\n"
+"\n"
+"   :return: the identifiers for each member of this collection.\n"
+"   :rtype: list of strings\n"
+);
+static PyObject *bpy_bmlayercollection_keys(BPy_BMLayerCollection *self)
+{
+       PyObject *ret = PyList_New(0);
+       PyObject *item;
+       int index;
+       CustomData *data;
+
+       BPY_BM_CHECK_OBJ(self);
+
+       data = bpy_bm_customdata_get(self->bm, self->htype);
+       index = CustomData_get_layer_index(data, self->type);
+
+       ret = PyList_New(0);
+
+       if (index != -1) {
+               int tot = CustomData_number_of_layers(data, self->type);
+               for ( ; tot-- > 0; index++) {
+                       item = PyUnicode_FromString(data->layers[index].name);
+                       PyList_Append(ret, item);
+                       Py_DECREF(item);
+               }
+       }
+
+       return ret;
+}
+
+PyDoc_STRVAR(bpy_bmlayercollection_values_doc,
+".. method:: items()\n"
+"\n"
+"   Return the identifiers of collection members\n"
+"   (matching pythons dict.items() functionality).\n"
+"\n"
+"   :return: (key, value) pairs for each member of this collection.\n"
+"   :rtype: list of tuples\n"
+);
+static PyObject *bpy_bmlayercollection_values(BPy_BMLayerCollection *self)
+{
+       PyObject *ret;
+       PyObject *item;
+       int index;
+       CustomData *data;
+
+       BPY_BM_CHECK_OBJ(self);
+
+       data = bpy_bm_customdata_get(self->bm, self->htype);
+       index = CustomData_get_layer_index(data, self->type);
+
+       ret = PyList_New(0);
+
+       if (index != -1) {
+               int tot = CustomData_number_of_layers(data, self->type);
+               for ( ; tot-- > 0; index++) {
+                       item = PyTuple_New(2);
+                       PyTuple_SET_ITEM(item, 0, 
PyUnicode_FromString(data->layers[index].name));
+                       PyTuple_SET_ITEM(item, 1, 
BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index));
+                       PyList_Append(ret, item);
+                       Py_DECREF(item);
+               }
+       }
+
+       return ret;
+}
+
+PyDoc_STRVAR(bpy_bmlayercollection_items_doc,
+".. method:: values()\n"
+"\n"
+"   Return the values of collection\n"
+"   (matching pythons dict.values() functionality).\n"
+"\n"
+"   :return: the members of this collection.\n"
+"   :rtype: list\n"
+);
+static PyObject *bpy_bmlayercollection_items(BPy_BMLayerCollection *self)
+{
+       PyObject *ret;
+       PyObject *item;
+       int index;
+       CustomData *data;
+
+       BPY_BM_CHECK_OBJ(self);
+
+       data = bpy_bm_customdata_get(self->bm, self->htype);
+       index = CustomData_get_layer_index(data, self->type);
+
+       ret = PyList_New(0);
+
+       if (index != -1) {
+               int tot = CustomData_number_of_layers(data, self->type);
+               for ( ; tot-- > 0; index++) {
+                       item = BPy_BMLayerItem_CreatePyObject(self->bm, 
self->htype, self->type, index);
+                       PyList_Append(ret, item);
+                       Py_DECREF(item);
+               }
+       }
+
+       return ret;
+}
+
+PyDoc_STRVAR(bpy_bmlayercollection_get_doc,
+".. method:: get(key, default=None)\n"
+"\n"
+"   Returns the value of the layer matching the key or default\n"
+"   when not found (matches pythons dictionary function of the same name).\n"
+"\n"
+"   :arg key: The key associated with the layer.\n"
+"   :type key: string\n"
+"   :arg default: Optional argument for the value to return if\n"
+"      *key* is not found.\n"
+"   :type default: Undefined\n"
+);
+static PyObject *bpy_bmlayercollection_get(BPy_BMLayerCollection *self, 
PyObject *args)
+{
+       const char *key;
+       PyObject* def = Py_None;
+
+       BPY_BM_CHECK_OBJ(self);
+
+       if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) {
+               return NULL;
+       }
+       else {
+               CustomData *data;
+               int index;
+
+               data = bpy_bm_customdata_get(self->bm, self->htype);
+               index = CustomData_get_named_layer_index(data, self->type, key);
+
+               if (index != -1) {
+                       return BPy_BMLayerItem_CreatePyObject(self->bm, 
self->htype, self->type, index);
+               }
+       }
+
+       return Py_INCREF(def), def;
+}
+
+static struct PyMethodDef bpy_bmelemseq_methods[] = {
+    {"keys",     (PyCFunction)bpy_bmlayercollection_keys,     METH_NOARGS,  
bpy_bmlayercollection_keys_doc},

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