26#define USE_STRING_COERCE
28#ifdef USE_STRING_COERCE
62#ifdef USE_STRING_COERCE
95 return (PyObject *)group;
106 array->owner_id = id;
108 return (PyObject *)
array;
113 PyObject *seq = PyList_New(prop->
len);
119 PyExc_RuntimeError,
"%s: IDP_IDPARRAY: PyList_New(%d) failed", __func__, prop->
len);
123 for (
i = 0;
i < prop->
len;
i++) {
132 PyList_SET_ITEM(seq,
i,
wrap);
152 return PyUnicode_FromFormat(
"<bpy id prop: owner=\"%s\", name=\"%s\", address=%p>",
153 self->owner_id ?
self->owner_id->name :
"<NONE>",
160 switch (prop->
type) {
188 switch (prop->
type) {
191 if (!PyUnicode_Check(value)) {
192 PyErr_SetString(PyExc_TypeError,
"expected a string!");
196# ifdef USE_STRING_COERCE
199 PyObject *value_coerce =
nullptr;
202 alloc_len = strlen(st) + 1;
204 st = PyUnicode_AsUTF8(value);
207 Py_XDECREF(value_coerce);
210 length_ssize_t st_len;
211 st = PyUnicode_AsUTF8AndSize(value, &st_len);
220 int ivalue = PyLong_AsSsize_t(value);
221 if (ivalue == -1 && PyErr_Occurred()) {
222 PyErr_SetString(PyExc_TypeError,
"expected an int type");
229 float fvalue =
float(PyFloat_AsDouble(value));
230 if (fvalue == -1 && PyErr_Occurred()) {
231 PyErr_SetString(PyExc_TypeError,
"expected a float");
238 double dvalue = PyFloat_AsDouble(value);
239 if (dvalue == -1 && PyErr_Occurred()) {
240 PyErr_SetString(PyExc_TypeError,
"expected a float");
247 PyErr_SetString(PyExc_AttributeError,
"attempt to set read-only attribute!");
256 return PyUnicode_FromString(
self->prop->name);
264 if (!PyUnicode_Check(value)) {
265 PyErr_SetString(PyExc_TypeError,
"expected a string!");
269 name = PyUnicode_AsUTF8AndSize(value, &name_len);
272 PyErr_SetString(PyExc_TypeError,
"string length cannot exceed 63 characters!");
280 PyErr_SetString(PyExc_NameError,
"property name already exists in parent group");
285 memcpy(
self->prop->name,
name, name_len + 1);
292 return PyLong_FromLong(
self->prop->type);
300 "The name of this Group.",
302 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
308 PyErr_SetString(PyExc_TypeError,
"len() of unsized object");
312 return self->prop->len;
321 PyErr_SetString(PyExc_TypeError,
"unsubscriptable object");
325 name = PyUnicode_AsUTF8(item);
327 if (
name ==
nullptr) {
328 PyErr_SetString(PyExc_TypeError,
"only strings are allowed as keys of ID properties");
334 if (idprop ==
nullptr) {
335 PyErr_SetString(PyExc_KeyError,
"key not in subgroup dict");
346 PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast);
350 Py_ssize_t
i,
len = PySequence_Fast_GET_SIZE(seq_fast);
352 for (
i = 0;
i <
len;
i++) {
353 item = seq_fast_items[
i];
354 if (PyFloat_Check(item)) {
362 else if (PyBool_Check(item)) {
369 else if (PyLong_Check(item)) {
376 else if (PyMapping_Check(item)) {
393 const char *
name =
nullptr;
396 name = PyUnicode_AsUTF8AndSize(name_obj, &name_len);
398 if (
name ==
nullptr) {
399 PyErr_Format(PyExc_KeyError,
400 "invalid id-property key, expected a string, not a %.200s",
401 Py_TYPE(name_obj)->tp_name);
406 PyErr_SetString(PyExc_KeyError,
407 "the length of IDProperty names is limited to 63 characters");
445 const bool do_conversion,
446 const bool can_create)
449 const double value = PyFloat_AsDouble(ob);
455 else if (do_conversion) {
456 switch (prop_exist->
type) {
473 if (!prop && can_create) {
482 const bool do_conversion,
483 const bool can_create)
492 else if (do_conversion) {
493 switch (prop_exist->
type) {
510 if (!prop && can_create) {
519 const bool do_conversion,
520 const bool can_create)
525 const int value = PyC_Long_AsI32(ob);
526 if (value == -1 && PyErr_Occurred()) {
532 else if (do_conversion) {
533 const int64_t value = PyC_Long_AsI64(ob);
534 if (value == -1 && PyErr_Occurred()) {
537 switch (prop_exist->
type) {
557 if (!prop && can_create) {
558 const int value = PyC_Long_AsI32(ob);
559 if (value == -1 && PyErr_Occurred()) {
571 const bool can_create)
574 Py_ssize_t value_len = 0;
575 const char *value =
nullptr;
577#ifdef USE_STRING_COERCE
578 PyObject *value_coerce =
nullptr;
581 value = PyUnicode_AsUTF8AndSize(ob, &value_len);
592 if (!prop && can_create) {
600#ifdef USE_STRING_COERCE
601 Py_XDECREF(value_coerce);
611 const bool can_create)
614 Py_ssize_t value_len = PyBytes_GET_SIZE(ob);
615 const char *value = PyBytes_AS_STRING(ob);
625 if (!prop && can_create) {
677 const Py_buffer &buffer,
680 const bool can_create)
693 if (!prop && can_create) {
696 val.
array.
len = buffer.len / buffer.itemsize;
706 const bool do_conversion,
707 const bool can_create)
712 PyObject **ob_seq_fast_items;
716 ob_seq_fast_items = PySequence_Fast_ITEMS(ob);
722 PyErr_SetString(PyExc_TypeError,
723 "only floats, ints, booleans and dicts are allowed in ID property arrays");
728 PyErr_SetString(PyExc_RuntimeError,
"internal error with idp array.type");
733 val.
array.
len = PySequence_Fast_GET_SIZE(ob);
740 if (prop_exist && prop_exist->
len == val.
array.
len) {
752 item = ob_seq_fast_items[
i];
753 const double value = PyFloat_AsDouble(item);
754 if ((value == -1.0) && PyErr_Occurred()) {
758 static_cast<float *
>(prop_data)[
i] =
float(value);
761 static_cast<double *
>(prop_data)[
i] = value;
770 (prop_exist->
subtype ==
IDP_INT || (do_conversion && (to_float || to_double)))))
777 item = ob_seq_fast_items[
i];
778 if (to_float || to_double) {
779 const int64_t value = PyC_Long_AsI64(item);
780 if ((value == -1) && PyErr_Occurred()) {
784 static_cast<float *
>(prop_data)[
i] =
float(value);
787 static_cast<double *
>(prop_data)[
i] =
double(value);
791 const int value = PyC_Long_AsI32(item);
792 if ((value == -1) && PyErr_Occurred()) {
795 static_cast<int *
>(prop_data)[
i] = value;
810 item = ob_seq_fast_items[
i];
812 if ((value == -1) && PyErr_Occurred()) {
816 static_cast<int *
>(prop_data)[
i] = value;
819 static_cast<bool *
>(prop_data)[
i] =
bool(value);
831 if (prop || !can_create) {
841 item = ob_seq_fast_items[
i];
842 if (((prop_data[
i] = PyFloat_AsDouble(item)) == -1.0) && PyErr_Occurred()) {
854 item = ob_seq_fast_items[
i];
855 if (((prop_data[
i] = PyC_Long_AsI32(item)) == -1) && PyErr_Occurred()) {
865 item = ob_seq_fast_items[
i];
877 item = ob_seq_fast_items[
i];
879 if ((value == -1) && PyErr_Occurred()) {
883 prop_data[
i] = (value != 0);
894 const bool do_conversion,
895 const bool can_create)
898 bool use_buffer =
false;
899 int idp_buffer_type = -1;
901 if (PyObject_CheckBuffer(ob)) {
902 if (PyObject_GetBuffer(ob, &buffer, PyBUF_ND | PyBUF_FORMAT) == -1) {
909 if (idp_buffer_type != -1) {
912 if (!can_create && (!prop_exist || (prop_exist->
type != idp_buffer_type) ||
913 (prop_exist->
len != buffer.len)))
915 PyBuffer_Release(&buffer);
922 PyBuffer_Release(&buffer);
929 prop_exist,
name, buffer, idp_buffer_type, do_conversion, can_create);
930 PyBuffer_Release(&buffer);
934 PyObject *ob_seq_fast = PySequence_Fast(ob,
"py -> idprop");
935 if (ob_seq_fast !=
nullptr) {
937 prop_exist,
name, ob_seq_fast, do_conversion, can_create);
955 PyObject *keys, *vals, *key, *pval;
958 keys = PyMapping_Keys(ob);
959 vals = PyMapping_Values(ob);
964 len = PyMapping_Length(ob);
965 for (
i = 0;
i <
len;
i++) {
966 key = PySequence_GetItem(keys,
i);
967 pval = PySequence_GetItem(vals,
i);
989 const bool can_create)
996 PyErr_SetString(PyExc_ValueError,
"Cannot assign an embedded ID pointer to an id-property");
1007 if (!prop && can_create) {
1016 const bool do_conversion,
1017 const bool can_create)
1019 if (
name ==
nullptr) {
1023 if (PyFloat_Check(ob)) {
1026 if (PyBool_Check(ob)) {
1029 if (PyLong_Check(ob)) {
1032 if (PyUnicode_Check(ob)) {
1035 if (PyBytes_Check(ob)) {
1038 if (PySequence_Check(ob)) {
1044 if (PyMapping_Check(ob)) {
1049 PyExc_TypeError,
"invalid id-property type %.200s not supported", Py_TYPE(ob)->tp_name);
1069 if (new_prop ==
nullptr) {
1087 if (prop != prop_exist) {
1088 PyErr_Format(PyExc_TypeError,
1089 "Cannot assign a '%.200s' value to the existing '%s' %s IDProperty",
1090 Py_TYPE(ob)->tp_name,
1101 if (new_prop ==
nullptr) {
1104 if (new_prop == prop_exist) {
1119 prop_exist->
ui_data =
nullptr;
1133 PyErr_SetString(PyExc_TypeError,
"unsubscriptable object");
1137 if (val ==
nullptr) {
1139 const char *
name = PyUnicode_AsUTF8(key);
1141 if (
name ==
nullptr) {
1142 PyErr_Format(PyExc_KeyError,
"expected a string, not %.200s", Py_TYPE(key)->tp_name);
1152 PyErr_SetString(PyExc_KeyError,
"property not found in group");
1176 ret = PyObject_GetIter(iterable);
1187 switch (prop->
type) {
1201 PyObject *seq = PyList_New(prop->
len);
1206 PyExc_RuntimeError,
"%s: IDP_ARRAY: PyList_New(%d) failed", __func__, prop->
len);
1213 for (
i = 0;
i < prop->
len;
i++) {
1214 PyList_SET_ITEM(seq,
i, PyFloat_FromDouble(
array[
i]));
1220 for (
i = 0;
i < prop->
len;
i++) {
1221 PyList_SET_ITEM(seq,
i, PyFloat_FromDouble(
array[
i]));
1227 for (
i = 0;
i < prop->
len;
i++) {
1228 PyList_SET_ITEM(seq,
i, PyLong_FromLong(
array[
i]));
1234 for (
i = 0;
i < prop->
len;
i++) {
1235 PyList_SET_ITEM(seq,
i, PyBool_FromLong(
array[
i]));
1241 PyExc_RuntimeError,
"%s: invalid/corrupt array type '%d'!", __func__, prop->
subtype);
1249 PyObject *seq = PyList_New(prop->
len);
1255 PyExc_RuntimeError,
"%s: IDP_IDPARRAY: PyList_New(%d) failed", __func__, prop->
len);
1259 for (
i = 0;
i < prop->
len;
i++) {
1268 PyList_SET_ITEM(seq,
i,
wrap);
1273 PyObject *dict = _PyDict_NewPresized(prop->
len);
1285 PyDict_SetItemString(dict, loop->
name,
wrap);
1292 PyErr_Format(PyExc_RuntimeError,
1293 "%s ERROR: '%s' property exists with a bad type code '%d'!",
1308 if (
self->group ==
nullptr) {
1309 return PyUnicode_FromFormat(
"<%s>", Py_TYPE(
self)->tp_name);
1311 return PyUnicode_FromFormat(
"<%s \"%s\">", Py_TYPE(
self)->tp_name,
self->group->prop->name);
1316 if (
self->group !=
nullptr) {
1317 PyObject_GC_UnTrack(
self);
1319 Py_CLEAR(
self->group);
1320 PyObject_GC_Del(
self);
1325 Py_VISIT(
self->group);
1331 Py_CLEAR(
self->group);
1337 return (
self->group !=
nullptr);
1342 if (
self->len_init ==
self->group->prop->len) {
1345 PyErr_SetString(PyExc_RuntimeError,
"IDPropertyGroup changed size during iteration");
1351 if (
self->cur !=
nullptr) {
1358 return PyUnicode_FromString(cur->
name);
1360 PyErr_SetNone(PyExc_StopIteration);
1366 if (
self->cur !=
nullptr) {
1375 PyErr_SetNone(PyExc_StopIteration);
1381 if (
self->cur !=
nullptr) {
1388 PyObject *
ret = PyTuple_New(2);
1390 PyUnicode_FromString(cur->
name),
1394 PyErr_SetNone(PyExc_StopIteration);
1405#define SHARED_MEMBER_SET(member, value) \
1407 k_ty->member = v_ty->member = i_ty->member = value; \
1416 k_ty->tp_name =
"IDPropertyGroupIterKeys";
1417 v_ty->tp_name =
"IDPropertyGroupIterValues";
1418 i_ty->tp_name =
"IDPropertyGroupIterItems";
1434#undef SHARED_MEMBER_SET
1438 const bool reversed,
1444 iter->
group = group;
1445 if (group !=
nullptr) {
1447 BLI_assert(!PyObject_GC_IsTracked((PyObject *)iter));
1448 PyObject_GC_Track(iter);
1451 iter->len_init = group->
prop->
len;
1454 iter->
cur =
nullptr;
1457 return (PyObject *)iter;
1493 if (
self->group ==
nullptr) {
1494 return PyUnicode_FromFormat(
"<%s>", Py_TYPE(
self)->tp_name);
1496 return PyUnicode_FromFormat(
"<%s \"%s\">", Py_TYPE(
self)->tp_name,
self->group->prop->name);
1501 if (
self->group !=
nullptr) {
1502 PyObject_GC_UnTrack(
self);
1504 Py_CLEAR(
self->group);
1505 PyObject_GC_Del(
self);
1510 Py_VISIT(
self->group);
1516 Py_CLEAR(
self->group);
1522 return (
self->group !=
nullptr);
1544 if (
self->group ==
nullptr) {
1547 return self->group->prop->len;
1552 if (
self->group ==
nullptr) {
1560 if (
self->group ==
nullptr) {
1564 PyObject *list = PySequence_List((PyObject *)
self);
1565 const int result = PySequence_Contains(list, value);
1572 if (
self->group ==
nullptr) {
1576 PyObject *list = PySequence_List((PyObject *)
self);
1577 const int result = PySequence_Contains(list, value);
1619 BPy_IDGroup_View_reversed_doc,
1620 "Return a reverse iterator over the ID Property keys values or items.");
1625 return (PyObject *)
result;
1632 BPy_IDGroup_View_reversed_doc},
1648 k_ty->tp_name =
"IDPropertyGroupViewKeys";
1649 v_ty->tp_name =
"IDPropertyGroupViewValues";
1650 i_ty->tp_name =
"IDPropertyGroupViewItems";
1661#define SHARED_MEMBER_SET(member, value) \
1663 k_ty->member = v_ty->member = i_ty->member = value; \
1676#undef SHARED_MEMBER_SET
1687 BPy_IDGroup_pop_doc,
1688 ".. method:: pop(key, default)\n"
1690 " Remove an item from the group, returning a Python representation.\n"
1692 " :raises KeyError: When the item doesn't exist.\n"
1694 " :arg key: Name of item to remove.\n"
1696 " :arg default: Value to return when key isn't found, otherwise raise an exception.\n"
1697 " :type default: Any\n");
1704 PyObject *def =
nullptr;
1706 if (!PyArg_ParseTuple(args,
"s|O:get", &key, &def)) {
1711 if (idprop ==
nullptr) {
1712 if (def ==
nullptr) {
1713 PyErr_SetString(PyExc_KeyError,
"item not in group");
1716 return Py_NewRef(def);
1720 if (pyform ==
nullptr) {
1735 printf(
"%s: ID Property Error found and corrected!\n", func);
1738 for (j =
len; j < prop->
len; j++) {
1739 PyList_SET_ITEM(seq, j, Py_NewRef(Py_None));
1748 PyObject *list = PyList_New(prop->
len);
1753 loop = loop->
next,
i++)
1755 PyList_SET_ITEM(list,
i, PyUnicode_FromString(loop->
name));
1759 for (; loop; loop = loop->
next,
i++) {
1763 if (
i != prop->
len) {
1775 PyObject *list = PyList_New(prop->
len);
1780 loop = loop->
next,
i++)
1785 if (
i != prop->
len) {
1797 PyObject *seq = PyList_New(prop->
len);
1802 loop = loop->
next,
i++)
1804 PyObject *item = PyTuple_New(2);
1807 PyList_SET_ITEM(seq,
i, item);
1810 if (
i != prop->
len) {
1846 BPy_IDGroup_keys_doc,
1847 ".. method:: keys()\n"
1849 " Return the keys associated with this group as a list of strings.\n");
1857 BPy_IDGroup_values_doc,
1858 ".. method:: values()\n"
1860 " Return the values associated with this group.\n");
1868 BPy_IDGroup_items_doc,
1869 ".. method:: items()\n"
1871 " Iterate through the items in the dict; behaves like dictionary method items.\n");
1879 const char *
name = PyUnicode_AsUTF8(value);
1882 PyErr_Format(PyExc_TypeError,
"expected a string, not a %.200s", Py_TYPE(value)->tp_name);
1891 BPy_IDGroup_update_doc,
1892 ".. method:: update(other)\n"
1894 " Update key, values.\n"
1896 " :arg other: Updates the values in the group with this.\n"
1898 " :type other: :class:`IDPropertyGroup` | dict[str, Any]\n");
1901 PyObject *pkey, *pval;
1913 else if (PyDict_Check(value)) {
1914 while (PyDict_Next(value, &
i, &pkey, &pval)) {
1916 if (PyErr_Occurred()) {
1922 PyErr_Format(PyExc_TypeError,
1923 "expected a dict or an IDPropertyGroup type, not a %.200s",
1924 Py_TYPE(value)->tp_name);
1933 BPy_IDGroup_to_dict_doc,
1934 ".. method:: to_dict()\n"
1936 " Return a purely Python version of the group.\n");
1944 BPy_IDGroup_clear_doc,
1945 ".. method:: clear()\n"
1947 " Clear all members from this group.\n");
1956 BPy_IDGroup_get_doc,
1957 ".. method:: get(key, default=None)\n"
1959 " Return the value for key, if it exists, else default.\n");
1964 PyObject *def = Py_None;
1966 if (!PyArg_ParseTuple(args,
"s|O:get", &key, &def)) {
1984# pragma clang diagnostic push
1985# pragma clang diagnostic ignored "-Wcast-function-type"
1987# pragma GCC diagnostic push
1988# pragma GCC diagnostic ignored "-Wcast-function-type"
1993 {
"pop", (PyCFunction)
BPy_IDGroup_pop, METH_VARARGS, BPy_IDGroup_pop_doc},
1994 {
"keys", (PyCFunction)
BPy_IDGroup_keys, METH_NOARGS, BPy_IDGroup_keys_doc},
1998 {
"get", (PyCFunction)
BPy_IDGroup_get, METH_VARARGS, BPy_IDGroup_get_doc},
2001 {
nullptr,
nullptr, 0,
nullptr},
2006# pragma clang diagnostic pop
2008# pragma GCC diagnostic pop
2039 PyVarObject_HEAD_INIT(
nullptr, 0)
2099 switch (
self->prop->subtype) {
2101 *elem_size =
sizeof(
float);
2102 return &PyFloat_Type;
2104 *elem_size =
sizeof(double);
2105 return &PyFloat_Type;
2107 *elem_size =
sizeof(int8_t);
2108 return &PyBool_Type;
2110 *elem_size =
sizeof(int);
2111 return &PyLong_Type;
2120 return PyUnicode_FromFormat(
"<bpy id property array [%d]>",
self->prop->len);
2125 BPy_IDArray_get_typecode_doc,
2126 "The type of the data in the array {'f': float, 'd': double, 'i': int, 'b': bool}.");
2129 const char *typecode;
2130 switch (
self->prop->subtype) {
2144 PyErr_Format(PyExc_RuntimeError,
2145 "%s: invalid/corrupt array type '%d'!",
2147 self->prop->subtype);
2152 return PyUnicode_FromString(typecode);
2160 BPy_IDArray_get_typecode_doc,
2162 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
2167 BPy_IDArray_to_list_doc,
2168 ".. method:: to_list()\n"
2170 " Return the array as a list.\n");
2178# pragma clang diagnostic push
2179# pragma clang diagnostic ignored "-Wcast-function-type"
2181# pragma GCC diagnostic push
2182# pragma GCC diagnostic ignored "-Wcast-function-type"
2188 {
nullptr,
nullptr, 0,
nullptr},
2193# pragma clang diagnostic pop
2195# pragma GCC diagnostic pop
2201 return self->prop->len;
2206 if (index < 0 || index >=
self->prop->len) {
2207 PyErr_SetString(PyExc_IndexError,
"index out of range!");
2211 switch (
self->prop->subtype) {
2223 PyExc_RuntimeError,
"%s: invalid/corrupt array type '%d'!", __func__,
self->prop->subtype);
2230 if (index < 0 || index >=
self->prop->len) {
2231 PyErr_SetString(PyExc_RuntimeError,
"index out of range!");
2235 switch (
self->prop->subtype) {
2237 const float f =
float(PyFloat_AsDouble(value));
2238 if (f == -1 && PyErr_Occurred()) {
2245 const double d = PyFloat_AsDouble(value);
2246 if (d == -1 && PyErr_Occurred()) {
2253 const int i = PyC_Long_AsI32(value);
2254 if (
i == -1 && PyErr_Occurred()) {
2263 if (
i == -1 && PyErr_Occurred()) {
2296 end = prop->
len + end + 1;
2301 tuple = PyTuple_New(end -
begin);
2351 alloc_len =
size * elem_size;
2356 if (
PyC_AsArray(vec, elem_size, seq,
size, py_type,
"slice assignment: ") == -1) {
2369 if (PyIndex_Check(item)) {
2371 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2372 if (
i == -1 && PyErr_Occurred()) {
2376 i +=
self->prop->len;
2380 if (PySlice_Check(item)) {
2381 Py_ssize_t start, stop,
step, slicelength;
2383 if (PySlice_GetIndicesEx(item,
self->prop->len, &start, &stop, &
step, &slicelength) < 0) {
2387 if (slicelength <= 0) {
2388 return PyTuple_New(0);
2394 PyErr_SetString(PyExc_TypeError,
"slice steps not supported with vectors");
2398 PyErr_Format(PyExc_TypeError,
2399 "vector indices must be integers, not %.200s",
2401 Py_TYPE(item)->tp_name);
2407 if (PyIndex_Check(item)) {
2408 Py_ssize_t
i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2409 if (
i == -1 && PyErr_Occurred()) {
2413 i +=
self->prop->len;
2417 if (PySlice_Check(item)) {
2418 Py_ssize_t start, stop,
step, slicelength;
2420 if (PySlice_GetIndicesEx(item,
self->prop->len, &start, &stop, &
step, &slicelength) < 0) {
2428 PyErr_SetString(PyExc_TypeError,
"slice steps not supported with vectors");
2433 PyExc_TypeError,
"vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
2449 return sizeof(
float);
2452 return sizeof(double);
2455 return sizeof(bool);
2464 const int length = itemsize * prop->
len;
2472 view->itemsize = itemsize;
2476 shape[0] = prop->
len;
2477 view->shape = shape;
2499 PyVarObject_HEAD_INIT(
nullptr, 0)
2586 iter->
group = group;
2587 if (group !=
nullptr) {
2589 BLI_assert(!PyObject_GC_IsTracked((PyObject *)iter));
2590 PyObject_GC_Track(iter);
2630 PyObject *submodule;
2660 {
nullptr,
nullptr, 0,
nullptr},
2666 "This module provides access id property types (currently mainly for docs).");
2682 PyObject *submodule;
2683 PyObject *sys_modules = PyImport_GetModuleDict();
2689 PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
IDPropertyUIData * IDP_TryConvertUIData(IDPropertyUIData *src, eIDPropertyUIDataType src_type, eIDPropertyUIDataType dst_type)
#define IDP_float_get(prop)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_FreeFromGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
#define IDP_array_voidp_get(prop)
eIDPropertyUIDataType IDP_ui_data_type(const IDProperty *prop)
#define IDP_bool_set(prop, value)
void IDP_AssignStringMaxSize(IDProperty *prop, const char *st, size_t st_maxncpy) ATTR_NONNULL()
#define IDP_int_get(prop)
#define IDP_array_double_get(prop)
const char * IDP_type_str(eIDPropertyType type, short sub_type)
void IDP_ReplaceInGroup_ex(IDProperty *group, IDProperty *prop, IDProperty *prop_exist, int flag)
void IDP_FreeProperty(IDProperty *prop)
#define IDP_int_set(prop, value)
#define IDP_string_get(prop)
#define IDP_double_get(prop)
IDProperty * IDP_New(char type, const IDPropertyTemplate *val, blender::StringRef name, eIDPropertyFlag flags={}) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define IDP_array_bool_get(prop)
#define IDP_array_int_get(prop)
void IDP_ClearProperty(IDProperty *prop)
#define IDP_property_array_get(prop)
void IDP_AppendArray(IDProperty *prop, IDProperty *item)
void IDP_AssignID(IDProperty *prop, ID *id, int flag)
void IDP_ResizeArray(IDProperty *prop, int newlen)
void IDP_MergeGroup(IDProperty *dest, const IDProperty *src, bool do_overwrite) ATTR_NONNULL()
#define IDP_float_set(prop, value)
#define IDP_double_set(prop, value)
#define IDP_array_float_get(prop)
IDProperty * IDP_NewIDPArray(blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define IDP_bool_get(prop)
#define BLI_assert_unreachable()
ID and Library types, which are fundamental for SDNA.
@ IDP_FLAG_OVERRIDABLE_LIBRARY
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
VecBase< float, D > constexpr mod(VecOp< float, D >, VecOp< float, D >) RET
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float length(VecOp< float, D >) RET
PyObject * BPy_Wrap_GetKeys(IDProperty *prop)
static PyObject * BPy_IDGroup_clear(BPy_IDProperty *self)
static IDProperty * idp_from_PyLong(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static PyMethodDef IDProp_methods[]
static int BPy_Group_ViewItems_Contains(BPy_IDGroup_View *self, PyObject *value)
static PyObject * idprop_py_from_idp_double(const IDProperty *prop)
static PyObject * idprop_py_from_idp_idparray(ID *id, IDProperty *prop)
static PyObject * BPyInit_idprop_types()
static PySequenceMethods BPy_IDGroup_ViewItems_as_sequence
PyTypeObject BPy_IDGroup_ViewItems_Type
static IDProperty * idp_from_PySequence_Buffer(IDProperty *prop_exist, const char *name, const Py_buffer &buffer, const int idp_type, const bool, const bool can_create)
static PyObject * BPy_Group_ViewItems_iter(BPy_IDGroup_View *self)
static PyGetSetDef BPy_IDGroup_getseters[]
PyDoc_STRVAR(BPy_IDGroup_View_reversed_doc, "Return a reverse iterator over the ID Property keys values or items.")
PyTypeObject BPy_IDGroup_ViewValues_Type
static PyObject * BPy_IDGroup_IterItems_CreatePyObject(BPy_IDProperty *group, const bool reversed)
static int BPy_Group_ViewKeys_Contains(BPy_IDGroup_View *self, PyObject *value)
PyObject * BPyInit_idprop()
static PyObject * BPy_IDGroup_IterValues_CreatePyObject(BPy_IDProperty *group, const bool reversed)
PyTypeObject BPy_IDGroup_ViewKeys_Type
bool pyrna_id_CheckPyObject(PyObject *obj)
static PyObject * BPy_IDGroup_keys(BPy_IDProperty *self)
static PyObject * BPy_IDGroup_IterKeys_CreatePyObject(BPy_IDProperty *group, const bool reversed)
static PyObject * BPy_IDGroup_GetName(BPy_IDProperty *self, void *)
static PyMethodDef BPy_IDGroup_View_methods[]
static PyObject * BPy_Group_ViewValues_iter(BPy_IDGroup_View *self)
PyObject * BPy_Wrap_GetKeys_View_WithID(ID *id, IDProperty *prop)
static PyGetSetDef BPy_IDArray_getseters[]
static PyObject * BPy_IDGroup_to_dict(BPy_IDProperty *self)
PyObject * BPy_Wrap_GetItems(ID *id, IDProperty *prop)
int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
static PyObject * idprop_py_from_idp_array(ID *id, IDProperty *prop)
bool BPy_IDProperty_Map_ValidateAndCreate(PyObject *key, IDProperty *group, PyObject *ob)
static IDProperty * idp_from_PyBool(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static void BPy_IDGroup_Iter_dealloc(BPy_IDGroup_Iter *self)
static void BPy_IDArray_releasebuffer(BPy_IDArray *, Py_buffer *view)
static int BPy_IDGroup_View_traverse(BPy_IDGroup_View *self, visitproc visit, void *arg)
static PyMethodDef BPy_IDArray_methods[]
static IDProperty * idp_from_PyMapping(IDProperty *, const char *name, PyObject *ob, const bool, const bool)
static PyObject * BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *args)
static Py_ssize_t BPy_Group_View_len(BPy_IDGroup_View *self)
static IDProperty * idp_from_PyUnicode(IDProperty *prop_exist, const char *name, PyObject *ob, const bool, const bool can_create)
static PyObject * BPy_IDArray_repr(BPy_IDArray *self)
static int BPy_IDArray_SetItem(BPy_IDArray *self, Py_ssize_t index, PyObject *value)
static int BPy_IDArray_ass_subscript(BPy_IDArray *self, PyObject *item, PyObject *value)
static const char * idp_format_from_array_type(int type)
static IDProperty * idp_from_PyObject(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static BPy_IDGroup_View * IDGroup_View_New_WithType(BPy_IDProperty *group, PyTypeObject *type)
PyTypeObject BPy_IDGroup_IterKeys_Type
static PyObject * BPy_Group_IterKeys_next(BPy_IDGroup_Iter *self)
static PyObject * BPy_IDArray_GetItem(BPy_IDArray *self, Py_ssize_t index)
PyObject * BPy_Wrap_GetValues(ID *id, IDProperty *prop)
static PyObject * BPy_IDGroup_Iter_repr(BPy_IDGroup_Iter *self)
static void IDGroup_Iter_init_type()
PyObject * BPy_Wrap_GetItems_View_WithID(ID *id, IDProperty *prop)
static int itemsize_by_idarray_type(int array_type)
static IDProperty * idp_from_PySequence_Fast(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static PyObject * BPy_Group_IterValues_next(BPy_IDGroup_Iter *self)
static int BPy_IDGroup_View_is_gc(BPy_IDGroup_View *self)
static PyObject * BPy_IDGroup_update(BPy_IDProperty *self, PyObject *value)
static PyObject * BPy_IDArray_to_list(BPy_IDArray *self)
static PySequenceMethods BPy_IDGroup_ViewValues_as_sequence
static PyObject * BPy_IDGroup_get(BPy_IDProperty *self, PyObject *args)
static const char * idp_try_read_name(PyObject *name_obj)
PyTypeObject BPy_IDGroup_Type
PyTypeObject BPy_IDArray_Type
static int BPy_IDGroup_Iter_clear(BPy_IDGroup_Iter *self)
PyObject * pyrna_id_CreatePyObject(ID *id)
static PyObject * BPy_Group_IterItems_next(BPy_IDGroup_Iter *self)
PyObject * BPy_IDGroup_MapDataToPy(IDProperty *prop)
static PySequenceMethods BPy_IDGroup_Seq
static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
static PyObject * idprop_py_from_idp_int(const IDProperty *prop)
PyTypeObject BPy_IDGroup_IterValues_Type
static PyObject * idprop_py_from_idp_bool(const IDProperty *prop)
static int BPy_Group_ViewValues_Contains(BPy_IDGroup_View *self, PyObject *value)
static IDProperty * idp_from_PySequence(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static PyModuleDef IDProp_types_module_def
static PyBufferProcs BPy_IDArray_Buffer
static bool BPy_Group_Iter_same_size_or_raise_error(BPy_IDGroup_Iter *self)
static IDProperty * idp_from_PyFloat(IDProperty *prop_exist, const char *name, PyObject *ob, const bool do_conversion, const bool can_create)
static void BPy_IDGroup_View_dealloc(BPy_IDGroup_View *self)
static void BPy_IDGroup_CorrectListLen(IDProperty *prop, PyObject *seq, int len, const char *func)
static PySequenceMethods BPy_IDArray_Seq
static PyObject * IDGroup_Iter_New_WithType(BPy_IDProperty *group, const bool reversed, PyTypeObject *type)
static PyObject * BPy_IDGroup_ViewKeys_CreatePyObject(BPy_IDProperty *group)
static PyObject * BPy_IDArray_slice(BPy_IDArray *self, int begin, int end)
static void IDGroup_View_init_type()
static PyObject * BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
static PyMappingMethods BPy_IDArray_AsMapping
static PyObject * BPy_IDArray_get_typecode(BPy_IDArray *self, void *)
static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *)
static PyObject * BPy_IDGroup_repr(BPy_IDProperty *self)
static PyObject * BPy_IDGroup_ViewItems_CreatePyObject(BPy_IDProperty *group)
static PyModuleDef IDProp_module_def
static PyObject * idprop_py_from_idp_float(const IDProperty *prop)
static int BPy_IDGroup_Iter_is_gc(BPy_IDGroup_Iter *self)
static PySequenceMethods BPy_IDGroup_ViewKeys_as_sequence
static Py_ssize_t BPy_IDGroup_Map_Len(BPy_IDProperty *self)
static PyTypeObject * idp_array_py_type(BPy_IDArray *self, size_t *elem_size)
static PyObject * BPy_IDGroup_View_repr(BPy_IDGroup_View *self)
static char idp_sequence_type(PyObject *seq_fast)
static PyMethodDef BPy_IDGroup_methods[]
static int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject *val)
static int BPy_IDGroup_View_clear(BPy_IDGroup_View *self)
static PyObject * idprop_py_from_idp_id(IDProperty *prop)
static PyObject * BPy_IDGroup_items(BPy_IDProperty *self)
static int BPy_IDArray_ass_slice(BPy_IDArray *self, int begin, int end, PyObject *seq)
static PyObject * BPy_IDGroup_values(BPy_IDProperty *self)
PyObject * BPy_IDGroup_WrapData(ID *id, IDProperty *prop, IDProperty *parent)
static PyObject * BPy_Group_ViewKeys_iter(BPy_IDGroup_View *self)
bool pyrna_id_FromPyObject(PyObject *obj, ID **id)
static IDProperty * idp_from_PyBytes(IDProperty *prop_exist, const char *name, PyObject *ob, const bool, const bool can_create)
static int BPy_IDArray_getbuffer(BPy_IDArray *self, Py_buffer *view, int flags)
PyTypeObject BPy_IDGroup_IterItems_Type
static PyObject * BPy_IDGroup_View_reversed(BPy_IDGroup_View *self, PyObject *)
static PyObject * BPy_IDArray_subscript(BPy_IDArray *self, PyObject *item)
static PyObject * BPy_IDGroup_ViewValues_CreatePyObject(BPy_IDProperty *group)
static Py_hash_t BPy_IDGroup_hash(BPy_IDProperty *self)
static PyObject * idprop_py_from_idp_string(const IDProperty *prop)
static Py_ssize_t BPy_IDArray_Len(BPy_IDArray *self)
static int idp_array_type_from_formatstr_and_size(const char *typestr, Py_ssize_t itemsize)
static int BPy_IDGroup_Iter_traverse(BPy_IDGroup_Iter *self, visitproc visit, void *arg)
static PyObject * BPy_IDGroup_iter(BPy_IDProperty *self)
#define SHARED_MEMBER_SET(member, value)
static PyObject * idprop_py_from_idp_group(ID *id, IDProperty *prop, IDProperty *parent)
PyObject * BPy_Wrap_GetValues_View_WithID(ID *id, IDProperty *prop)
static PyMappingMethods BPy_IDGroup_Mapping
static IDProperty * idp_from_DatablockPointer(IDProperty *prop_exist, const char *name, PyObject *ob, const bool, const bool can_create)
#define BPy_IDGroup_Check(v)
void IDPropertyUIData_Init_Types()
void * MEM_mallocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
std::unique_ptr< IDProperty, IDPropertyDeleter > create_bool(StringRef prop_name, bool value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_BOOLEAN, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
float wrap(float value, float max, float min)
const char * PyC_UnicodeAsBytesAndSize(PyObject *py_str, Py_ssize_t *r_size, PyObject **r_coerce)
char PyC_StructFmt_type_from_str(const char *typestr)
PyObject * PyC_UnicodeFromBytesAndSize(const char *str, Py_ssize_t size)
bool PyC_StructFmt_type_is_int_any(char format)
int PyC_Long_AsBool(PyObject *value)
int PyC_AsArray(void *array, const size_t array_item_size, PyObject *value, const Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
bool PyC_StructFmt_type_is_float_any(char format)
const char * PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce)
header-only compatibility defines.
#define PyTuple_SET_ITEMS(op_arg,...)
PyObject_VAR_HEAD BPy_IDProperty * group
PyObject_VAR_HEAD BPy_IDProperty * group
PyObject_VAR_HEAD struct ID * owner_id
struct IDProperty * parent
IDPropertyUIData * ui_data
struct IDPropertyTemplate::@032057005265002020267344110225167212360002125060 array
struct IDPropertyTemplate::@306303166102371126056157213146124155011254157272 string