32 #include "../mathutils/mathutils.h"
40 #include "../generic/py_capi_utils.h"
41 #include "../generic/python_utildefines.h"
51 PyErr_Format(PyExc_RuntimeError,
"bmesh operator: %.200s", errmsg);
72 const char *slot_name,
76 PyErr_Format(PyExc_TypeError,
77 "%.200s: keyword \"%.200s\" %.200s, expected a %.200s not *.200s",
82 Py_TYPE(value)->tp_name);
86 PyErr_Format(PyExc_TypeError,
87 "%.200s: keyword \"%.200s\" %.200s invalidated element",
93 if (value->
bm !=
bm) {
94 PyErr_Format(PyExc_TypeError,
95 "%.200s: keyword \"%.200s\" %.200s invalidated element",
116 const char htype_bmo,
119 const char *slot_name,
123 PyErr_Format(PyExc_TypeError,
124 "%.200s: keyword \"%.200s\" %.200s, invalidated sequence",
130 if (value->
bm !=
bm) {
131 PyErr_Format(PyExc_TypeError,
132 "%.200s: keyword \"%.200s\" %.200s, invalidated sequence",
138 if ((htype_py & htype_bmo) == 0) {
141 PyErr_Format(PyExc_TypeError,
142 "%.200s: keyword \"%.200s\" %.200s, expected "
143 "a sequence of %.200s not %.200s",
164 const char *slot_name)
171 PyErr_Format(PyExc_TypeError,
172 "%.200s: keyword \"%.200s\" expected True/False or 0/1, not %.200s",
175 Py_TYPE(value)->tp_name);
187 const char *enum_str = PyUnicode_AsUTF8(value);
189 if (enum_str ==
NULL) {
190 PyErr_Format(PyExc_TypeError,
191 "%.200s: keyword \"%.200s\" expected a string, not %.200s",
194 Py_TYPE(value)->tp_name);
215 const int param = PyC_Long_AsI32(value);
217 if (param == -1 && PyErr_Occurred()) {
218 PyErr_Format(PyExc_TypeError,
219 "%.200s: keyword \"%.200s\" expected an int, not %.200s",
222 Py_TYPE(value)->tp_name);
231 const float param = PyFloat_AsDouble(value);
232 if (param == -1 && PyErr_Occurred()) {
233 PyErr_Format(PyExc_TypeError,
234 "%.200s: keyword \"%.200s\" expected a float, not %.200s",
237 Py_TYPE(value)->tp_name);
254 PyErr_Format(PyExc_TypeError,
255 "%.200s: keyword \"%.200s\" expected a 3x3 or 4x4 matrix Matrix",
278 "single element") == -1) {
302 "element buffer") == -1) {
315 "element buffer") == -1) {
328 "element buffer") == -1) {
347 "element buffer") == -1) {
354 tot = Py_TYPE(value)->tp_as_sequence->sq_length(value);
365 else if (PySequence_Check(value)) {
367 Py_ssize_t elem_array_len;
380 if (elem_array ==
NULL) {
385 memcpy(slot->
data.
buf, elem_array,
sizeof(
void *) * elem_array_len);
386 PyMem_FREE(elem_array);
389 PyErr_Format(PyExc_TypeError,
390 "%.200s: keyword \"%.200s\" expected "
391 "a bmesh sequence, list, (htype, flag) pair, not %.200s",
394 Py_TYPE(value)->tp_name);
403 if (!PyDict_Check(value)) {
404 PyErr_Format(PyExc_TypeError,
405 "%.200s: keyword \"%.200s\" expected "
406 "a dict, not %.200s",
409 Py_TYPE(value)->tp_name);
414 if (!PySet_Check(value)) {
415 PyErr_Format(PyExc_TypeError,
416 "%.200s: keyword \"%.200s\" expected "
420 Py_TYPE(value)->tp_name);
427 if (PyDict_Size(value) > 0) {
428 PyObject *arg_key, *arg_value;
429 Py_ssize_t arg_pos = 0;
430 while (PyDict_Next(value, &arg_pos, &arg_key, &arg_value)) {
436 "invalid key in dict") == -1) {
445 "invalid value in dict") == -1) {
456 if (PyDict_Size(value) > 0) {
457 PyObject *arg_key, *arg_value;
458 Py_ssize_t arg_pos = 0;
459 while (PyDict_Next(value, &arg_pos, &arg_key, &arg_value)) {
467 "invalid key in dict") == -1) {
471 value_f = PyFloat_AsDouble(arg_value);
473 if (value_f == -1.0f && PyErr_Occurred()) {
474 PyErr_Format(PyExc_TypeError,
475 "%.200s: keyword \"%.200s\" expected "
476 "a dict with float values, not %.200s",
479 Py_TYPE(arg_value)->tp_name);
489 if (PyDict_Size(value) > 0) {
490 PyObject *arg_key, *arg_value;
491 Py_ssize_t arg_pos = 0;
492 while (PyDict_Next(value, &arg_pos, &arg_key, &arg_value)) {
500 "invalid key in dict") == -1) {
504 value_i = PyC_Long_AsI32(arg_value);
506 if (value_i == -1 && PyErr_Occurred()) {
507 PyErr_Format(PyExc_TypeError,
508 "%.200s: keyword \"%.200s\" expected "
509 "a dict with int values, not %.200s",
512 Py_TYPE(arg_value)->tp_name);
522 if (PyDict_Size(value) > 0) {
523 PyObject *arg_key, *arg_value;
524 Py_ssize_t arg_pos = 0;
525 while (PyDict_Next(value, &arg_pos, &arg_key, &arg_value)) {
533 "invalid key in dict") == -1) {
537 value_i = PyC_Long_AsI32(arg_value);
539 if (value_i == -1 && PyErr_Occurred()) {
540 PyErr_Format(PyExc_TypeError,
541 "%.200s: keyword \"%.200s\" expected "
542 "a dict with bool values, not %.200s",
545 Py_TYPE(arg_value)->tp_name);
555 if (PySet_Size(value) > 0) {
557 Py_ssize_t arg_pos = 0;
558 Py_ssize_t arg_hash = 0;
559 while (_PySet_NextEntry(value, &arg_pos, &arg_key, &arg_hash)) {
566 "invalid key in set") == -1) {
577 PyErr_Format(PyExc_NotImplementedError,
578 "This arguments mapping subtype %d is not supported",
587 PyErr_Format(PyExc_NotImplementedError,
588 "%.200s: keyword \"%.200s\" type %d not working yet!",
606 PyObject *item =
NULL;
627 item = Py_INCREF_RET(Py_None);
639 item = PyList_New(
size);
640 for (j = 0; j <
size; j++) {
653 item = _PyDict_NewPresized(slot_hash ?
BLI_ghash_len(slot_hash) : 0);
662 PyDict_SetItem(item, py_key, py_val);
670 item = _PyDict_NewPresized(slot_hash ?
BLI_ghash_len(slot_hash) : 0);
677 PyObject *py_val = PyFloat_FromDouble(*(
float *)&ele_val);
679 PyDict_SetItem(item, py_key, py_val);
687 item = _PyDict_NewPresized(slot_hash ?
BLI_ghash_len(slot_hash) : 0);
694 PyObject *py_val = PyLong_FromLong(*(
int *)&ele_val);
696 PyDict_SetItem(item, py_key, py_val);
704 item = _PyDict_NewPresized(slot_hash ?
BLI_ghash_len(slot_hash) : 0);
711 PyObject *py_val = PyBool_FromLong(*(
bool *)&ele_val);
713 PyDict_SetItem(item, py_key, py_val);
721 item = PySet_New(
NULL);
728 PySet_Add(item, py_key);
737 item = Py_INCREF_RET(Py_None);
759 if ((PyTuple_GET_SIZE(args) == 1) && (py_bm = (
BPy_BMesh *)PyTuple_GET_ITEM(args, 0)) &&
765 PyErr_SetString(PyExc_ValueError,
"bmesh created with 'use_operators=False'");
773 PyErr_SetString(PyExc_TypeError,
774 "bmesh operators expect a single BMesh positional argument, all other args "
783 if (kw && PyDict_Size(kw) > 0) {
787 PyObject *key, *value;
789 while (PyDict_Next(kw, &
pos, &key, &value)) {
790 const char *slot_name = PyUnicode_AsUTF8(key);
794 PyErr_Format(PyExc_TypeError,
795 "%.200s: keyword \"%.200s\" is invalid for this operator",
819 ret = Py_INCREF_RET(Py_None);
835 item = Py_INCREF_RET(Py_None);
842 const char *ch = strchr(slot->
slot_name,
'.');
845 memcpy(slot_name_strip, slot->
slot_name, tot);
846 slot_name_strip[tot] =
'\0';
847 PyDict_SetItemString(
ret, slot_name_strip, item);
BLI_INLINE void * BLI_ghashIterator_getKey(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER(gh_iter_, ghash_)
unsigned int BLI_ghash_len(GHash *gh) ATTR_WARN_UNUSED_RESULT
bool BMO_error_occurred(BMesh *bm)
void BMO_error_clear(BMesh *bm)
int BMO_error_get(BMesh *bm, const char **msg, BMOperator **op)
const char bm_iter_itype_htype_map[BM_ITYPE_MAX]
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const char htype)
BMO_ALL_TO_SLOT.
#define BMO_SLOT_AS_VECTOR(slot)
void * BMO_slot_buffer_alloc(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const int len)
void BMO_slot_mat_set(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const float *mat, int size)
#define BMO_SLOT_AS_FLOAT(slot)
@ BMO_OP_SLOT_SUBTYPE_ELEM_IS_SINGLE
@ BMO_OP_SLOT_ELEMENT_BUF
void * BMO_slot_buffer_get_single(BMOpSlot *slot)
void BMO_slot_buffer_from_single(BMOperator *op, BMOpSlot *slot, BMHeader *ele)
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
#define BMO_SLOT_AS_BUFFER(slot)
@ BMO_OP_SLOT_SUBTYPE_MAP_ELEM
@ BMO_OP_SLOT_SUBTYPE_MAP_BOOL
@ BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL
@ BMO_OP_SLOT_SUBTYPE_MAP_INT
@ BMO_OP_SLOT_SUBTYPE_MAP_EMPTY
@ BMO_OP_SLOT_SUBTYPE_MAP_FLT
@ BMO_OP_SLOT_SUBTYPE_INT_FLAG
@ BMO_OP_SLOT_SUBTYPE_INT_ENUM
#define BMO_SLOT_AS_GHASH(slot)
#define BMO_SLOT_AS_BOOL(slot)
#define BMO_SLOT_AS_MATRIX(slot)
void BMO_op_finish(BMesh *bm, BMOperator *op)
BMESH OPSTACK FINISH OP.
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
#define BMO_FLAG_DEFAULTS
bool BMO_slot_exists(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK HAS SLOT.
void BMO_op_init(BMesh *bm, BMOperator *op, const int flag, const char *opname)
BMESH OPSTACK INIT OP.
#define BMO_SLOT_AS_INT(slot)
BLI_INLINE void BMO_slot_map_int_insert(BMOperator *op, BMOpSlot *slot, void *element, const int val)
BLI_INLINE void BMO_slot_map_elem_insert(BMOperator *op, BMOpSlot *slot, const void *element, void *val)
BLI_INLINE void BMO_slot_map_float_insert(BMOperator *op, BMOpSlot *slot, void *element, const float val)
BLI_INLINE void BMO_slot_map_empty_insert(BMOperator *op, BMOpSlot *slot, const void *element)
BLI_INLINE void BMO_slot_map_bool_insert(BMOperator *op, BMOpSlot *slot, void *element, const bool val)
BLI_STATIC_ASSERT(sizeof(PyC_FlagSet)==sizeof(BMO_FlagSet), "size mismatch")
PyObject * BPy_BMO_call(BPy_BMeshOpFunc *self, PyObject *args, PyObject *kw)
static PyObject * bpy_slot_to_py(BMesh *bm, BMOpSlot *slot)
static int bpy_bm_op_as_py_error(BMesh *bm)
static int bpy_slot_from_py_elemseq_check(BPy_BMGeneric *value, BMesh *bm, const char htype_py, const char htype_bmo, const char *opname, const char *slot_name, const char *descr)
Utility function to check BMVertSeq/BMEdgeSeq/BMFaceSeq's.
static int bpy_slot_from_py_elem_check(BPy_BMElem *value, BMesh *bm, const char htype, const char *opname, const char *slot_name, const char *descr)
Utility function to check BMVert/BMEdge/BMFace's.
static int bpy_slot_from_py(BMesh *bm, BMOperator *bmop, BMOpSlot *slot, PyObject *value, const char *opname, const char *slot_name)
PyObject * BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele)
char * BPy_BMElem_StringFromHType_ex(const char htype, char ret[32])
char * BPy_BMElem_StringFromHType(const char htype)
void * BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, const char htype, const bool do_unique_check, const bool do_bm_check, const char *error_prefix)
#define BPY_BM_CHECK_OBJ(obj)
#define BPy_BMVertSeq_Check(v)
#define BPy_BMFaceSeq_Check(v)
#define BPy_BMElemSeq_Check(v)
#define BPy_BMElem_Check(v)
#define BPy_BMesh_Check(v)
#define BPy_BMEdgeSeq_Check(v)
#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
int Matrix_ParseAny(PyObject *o, void *p)
PyObject * Matrix_CreatePyObject(const float *mat, const ushort num_col, const ushort num_row, PyTypeObject *base_type)
PyObject * Vector_CreatePyObject(const float *vec, const int size, PyTypeObject *base_type)
int PyC_FlagSet_ToBitfield(PyC_FlagSet *items, PyObject *value, int *r_value, const char *error_prefix)
int PyC_FlagSet_ValueFromID(PyC_FlagSet *item, const char *identifier, int *r_value, const char *error_prefix)
int PyC_Long_AsBool(PyObject *value)
eBMOpSlotSubType_Union slot_subtype
union BMOpSlot::@139 data
struct BMOpSlot::@139::@140 enum_data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]
PyObject_VAR_HEAD struct BMesh * bm
PyObject_VAR_HEAD struct BMesh * bm
PyObject_VAR_HEAD struct BMesh * bm
eBMOpSlotSubType_Int intg
eBMOpSlotSubType_Elem elem