static PyObject *bpy_bmlayercollection_subscript_str(BPy_BMLayerCollection *self, const char *keyname) { CustomData *data; int index; BPY_BM_CHECK_OBJ(self); data = bpy_bm_customdata_get(self->bm, self->htype); index = CustomData_get_named_layer(data, self->type, keyname); /* type relative */ if (index != -1) { return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index); } else { PyErr_Format(PyExc_KeyError, "BMLayerCollection[key]: key \"%.200s\" not found", keyname); return NULL; } }
static PyObject *bpy_bmeditselseq_subscript_slice(BPy_BMEditSelSeq *self, Py_ssize_t start, Py_ssize_t stop) { int count = 0; bool ok; PyObject *list; PyObject *item; BMEditSelection *ese; BPY_BM_CHECK_OBJ(self); list = PyList_New(0); ese = self->bm->selected.first; ok = (ese != NULL); if (UNLIKELY(ok == false)) { return list; } /* first loop up-until the start */ for (ok = true; ok; ok = ((ese = ese->next) != NULL)) { if (count == start) { break; } count++; } /* add items until stop */ while ((ese = ese->next)) { item = BPy_BMElem_CreatePyObject(self->bm, &ese->ele->head); PyList_Append(list, item); Py_DECREF(item); count++; if (count == stop) { break; } } return list; }
static PyObject *bpy_bmeditselseq_add(BPy_BMEditSelSeq *self, BPy_BMElem *value) { BPY_BM_CHECK_OBJ(self); if ((BPy_BMVert_Check(value) || BPy_BMEdge_Check(value) || BPy_BMFace_Check(value)) == false) { PyErr_Format(PyExc_TypeError, "Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name); return NULL; } BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.add()"); BM_select_history_store(self->bm, value->ele); Py_RETURN_NONE; }
static PyObject *bpy_bmlayercollection_subscript_slice(BPy_BMLayerCollection *self, Py_ssize_t start, Py_ssize_t stop) { Py_ssize_t len = bpy_bmlayercollection_length(self); int count = 0; PyObject *tuple; BPY_BM_CHECK_OBJ(self); if (start >= len) start = len - 1; if (stop >= len) stop = len - 1; tuple = PyTuple_New(stop - start); for (count = start; count < stop; count++) { PyTuple_SET_ITEM(tuple, count - start, BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, count)); } return tuple; }
static PyObject *bpy_bmlayercollection_verify(BPy_BMLayerCollection *self) { int index; CustomData *data; BPY_BM_CHECK_OBJ(self); data = bpy_bm_customdata_get(self->bm, self->htype); index = CustomData_get_active_layer(data, self->type); /* type relative */ if (index == -1) { BM_data_layer_add(self->bm, data, self->type); index = 0; } BLI_assert(index >= 0); return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index); }
static PyObject *bpy_bmeditselseq_subscript_int(BPy_BMEditSelSeq *self, int keynum) { BMEditSelection *ese; BPY_BM_CHECK_OBJ(self); if (keynum < 0) { ese = BLI_rfindlink(&self->bm->selected, -1 - keynum); } else { ese = BLI_findlink(&self->bm->selected, keynum); } if (ese) { return BPy_BMElem_CreatePyObject(self->bm, &ese->ele->head); } else { PyErr_Format(PyExc_IndexError, "BMElemSeq[index]: index %d out of range", keynum); return NULL; } }
static PyObject *bpy_bm_utils_face_vert_separate(PyObject *UNUSED(self), PyObject *args) { BPy_BMFace *py_face; BPy_BMVert *py_vert; BMesh *bm; BMLoop *l; BMVert *v_old, *v_new; if (!PyArg_ParseTuple(args, "O!O!:face_vert_separate", &BPy_BMFace_Type, &py_face, &BPy_BMVert_Type, &py_vert)) { return NULL; } bm = py_face->bm; BPY_BM_CHECK_OBJ(py_face); BPY_BM_CHECK_SOURCE_OBJ(bm, "face_vert_separate()", py_vert); l = BM_face_vert_share_loop(py_face->f, py_vert->v); if (l == NULL) { PyErr_SetString(PyExc_ValueError, "vertex not found in face"); return NULL; } v_old = l->v; v_new = BM_face_loop_separate(bm, l); if (v_new != v_old) { return BPy_BMVert_CreatePyObject(bm, v_new); } else { Py_RETURN_NONE; } }
static PyObject *bpy_bmeditselseq_remove(BPy_BMEditSelSeq *self, BPy_BMElem *value) { BPY_BM_CHECK_OBJ(self); if ((BPy_BMVert_Check(value) || BPy_BMEdge_Check(value) || BPy_BMFace_Check(value)) == FALSE) { PyErr_Format(PyExc_TypeError, "Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name); return NULL; } BPY_BM_CHECK_SOURCE_OBJ(value, self->bm, "select_history.remove()"); if (BM_select_history_remove(self->bm, value->ele) == FALSE) { PyErr_SetString(PyExc_ValueError, "Element not found in selection history"); return NULL; } Py_RETURN_NONE; }
static PyObject *bpy_bmlayercollection_values(BPy_BMLayerCollection *self) { PyObject *ret; PyObject *item; int index; CustomData *data; int tot, i; BPY_BM_CHECK_OBJ(self); data = bpy_bm_customdata_get(self->bm, self->htype); index = CustomData_get_layer_index(data, self->type); tot = (index != -1) ? CustomData_number_of_layers(data, self->type) : 0; ret = PyList_New(tot); for (i = 0; tot-- > 0; index++) { item = BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, i); PyList_SET_ITEM(ret, i++, item); } return ret; }
static PyObject *bpy_bmlayercollection_keys(BPy_BMLayerCollection *self) { PyObject *ret; PyObject *item; int index; CustomData *data; int tot, i; BPY_BM_CHECK_OBJ(self); data = bpy_bm_customdata_get(self->bm, self->htype); index = CustomData_get_layer_index(data, self->type); /* absolute, but no need to make relative */ tot = (index != -1) ? CustomData_number_of_layers(data, self->type) : 0; ret = PyList_New(tot); for (i = 0; tot-- > 0; index++) { item = PyUnicode_FromString(data->layers[index].name); PyList_SET_ITEM(ret, i++, item); } return ret; }
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_SOURCE_OBJ(self->bm, "layer.copy_from()", value); if ((self->htype != value->htype) || (self->type != value->type)) { PyErr_SetString(PyExc_ValueError, "layer.copy_from(other): layer type mismatch"); } else if (self->index == value->index) { Py_RETURN_NONE; } data = bpy_bm_customdata_get(self->bm, self->htype); if ((bpy_bmlayeritem_get(self) == NULL) || (bpy_bmlayeritem_get(value) == NULL)) { return NULL; } BM_data_layer_copy(self->bm, data, self->type, value->index, self->index); Py_RETURN_NONE; }
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(data, self->type, key); /* type relative */ if (index != -1) { return BPy_BMLayerItem_CreatePyObject(self->bm, self->htype, self->type, index); } } return Py_INCREF_RET(def); }
static PyObject *bpy_bm_geometry_intersect_face_point(BPy_BMFace *UNUSED(self), PyObject *args) { BPy_BMFace *py_face; PyObject *py_point; float point[3]; bool ret; if (!PyArg_ParseTuple(args, "O!O:intersect_face_point", &BPy_BMFace_Type, &py_face, &py_point)) { return NULL; } BPY_BM_CHECK_OBJ(py_face); if (mathutils_array_parse(point, 3, 3, py_point, "intersect_face_point") == -1) { return NULL; } ret = BM_face_point_inside_test(py_face->f, point); return PyBool_FromLong(ret); }
static PyObject *bpy_bmeditselseq_clear(BPy_BMEditSelSeq *self) { BPY_BM_CHECK_OBJ(self); BM_select_history_clear(self->bm); Py_RETURN_NONE; }
static PyObject *bpy_bm_utils_face_split(PyObject *UNUSED(self), PyObject *args, PyObject *kw) { static const char *kwlist[] = {"face", "vert_a", "vert_b", "coords", "use_exist", "example", NULL}; BPy_BMFace *py_face; BPy_BMVert *py_vert_a; BPy_BMVert *py_vert_b; /* optional */ PyObject *py_coords = NULL; int edge_exists = TRUE; BPy_BMEdge *py_edge_example = NULL; float *coords; int ncoords = 0; BMesh *bm; BMFace *f_new = NULL; BMLoop *l_new = NULL; if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O!O!|OiO!:face_split", (char **)kwlist, &BPy_BMFace_Type, &py_face, &BPy_BMVert_Type, &py_vert_a, &BPy_BMVert_Type, &py_vert_b, &py_coords, &edge_exists, &BPy_BMEdge_Type, &py_edge_example)) { return NULL; } BPY_BM_CHECK_OBJ(py_face); BPY_BM_CHECK_OBJ(py_vert_a); BPY_BM_CHECK_OBJ(py_vert_b); if (py_edge_example) { BPY_BM_CHECK_OBJ(py_edge_example); } /* this doubles for checking that the verts are in the same mesh */ if (BM_vert_in_face(py_face->f, py_vert_a->v) == FALSE || BM_vert_in_face(py_face->f, py_vert_b->v) == FALSE) { PyErr_SetString(PyExc_ValueError, "face_split(...): one of the verts passed is not found in the face"); return NULL; } if (py_vert_a->v == py_vert_b->v) { PyErr_SetString(PyExc_ValueError, "face_split(...): vert arguments must differ"); return NULL; } if (py_coords) { ncoords = mathutils_array_parse_alloc_v(&coords, 3, py_coords, "face_split(...): "); if (ncoords == -1) { return NULL; } } /* --- main function body --- */ bm = py_face->bm; if (ncoords) { f_new = BM_face_split_n(bm, py_face->f, py_vert_a->v, py_vert_b->v, (float (*)[3])coords, ncoords, &l_new, py_edge_example ? py_edge_example->e : NULL); } else { f_new = BM_face_split(bm, py_face->f, py_vert_a->v, py_vert_b->v, &l_new, py_edge_example ? py_edge_example->e : NULL, edge_exists); } if (f_new && l_new) { PyObject *ret = PyTuple_New(2); PyTuple_SET_ITEM(ret, 0, BPy_BMFace_CreatePyObject(bm, f_new)); PyTuple_SET_ITEM(ret, 1, BPy_BMLoop_CreatePyObject(bm, l_new)); return ret; } else { PyErr_SetString(PyExc_ValueError, "face_split(...): couldn't split the face, internal error"); return NULL; } }
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)); }