54 #include "../generic/py_capi_utils.h"
55 #include "../generic/python_utildefines.h"
58 #include "../generic/idprop_py_api.h"
68 ".. function:: script_paths()\n"
70 " Return 2 paths to blender scripts directories.\n"
72 " :return: (system, user) strings will be empty when not found.\n"
73 " :rtype: tuple of strings\n");
76 PyObject *
ret = PyTuple_New(2);
83 PyTuple_SET_ITEM(
ret, 0, item);
87 PyTuple_SET_ITEM(
ret, 1, item);
99 ".. function:: blend_paths(absolute=False, packed=False, local=False)\n"
101 " Returns a list of paths to external files referenced by the loaded .blend file.\n"
103 " :arg absolute: When true the paths returned are made absolute.\n"
104 " :type absolute: boolean\n"
105 " :arg packed: When true skip file paths for packed data.\n"
106 " :type packed: boolean\n"
107 " :arg local: When true skip linked library paths.\n"
108 " :type local: boolean\n"
109 " :return: path list.\n"
110 " :rtype: list of strings\n");
120 static const char *_keywords[] = {
"absolute",
"packed",
"local",
NULL};
121 static _PyArg_Parser _parser = {
"|O&O&O&:blend_paths", _keywords, 0};
122 if (!_PyArg_ParseTupleAndKeywordsFast(args,
144 list = PyList_New(0);
163 const char *subdir =
NULL;
167 static const char *_keywords[] = {
"type",
"subdir",
NULL};
168 static _PyArg_Parser _parser = {
"O&|s:user_resource", _keywords, 0};
181 ".. function:: system_resource(type, path=\"\")\n"
183 " Return a system resource path.\n"
185 " :arg type: string in ['DATAFILES', 'SCRIPTS', 'PYTHON'].\n"
186 " :type type: string\n"
187 " :arg path: Optional subdirectory.\n"
188 " :type path: string\n");
199 const char *subdir =
NULL;
203 static const char *_keywords[] = {
"type",
"path",
NULL};
204 static _PyArg_Parser _parser = {
"O&|s:system_resource", _keywords, 0};
215 bpy_resource_path_doc,
216 ".. function:: resource_path(type, major=bpy.app.version[0], minor=bpy.app.version[1])\n"
218 " Return the base path for storing system files.\n"
220 " :arg type: string in ['USER', 'LOCAL', 'SYSTEM'].\n"
221 " :type type: string\n"
222 " :arg major: major version, defaults to current.\n"
223 " :type major: int\n"
224 " :arg minor: minor version, defaults to current.\n"
225 " :type minor: string\n"
226 " :return: the resource path (not necessarily existing).\n"
227 " :rtype: string\n");
241 static const char *_keywords[] = {
"type",
"major",
"minor",
NULL};
242 static _PyArg_Parser _parser = {
"O&|ii:resource_path", _keywords, 0};
243 if (!_PyArg_ParseTupleAndKeywordsFast(
254 ".. function:: escape_identifier(string)\n"
256 " Simple string escaping function used for animation paths.\n"
258 " :arg string: text\n"
259 " :type string: string\n"
260 " :return: The escaped string.\n"
261 " :rtype: string\n");
264 Py_ssize_t value_str_len;
265 const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len);
267 if (value_str ==
NULL) {
268 PyErr_SetString(PyExc_TypeError,
"expected a string");
272 const size_t size = (value_str_len * 2) + 1;
273 char *value_escape_str = PyMem_MALLOC(
size);
274 const Py_ssize_t value_escape_str_len =
BLI_str_escape(value_escape_str, value_str,
size);
276 PyObject *value_escape;
277 if (value_escape_str_len == value_str_len) {
279 value_escape = value;
282 value_escape = PyUnicode_FromStringAndSize(value_escape_str, value_escape_str_len);
285 PyMem_FREE(value_escape_str);
291 ".. function:: unescape_identifier(string)\n"
293 " Simple string un-escape function used for animation paths.\n"
294 " This performs the reverse of `escape_identifier`.\n"
296 " :arg string: text\n"
297 " :type string: string\n"
298 " :return: The un-escaped string.\n"
299 " :rtype: string\n");
302 Py_ssize_t value_str_len;
303 const char *value_str = PyUnicode_AsUTF8AndSize(value, &value_str_len);
305 if (value_str ==
NULL) {
306 PyErr_SetString(PyExc_TypeError,
"expected a string");
310 const size_t size = value_str_len + 1;
311 char *value_unescape_str = PyMem_MALLOC(
size);
312 const Py_ssize_t value_unescape_str_len =
BLI_str_unescape(value_unescape_str, value_str,
size);
314 PyObject *value_unescape;
315 if (value_unescape_str_len == value_str_len) {
317 value_unescape = value;
320 value_unescape = PyUnicode_FromStringAndSize(value_unescape_str, value_unescape_str_len);
323 PyMem_FREE(value_unescape_str);
325 return value_unescape;
332 bpy_script_paths_doc,
337 METH_VARARGS | METH_KEYWORDS,
343 METH_VARARGS | METH_KEYWORDS,
349 METH_VARARGS | METH_KEYWORDS,
350 bpy_system_resource_doc,
355 METH_VARARGS | METH_KEYWORDS,
356 bpy_resource_path_doc,
362 bpy_escape_identifier_doc,
365 "unescape_identifier",
368 bpy_unescape_identifier_doc,
373 PyObject *
mod = PyImport_ImportModuleLevel(modname,
NULL,
NULL,
NULL, 0);
400 PyObject *sys_path = PySys_GetObject(
"path");
401 PyObject *py_modpath = PyUnicode_FromString(modpath);
402 PyList_Insert(sys_path, 0, py_modpath);
403 Py_DECREF(py_modpath);
406 printf(
"bpy: couldn't find 'scripts/modules', blender probably wont start.\n");
410 #ifdef WITH_FREESTYLE
414 mod = PyModule_New(
"_bpy");
417 PyDict_SetItemString(PyImport_GetModuleDict(),
"_bpy",
mod);
456 PyModule_AddObject(
mod,
461 PyModule_AddObject(
mod,
464 PyModule_AddObject(
mod,
467 PyModule_AddObject(
mod,
470 PyModule_AddObject(
mod,
473 PyModule_AddObject(
mod,
478 PyModule_AddObject(
mod,
481 PyModule_AddObject(
mod,
485 PyModule_AddObject(
mod,
488 PyModule_AddObject(
mod,
@ BLENDER_SYSTEM_DATAFILES
const char * BKE_appdir_folder_id_version(const int folder_id, const int version, const bool check_is_dir)
const char * BKE_appdir_folder_id(const int folder_id, const char *subfolder)
@ BLENDER_RESOURCE_PATH_SYSTEM
@ BLENDER_RESOURCE_PATH_LOCAL
@ BLENDER_RESOURCE_PATH_USER
const char * BKE_appdir_folder_id_user_notest(const int folder_id, const char *subfolder)
void BKE_bpath_traverse_main(struct Main *bmain, BPathVisitor visit_cb, const int flag, void *bpath_user_data)
@ BKE_BPATH_TRAVERSE_SKIP_LIBRARY
@ BKE_BPATH_TRAVERSE_SKIP_PACKED
size_t size_t char size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy) ATTR_NONNULL()
size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy) ATTR_NONNULL()
PyObject * Freestyle_Init(void)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
static bool bpy_blend_paths_visit_cb(void *userdata, char *UNUSED(path_dst), const char *path_src)
static PyObject * bpy_import_test(const char *modname)
PyDoc_STRVAR(bpy_script_paths_doc, ".. function:: script_paths()\n" "\n" " Return 2 paths to blender scripts directories.\n" "\n" " :return: (system, user) strings will be empty when not found.\n" " :rtype: tuple of strings\n")
void BPy_init_modules(struct bContext *C)
static PyMethodDef meth_bpy_resource_path
static PyObject * bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value)
static PyObject * bpy_script_paths(PyObject *UNUSED(self))
static PyMethodDef meth_bpy_blend_paths
PyObject * bpy_package_py
static PyMethodDef meth_bpy_script_paths
static PyObject * bpy_resource_path(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
static PyObject * bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
static PyMethodDef meth_bpy_unescape_identifier
static PyObject * bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
static PyObject * bpy_system_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
static PyMethodDef meth_bpy_escape_identifier
static PyObject * bpy_unescape_identifier(PyObject *UNUSED(self), PyObject *value)
static PyMethodDef meth_bpy_user_resource
static PyMethodDef meth_bpy_system_resource
PyObject * BPY_app_struct(void)
int BPY_library_load_type_ready(void)
PyObject * BPY_msgbus_module(void)
PyObject * BPY_operator_module(void)
PyObject * BPY_rna_props(void)
PyMethodDef meth_bpy_owner_id_set
PyMethodDef meth_bpy_owner_id_get
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
PyObject * BPY_rna_module(void)
PyMethodDef meth_bpy_unregister_class
PyMethodDef meth_bpy_register_class
PyObject * BPY_rna_types(void)
BPy_StructRNA * bpy_context_module
int BPY_rna_data_context_type_ready(void)
bool BPY_rna_gizmo_module(PyObject *mod_par)
void BPY_rna_types_extend_capi(void)
PyObject * BPY_utils_previews_module(void)
PyObject * BPY_utils_units(void)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
btMatrix3x3 absolute() const
Return the matrix with all values non negative.
void IDProp_Init_Types(void)
int PyC_ParseStringEnum(PyObject *o, void *p)
PyObject * PyC_UnicodeFromByte(const char *str)
int PyC_ParseBool(PyObject *o, void *p)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
ccl_device_inline int mod(int x, int m)