option to have scripts run on startup for per blendfile UI's
This commit is contained in:
@@ -51,6 +51,10 @@ class TEXT_HT_header(bpy.types.Header):
|
|||||||
row.itemR(st, "word_wrap", text="")
|
row.itemR(st, "word_wrap", text="")
|
||||||
row.itemR(st, "syntax_highlight", text="")
|
row.itemR(st, "syntax_highlight", text="")
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
row.itemO("text.run_script")
|
||||||
|
row.itemR(text, "use_module")
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
if text.filename != "":
|
if text.filename != "":
|
||||||
@@ -64,9 +68,6 @@ class TEXT_HT_header(bpy.types.Header):
|
|||||||
else:
|
else:
|
||||||
row.itemL(text="Text: Internal")
|
row.itemL(text="Text: Internal")
|
||||||
|
|
||||||
row = layout.row()
|
|
||||||
row.itemO("text.run_script")
|
|
||||||
|
|
||||||
|
|
||||||
class TEXT_PT_properties(bpy.types.Panel):
|
class TEXT_PT_properties(bpy.types.Panel):
|
||||||
bl_space_type = 'TEXT_EDITOR'
|
bl_space_type = 'TEXT_EDITOR'
|
||||||
|
@@ -194,6 +194,10 @@ static void rna_def_text(BlenderRNA *brna)
|
|||||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||||
RNA_def_property_ui_text(prop, "Memory", "Text file is in memory, without a corresponding file on disk.");
|
RNA_def_property_ui_text(prop, "Memory", "Text file is in memory, without a corresponding file on disk.");
|
||||||
|
|
||||||
|
prop= RNA_def_property(srna, "use_module", PROP_BOOLEAN, PROP_NONE);
|
||||||
|
RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISSCRIPT);
|
||||||
|
RNA_def_property_ui_text(prop, "Register", "Register this text as a module on loading.");
|
||||||
|
|
||||||
prop= RNA_def_property(srna, "lines", PROP_COLLECTION, PROP_NONE);
|
prop= RNA_def_property(srna, "lines", PROP_COLLECTION, PROP_NONE);
|
||||||
RNA_def_property_struct_type(prop, "TextLine");
|
RNA_def_property_struct_type(prop, "TextLine");
|
||||||
RNA_def_property_ui_text(prop, "Lines", "Lines of text.");
|
RNA_def_property_ui_text(prop, "Lines", "Lines of text.");
|
||||||
|
@@ -72,72 +72,73 @@ extern "C" {
|
|||||||
|
|
||||||
This is necassary to avoid blender buttons storing invalid pointers to freed
|
This is necassary to avoid blender buttons storing invalid pointers to freed
|
||||||
python data.*/
|
python data.*/
|
||||||
void BPy_Set_DrawButtonsList(void *list);
|
// void BPy_Set_DrawButtonsList(void *list);
|
||||||
void BPy_Free_DrawButtonsList(void);
|
// void BPy_Free_DrawButtonsList(void);
|
||||||
|
//
|
||||||
void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
|
void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
|
||||||
void BPY_pyconstraint_settings(void *arg1, void *arg2);
|
// void BPY_pyconstraint_settings(void *arg1, void *arg2);
|
||||||
void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
|
void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
|
||||||
void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
|
void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
|
||||||
int BPY_is_pyconstraint(struct Text *text);
|
int BPY_is_pyconstraint(struct Text *text);
|
||||||
void BPY_free_pyconstraint_links(struct Text *text);
|
// void BPY_free_pyconstraint_links(struct Text *text);
|
||||||
|
//
|
||||||
void BPY_start_python( int argc, char **argv );
|
void BPY_start_python( int argc, char **argv );
|
||||||
void BPY_end_python( void );
|
void BPY_end_python( void );
|
||||||
void init_syspath( int first_time );
|
// void init_syspath( int first_time );
|
||||||
void syspath_append( char *dir );
|
// void syspath_append( char *dir );
|
||||||
void BPY_rebuild_syspath( void );
|
// void BPY_rebuild_syspath( void );
|
||||||
int BPY_path_update( void );
|
// int BPY_path_update( void );
|
||||||
|
//
|
||||||
int BPY_Err_getLinenumber( void );
|
// int BPY_Err_getLinenumber( void );
|
||||||
const char *BPY_Err_getFilename( void );
|
// const char *BPY_Err_getFilename( void );
|
||||||
|
//
|
||||||
int BPY_txt_do_python_Text( struct Text *text );
|
// int BPY_txt_do_python_Text( struct Text *text );
|
||||||
int BPY_menu_do_python( short menutype, int event );
|
// int BPY_menu_do_python( short menutype, int event );
|
||||||
int BPY_menu_do_shortcut( short menutype, unsigned short key, unsigned short modifiers );
|
// int BPY_menu_do_shortcut( short menutype, unsigned short key, unsigned short modifiers );
|
||||||
int BPY_menu_invoke( struct BPyMenu *pym, short menutype );
|
// int BPY_menu_invoke( struct BPyMenu *pym, short menutype );
|
||||||
|
|
||||||
/* 2.5 UI Scripts */
|
/* 2.5 UI Scripts */
|
||||||
int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text, struct ReportList *reports ); // 2.5 working
|
int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text, struct ReportList *reports ); // 2.5 working
|
||||||
int BPY_run_script_space_draw(const struct bContext *C, struct SpaceScript * sc); // 2.5 working
|
int BPY_run_script_space_draw(const struct bContext *C, struct SpaceScript * sc); // 2.5 working
|
||||||
// int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working
|
// int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working
|
||||||
void BPY_update_modules( void ); // XXX - annoying, need this for pointers that get out of date
|
void BPY_update_modules( void ); // XXX - annoying, need this for pointers that get out of date
|
||||||
|
//
|
||||||
int BPY_context_get(struct bContext *C, const char *member, struct bContextDataResult *result);
|
int BPY_context_get(struct bContext *C, const char *member, struct bContextDataResult *result);
|
||||||
|
//
|
||||||
int BPY_run_script(struct Script *script);
|
// int BPY_run_script(struct Script *script);
|
||||||
void BPY_free_compiled_text( struct Text *text );
|
void BPY_free_compiled_text( struct Text *text );
|
||||||
|
//
|
||||||
int BPY_has_onload_script( void );
|
// int BPY_has_onload_script( void );
|
||||||
|
//
|
||||||
int BPY_is_spacehandler(struct Text *text, char spacetype);
|
// int BPY_is_spacehandler(struct Text *text, char spacetype);
|
||||||
int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa);
|
// int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa);
|
||||||
int BPY_add_spacehandler(struct Text *txt, struct ScrArea *sa,char spacetype);
|
// int BPY_add_spacehandler(struct Text *txt, struct ScrArea *sa,char spacetype);
|
||||||
int BPY_has_spacehandler(struct Text *text, struct ScrArea *sa);
|
// int BPY_has_spacehandler(struct Text *text, struct ScrArea *sa);
|
||||||
void BPY_screen_free_spacehandlers(struct bScreen *sc);
|
// void BPY_screen_free_spacehandlers(struct bScreen *sc);
|
||||||
int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event,
|
// int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event,
|
||||||
short eventValue, unsigned short space_event);
|
// short eventValue, unsigned short space_event);
|
||||||
|
//
|
||||||
void BPY_pydriver_update(void);
|
// void BPY_pydriver_update(void);
|
||||||
float BPY_pydriver_eval(struct ChannelDriver *driver);
|
float BPY_pydriver_eval(struct ChannelDriver *driver);
|
||||||
|
//
|
||||||
int BPY_button_eval(struct bContext *C, char *expr, double *value);
|
int BPY_button_eval(struct bContext *C, char *expr, double *value);
|
||||||
|
|
||||||
/* format importer hook */
|
/* format importer hook */
|
||||||
int BPY_call_importloader( char *name );
|
int BPY_call_importloader( char *name );
|
||||||
|
//
|
||||||
void BPY_spacescript_do_pywin_draw( struct SpaceScript *sc );
|
// void BPY_spacescript_do_pywin_draw( struct SpaceScript *sc );
|
||||||
void BPY_spacescript_do_pywin_event( struct SpaceScript *sc,
|
// void BPY_spacescript_do_pywin_event( struct SpaceScript *sc,
|
||||||
unsigned short event, short val, char ascii );
|
// unsigned short event, short val, char ascii );
|
||||||
void BPY_clear_script( struct Script *script );
|
// void BPY_clear_script( struct Script *script );
|
||||||
void BPY_free_finished_script( struct Script *script );
|
// void BPY_free_finished_script( struct Script *script );
|
||||||
void BPY_scripts_clear_pyobjects( void );
|
// void BPY_scripts_clear_pyobjects( void );
|
||||||
|
//
|
||||||
void error_pyscript( void );
|
// void error_pyscript( void );
|
||||||
void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
|
// void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
|
||||||
void BPY_set_context(struct bContext *C);
|
void BPY_set_context(struct bContext *C);
|
||||||
/* void BPY_Err_Handle(struct Text *text); */
|
/* void BPY_Err_Handle(struct Text *text); */
|
||||||
/* int BPY_spacetext_is_pywin(struct SpaceText *st); */
|
/* int BPY_spacetext_is_pywin(struct SpaceText *st); */
|
||||||
|
void BPY_load_user_modules(struct bContext *C);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
@@ -54,12 +54,35 @@ void bpy_import_main_set(struct Main *maggie)
|
|||||||
bpy_import_main= maggie;
|
bpy_import_main= maggie;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *bpy_text_import( Text *text )
|
||||||
|
{
|
||||||
|
char *buf = NULL;
|
||||||
|
char modulename[24];
|
||||||
|
int len;
|
||||||
|
|
||||||
PyObject *bpy_text_import( char *name, int *found )
|
if( !text->compiled ) {
|
||||||
|
buf = txt_to_buf( text );
|
||||||
|
text->compiled = Py_CompileString( buf, text->id.name+2, Py_file_input );
|
||||||
|
MEM_freeN( buf );
|
||||||
|
|
||||||
|
if( PyErr_Occurred( ) ) {
|
||||||
|
PyErr_Print( );
|
||||||
|
PyErr_Clear( );
|
||||||
|
PySys_SetObject("last_traceback", NULL);
|
||||||
|
free_compiled_text( text );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
len= strlen(text->id.name+2) - 3;
|
||||||
|
strncpy(modulename, text->id.name+2, len);
|
||||||
|
return PyImport_ExecCodeModule(modulename, text->compiled);
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *bpy_text_import_name( char *name, int *found )
|
||||||
{
|
{
|
||||||
Text *text;
|
Text *text;
|
||||||
char txtname[22]; /* 21+NULL */
|
char txtname[22]; /* 21+NULL */
|
||||||
char *buf = NULL;
|
|
||||||
int namelen = strlen( name );
|
int namelen = strlen( name );
|
||||||
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
|
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
|
||||||
Main *maggie= bpy_import_main;
|
Main *maggie= bpy_import_main;
|
||||||
@@ -86,21 +109,7 @@ PyObject *bpy_text_import( char *name, int *found )
|
|||||||
else
|
else
|
||||||
*found = 1;
|
*found = 1;
|
||||||
|
|
||||||
if( !text->compiled ) {
|
return bpy_text_import(text);
|
||||||
buf = txt_to_buf( text );
|
|
||||||
text->compiled = Py_CompileString( buf, text->id.name+2, Py_file_input );
|
|
||||||
MEM_freeN( buf );
|
|
||||||
|
|
||||||
if( PyErr_Occurred( ) ) {
|
|
||||||
PyErr_Print( );
|
|
||||||
PyErr_Clear( );
|
|
||||||
PySys_SetObject("last_traceback", NULL);
|
|
||||||
free_compiled_text( text );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return PyImport_ExecCodeModule( name, text->compiled );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -195,7 +204,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k
|
|||||||
PyErr_Fetch( &exception, &err, &tb ); /* get the python error incase we cant import as blender text either */
|
PyErr_Fetch( &exception, &err, &tb ); /* get the python error incase we cant import as blender text either */
|
||||||
|
|
||||||
/* importing from existing modules failed, see if we have this module as blender text */
|
/* importing from existing modules failed, see if we have this module as blender text */
|
||||||
newmodule = bpy_text_import( name, &found );
|
newmodule = bpy_text_import_name( name, &found );
|
||||||
|
|
||||||
if( newmodule ) {/* found module as blender text, ignore above exception */
|
if( newmodule ) {/* found module as blender text, ignore above exception */
|
||||||
PyErr_Clear( );
|
PyErr_Clear( );
|
||||||
|
@@ -44,7 +44,10 @@
|
|||||||
#include "compile.h" /* for the PyCodeObject */
|
#include "compile.h" /* for the PyCodeObject */
|
||||||
#include "eval.h" /* for PyEval_EvalCode */
|
#include "eval.h" /* for PyEval_EvalCode */
|
||||||
|
|
||||||
PyObject* bpy_text_import( char *name, int *found );
|
struct Text;
|
||||||
|
|
||||||
|
PyObject* bpy_text_import( struct Text *text );
|
||||||
|
PyObject* bpy_text_import_name( char *name, int *found );
|
||||||
PyObject* bpy_text_reimport( PyObject *module, int *found );
|
PyObject* bpy_text_reimport( PyObject *module, int *found );
|
||||||
/* void bpy_text_clear_modules( int clear_all );*/ /* Clear user modules */
|
/* void bpy_text_clear_modules( int clear_all );*/ /* Clear user modules */
|
||||||
extern PyMethodDef bpy_import_meth[];
|
extern PyMethodDef bpy_import_meth[];
|
||||||
|
@@ -65,6 +65,7 @@
|
|||||||
#include "BKE_text.h"
|
#include "BKE_text.h"
|
||||||
#include "BKE_context.h"
|
#include "BKE_context.h"
|
||||||
#include "BKE_global.h"
|
#include "BKE_global.h"
|
||||||
|
#include "BKE_main.h"
|
||||||
|
|
||||||
#include "BPY_extern.h"
|
#include "BPY_extern.h"
|
||||||
|
|
||||||
@@ -864,7 +865,28 @@ int BPY_button_eval(bContext *C, char *expr, double *value)
|
|||||||
return error_ret;
|
return error_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BPY_load_user_modules(bContext *C)
|
||||||
|
{
|
||||||
|
PyGILState_STATE gilstate;
|
||||||
|
Text *text;
|
||||||
|
|
||||||
|
bpy_context_set(C, &gilstate);
|
||||||
|
|
||||||
|
for(text=CTX_data_main(C)->text.first; text; text= text->id.next) {
|
||||||
|
if(text->flags & TXT_ISSCRIPT && BLI_testextensie(text->id.name+2, ".py")) {
|
||||||
|
PyObject *module= bpy_text_import(text);
|
||||||
|
|
||||||
|
if (module==NULL) {
|
||||||
|
PyErr_Print();
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Py_DECREF(module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bpy_context_clear(C, &gilstate);
|
||||||
|
}
|
||||||
|
|
||||||
int BPY_context_get(bContext *C, const char *member, bContextDataResult *result)
|
int BPY_context_get(bContext *C, const char *member, bContextDataResult *result)
|
||||||
{
|
{
|
||||||
|
@@ -89,7 +89,7 @@
|
|||||||
|
|
||||||
#include "GPU_draw.h"
|
#include "GPU_draw.h"
|
||||||
|
|
||||||
// XXX #include "BPY_extern.h"
|
#include "BPY_extern.h"
|
||||||
|
|
||||||
#include "WM_api.h"
|
#include "WM_api.h"
|
||||||
#include "WM_types.h"
|
#include "WM_types.h"
|
||||||
@@ -276,6 +276,9 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
|
|||||||
// refresh_interface_font();
|
// refresh_interface_font();
|
||||||
|
|
||||||
CTX_wm_window_set(C, NULL); /* exits queues */
|
CTX_wm_window_set(C, NULL); /* exits queues */
|
||||||
|
|
||||||
|
/* run any texts that were loaded in and flagged as modules */
|
||||||
|
BPY_load_user_modules(C);
|
||||||
}
|
}
|
||||||
else if(retval==1)
|
else if(retval==1)
|
||||||
BKE_write_undo(C, "Import file");
|
BKE_write_undo(C, "Import file");
|
||||||
|
@@ -494,6 +494,7 @@ int main(int argc, char **argv)
|
|||||||
#ifndef DISABLE_PYTHON
|
#ifndef DISABLE_PYTHON
|
||||||
BPY_set_context(C); /* necessary evil */
|
BPY_set_context(C); /* necessary evil */
|
||||||
BPY_start_python(argc, argv);
|
BPY_start_python(argc, argv);
|
||||||
|
BPY_load_user_modules(C);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// XXX BRECHT SOLVE
|
// XXX BRECHT SOLVE
|
||||||
@@ -533,6 +534,7 @@ int main(int argc, char **argv)
|
|||||||
#ifndef DISABLE_PYTHON
|
#ifndef DISABLE_PYTHON
|
||||||
BPY_set_context(C); /* necessary evil */
|
BPY_set_context(C); /* necessary evil */
|
||||||
BPY_start_python(argc, argv);
|
BPY_start_python(argc, argv);
|
||||||
|
BPY_load_user_modules(C);
|
||||||
#endif
|
#endif
|
||||||
BLI_where_is_temp( btempdir, 0 ); /* call after loading the .B.blend so we can read U.tempdir */
|
BLI_where_is_temp( btempdir, 0 ); /* call after loading the .B.blend so we can read U.tempdir */
|
||||||
}
|
}
|
||||||
|
@@ -1608,7 +1608,7 @@ PyObject *KXpy_import(PyObject *self, PyObject *args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Import blender texts as python modules */
|
/* Import blender texts as python modules */
|
||||||
m= bpy_text_import(name, &found);
|
m= bpy_text_import_name(name, &found);
|
||||||
if (m)
|
if (m)
|
||||||
return m;
|
return m;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user