diff options
Diffstat (limited to 'source/blender/python/intern/bpy.c')
-rw-r--r-- | source/blender/python/intern/bpy.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c new file mode 100644 index 00000000000..de46aa71af9 --- /dev/null +++ b/source/blender/python/intern/bpy.c @@ -0,0 +1,136 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/* This file defines the '_bpy' module which is used by python's 'bpy' package. + * a script writer should never directly access this module */ + +#include <Python.h> + +#include "bpy_rna.h" +#include "bpy_app.h" +#include "bpy_props.h" +#include "bpy_operator.h" + +#include "BLI_path_util.h" + + /* external util modules */ +#include "../generic/Mathutils.h" +#include "../generic/Geometry.h" +#include "../generic/BGL.h" +#include "../generic/IDProp.h" + +#include "BPy_Freestyle.h" + +/* todo, make nice syntax for sphinx */ +static char bpy_home_paths_doc[] = "home_paths(subfolder), return 3 paths to blender home directories (system, local, user), strings will be empty when not found."; + +PyObject *bpy_home_paths(PyObject *self, PyObject *args) +{ + PyObject *ret= PyTuple_New(3); + char *path; + char *subfolder= ""; + + if (!PyArg_ParseTuple(args, "|s:blender_homes", &subfolder)) + return NULL; + + path= BLI_gethome_folder(subfolder, BLI_GETHOME_SYSTEM); + PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:"")); + + path= BLI_gethome_folder(subfolder, BLI_GETHOME_LOCAL); + PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:"")); + + path= BLI_gethome_folder(subfolder, BLI_GETHOME_USER); + PyTuple_SET_ITEM(ret, 2, PyUnicode_FromString(path?path:"")); + + return ret; +} + +static PyMethodDef meth_bpy_home_paths[] = {{ "home_paths", (PyCFunction)bpy_home_paths, METH_VARARGS, bpy_home_paths_doc}}; + +static void bpy_import_test(char *modname) +{ + PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0); + if(mod) { + Py_DECREF(mod); + } + else { + PyErr_Print(); + PyErr_Clear(); + } +} + +/***************************************************************************** +* Description: Creates the bpy module and adds it to sys.modules for importing +*****************************************************************************/ +void BPy_init_modules( void ) +{ + extern BPy_StructRNA *bpy_context_module; + PyObject *mod; + + /* Needs to be first since this dir is needed for future modules */ + char *modpath= BLI_gethome_folder("scripts/modules", BLI_GETHOME_ALL); + if(modpath) { + PyObject *sys_path= PySys_GetObject("path"); /* borrow */ + PyObject *py_modpath= PyUnicode_FromString(modpath); + PyList_Insert(sys_path, 0, py_modpath); /* add first */ + Py_DECREF(py_modpath); + } + + /* stand alone utility modules not related to blender directly */ + Geometry_Init(); + Mathutils_Init(); + BGL_Init(); + IDProp_Init_Types(); + Freestyle_Init(); + + + mod = PyModule_New("_bpy"); + + /* add the module so we can import it */ + PyDict_SetItemString(PySys_GetObject("modules"), "_bpy", mod); + Py_DECREF(mod); + + /* run first, initializes rna types */ + BPY_rna_init(); + + PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */ + bpy_import_test("bpy_types"); + PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */ + bpy_import_test("bpy_types"); + PyModule_AddObject( mod, "props", BPY_rna_props() ); + PyModule_AddObject( mod, "ops", BPY_operator_module() ); /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */ + PyModule_AddObject( mod, "app", BPY_app_struct() ); + + /* bpy context */ + bpy_context_module= ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type ); + RNA_pointer_create(NULL, &RNA_Context, NULL, &bpy_context_module->ptr); + bpy_context_module->freeptr= 0; + PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module); + + /* utility func's that have nowhere else to go */ + PyModule_AddObject(mod, meth_bpy_home_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_home_paths, NULL)); + + /* add our own modules dir, this is a python package */ + bpy_import_test("bpy"); +} |