2010-02-11 14:08:22 +00:00
/**
* $ 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 ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2010-02-11 14:08:22 +00:00
*
* 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"
2010-02-13 01:13:16 +00:00
# include "BPy_Freestyle.h"
2010-02-11 14:08:22 +00:00
/* 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 ( ) ;
2010-02-13 01:13:16 +00:00
Freestyle_Init ( ) ;
2010-02-11 14:08:22 +00:00
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 " ) ;
}