static PyObject *bpy_bm_utils_edge_split(PyObject *UNUSED(self), PyObject *args) { BPy_BMEdge *py_edge; BPy_BMVert *py_vert; float fac; BMesh *bm; BMVert *v_new = NULL; BMEdge *e_new = NULL; if (!PyArg_ParseTuple(args, "O!O!f:edge_split", &BPy_BMEdge_Type, &py_edge, &BPy_BMVert_Type, &py_vert, &fac)) { return NULL; } BPY_BM_CHECK_OBJ(py_edge); BPY_BM_CHECK_OBJ(py_vert); /* this doubles for checking that the verts are in the same mesh */ if (!(py_edge->e->v1 == py_vert->v || py_edge->e->v2 == py_vert->v)) { PyErr_SetString(PyExc_ValueError, "edge_split(edge, vert): the vertex is not found in the edge"); return NULL; } bm = py_edge->bm; v_new = BM_edge_split(bm, py_edge->e, py_vert->v, &e_new, CLAMPIS(fac, 0.0f, 1.0f)); if (v_new && e_new) { PyObject *ret = PyTuple_New(2); PyTuple_SET_ITEMS(ret, BPy_BMEdge_CreatePyObject(bm, e_new), BPy_BMVert_CreatePyObject(bm, v_new)); return ret; } else { PyErr_SetString(PyExc_ValueError, "edge_split(edge, vert): couldn't split the edge, internal error"); return NULL; } }
static PyObject *bpy_bm_utils_vert_collapse_edge(PyObject *UNUSED(self), PyObject *args) { BPy_BMEdge *py_edge; BPy_BMVert *py_vert; BMesh *bm; BMEdge *e_new = NULL; if (!PyArg_ParseTuple(args, "O!O!:vert_collapse_edge", &BPy_BMVert_Type, &py_vert, &BPy_BMEdge_Type, &py_edge)) { return NULL; } BPY_BM_CHECK_OBJ(py_edge); BPY_BM_CHECK_OBJ(py_vert); /* this doubles for checking that the verts are in the same mesh */ if (!(py_edge->e->v1 == py_vert->v || py_edge->e->v2 == py_vert->v)) { PyErr_SetString(PyExc_ValueError, "vert_collapse_edge(vert, edge): the vertex is not found in the edge"); return NULL; } if (BM_vert_edge_count(py_vert->v) > 2) { PyErr_SetString(PyExc_ValueError, "vert_collapse_edge(vert, edge): vert has more then 2 connected edges"); return NULL; } bm = py_edge->bm; e_new = BM_vert_collapse_edge(bm, py_edge->e, py_vert->v, TRUE); if (e_new) { return BPy_BMEdge_CreatePyObject(bm, e_new); } else { PyErr_SetString(PyExc_ValueError, "vert_collapse_edge(vert, edge): no new edge created, internal error"); return NULL; } }