diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-24 08:59:13 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-24 08:59:13 +0400 |
commit | b9b0c3dfb44e929b4b9f7181e8ee16ea7cff8deb (patch) | |
tree | ab4b0e25c2c8dde31ff7befdd34bab99741b4732 /source | |
parent | 8aa569b52e8402f010ca3a8cc9a880c1c7729f49 (diff) |
bmesh python api - add/improve rst docstrings.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_api.c | 20 | ||||
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types.c | 332 | ||||
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types.h | 8 | ||||
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_utils.c | 46 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_interface.c | 2 |
5 files changed, 297 insertions, 111 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c index ec8a5c1acf0..96604e7337d 100644 --- a/source/blender/python/bmesh/bmesh_py_api.c +++ b/source/blender/python/bmesh/bmesh_py_api.c @@ -49,7 +49,10 @@ PyDoc_STRVAR(bpy_bm_from_mesh_doc, ".. method:: from_mesh(mesh)\n" "\n" -" todo.\n" +" Return a BMesh from this mesh, currently the mesh must already be in editmode.\n" +"\n" +" :return: the BMesh assosiated with this mesh.\n" +" :rtype: :class:`bmesh.types.BMesh`\n" ); static PyObject *bpy_bm_from_mesh(PyObject *UNUSED(self), PyObject *value) @@ -88,15 +91,22 @@ static struct PyModuleDef BPy_BM_module_def = { PyObject *BPyInit_bmesh(void) { + PyObject *mod; PyObject *submodule; + PyObject *sys_modules = PySys_GetObject("modules"); /* not pretty */ BPy_BM_init_types(); - submodule = PyModule_Create(&BPy_BM_module_def); + mod = PyModule_Create(&BPy_BM_module_def); /* bmesh.types */ - PyModule_AddObject(submodule, "types", BPyInit_bmesh_types()); - PyModule_AddObject(submodule, "utils", BPyInit_bmesh_utils()); + PyModule_AddObject(mod, "types", (submodule=BPyInit_bmesh_types())); + PyDict_SetItemString(sys_modules, "bmesh.types", submodule); + Py_INCREF(submodule); + + PyModule_AddObject(mod, "utils", (submodule=BPyInit_bmesh_utils())); + PyDict_SetItemString(sys_modules, "bmesh.utils", submodule); + Py_INCREF(submodule); - return submodule; + return mod; } diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 3d7c051b6ea..08097a2dc57 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -86,11 +86,10 @@ PyC_FlagSet bpy_bm_hflag_all_flags[] = { /* bmesh elems * ----------- */ -PyDoc_STRVAR(bpy_bm_elem_select_doc, "Selected state of this element (boolean)"); -PyDoc_STRVAR(bpy_bm_elem_hide_doc, "Hidden state of this element (boolean)"); -PyDoc_STRVAR(bpy_bm_elem_tag_doc, "Tag state of this element (boolean)"); -PyDoc_STRVAR(bpy_bm_elem_smooth_doc, "Smooth state of this element (boolean)"); -PyDoc_STRVAR(bpy_bm_elem_index_doc, "Index of this element"); +PyDoc_STRVAR(bpy_bm_elem_select_doc, "Selected state of this element.\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_hide_doc, "Hidden state of this element.\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_tag_doc, "Generic attribute scripts can use for own logic\n\n:type: boolean"); +PyDoc_STRVAR(bpy_bm_elem_smooth_doc, "Smooth state of this element.\n\n:type: boolean"); static PyObject *bpy_bm_elem_hflag_get(BPy_BMElem *self, void *flag) @@ -127,6 +126,19 @@ static int bpy_bm_elem_hflag_set(BPy_BMElem *self, PyObject *value, void *flag) } } +PyDoc_STRVAR(bpy_bm_elem_index_doc, +"Index of this element.\n" +"\n" +":type: int\n" +"\n" +".. note::\n" +"\n" +" This value is not necessarily valid, while editing the mesh it can become *dirty*.\n" +"\n" +" It's also possible to assign any number to this attribute for a scripts internal logic.\n" +"\n" +" To ensure the value is up to date - see :class:`BMesh.update` **index** argument.\n" +); static PyObject *bpy_bm_elem_index_get(BPy_BMElem *self, void *UNUSED(flag)) { BPY_BM_CHECK_OBJ(self); @@ -165,20 +177,66 @@ static int bpy_bm_elem_index_set(BPy_BMElem *self, PyObject *value, void *UNUSED /* Mesh * ^^^^ */ -static PyObject *bpy_bmesh_seq_get(BPy_BMesh *self, void *itype) +/* doc-strings for all uses of this funcion */ +PyDoc_STRVAR(bpy_bmesh_verts_doc, +"This meshes vert sequence (readonly).\n\n:type: :class:`BMElemSeq`" +); +PyDoc_STRVAR(bpy_bmesh_edges_doc, +"This meshes edge sequence (readonly).\n\n:type: :class:`BMElemSeq`" +); +PyDoc_STRVAR(bpy_bmesh_faces_doc, +"This meshes face sequence (readonly).\n\n:type: :class:`BMElemSeq`" +); + +static PyObject *bpy_bmelemseq_get(BPy_BMesh *self, void *itype) { BPY_BM_CHECK_OBJ(self); return BPy_BMElemSeq_CreatePyObject(self->bm, NULL, GET_INT_FROM_POINTER(itype)); } -static PyObject *bpy_bmesh_seq_elem_get(BPy_BMElem *self, void *itype) +/* vert */ +PyDoc_STRVAR(bpy_bmvert_link_edges_doc, +"Edges connected to this vertex (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`" +); +PyDoc_STRVAR(bpy_bmvert_link_faces_doc, +"Faces connected to this vertex (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`" +); +PyDoc_STRVAR(bpy_bmvert_link_loops_doc, +"Loops that use this vertex (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" +); +/* edge */ +PyDoc_STRVAR(bpy_bmedge_verts_doc, +"Verts this edge uses (always 2), (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`" +); +PyDoc_STRVAR(bpy_bmedge_link_faces_doc, +"Faces connected to this edge, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMFace`" +); +PyDoc_STRVAR(bpy_bmedge_link_loops_doc, +"Loops connected to this edge, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" +); +/* face */ +PyDoc_STRVAR(bpy_bmface_verts_doc, +"Verts of this face, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMVert`" +); +PyDoc_STRVAR(bpy_bmface_edges_doc, +"Edges of this face, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMEdge`" +); +PyDoc_STRVAR(bpy_bmface_loops_doc, +"Loops of this face, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" +); +/* loop */ +PyDoc_STRVAR(bpy_bmloops_link_loops_doc, +"Loops connected to this loop, (readonly).\n\n:type: :class:`BMElemSeq` of :class:`BMLoop`" +); + +static PyObject *bpy_bmelemseq_elem_get(BPy_BMElem *self, void *itype) { BPY_BM_CHECK_OBJ(self); return BPy_BMElemSeq_CreatePyObject(self->bm, self, GET_INT_FROM_POINTER(itype)); } PyDoc_STRVAR(bpy_bm_is_valid_doc, -"True when this element is valid (hasn't been removed)" +"True when this element is valid (hasn't been removed).\n\n:type: boolean" ); static PyObject *bpy_bm_is_valid_get(BPy_BMGeneric *self) { @@ -187,7 +245,7 @@ static PyObject *bpy_bm_is_valid_get(BPy_BMGeneric *self) PyDoc_STRVAR(bpy_bmesh_select_mode_doc, -"The selection mode for this mesh" +"The selection mode, values can be {'VERT', 'EDGE', 'FACE'}, can't be assigned an empty set.\n\n:type: set" ); static PyObject *bpy_bmesh_select_mode_get(BPy_BMesh *self) { @@ -219,7 +277,7 @@ static int bpy_bmesh_select_mode_set(BPy_BMesh *self, PyObject *value) * ^^^^ */ PyDoc_STRVAR(bpy_bmvert_co_doc, -"The coordinates for this vertex" +"The coordinates for this vertex as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`" ); static PyObject *bpy_bmvert_co_get(BPy_BMVert *self) { @@ -240,7 +298,7 @@ static int bpy_bmvert_co_set(BPy_BMVert *self, PyObject *value) } PyDoc_STRVAR(bpy_bmvert_normal_doc, -"The normal for this vertex" +"The normal for this vertex as a 3D, wrapped vector.\n\n:type: :class:`mathutils.Vector`" ); static PyObject *bpy_bmvert_normal_get(BPy_BMVert *self) { @@ -261,7 +319,7 @@ static int bpy_bmvert_normal_set(BPy_BMVert *self, PyObject *value) } PyDoc_STRVAR(bpy_bmvert_is_manifold_doc, -"True when this vertex is manifold (readonly)" +"True when this vertex is manifold (readonly).\n\n:type: boolean" ); static PyObject *bpy_bmvert_is_manifold_get(BPy_BMVert *self) { @@ -270,7 +328,7 @@ static PyObject *bpy_bmvert_is_manifold_get(BPy_BMVert *self) } PyDoc_STRVAR(bpy_bmvert_is_wire_doc, -"True when this vertex is not connected to any faces (readonly)" +"True when this vertex is not connected to any faces (readonly).\n\n:type: boolean" ); static PyObject *bpy_bmvert_is_wire_get(BPy_BMVert *self) { @@ -282,7 +340,7 @@ static PyObject *bpy_bmvert_is_wire_get(BPy_BMVert *self) * ^^^^ */ PyDoc_STRVAR(bpy_bmedge_is_manifold_doc, -"True when this edge is manifold (readonly)" +"True when this edge is manifold (readonly).\n\n:type: boolean" ); static PyObject *bpy_bmedge_is_manifold_get(BPy_BMEdge *self) { @@ -291,7 +349,7 @@ static PyObject *bpy_bmedge_is_manifold_get(BPy_BMEdge *self) } PyDoc_STRVAR(bpy_bmedge_is_wire_doc, -"True when this edge is not connected to any faces (readonly)" +"True when this edge is not connected to any faces (readonly).\n\n:type: boolean" ); static PyObject *bpy_bmedge_is_wire_get(BPy_BMEdge *self) { @@ -300,7 +358,7 @@ static PyObject *bpy_bmedge_is_wire_get(BPy_BMEdge *self) } PyDoc_STRVAR(bpy_bmedge_is_boundry_doc, -"True when this edge is at the boundry of a face (readonly)" +"True when this edge is at the boundry of a face (readonly).\n\n:type: boolean" ); static PyObject *bpy_bmedge_is_boundry_get(BPy_BMEdge *self) { @@ -312,7 +370,7 @@ static PyObject *bpy_bmedge_is_boundry_get(BPy_BMEdge *self) * ^^^^ */ PyDoc_STRVAR(bpy_bmface_normal_doc, -"The normal for this face" +"The normal for this face as a 3D, wrapped vector.\n\n:type: boolean" ); static PyObject *bpy_bmface_normal_get(BPy_BMFace *self) { @@ -333,9 +391,9 @@ static int bpy_bmface_normal_set(BPy_BMFace *self, PyObject *value) } static PyGetSetDef bpy_bmesh_getseters[] = { - {(char *)"verts", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_VERTS_OF_MESH}, - {(char *)"edges", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_EDGES_OF_MESH}, - {(char *)"faces", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_FACES_OF_MESH}, + {(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}, + {(char *)"faces", (getter)bpy_bmelemseq_get, (setter)NULL, (char *)bpy_bmesh_faces_doc, (void *)BM_FACES_OF_MESH}, {(char *)"select_mode", (getter)bpy_bmesh_select_mode_get, (setter)bpy_bmesh_select_mode_set, (char *)bpy_bmesh_select_mode_doc, NULL}, /* readonly checks */ @@ -355,9 +413,9 @@ static PyGetSetDef bpy_bmvert_getseters[] = { {(char *)"normal", (getter)bpy_bmvert_normal_get, (setter)bpy_bmvert_normal_set, (char *)bpy_bmvert_normal_doc, NULL}, /* connectivity data */ - {(char *)"link_edges", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_EDGES_OF_VERT}, - {(char *)"link_faces", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_FACES_OF_VERT}, - {(char *)"link_loops", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_LOOPS_OF_VERT}, + {(char *)"link_edges", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_edges_doc, (void *)BM_EDGES_OF_VERT}, + {(char *)"link_faces", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_faces_doc, (void *)BM_FACES_OF_VERT}, + {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmvert_link_loops_doc, (void *)BM_LOOPS_OF_VERT}, /* readonly checks */ {(char *)"is_manifold", (getter)bpy_bmvert_is_manifold_get, (setter)NULL, (char *)bpy_bmvert_is_manifold_doc, NULL}, @@ -378,10 +436,10 @@ static PyGetSetDef bpy_bmedge_getseters[] = { {(char *)"seam", (getter)bpy_bm_elem_hflag_get, (setter)bpy_bm_elem_hflag_set, (char *)bpy_bm_elem_smooth_doc, (void *)BM_ELEM_SEAM}, /* connectivity data */ - {(char *)"verts", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_VERTS_OF_EDGE}, + {(char *)"verts", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_verts_doc, (void *)BM_VERTS_OF_EDGE}, - {(char *)"link_faces", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_FACES_OF_EDGE}, - {(char *)"link_loops", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_LOOPS_OF_EDGE}, + {(char *)"link_faces", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_link_faces_doc, (void *)BM_FACES_OF_EDGE}, + {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmedge_link_loops_doc, (void *)BM_LOOPS_OF_EDGE}, /* readonly checks */ {(char *)"is_manifold", (getter)bpy_bmedge_is_manifold_get, (setter)NULL, (char *)bpy_bmedge_is_manifold_doc, NULL}, @@ -404,9 +462,9 @@ static PyGetSetDef bpy_bmface_getseters[] = { {(char *)"normal", (getter)bpy_bmface_normal_get, (setter)bpy_bmface_normal_set, (char *)bpy_bmface_normal_doc, NULL}, /* connectivity data */ - {(char *)"verts", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_VERTS_OF_FACE}, - {(char *)"edges", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_EDGES_OF_FACE}, - {(char *)"loops", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_LOOPS_OF_FACE}, + {(char *)"verts", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_verts_doc, (void *)BM_VERTS_OF_FACE}, + {(char *)"edges", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_edges_doc, (void *)BM_EDGES_OF_FACE}, + {(char *)"loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmface_loops_doc, (void *)BM_LOOPS_OF_FACE}, /* readonly checks */ {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, @@ -422,7 +480,7 @@ static PyGetSetDef bpy_bmloop_getseters[] = { {(char *)"index", (getter)bpy_bm_elem_index_get, (setter)bpy_bm_elem_index_set, (char *)bpy_bm_elem_index_doc, NULL}, /* connectivity data */ - {(char *)"link_loops", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_LOOPS_OF_LOOP}, + {(char *)"link_loops", (getter)bpy_bmelemseq_elem_get, (setter)NULL, (char *)bpy_bmloops_link_loops_doc, (void *)BM_LOOPS_OF_LOOP}, /* readonly checks */ {(char *)"is_valid", (getter)bpy_bm_is_valid_get, (setter)NULL, (char *)bpy_bm_is_valid_doc, NULL}, @@ -440,7 +498,7 @@ static PyGetSetDef bpy_bmloop_getseters[] = { PyDoc_STRVAR(bpy_bmesh_select_flush_mode_doc, ".. method:: select_flush_mode()\n" "\n" -" flush selection based on the current mode current *select_mode*.\n" +" flush selection based on the current mode current :class:`BMesh.select_mode`.\n" ); static PyObject *bpy_bmesh_select_flush_mode(BPy_BMesh *self) { @@ -457,7 +515,7 @@ PyDoc_STRVAR(bpy_bmesh_select_flush_doc, " Flush selection, independant of the current selection mode.\n" "\n" " :arg select: flush selection or de-selected elements.\n" -" :type select: bool\n" +" :type select: boolean\n" ); static PyObject *bpy_bmesh_select_flush(BPy_BMesh *self, PyObject *value) { @@ -481,6 +539,10 @@ PyDoc_STRVAR(bpy_bmesh_update_doc, ".. method:: update(index=False, normals=False)\n" "\n" " Update mesh data.\n" +"\n" +" :arg normals: When True will re-calculate normals for verts and faces.\n" +" :type normals: boolean\n" + ); static PyObject *bpy_bmesh_update(BPy_BMElem *self, PyObject *args, PyObject *kw) { @@ -598,7 +660,7 @@ PyDoc_STRVAR(bpy_bm_elem_select_set_doc, " This is different from the *select* attribute because it updates the selection state of assosiated geometry..\n" "\n" " :arg select: Select or de-select.\n" -" :type select: bool\n" +" :type select: boolean\n" ); static PyObject *bpy_bm_elem_select_set(BPy_BMElem *self, PyObject *value) { @@ -660,6 +722,9 @@ PyDoc_STRVAR(bpy_bmedge_calc_face_angle_doc, ".. method:: calc_face_angle()\n" "\n" " Return the angle between 2 connected faces.\n" +"\n" +" :return: The angle between both faces in radians.\n" +" :rtype: float\n" ); static PyObject *bpy_bmedge_calc_face_angle(BPy_BMEdge *self) { @@ -671,6 +736,11 @@ PyDoc_STRVAR(bpy_bmedge_other_vert_doc, ".. method:: other_vert(vert)\n" "\n" " Return the other vertex on this edge or None if the vertex is not used by this edge.\n" +"\n" +" :arg vert: a vert in this edge.\n" +" :type vert: :class:`BMVert`\n" +" :return: The edges other vert.\n" +" :rtype: :class:`BMVert` or None\n" ); static PyObject *bpy_bmedge_other_vert(BPy_BMEdge *self, BPy_BMVert *value) { @@ -709,7 +779,14 @@ static PyObject *bpy_bmedge_other_vert(BPy_BMEdge *self, BPy_BMVert *value) PyDoc_STRVAR(bpy_bmface_copy_doc, ".. method:: copy(verts=True, edges=True)\n" "\n" -" Return the area of the face.\n" +" Make a copy of this face.\n" +"\n" +" :arg verts: When set, the faces verts will be duplicated too.\n" +" :type verts: boolean\n" +" :arg edges: When set, the faces edges will be duplicated too.\n" +" :type edges: boolean\n" +" :return: The newly created face.\n" +" :rtype: :class:`BMFace`\n" ); static PyObject *bpy_bmface_copy(BPy_BMFace *self, PyObject *args, PyObject *kw) { @@ -746,6 +823,9 @@ PyDoc_STRVAR(bpy_bmface_calc_area_doc, ".. method:: calc_area()\n" "\n" " Return the area of the face.\n" +"\n" +" :return: Return the area of the face.\n" +" :rtype: float\n" ); static PyObject *bpy_bmface_calc_area(BPy_BMFace *self) { @@ -757,6 +837,9 @@ PyDoc_STRVAR(bpy_bmface_calc_center_mean_doc, ".. method:: calc_center_median()\n" "\n" " Return median center of the face.\n" +"\n" +" :return: a 3D vector.\n" +" :rtype: :class:`mathutils.Vector`\n" ); static PyObject *bpy_bmface_calc_center_mean(BPy_BMFace *self) { @@ -771,6 +854,9 @@ PyDoc_STRVAR(bpy_bmface_calc_center_bounds_doc, ".. method:: calc_center_bounds()\n" "\n" " Return bounds center of the face.\n" +"\n" +" :return: a 3D vector.\n" +" :rtype: :class:`mathutils.Vector`\n" ); static PyObject *bpy_bmface_calc_center_bounds(BPy_BMFace *self) { @@ -788,6 +874,10 @@ PyDoc_STRVAR(bpy_bmloop_calc_face_angle_doc, ".. method:: calc_face_angle()\n" "\n" " Return angle at this loops corner of the face.\n" +" This is calculated so sharper corners give lower angles.\n" +"\n" +" :return: The angle in radians.\n" +" :rtype: float\n" ); static PyObject *bpy_bmloop_calc_face_angle(BPy_BMLoop *self) { @@ -839,6 +929,7 @@ static PyObject *bpy_bmvert_seq_new(BPy_BMElemSeq *self, PyObject *args) } } + /* Edge Seq * -------- */ @@ -896,6 +987,7 @@ static PyObject *bpy_bmedge_seq_new(BPy_BMElemSeq *self, PyObject *args) } } + /* Face Seq * -------- */ @@ -927,9 +1019,9 @@ static PyObject *bpy_bmface_seq_new(BPy_BMElemSeq *self, PyObject *args) BPY_BM_CHECK_OBJ(py_face_example); } - vert_array = bpy_bm_generic_py_seq_as_array(&bm, vert_seq, 3, PY_SSIZE_T_MAX, - &vert_seq_len, &BPy_BMVert_Type, - TRUE, TRUE, "faces.new(...)"); + vert_array = BPy_BMElem_PySeq_As_Array(&bm, vert_seq, 3, PY_SSIZE_T_MAX, + &vert_seq_len, &BPy_BMVert_Type, + TRUE, TRUE, "faces.new(...)"); /* check if the face exists */ if (BM_face_exists(bm, vert_array, vert_seq_len, NULL)) { @@ -970,12 +1062,50 @@ cleanup: } } -PyDoc_STRVAR(bpy_bm_seq_new_doc, -".. method:: new()\n" +/* Elem Seq + * -------- */ + +/* eek - 3 docstrings in 1!, we might need to split up this seq at some point */ +PyDoc_STRVAR(bpy_bmelemseq_new_doc, +".. method:: new(co=(0.0, 0.0, 0.0), example=None)\n" +"\n" +" *Vertex Sequence*\n" +"\n" +" :arg co: The initial location of the vertex (optional argument).\n" +" :type co: float triplet\n" +" :arg example: Existing vert to initialize settings.\n" +" :type example: :class:`BMVert`\n" +" :return: The newly created edge.\n" +" :rtype: :class:`BMVert`\n" +"\n" +"\n" +".. method:: new(v_a, v_b, example=None)\n" +"\n" +" *Edge Sequence*\n" +"\n" +" :arg v_a: Edge vertex.\n" +" :type v_a: :class:`BMEdge`\n" +" :arg v_b: Edge vertex.\n" +" :type v_b: :class:`BMEdge`\n" +" :arg example: Existing edge to initialize settings (optional argument).\n" +" :type example: :class:`BMEdge`\n" +" :return: The newly created edge.\n" +" :rtype: :class:`BMEdge`\n" +"\n" +".. method:: new(verts, example=None)\n" +"\n" +" *Face Sequence*\n" "\n" " Create a new vert/edge/face.\n" +"\n" +" :arg verts: Sequence of 3 or more verts.\n" +" :type verts: :class:`BMVert`\n" +" :arg example: Existing face to initialize settings (optional argument).\n" +" :type example: :class:`BMFace`\n" +" :return: The newly created face.\n" +" :rtype: :class:`BMFace`\n" ); -static PyObject *bpy_bm_seq_new(BPy_BMElemSeq *self, PyObject *args) +static PyObject *bpy_bmelemseq_new(BPy_BMElemSeq *self, PyObject *args) { switch ((BMIterType)self->itype) { case BM_VERTS_OF_MESH: @@ -1064,12 +1194,12 @@ static PyObject *bpy_bmface_seq_remove(BPy_BMElemSeq *self, BPy_BMFace *value) } -PyDoc_STRVAR(bpy_bm_seq_remove_doc, +PyDoc_STRVAR(bpy_bmelemseq_remove_doc, ".. method:: remove()\n" "\n" " Remove a vert/edge/face.\n" ); -static PyObject *bpy_bm_seq_remove(BPy_BMElemSeq *self, PyObject *value) +static PyObject *bpy_bmelemseq_remove(BPy_BMElemSeq *self, PyObject *value) { switch ((BMIterType)self->itype) { case BM_VERTS_OF_MESH: @@ -1130,18 +1260,18 @@ static struct PyMethodDef bpy_bmloop_methods[] = { {NULL, NULL, 0, NULL} }; -static struct PyMethodDef bpy_bm_seq_methods[] = { - {"new", (PyCFunction)bpy_bm_seq_new, METH_VARARGS, bpy_bm_seq_new_doc}, - {"remove", (PyCFunction)bpy_bm_seq_remove, METH_O, bpy_bm_seq_remove_doc}, +static struct PyMethodDef bpy_bmelemseq_methods[] = { + {"new", (PyCFunction)bpy_bmelemseq_new, METH_VARARGS, bpy_bmelemseq_new_doc}, + {"remove", (PyCFunction)bpy_bmelemseq_remove, METH_O, bpy_bmelemseq_remove_doc}, {NULL, NULL, 0, NULL} }; /* Sequences * ========= */ -#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bm_seq) \ - BM_ITER(ele, iter, (bpy_bm_seq)->bm, (bpy_bm_seq)->itype,\ - (bpy_bm_seq)->py_ele ? ((BPy_BMElem *)(bpy_bm_seq)->py_ele)->ele : NULL) +#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \ + BM_ITER(ele, iter, (bpy_bmelemseq)->bm, (bpy_bmelemseq)->itype,\ + (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL) static PyTypeObject *bpy_bm_itype_as_pytype(const char itype) @@ -1174,10 +1304,11 @@ static PyTypeObject *bpy_bm_itype_as_pytype(const char itype) return NULL; } -static Py_ssize_t bpy_bm_seq_length(BPy_BMElemSeq *self) +static Py_ssize_t bpy_bmelemseq_length(BPy_BMElemSeq *self) { BPY_BM_CHECK_INT(self); + /* first check if the size is known */ switch ((BMIterType)self->itype) { /* main-types */ case BM_VERTS_OF_MESH: @@ -1216,11 +1347,11 @@ static Py_ssize_t bpy_bm_seq_length(BPy_BMElemSeq *self) } } -static PyObject *bpy_bm_seq_subscript_int(BPy_BMElemSeq *self, int keynum) +static PyObject *bpy_bmelemseq_subscript_int(BPy_BMElemSeq *self, int keynum) { BPY_BM_CHECK_OBJ(self); - if (keynum < 0) keynum += bpy_bm_seq_length(self); /* only get length on negative value, may loop entire seq */ + if (keynum < 0) keynum += bpy_bmelemseq_length(self); /* only get length on negative value, may loop entire seq */ if (keynum >= 0) { BMHeader *ele = BM_iter_at_index(self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL, keynum); if (ele) { @@ -1233,7 +1364,7 @@ static PyObject *bpy_bm_seq_subscript_int(BPy_BMElemSeq *self, int keynum) return NULL; } -static PyObject *bpy_bm_seq_subscript_slice(BPy_BMElemSeq *self, Py_ssize_t start, Py_ssize_t stop) +static PyObject *bpy_bmelemseq_subscript_slice(BPy_BMElemSeq *self, Py_ssize_t start, Py_ssize_t stop) { BMIter iter; int count = 0; @@ -1279,14 +1410,14 @@ static PyObject *bpy_bm_seq_subscript_slice(BPy_BMElemSeq *self, Py_ssize_t star return list; } -static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key) +static PyObject *bpy_bmelemseq_subscript(BPy_BMElemSeq *self, PyObject *key) { /* dont need error check here */ if (PyIndex_Check(key)) { Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; - return bpy_bm_seq_subscript_int(self, i); + return bpy_bmelemseq_subscript_int(self, i); } else if (PySlice_Check(key)) { PySliceObject *key_slice = (PySliceObject *)key; @@ -1300,7 +1431,7 @@ static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key) return NULL; } else if (key_slice->start == Py_None && key_slice->stop == Py_None) { - return bpy_bm_seq_subscript_slice(self, 0, PY_SSIZE_T_MAX); + return bpy_bmelemseq_subscript_slice(self, 0, PY_SSIZE_T_MAX); } else { Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX; @@ -1311,7 +1442,7 @@ static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key) if (start < 0 || stop < 0) { /* only get the length for negative values */ - Py_ssize_t len = bpy_bm_seq_length(self); + Py_ssize_t len = bpy_bmelemseq_length(self); if (start < 0) start += len; if (stop < 0) start += len; } @@ -1320,7 +1451,7 @@ static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key) return PyList_New(0); } else { - return bpy_bm_seq_subscript_slice(self, start, stop); + return bpy_bmelemseq_subscript_slice(self, start, stop); } } } @@ -1330,7 +1461,7 @@ static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key) } } -static int bpy_bm_seq_contains(BPy_BMElemSeq *self, PyObject *value) +static int bpy_bmelemseq_contains(BPy_BMElemSeq *self, PyObject *value) { BPY_BM_CHECK_INT(self); @@ -1350,29 +1481,29 @@ static int bpy_bm_seq_contains(BPy_BMElemSeq *self, PyObject *value) return 0; } -static PySequenceMethods bpy_bm_seq_as_sequence = { - (lenfunc)bpy_bm_seq_length, /* sq_length */ +static PySequenceMethods bpy_bmelemseq_as_sequence = { + (lenfunc)bpy_bmelemseq_length, /* sq_length */ NULL, /* sq_concat */ NULL, /* sq_repeat */ - (ssizeargfunc)bpy_bm_seq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */ + (ssizeargfunc)bpy_bmelemseq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */ NULL, /* sq_slice */ (ssizeobjargproc)NULL, /* sq_ass_item */ NULL, /* *was* sq_ass_slice */ - (objobjproc)bpy_bm_seq_contains, /* sq_contains */ + (objobjproc)bpy_bmelemseq_contains, /* sq_contains */ (binaryfunc) NULL, /* sq_inplace_concat */ (ssizeargfunc) NULL, /* sq_inplace_repeat */ }; -static PyMappingMethods bpy_bm_seq_as_mapping = { - (lenfunc)bpy_bm_seq_length, /* mp_length */ - (binaryfunc)bpy_bm_seq_subscript, /* mp_subscript */ +static PyMappingMethods bpy_bmelemseq_as_mapping = { + (lenfunc)bpy_bmelemseq_length, /* mp_length */ + (binaryfunc)bpy_bmelemseq_subscript, /* mp_subscript */ (objobjargproc)NULL, /* mp_ass_subscript */ }; /* Iterator * -------- */ -static PyObject *bpy_bm_seq_iter(BPy_BMElemSeq *self) +static PyObject *bpy_bmelemseq_iter(BPy_BMElemSeq *self) { BPy_BMIter *py_iter; @@ -1382,11 +1513,11 @@ static PyObject *bpy_bm_seq_iter(BPy_BMElemSeq *self) return (PyObject *)py_iter; } -static PyObject *bpy_bm_iter_next(BPy_BMIter *self) +static PyObject *bpy_bmiter_next(BPy_BMIter *self) { BMHeader *ele = BM_iter_step(&self->iter); if (ele == NULL) { - PyErr_SetString(PyExc_StopIteration, "bpy_bm_iter_next stop"); + PyErr_SetString(PyExc_StopIteration, "bpy_bmiter_next stop"); return NULL; } else { @@ -1452,7 +1583,7 @@ static void bpy_bmloop_dealloc(BPy_BMElem *self) PyObject_DEL(self); } -static void bpy_bm_seq_dealloc(BPy_BMElemSeq *self) +static void bpy_bmelemseq_dealloc(BPy_BMElemSeq *self) { Py_XDECREF(self->py_ele); @@ -1465,6 +1596,40 @@ static long bpy_bm_elem_hash(PyObject *self) return _Py_HashPointer(((BPy_BMElem *)self)->ele); } + +/* Type Docstrings + * =============== */ + +PyDoc_STRVAR(bpy_bmesh_doc, +"The BMesh data structure\n" +); +PyDoc_STRVAR(bpy_bmvert_doc, +"The BMesh vertex type\n" +); +PyDoc_STRVAR(bpy_bmedge_doc, +"The BMesh edge connecting 2 verts\n" +); +PyDoc_STRVAR(bpy_bmface_doc, +"The BMesh face with 3 or more sides\n" +); +PyDoc_STRVAR(bpy_bmloop_doc, +"This is normally accessed from :class:`BMFace.loops` where each face corner represents a corner of a face.\n" +); +PyDoc_STRVAR(bpy_bmelemseq_doc, +"General sequence type used for accessing any sequence of \n" +":class:`BMVert`, :class:`BMEdge`, :class:`BMFace`, :class:`BMLoop`.\n" +"\n" +"When accessed via :class:`BMesh.verts`, :class:`BMesh.edges`, :class:`BMesh.faces` \n" +"there are also functions to create/remomove items.\n" +); +PyDoc_STRVAR(bpy_bmiter_doc, +"Internal BMesh type for looping over verts/faces/edges,\n" +"used for iterating over :class:`BMElemSeq` types.\n" +); + +/* Types + * ===== */ + PyTypeObject BPy_BMesh_Type = {{{0}}}; PyTypeObject BPy_BMVert_Type = {{{0}}}; PyTypeObject BPy_BMEdge_Type = {{{0}}}; @@ -1495,6 +1660,15 @@ void BPy_BM_init_types(void) BPy_BMIter_Type.tp_name = "BMIter"; + BPy_BMesh_Type.tp_doc = bpy_bmesh_doc; + BPy_BMVert_Type.tp_doc = bpy_bmvert_doc; + BPy_BMEdge_Type.tp_doc = bpy_bmedge_doc; + BPy_BMFace_Type.tp_doc = bpy_bmface_doc; + BPy_BMLoop_Type.tp_doc = bpy_bmloop_doc; + BPy_BMElemSeq_Type.tp_doc = bpy_bmelemseq_doc; + BPy_BMIter_Type.tp_doc = bpy_bmiter_doc; + + BPy_BMesh_Type.tp_getset = bpy_bmesh_getseters; BPy_BMVert_Type.tp_getset = bpy_bmvert_getseters; BPy_BMEdge_Type.tp_getset = bpy_bmedge_getseters; @@ -1509,7 +1683,7 @@ void BPy_BM_init_types(void) BPy_BMEdge_Type.tp_methods = bpy_bmedge_methods; BPy_BMFace_Type.tp_methods = bpy_bmface_methods; BPy_BMLoop_Type.tp_methods = bpy_bmloop_methods; - BPy_BMElemSeq_Type.tp_methods = bpy_bm_seq_methods; + BPy_BMElemSeq_Type.tp_methods = bpy_bmelemseq_methods; BPy_BMIter_Type.tp_methods = NULL; @@ -1521,21 +1695,21 @@ void BPy_BM_init_types(void) BPy_BMElemSeq_Type.tp_hash = NULL; BPy_BMIter_Type.tp_hash = NULL; - BPy_BMElemSeq_Type.tp_as_sequence = &bpy_bm_seq_as_sequence; + BPy_BMElemSeq_Type.tp_as_sequence = &bpy_bmelemseq_as_sequence; - BPy_BMElemSeq_Type.tp_as_mapping = &bpy_bm_seq_as_mapping; + BPy_BMElemSeq_Type.tp_as_mapping = &bpy_bmelemseq_as_mapping; - BPy_BMElemSeq_Type.tp_iter = (getiterfunc)bpy_bm_seq_iter; + BPy_BMElemSeq_Type.tp_iter = (getiterfunc)bpy_bmelemseq_iter; /* only 1 iteratir so far */ - BPy_BMIter_Type.tp_iternext = (iternextfunc)bpy_bm_iter_next; + BPy_BMIter_Type.tp_iternext = (iternextfunc)bpy_bmiter_next; BPy_BMesh_Type.tp_dealloc = (destructor)bpy_bmesh_dealloc; BPy_BMVert_Type.tp_dealloc = (destructor)bpy_bmvert_dealloc; BPy_BMEdge_Type.tp_dealloc = (destructor)bpy_bmedge_dealloc; BPy_BMFace_Type.tp_dealloc = (destructor)bpy_bmface_dealloc; BPy_BMLoop_Type.tp_dealloc = (destructor)bpy_bmloop_dealloc; - BPy_BMElemSeq_Type.tp_dealloc = (destructor)bpy_bm_seq_dealloc; + BPy_BMElemSeq_Type.tp_dealloc = (destructor)bpy_bmelemseq_dealloc; BPy_BMIter_Type.tp_dealloc = NULL; /* @@ -1790,10 +1964,10 @@ void bpy_bm_generic_invalidate(BPy_BMGeneric *self) * * The 'bm_r' value is assigned when empty, and used when set. */ -void *bpy_bm_generic_py_seq_as_array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, - PyTypeObject *type, - const char do_unique_check, const char do_bm_check, - const char *error_prefix) +void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, + PyTypeObject *type, + const char do_unique_check, const char do_bm_check, + const char *error_prefix) { BMesh *bm = (r_bm && *r_bm) ? *r_bm : NULL; PyObject *seq_fast; diff --git a/source/blender/python/bmesh/bmesh_py_types.h b/source/blender/python/bmesh/bmesh_py_types.h index e4bc6beb7cc..67a276f3f80 100644 --- a/source/blender/python/bmesh/bmesh_py_types.h +++ b/source/blender/python/bmesh/bmesh_py_types.h @@ -132,10 +132,10 @@ PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele); /* just checks ty int bpy_bm_generic_valid_check(BPy_BMGeneric *self); void bpy_bm_generic_invalidate(BPy_BMGeneric *self); -void *bpy_bm_generic_py_seq_as_array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, - PyTypeObject *type, - const char do_unique_check, const char do_bm_check, - const char *error_prefix); +void *BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, + PyTypeObject *type, + const char do_unique_check, const char do_bm_check, + const char *error_prefix); #define BPY_BM_CHECK_OBJ(obj) if (bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1) { return NULL; } (void)NULL #define BPY_BM_CHECK_INT(obj) if (bpy_bm_generic_valid_check((BPy_BMGeneric *)obj) == -1) { return -1; } (void)NULL diff --git a/source/blender/python/bmesh/bmesh_py_utils.c b/source/blender/python/bmesh/bmesh_py_utils.c index 52bffe968e2..7be29ca6ea7 100644 --- a/source/blender/python/bmesh/bmesh_py_utils.c +++ b/source/blender/python/bmesh/bmesh_py_utils.c @@ -44,14 +44,14 @@ PyDoc_STRVAR(bpy_bm_utils_vert_collapse_edge_doc, ".. method:: vert_collapse_edge(vert, edge)\n" "\n" -" Split an edge, return the newly created data.\n" +" Collapse a vertex into an edge.\n" "\n" " :arg vert: The vert that will be collapsed.\n" -" :type vert: :class:`bmesh.tupes.BMVert`\n" +" :type vert: :class:`bmesh.types.BMVert`\n" " :arg edge: The edge to collapse into.\n" -" :type edge: :class:`bmesh.tupes.BMEdge`\n" +" :type edge: :class:`bmesh.types.BMEdge`\n" " :return: The resulting edge from the collapse operation.\n" -" :rtype: :class:`bmesh.tupes.BMEdge`\n" +" :rtype: :class:`bmesh.types.BMEdge`\n" ); static PyObject *bpy_bm_utils_vert_collapse_edge(PyObject *UNUSED(self), PyObject *args) { @@ -107,13 +107,13 @@ PyDoc_STRVAR(bpy_bm_utils_vert_collapse_faces_doc, " Split an edge, return the newly created data.\n" "\n" " :arg vert: The vert that will be collapsed.\n" -" :type vert: :class:`bmesh.tupes.BMVert`\n" +" :type vert: :class:`bmesh.types.BMVert`\n" " :arg edge: The edge to collapse into.\n" -" :type edge: :class:`bmesh.tupes.BMEdge`\n" +" :type edge: :class:`bmesh.types.BMEdge`\n" " :arg fac: The factor to use when merging customdata [0 - 1].\n" " :type fac: float\n" " :return: The resulting edge from the collapse operation.\n" -" :rtype: :class:`bmesh.tupes.BMEdge`\n" +" :rtype: :class:`bmesh.types.BMEdge`\n" ); static PyObject *bpy_bm_utils_vert_collapse_faces(PyObject *UNUSED(self), PyObject *args) { @@ -173,9 +173,9 @@ PyDoc_STRVAR(bpy_bm_utils_vert_dissolve_doc, " Dissolve this vertex (will be removed).\n" "\n" " :arg vert: The vert to be dissolved.\n" -" :type vert: :class:`bmesh.tupes.BMVert`\n" +" :type vert: :class:`bmesh.types.BMVert`\n" " :return: True when the vertex dissolve is successful.\n" -" :rtype: bool\n" +" :rtype: boolean\n" ); static PyObject *bpy_bm_utils_vert_dissolve(PyObject *UNUSED(self), PyObject *args) { @@ -203,9 +203,9 @@ PyDoc_STRVAR(bpy_bm_utils_edge_split_doc, " Split an edge, return the newly created data.\n" "\n" " :arg edge: The edge to split.\n" -" :type edge: :class:`bmesh.tupes.BMEdge`\n" +" :type edge: :class:`bmesh.types.BMEdge`\n" " :arg vert: One of the verts on the edge, defines the split direction.\n" -" :type vert: :class:`bmesh.tupes.BMVert`\n" +" :type vert: :class:`bmesh.types.BMVert`\n" " :arg fac: The point on the edge where the new vert will be created [0 - 1].\n" " :type fac: float\n" " :return: The newly created (edge, vert) pair.\n" @@ -266,11 +266,11 @@ PyDoc_STRVAR(bpy_bm_utils_edge_rotate_doc, " If rotating the edge fails, None will be returned.\n" "\n" " :arg edge: The edge to rotate.\n" -" :type edge: :class:`bmesh.tupes.BMEdge`\n" +" :type edge: :class:`bmesh.types.BMEdge`\n" " :arg ccw: When True the edge will be rotated counter clockwise.\n" -" :type ccw: bool\n" +" :type ccw: boolean\n" " :return: The newly rotated edge.\n" -" :rtype: :class:`bmesh.tupes.BMEdge`\n" +" :rtype: :class:`bmesh.types.BMEdge`\n" ); static PyObject *bpy_bm_utils_edge_rotate(PyObject *UNUSED(self), PyObject *args) { @@ -308,13 +308,13 @@ PyDoc_STRVAR(bpy_bm_utils_face_split_doc, " Split an edge, return the newly created data.\n" "\n" " :arg face: The face to cut.\n" -" :type face: :class:`bmesh.tupes.BMFace`\n" +" :type face: :class:`bmesh.types.BMFace`\n" " :arg vert_a: First vertex to cut in the face (face must contain the vert).\n" -" :type vert_a: :class:`bmesh.tupes.BMVert`\n" +" :type vert_a: :class:`bmesh.types.BMVert`\n" " :arg vert_b: Second vertex to cut in the face (face must contain the vert).\n" -" :type vert_b: :class:`bmesh.tupes.BMVert`\n" +" :type vert_b: :class:`bmesh.types.BMVert`\n" " :arg edge_example: Optional edge argument, newly created edge will copy settings from this one.\n" -" :type edge_example: :class:`bmesh.tupes.BMEdge`\n" +" :type edge_example: :class:`bmesh.types.BMEdge`\n" ); static PyObject *bpy_bm_utils_face_split(PyObject *UNUSED(self), PyObject *args) { @@ -384,9 +384,9 @@ PyDoc_STRVAR(bpy_bm_utils_face_join_doc, " Joins a sequence of faces.\n" "\n" " :arg faces: Sequence of faces .\n" -" :type faces: :class:`bmesh.tupes.BMFace`\n" +" :type faces: :class:`bmesh.types.BMFace`\n" " :return: The newly created face or None on failier.\n" -" :rtype: :class:`bmesh.tupes.BMFace`\n" +" :rtype: :class:`bmesh.types.BMFace`\n" ); static PyObject *bpy_bm_utils_face_join(PyObject *UNUSED(self), PyObject *value) { @@ -395,9 +395,9 @@ static PyObject *bpy_bm_utils_face_join(PyObject *UNUSED(self), PyObject *value) Py_ssize_t face_seq_len = 0; BMFace *f_new; - face_array = bpy_bm_generic_py_seq_as_array(&bm, value, 2, PY_SSIZE_T_MAX, - &face_seq_len, &BPy_BMFace_Type, - TRUE, TRUE, "face_join(...)"); + face_array = BPy_BMElem_PySeq_As_Array(&bm, value, 2, PY_SSIZE_T_MAX, + &face_seq_len, &BPy_BMFace_Type, + TRUE, TRUE, "face_join(...)"); if (face_array == NULL) { return NULL; /* error will be set */ diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 1df5e94e9fa..413b29e7e2d 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -194,6 +194,8 @@ static struct _inittab bpy_internal_modules[] = { {(char *)"bgl", BPyInit_bgl}, {(char *)"blf", BPyInit_blf}, {(char *)"bmesh", BPyInit_bmesh}, + // {(char *)"bmesh.types", BPyInit_bmesh_types}, + // {(char *)"bmesh.utils", BPyInit_bmesh_utils}, #ifdef WITH_AUDASPACE {(char *)"aud", AUD_initPython}, #endif |