[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46127] trunk/blender/source/blender: bmesh - python api

Campbell Barton ideasman42 at gmail.com
Wed May 2 12:35:14 CEST 2012


This isn't the intention, Brecht said that the default name was used
to denote if a customdata layer have multiple members, probably this
is right but since int/float/string layers are not added by the UI,
nobody ever ran into an issue with them, will look into this when I
get back online properly.

On Tue, May 1, 2012 at 9:14 PM, Andrew Hale <trumanblending at gmail.com> wrote:
> Hi Campbell,
>
> Seems we cannot create multiple customdata layers of ANY type, i.e. no
> multiple float/int/string layers at all in py. Was this intended?
>
> Cheers,
> Andrew
>
> On Tue, May 1, 2012 at 4:54 AM, Campbell Barton <ideasman42 at gmail.com>wrote:
>
>> Revision: 46127
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46127
>> Author:   campbellbarton
>> Date:     2012-04-30 18:54:14 +0000 (Mon, 30 Apr 2012)
>> Log Message:
>> -----------
>> bmesh - python api
>>
>> - bm.*.layers.*.verify()
>> - bm.*.layers.*.is_singleton
>> - bm.*.layers.*.copy_from(other)
>>
>>
>> also added api functons
>> - BM_data_layer_copy(...)
>> - CustomData_layertype_is_singleton(type)
>>
>> Modified Paths:
>> --------------
>>    trunk/blender/source/blender/blenkernel/BKE_customdata.h
>>    trunk/blender/source/blender/blenkernel/intern/customdata.c
>>    trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
>>    trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
>>    trunk/blender/source/blender/editors/mesh/mesh_data.c
>>    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
>>
>> Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
>> ===================================================================
>> --- trunk/blender/source/blender/blenkernel/BKE_customdata.h    2012-04-30
>> 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/blenkernel/BKE_customdata.h    2012-04-30
>> 18:54:14 UTC (rev 46127)
>> @@ -305,6 +305,7 @@
>>
>>  /* get the name of a layer type */
>>  const char *CustomData_layertype_name(int type);
>> +int         CustomData_layertype_is_singleton(int type);
>>
>>  /* make sure the name of layer at index is unique */
>>  void CustomData_set_layer_unique_name(struct CustomData *data, int index);
>>
>> Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
>> ===================================================================
>> --- trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-04-30
>> 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/blenkernel/intern/customdata.c 2012-04-30
>> 18:54:14 UTC (rev 46127)
>> @@ -71,8 +71,12 @@
>>        int size;          /* the memory size of one element of this
>> layer's data */
>>        const char *structname;  /* name of the struct used, for file
>> writing */
>>        int structnum;     /* number of structs per element, for file
>> writing */
>> -       const char *defaultname; /* default layer name */
>>
>> +       /* default layer name.
>> +        * note! when NULL this is a way to ensure there is only ever one
>> item
>> +        * see: CustomData_layertype_is_singleton() */
>> +       const char *defaultname;
>> +
>>        /* a function to copy count elements of this layer's data
>>         * (deep copy if appropriate)
>>         * if NULL, memcpy is used
>> @@ -2601,6 +2605,16 @@
>>        return layerType_getName(type);
>>  }
>>
>> +
>> +/**
>> + * Can only ever be one of these.
>> + */
>> +int CustomData_layertype_is_singleton(int type)
>> +{
>> +       const LayerTypeInfo *typeInfo = layerType_getInfo(type);
>> +       return typeInfo->defaultname != NULL;
>> +}
>> +
>>  static int  CustomData_is_property_layer(int type)
>>  {
>>        if ((type == CD_PROP_FLT) || (type == CD_PROP_INT) || (type ==
>> CD_PROP_STR))
>>
>> Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
>> ===================================================================
>> --- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-04-30
>> 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-04-30
>> 18:54:14 UTC (rev 46127)
>> @@ -853,6 +853,52 @@
>>        if (olddata.layers) MEM_freeN(olddata.layers);
>>  }
>>
>> +void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n,
>> int dst_n)
>> +{
>> +       BMIter iter;
>> +
>> +       if (&bm->vdata == data) {
>> +               BMVert *eve;
>> +
>> +               BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
>> +                       void *ptr = CustomData_bmesh_get_n(data,
>> eve->head.data, type, dst_n);
>> +                       CustomData_bmesh_set_n(data, eve->head.data, type,
>> src_n, ptr);
>> +               }
>> +       }
>> +       else if (&bm->edata == data) {
>> +               BMEdge *eed;
>> +
>> +               BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
>> +                       void *ptr = CustomData_bmesh_get_n(data,
>> eed->head.data, type, dst_n);
>> +                       CustomData_bmesh_set_n(data, eed->head.data, type,
>> src_n, ptr);
>> +               }
>> +       }
>> +       else if (&bm->pdata == data) {
>> +               BMFace *efa;
>> +
>> +               BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
>> +                       void *ptr = CustomData_bmesh_get_n(data,
>> efa->head.data, type, dst_n);
>> +                       CustomData_bmesh_set_n(data, efa->head.data, type,
>> src_n, ptr);
>> +               }
>> +       }
>> +       else if (&bm->ldata == data) {
>> +               BMIter liter;
>> +               BMFace *efa;
>> +               BMLoop *l;
>> +
>> +               BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
>> +                       BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
>> +                               void *ptr = CustomData_bmesh_get_n(data,
>> l->head.data, type, dst_n);
>> +                               CustomData_bmesh_set_n(data, l->head.data,
>> type, src_n, ptr);
>> +                       }
>> +               }
>> +       }
>> +       else {
>> +               /* should never reach this! */
>> +               BLI_assert(0);
>> +       }
>> +}
>> +
>>  float BM_elem_float_data_get(CustomData *cd, void *element, int type)
>>  {
>>        float *f = CustomData_bmesh_get(cd, ((BMHeader *)element)->data,
>> type);
>>
>> Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.h
>> ===================================================================
>> --- trunk/blender/source/blender/bmesh/intern/bmesh_interp.h    2012-04-30
>> 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.h    2012-04-30
>> 18:54:14 UTC (rev 46127)
>> @@ -36,6 +36,8 @@
>>  void  BM_data_layer_add_named(BMesh *bm, CustomData *data, int type,
>> const char *name);
>>  void  BM_data_layer_free(BMesh *em, CustomData *data, int type);
>>  void  BM_data_layer_free_n(BMesh *bm, CustomData *data, int type, int n);
>> +void  BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int
>> src_n, int dst_n);
>> +
>>  float BM_elem_float_data_get(CustomData *cd, void *element, int type);
>>  void  BM_elem_float_data_set(CustomData *cd, void *element, int type,
>> const float val);
>>
>>
>> Modified: trunk/blender/source/blender/editors/mesh/mesh_data.c
>> ===================================================================
>> --- trunk/blender/source/blender/editors/mesh/mesh_data.c       2012-04-30
>> 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/editors/mesh/mesh_data.c       2012-04-30
>> 18:54:14 UTC (rev 46127)
>> @@ -189,42 +189,6 @@
>>        }
>>  }
>>
>> -/* copies from active to 'index' */
>> -static void editmesh_face_copy_customdata(BMEditMesh *em, int type, int
>> index)
>> -{
>> -       BMesh *bm = em->bm;
>> -       CustomData *pdata = &bm->pdata;
>> -       BMIter iter;
>> -       BMFace *efa;
>> -       const int n = CustomData_get_active_layer(pdata, type);
>> -
>> -       /* ensure all current elements follow new customdata layout */
>> -       BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
>> -               void *data = CustomData_bmesh_get_n(pdata, efa->head.data,
>> type, n);
>> -               CustomData_bmesh_set_n(pdata, efa->head.data, type, index,
>> data);
>> -       }
>> -}
>> -
>> -/* copies from active to 'index' */
>> -static void editmesh_loop_copy_customdata(BMEditMesh *em, int type, int
>> index)
>> -{
>> -       BMesh *bm = em->bm;
>> -       CustomData *ldata = &bm->ldata;
>> -       BMIter iter;
>> -       BMIter liter;
>> -       BMFace *efa;
>> -       BMLoop *loop;
>> -       const int n = CustomData_get_active_layer(ldata, type);
>> -
>> -       /* ensure all current elements follow new customdata layout */
>> -       BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
>> -               BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
>> -                       void *data = CustomData_bmesh_get_n(ldata,
>> loop->head.data, type, n);
>> -                       CustomData_bmesh_set_n(ldata, loop->head.data,
>> type, index, data);
>> -               }
>> -       }
>> -}
>> -
>>  int ED_mesh_uv_loop_reset_ex(struct bContext *C, struct Mesh *me, const
>> int layernum)
>>  {
>>        BMEditMesh *em = me->edit_btmesh;
>> @@ -360,7 +324,8 @@
>>                BM_data_layer_add_named(em->bm, &em->bm->pdata,
>> CD_MTEXPOLY, name);
>>                /* copy data from active UV */
>>                if (layernum) {
>> -                       editmesh_face_copy_customdata(em, CD_MTEXPOLY,
>> layernum);
>> +                       const int layernum_dst =
>> CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY);
>> +                       BM_data_layer_copy(em->bm, &em->bm->pdata,
>> CD_MTEXPOLY, layernum, layernum_dst);
>>                }
>>                if (active_set || layernum == 0) {
>>                        CustomData_set_layer_active(&em->bm->pdata,
>> CD_MTEXPOLY, layernum);
>> @@ -370,7 +335,9 @@
>>                BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV,
>> name);
>>                /* copy data from active UV */
>>                if (layernum) {
>> -                       editmesh_loop_copy_customdata(em, CD_MLOOPUV,
>> layernum);
>> +                       const int layernum_dst =
>> CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPUV);
>> +                       BM_data_layer_copy(em->bm, &em->bm->ldata,
>> CD_MLOOPUV, layernum, layernum_dst);
>> +
>>                        is_init = TRUE;
>>                }
>>                if (active_set || layernum == 0) {
>> @@ -457,7 +424,8 @@
>>                BM_data_layer_add_named(em->bm, &em->bm->ldata,
>> CD_MLOOPCOL, name);
>>                /* copy data from active vertex color layer */
>>                if (layernum) {
>> -                       editmesh_loop_copy_customdata(em, CD_MLOOPCOL,
>> layernum);
>> +                       const int layernum_dst =
>> CustomData_get_active_layer(&em->bm->ldata, CD_MLOOPCOL);
>> +                       BM_data_layer_copy(em->bm, &em->bm->ldata,
>> CD_MLOOPUV, layernum, layernum_dst);
>>                }
>>                if (active_set || layernum == 0) {
>>                        CustomData_set_layer_active(&em->bm->ldata,
>> CD_MLOOPCOL, layernum);
>>
>> Modified:
>> trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
>> ===================================================================
>> --- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
>>       2012-04-30 18:37:34 UTC (rev 46126)
>> +++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
>>       2012-04-30 18:54:14 UTC (rev 46127)
>> @@ -124,7 +124,7 @@
>>
>>
>>  PyDoc_STRVAR(bpy_bmlayercollection_active_doc,
>> -"This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`"
>> +"The active layer of this type (read-only).\n\n:type:
>> :class:`BMLayerItem`"
>>  );
>>  static PyObject *bpy_bmlayercollection_active_get(BPy_BMLayerItem *self,
>> void *UNUSED(flag))
>>  {
>> @@ -145,6 +145,17 @@
>>        }
>>  }
>>
>> +
>> +PyDoc_STRVAR(bpy_bmlayercollection_is_singleton_doc,
>> +"This meshes vert sequence (read-only).\n\n:type: :class:`BMVertSeq`"
>> +);
>> +static PyObject *bpy_bmlayercollection_is_singleton_get(BPy_BMLayerItem
>> *self, void *UNUSED(flag))
>> +{
>> +       BPY_BM_CHECK_OBJ(self);
>> +
>> +       return
>> PyBool_FromLong(CustomData_layertype_is_singleton(self->type));
>> +}
>> +
>>  PyDoc_STRVAR(bpy_bmlayercollection_name_doc,
>>  "The layers unique name (read-only).\n\n:type: string"
>>  );
>> @@ -211,7 +222,8 @@
>>
>>  static PyGetSetDef bpy_bmlayercollection_getseters[] = {
>>     /* BMESH_TODO, make writeable */
>> -    {(char *)"active", (getter)bpy_bmlayercollection_active_get,
>> (setter)NULL, (char *)bpy_bmlayercollection_active_doc, NULL},
>> +    {(char *)"active",       (getter)bpy_bmlayercollection_active_get,
>>     (setter)NULL, (char *)bpy_bmlayercollection_active_doc, NULL},
>> +    {(char *)"is_singleton",
>> (getter)bpy_bmlayercollection_is_singleton_get, (setter)NULL, (char
>> *)bpy_bmlayercollection_is_singleton_doc, NULL},
>>
>>     {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
>>  };
>> @@ -230,7 +242,88 @@
>>  /* BMLayerCollection
>>  * ----------------- */
>>
>> +PyDoc_STRVAR(bpy_bmlayeritem_copy_from_doc,
>> +".. method:: copy_from(other)\n"
>> +"\n"
>> +"   Return a copy of the layer\n"
>> +"\n"
>> +"   :arg other: Another layer to copy from.\n"
>> +"   :arg other: :class:`BMLayerItem`\n"
>> +);
>> +static PyObject *bpy_bmlayeritem_copy_from(BPy_BMLayerItem *self,
>> BPy_BMLayerItem *value)
>> +{
>> +       CustomData *data;
>>
>> +       if (!BPy_BMLayerItem_Check(value)) {
>> +               PyErr_Format(PyExc_TypeError,
>> +                            "layer.copy_from(x): expected BMLayerItem,
>> not '%.200s'",
>> +                            Py_TYPE(value)->tp_name);
>> +               return NULL;
>> +       }
>> +
>> +       BPY_BM_CHECK_OBJ(self);
>> +       BPY_BM_CHECK_OBJ(value);
>> +
>> +       if (self->bm != value->bm) {
>> +               PyErr_SetString(PyExc_ValueError,
>> +                               "layer.copy_from(): layer is from another
>> mesh");
>> +               return NULL;
>> +       }
>> +
>> +       else if ((self->htype != value->htype) ||
>> +                (self->type  != value->type) ||
>> +                (self->index != value->index))
>> +       {
>> +               PyErr_SetString(PyExc_ValueError,
>>
>> @@ Diff output truncated at 10240 characters. @@
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers



-- 
- Campbell


More information about the Bf-committers mailing list