/* * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * * This is a new part of Blender. * * Contributor(s): Willian P. Germano, Tom Musgrove, Michael Reimpell, * Yann Vernier, Ken Hughes * * ***** END GPL LICENSE BLOCK ***** */ #include #include "BDR_editobject.h" /* enter / leave editmode */ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_object.h" /* for during_script() and during_scriptlink() */ #include "BKE_scene.h" /* scene_find_camera() */ #include "BIF_mywindow.h" #include "BIF_imasel.h" #include "BSE_headerbuttons.h" #include "BSE_filesel.h" #include "BIF_editmesh.h" /* for undo_push_mesh() */ #include "BIF_screen.h" #include "BIF_space.h" #include "BIF_drawtext.h" #include "BIF_poseobject.h" #include "BIF_toolbox.h" /* for error() */ #include "DNA_view3d_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_text_types.h" #include "DNA_object_types.h" #include "mydevice.h" #include "blendef.h" /* OBACT */ #include "windowTheme.h" #include "Mathutils.h" #include "constant.h" #include "gen_utils.h" #include "Armature.h" /* Pivot Types -0 for Bounding Box Center; \n\ -1 for 3D Cursor\n\ -2 for Individual Centers\n\ -3 for Median Point\n\ -4 for Active Object"; */ #define PIVOT_BOUNDBOX 0 #define PIVOT_CURSOR 1 #define PIVOT_INDIVIDUAL 2 #define PIVOT_MEDIAN 3 #define PIVOT_ACTIVE 4 /* See Draw.c */ extern int EXPP_disable_force_draw; extern void setcameratoview3d(void); /*****************************************************************************/ /* Python API function prototypes for the Window module. */ /*****************************************************************************/ PyObject *M_Window_Redraw( PyObject * self, PyObject * args ); static PyObject *M_Window_RedrawAll( PyObject * self, PyObject * args ); static PyObject *M_Window_QRedrawAll( PyObject * self, PyObject * args ); static PyObject *M_Window_DrawProgressBar( PyObject * self, PyObject * args ); static PyObject *M_Window_GetCursorPos( PyObject * self ); static PyObject *M_Window_SetCursorPos( PyObject * self, PyObject * args ); static PyObject *M_Window_WaitCursor( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewVector( PyObject * self ); static PyObject *M_Window_GetActiveLayer( PyObject * self ); static PyObject *M_Window_SetActiveLayer( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewQuat( PyObject * self ); static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewOffset( PyObject * self ); static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args ); static PyObject *M_Window_GetViewMatrix( PyObject * self ); static PyObject *M_Window_GetPerspMatrix( PyObject * self ); static PyObject *M_Window_FileSelector( PyObject * self, PyObject * args ); static PyObject *M_Window_ImageSelector( PyObject * self, PyObject * args ); static PyObject *M_Window_EditMode( PyObject * self, PyObject * args ); static PyObject *M_Window_PoseMode( PyObject * self, PyObject * args ); static PyObject *M_Window_ViewLayers( PyObject * self, PyObject * args ); static PyObject *M_Window_CameraView( PyObject * self, PyObject * args ); static PyObject *M_Window_QTest( PyObject * self ); static PyObject *M_Window_QRead( PyObject * self ); static PyObject *M_Window_QAdd( PyObject * self, PyObject * args ); static PyObject *M_Window_QHandle( PyObject * self, PyObject * args ); static PyObject *M_Window_TestBreak( PyObject * self ); static PyObject *M_Window_GetMouseCoords( PyObject * self ); static PyObject *M_Window_SetMouseCoords( PyObject * self, PyObject * args ); static PyObject *M_Window_GetMouseButtons( PyObject * self ); static PyObject *M_Window_GetKeyQualifiers( PyObject * self ); static PyObject *M_Window_SetKeyQualifiers( PyObject * self, PyObject * args ); static PyObject *M_Window_GetAreaSize( PyObject * self ); static PyObject *M_Window_GetAreaID( PyObject * self ); static PyObject *M_Window_GetScreenSize( PyObject * self ); static PyObject *M_Window_GetScreens( PyObject * self ); static PyObject *M_Window_SetScreen( PyObject * self, PyObject * value ); static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args, PyObject * kwords ); static PyObject *M_Window_GetPivot( PyObject * self ); static PyObject *M_Window_SetPivot( PyObject * self, PyObject * value ); PyObject *Window_Init( void ); /*****************************************************************************/ /* The following string definitions are used for documentation strings. */ /* In Python these will be written to the console when doing a */ /* Blender.Window.__doc__ */ /*****************************************************************************/ static char M_Window_doc[] = "The Blender Window module\n\n"; static char M_Window_Redraw_doc[] = "() - Force a redraw of a specific Window Type (see Window.Types)"; static char M_Window_RedrawAll_doc[] = "() - Redraw all windows"; static char M_Window_QRedrawAll_doc[] = "() - Redraw all windows by queue event"; static char M_Window_FileSelector_doc[] = "(callback [, title, filename]) - Open a file selector window.\n\ The selected file name is used as argument to a function callback f(name)\n\ that you must provide. 'title' is optional and defaults to 'SELECT FILE'.\n\ 'filename' is optional and defaults to Blender.Get('filename').\n\n\ Example:\n\n\ import Blender\n\n\ def my_function(filename):\n\ print 'The selected file was: ', filename\n\n\ Blender.Window.FileSelector(my_function, 'SAVE FILE')\n"; static char M_Window_ImageSelector_doc[] = "(callback [, title, filename]) - Open an image selector window.\n\ The selected file name is used as argument to a function callback f(name)\n\ that you must provide. 'title' is optional and defaults to 'SELECT IMAGE'.\n\ 'filename' is optional and defaults to Blender.Get('filename').\n\n\ Example:\n\n\ import Blender\n\n\ def my_function(filename):\n\ print 'The selected image file was: ', filename\n\n\ Blender.Window.ImageSelector(my_function, 'LOAD IMAGE')\n"; static char M_Window_DrawProgressBar_doc[] = "(done, text) - Draw a progress bar.\n\ 'done' is a float value <= 1.0, 'text' contains info about what is\n\ currently being done."; static char M_Window_GetCursorPos_doc[] = "() - Get the current 3d cursor position as a list of three floats."; static char M_Window_SetCursorPos_doc[] = "([f,f,f]) - Set the current 3d cursor position from a list of three floats."; static char M_Window_WaitCursor_doc[] = "(bool) - Set cursor to wait mode (nonzero bool) or normal mode (0)."; static char M_Window_GetViewVector_doc[] = "() - Get the current 3d view vector as a list of three floats [x,y,z]."; static char M_Window_GetActiveLayer_doc[] = "() - Get the current 3d views active layer where new objects are created."; static char M_Window_SetActiveLayer_doc[] = "(int) - Set the current 3d views active layer where new objects are created."; static char M_Window_GetViewMatrix_doc[] = "() - Get the current 3d view matrix."; static char M_Window_GetPerspMatrix_doc[] = "() - Get the current 3d Persp matrix."; static char M_Window_EditMode_doc[] = "() - Get the current status -- 0: not in edit mode; 1: in edit mode.\n\ (status) - if 1: enter edit mode; if 0: leave edit mode.\n\ Returns the current status. This function is mostly useful to leave\n\ edit mode before applying changes to a mesh (otherwise the changes will\n\ be lost) and then returning to it upon leaving."; static char M_Window_PoseMode_doc[] = "() - Get the current status -- 0: not in pose mode; 1: in edit mode"; static char M_Window_ViewLayers_doc[] = "(layers = [], winid = None) - Get/set active layers in all 3d View windows.\n\ () - Make no changes, only return currently visible layers.\n\ (layers = []) - a list of integers, each in the range [1, 20].\n\ (layers = [], winid = int) - layers as above, winid is an optional.\n\ arg that makes the function only set layers for that view.\n\ This function returns the currently visible layers as a list of ints."; static char M_Window_GetViewQuat_doc[] = "() - Get the current VIEW3D view quaternion values."; static char M_Window_SetViewQuat_doc[] = "(quat) - Set the current VIEW3D view quaternion values.\n\ (quat) - [f,f,f,f] or f,f,f,f: the new float values."; static char M_Window_GetViewOffset_doc[] = "() - Get the current VIEW3D view offset values."; static char M_Window_SetViewOffset_doc[] = "(ofs) - Set the current VIEW3D view offset values.\n\ (ofs) - [f,f,f] or f,f,f: the new float values."; static char M_Window_CameraView_doc[] = "(camtov3d = 0) - Set the current VIEW3D view to the active camera's view.\n\ (camtov3d = 0) - bool: if nonzero it's the camera that gets positioned at the\n\ current view, instead of the view being changed to that of the camera.\n\n\ If no camera is the active object, the active camera for the current scene\n\ is used."; static char M_Window_QTest_doc[] = "() - Check if there are pending events in the event queue."; static char M_Window_QRead_doc[] = "() - Get the next pending event from the event queue.\n\ This function returns a list [event, val], where:\n\ event - int: the key or mouse event (see Blender.Draw module);\n\ val - int: if 1 it's a key or mouse button press, if 0 a release. For\n\ mouse movement events 'val' returns the new coordinates in x or y."; static char M_Window_QAdd_doc[] = "(win, evt, val, after = 0) - Add an event to some window's event queue.\n\ (win) - int: the win id, see Blender.Window.GetScreenInfo();\n\ (evt) - int: the event number, see events in Blender.Draw;\n\ (val) - bool: 1 for a key press, 0 for a release;\n\ (after) - bool: if 1 the event is put after the current queue and added later."; static char M_Window_QHandle_doc[] = "(win) - Process all events for the given window (area) now.\n\ (win) - int: the window id, see Blender.Window.GetScreenInfo().\n\n\ See Blender.Window.QAdd() for how to send events to a particular window."; static char M_Window_TestBreak_doc[] = "() - Returns true if the user has pressed escape."; static char M_Window_GetMouseCoords_doc[] = "() - Get mouse pointer's current screen coordinates."; static char M_Window_SetMouseCoords_doc[] = "(x, y) - Set mouse pointer's current screen coordinates.\n\ (x,y) - ints ([x, y] also accepted): the new x, y coordinates."; static char M_Window_GetMouseButtons_doc[] = "() - Get the current mouse button state (see Blender.Window.MButs dict)."; static char M_Window_GetKeyQualifiers_doc[] = "() - Get the current qualifier keys state.\n\ An int is returned: or'ed combination of values in Blender.Window.Qual's dict."; static char M_Window_SetKeyQualifiers_doc[] = "(qual) - Fake qualifier keys state.\n\ (qual) - int: an or'ed combination of the values in Blender.Window.Qual dict.\n\ Note: remember to reset to 0 after handling the related event (see QAdd())."; static char M_Window_GetAreaID_doc[] = "() - Get the current window's (area) ID."; static char M_Window_GetAreaSize_doc[] = "() - Get the current window's (area) size as [width, height]."; static char M_Window_GetScreenSize_doc[] = "() - Get the screen's size as [width, height]."; static char M_Window_GetScreens_doc[] = "() - Get a list with the names of all available screens."; static char M_Window_SetScreen_doc[] = "(name) - Set current screen to the one with the given 'name'."; static char M_Window_GetScreenInfo_doc[] = "(type = -1, rect = 'win', screen = None)\n\ - Get info about the the areas in the current screen setup.\n\ (type = -1) - int: the space type (Blender.Window.Types) to restrict the\n\ results to, all if -1;\n\ (rect = 'win') - str: the rectangle of interest. This defines if the corner\n\ coordinates returned will refer to:\n\ - the whole area: 'total';\n\ - only the header: 'header';\n\ - only the window content (default): 'win'.\n\ (screen = None) - str: the screen name, current if not given.\n\n\ A list of dictionaries (one for each area) is returned.\n\ Each dictionary has keys:\n\ 'vertices': [xmin, ymin, xmax, ymax] area corners;\n\ 'win': window type, see Blender.Window.Types dict;\n\ 'id': area's id."; static char M_Window_SetPivot_doc[] = "(Pivot) - Set Pivot Mode for 3D Viewport:\n\ Options are: \n\ -PivotTypes.BOUNDBOX for Bounding Box Center; \n\ -PivotTypes.CURSOR for 3D Cursor\n\ -PivotTypes.INDIVIDUAL for Individual Centers\n\ -PivotTypes.MEDIAN for Median Point\n\ -PivotTypes.ACTIVE for Active Object"; static char M_Window_GetPivot_doc[] = "Return the pivot for the active 3d window"; /*****************************************************************************/ /* Python method structure definition for Blender.Window module: */ /*****************************************************************************/ struct PyMethodDef M_Window_methods[] = { {"Redraw", M_Window_Redraw, METH_VARARGS, M_Window_Redraw_doc}, {"RedrawAll", M_Window_RedrawAll, METH_VARARGS, M_Window_RedrawAll_doc}, {"QRedrawAll", M_Window_QRedrawAll, METH_VARARGS, M_Window_QRedrawAll_doc}, {"FileSelector", M_Window_FileSelector, METH_VARARGS, M_Window_FileSelector_doc}, {"ImageSelector", ( PyCFunction ) M_Window_ImageSelector, METH_VARARGS, M_Window_ImageSelector_doc}, {"DrawProgressBar", M_Window_DrawProgressBar, METH_VARARGS, M_Window_DrawProgressBar_doc}, {"drawProgressBar", M_Window_DrawProgressBar, METH_VARARGS, M_Window_DrawProgressBar_doc}, {"GetCursorPos", ( PyCFunction ) M_Window_GetCursorPos, METH_NOARGS, M_Window_GetCursorPos_doc}, {"SetCursorPos", M_Window_SetCursorPos, METH_VARARGS, M_Window_SetCursorPos_doc}, {"WaitCursor", M_Window_WaitCursor, METH_VARARGS, M_Window_WaitCursor_doc}, {"GetViewVector", ( PyCFunction ) M_Window_GetViewVector, METH_NOARGS, M_Window_GetViewVector_doc}, {"GetActiveLayer", ( PyCFunction ) M_Window_GetActiveLayer, METH_NOARGS, M_Window_GetActiveLayer_doc}, {"SetActiveLayer", ( PyCFunction ) M_Window_SetActiveLayer, METH_VARARGS, M_Window_SetActiveLayer_doc}, {"GetViewQuat", ( PyCFunction ) M_Window_GetViewQuat, METH_NOARGS, M_Window_GetViewQuat_doc}, {"SetViewQuat", ( PyCFunction ) M_Window_SetViewQuat, METH_VARARGS, M_Window_SetViewQuat_doc}, {"GetViewOffset", ( PyCFunction ) M_Window_GetViewOffset, METH_NOARGS, M_Window_GetViewOffset_doc}, {"SetViewOffset", ( PyCFunction ) M_Window_SetViewOffset, METH_VARARGS, M_Window_SetViewOffset_doc}, {"GetViewMatrix", ( PyCFunction ) M_Window_GetViewMatrix, METH_NOARGS, M_Window_GetViewMatrix_doc}, {"GetPerspMatrix", ( PyCFunction ) M_Window_GetPerspMatrix, METH_NOARGS, M_Window_GetPerspMatrix_doc}, {"EditMode", ( PyCFunction ) M_Window_EditMode, METH_VARARGS, M_Window_EditMode_doc}, {"PoseMode", ( PyCFunction ) M_Window_PoseMode, METH_VARARGS, M_Window_PoseMode_doc}, {"ViewLayers", ( PyCFunction ) M_Window_ViewLayers, METH_VARARGS, M_Window_ViewLayers_doc}, /* typo, deprecate someday: */ {"ViewLayer", ( PyCFunction ) M_Window_ViewLayers, METH_VARARGS, M_Window_ViewLayers_doc}, {"CameraView", ( PyCFunction ) M_Window_CameraView, METH_VARARGS, M_Window_CameraView_doc}, {"QTest", ( PyCFunction ) M_Window_QTest, METH_NOARGS, M_Window_QTest_doc}, {"QRead", ( PyCFunction ) M_Window_QRead, METH_NOARGS, M_Window_QRead_doc}, {"QAdd", ( PyCFunction ) M_Window_QAdd, METH_VARARGS, M_Window_QAdd_doc}, {"QHandle", ( PyCFunction ) M_Window_QHandle, METH_VARARGS, M_Window_QHandle_doc}, {"TestBreak", ( PyCFunction ) M_Window_TestBreak, METH_NOARGS, M_Window_TestBreak_doc}, {"GetMouseCoords", ( PyCFunction ) M_Window_GetMouseCoords, METH_NOARGS, M_Window_GetMouseCoords_doc}, {"SetMouseCoords", ( PyCFunction ) M_Window_SetMouseCoords, METH_VARARGS, M_Window_SetMouseCoords_doc}, {"GetMouseButtons", ( PyCFunction ) M_Window_GetMouseButtons, METH_NOARGS, M_Window_GetMouseButtons_doc}, {"GetKeyQualifiers", ( PyCFunction ) M_Window_GetKeyQualifiers, METH_NOARGS, M_Window_GetKeyQualifiers_doc}, {"SetKeyQualifiers", ( PyCFunction ) M_Window_SetKeyQualifiers, METH_VARARGS, M_Window_SetKeyQualifiers_doc}, {"GetAreaSize", ( PyCFunction ) M_Window_GetAreaSize, METH_NOARGS, M_Window_GetAreaSize_doc}, {"GetAreaID", ( PyCFunction ) M_Window_GetAreaID, METH_NOARGS, M_Window_GetAreaID_doc}, {"GetScreenSize", ( PyCFunction ) M_Window_GetScreenSize, METH_NOARGS, M_Window_GetScreenSize_doc}, {"GetScreens", ( PyCFunction ) M_Window_GetScreens, METH_NOARGS, M_Window_GetScreens_doc}, {"SetScreen", ( PyCFunction ) M_Window_SetScreen, METH_O, M_Window_SetScreen_doc}, {"GetScreenInfo", ( PyCFunction ) M_Window_GetScreenInfo, METH_VARARGS | METH_KEYWORDS, M_Window_GetScreenInfo_doc}, {"GetPivot", ( PyCFunction ) M_Window_GetPivot, METH_NOARGS, M_Window_GetPivot_doc}, {"SetPivot", ( PyCFunction ) M_Window_SetPivot, METH_O, M_Window_SetPivot_doc}, {NULL, NULL, 0, NULL} }; /*****************************************************************************/ /* Function: M_Window_Redraw */ /* Python equivalent: Blender.Window.Redraw */ /*****************************************************************************/ /* not static so py_slider_update in Draw.[ch] can use it */ PyObject *M_Window_Redraw( PyObject * self, PyObject * args ) { ScrArea *tempsa, *sa; int wintype = SPACE_VIEW3D; short redraw_all = 0; if( !PyArg_ParseTuple( args, "|i", &wintype ) ) return ( EXPP_ReturnPyObjError( PyExc_AttributeError, "expected int argument (or nothing)" ) ); if( wintype < 0 ) redraw_all = 1; if( !during_script( ) && !G.background ) { tempsa = curarea; sa = G.curscreen->areabase.first; while( sa ) { if( sa->spacetype == wintype || redraw_all ) { if (sa->spacetype == SPACE_SCRIPT && EXPP_disable_force_draw) { scrarea_queue_redraw(sa); } else { /* do not call fancy hacks here like pop_space_text(st); (ton) */ scrarea_do_windraw( sa ); if( sa->headwin ) scrarea_do_headdraw( sa ); } } sa = sa->next; } if( curarea != tempsa ) areawinset( tempsa->win ); if( curarea ) { /* is null if Blender is in bg mode */ if( curarea->headwin ) scrarea_do_headdraw( curarea ); screen_swapbuffers( ); } } Py_RETURN_NONE; } /*****************************************************************************/ /* Function: M_Window_RedrawAll */ /* Python equivalent: Blender.Window.RedrawAll */ /*****************************************************************************/ static PyObject *M_Window_RedrawAll( PyObject * self, PyObject * args ) { PyObject *arg = Py_BuildValue( "(i)", -1 ); PyObject *ret = M_Window_Redraw( self, arg ); Py_DECREF(arg); return ret; } /*****************************************************************************/ /* Function: M_Window_QRedrawAll */ /* Python equivalent: Blender.Window.QRedrawAll */ /*****************************************************************************/ static PyObject *M_Window_QRedrawAll( PyObject * self, PyObject * args ) { EXPP_allqueue( REDRAWALL, 0 ); Py_RETURN_NONE; } /*****************************************************************************/ /* Function: M_Window_FileSelector */ /* Python equivalent: Blender.Window.FileSelector */ /*****************************************************************************/ /* This is the callback to "activate_fileselect" below. It receives the * selected filename and (using it as argument) calls the Python callback * provided by the script writer and stored in EXPP_FS_PyCallback. */ static void getSelectedFile( char *name ) { PyObject *pycallback; PyObject *result; Script *script; /* let's find the script that owns this callback */ script = G.main->script.first; while (script) { if (script->flags & SCRIPT_RUNNING) break; script = script->id.next; } if (!script) { if (curarea->spacetype == SPACE_SCRIPT) { SpaceScript *sc = curarea->spacedata.first; script = sc->script; } } /* If 'script' is null, * The script must have had an error and closed, * but the fileselector was left open, show an error and exit */ if (!script) { error("Python script error: script quit, cannot run callback"); return; } pycallback = script->py_browsercallback; if (pycallback) { PyGILState_STATE gilstate = PyGILState_Ensure(); result = PyObject_CallFunction( pycallback, "s", name ); if (!result) { if (G.f & G_DEBUG) fprintf(stderr, "BPy error: Callback call failed!\n"); } else Py_DECREF(result); if (script->py_browsercallback == pycallback) { if (script->flags & SCRIPT_GUI) { script->py_browsercallback = NULL; } else { SCRIPT_SET_NULL(script); } } /* else another call to selector was made inside pycallback */ Py_DECREF(pycallback); PyGILState_Release(gilstate); } return; } /* Use for file and image selector */ static PyObject * FileAndImageSelector(PyObject * self, PyObject * args, int type) { char *title = (type==0 ? "SELECT FILE" : "SELECT IMAGE"); char *filename = G.sce; SpaceScript *sc; Script *script = NULL; PyObject *pycallback = NULL; int startspace = 0; if (during_scriptlink()) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "script links can't call the file/image selector"); if (G.background) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "the file/image selector is not available in background mode"); if((!PyArg_ParseTuple( args, "O|ss", &pycallback, &title, &filename)) || (!PyCallable_Check(pycallback))) return EXPP_ReturnPyObjError( PyExc_AttributeError, "\nexpected a callback function (and optionally one or two strings) " "as argument(s)" ); Py_INCREF(pycallback); /* trick: we move to a spacescript because then the fileselector will properly * unset our SCRIPT_FILESEL flag when the user chooses a file or cancels the * selection. This is necessary because when a user cancels, the * getSelectedFile function above doesn't get called and so couldn't unset the * flag. */ startspace = curarea->spacetype; if( startspace != SPACE_SCRIPT ) newspace( curarea, SPACE_SCRIPT ); sc = curarea->spacedata.first; /* let's find the script that called us */ script = G.main->script.first; while (script) { if (script->flags & SCRIPT_RUNNING) break; script = script->id.next; } if( !script ) { /* if not running, then we were already on a SpaceScript space, executing * a registered callback -- aka: this script has a gui */ script = sc->script; /* this is the right script */ } else { /* still running, use the trick */ script->lastspace = startspace; sc->script = script; } script->flags |= SCRIPT_FILESEL; /* clear any previous callback (nested calls to selector) */ if (script->py_browsercallback) { Py_DECREF((PyObject *)script->py_browsercallback); } script->py_browsercallback = pycallback; /* if were not running a script GUI here alredy, then dont make this script persistant */ if ((script->flags & SCRIPT_GUI)==0) { script->scriptname[0] = '\0'; script->scriptarg[0] = '\0'; } if (type==0) { activate_fileselect( FILE_BLENDER, title, filename, getSelectedFile ); } else { activate_imageselect( FILE_BLENDER, title, filename, getSelectedFile ); } Py_RETURN_NONE; } static PyObject *M_Window_FileSelector( PyObject * self, PyObject * args ) { return FileAndImageSelector( self, args, 0 ); } static PyObject *M_Window_ImageSelector( PyObject * self, PyObject * args ) { return FileAndImageSelector( self, args, 1 ); } /*****************************************************************************/ /* Function: M_Window_DrawProgressBar */ /* Python equivalent: Blender.Window.DrawProgressBar */ /*****************************************************************************/ static PyObject *M_Window_DrawProgressBar( PyObject * self, PyObject * args ) { float done; char *info = NULL; int retval = 0; ScrArea *sa = curarea; if (G.background) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "the progress bar is not available in background mode"); if( !PyArg_ParseTuple( args, "fs", &done, &info ) ) return ( EXPP_ReturnPyObjError( PyExc_AttributeError, "expected a float and a string as arguments" ) ); retval = progress_bar( done, info ); areawinset(sa->win); return Py_BuildValue( "i", retval ); } /*****************************************************************************/ /* Function: M_Window_GetCursorPos */ /* Python equivalent: Blender.Window.GetCursorPos */ /*****************************************************************************/ static PyObject *M_Window_GetCursorPos( PyObject * self ) { float *cursor = NULL; PyObject *pylist; if( G.vd && G.vd->localview ) cursor = G.vd->cursor; else cursor = G.scene->cursor; pylist = Py_BuildValue( "[fff]", cursor[0], cursor[1], cursor[2] ); if( !pylist ) return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "GetCursorPos: couldn't create pylist" ) ); return pylist; } /*****************************************************************************/ /* Function: M_Window_SetCursorPos */ /* Python equivalent: Blender.Window.SetCursorPos */ /*****************************************************************************/ static PyObject *M_Window_SetCursorPos( PyObject * self, PyObject * args ) { int ok = 0; float val[3]; if( PyObject_Length( args ) == 3 ) ok = PyArg_ParseTuple( args, "fff", &val[0], &val[1], &val[2] ); else ok = PyArg_ParseTuple( args, "(fff)", &val[0], &val[1], &val[2] ); if( !ok ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected [f,f,f] or f,f,f as arguments" ); if( G.vd && G.vd->localview ) { G.vd->cursor[0] = val[0]; G.vd->cursor[1] = val[1]; G.vd->cursor[2] = val[2]; } else { G.scene->cursor[0] = val[0]; G.scene->cursor[1] = val[1]; G.scene->cursor[2] = val[2]; } Py_RETURN_NONE; } static PyObject *M_Window_WaitCursor( PyObject * self, PyObject * args ) { int bool; if( !PyArg_ParseTuple( args, "i", &bool ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected bool (0 or 1) or nothing as argument" ); waitcursor( bool ); /* nonzero bool sets, zero unsets */ Py_RETURN_NONE; } /*****************************************************************************/ /* Function: M_Window_GetViewVector */ /* Python equivalent: Blender.Window.GetViewVector */ /*****************************************************************************/ static PyObject *M_Window_GetViewVector( PyObject * self ) { float *vec = NULL; if( !G.vd ) Py_RETURN_NONE; vec = G.vd->viewinv[2]; return Py_BuildValue( "[fff]", vec[0], vec[1], vec[2] ); } /*****************************************************************************/ /* Function: M_Window_GetActiveLayer */ /* Python equivalent: Blender.Window.GetActiveLayer */ /*****************************************************************************/ static PyObject *M_Window_GetActiveLayer( PyObject * self ) { if (!G.vd) { return PyInt_FromLong(0); } else { return PyInt_FromLong( G.vd->layact ); } } static PyObject *M_Window_SetActiveLayer( PyObject * self, PyObject * args ) { int layer, bit=1; if( !PyArg_ParseTuple( args, "i", &layer ) ) return ( EXPP_ReturnPyObjError( PyExc_TypeError, "expected an int" ) ); if (!G.vd) Py_RETURN_FALSE; bit= 0; while(bit<32) { if(layer & (1<layact= 1<lay |= G.vd->layact; if (G.vd->scenelock) { G.scene->lay |= G.vd->layact; } bit = -1; /* no error */ break; } bit++; } if (bit != -1) return ( EXPP_ReturnPyObjError( PyExc_ValueError, "The flag could not be used for the active layer" ) ); Py_RETURN_NONE; } static PyObject *M_Window_GetViewQuat( PyObject * self ) { float *vec = NULL; if( !G.vd ) Py_RETURN_NONE; vec = G.vd->viewquat; return Py_BuildValue( "[ffff]", vec[0], vec[1], vec[2], vec[3] ); } static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args ) { int ok = 0; float val[4]; if( !G.vd ) Py_RETURN_NONE; if( PyObject_Length( args ) == 4 ) ok = PyArg_ParseTuple( args, "ffff", &val[0], &val[1], &val[2], &val[3] ); else ok = PyArg_ParseTuple( args, "(ffff)", &val[0], &val[1], &val[2], &val[3] ); if( !ok ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected [f,f,f,f] or f,f,f,f as arguments" ); G.vd->viewquat[0] = val[0]; G.vd->viewquat[1] = val[1]; G.vd->viewquat[2] = val[2]; G.vd->viewquat[3] = val[3]; Py_RETURN_NONE; } static PyObject *M_Window_GetViewOffset( PyObject * self ) { if( !G.vd ) Py_RETURN_NONE; return Py_BuildValue( "[fff]", G.vd->ofs[0], G.vd->ofs[1], G.vd->ofs[2] ); } static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args ) { int ok = 0; float val[3]; if( !G.vd ) Py_RETURN_NONE; if( PyObject_Length( args ) == 3 ) ok = PyArg_ParseTuple( args, "fff", &val[0], &val[1], &val[2] ); else ok = PyArg_ParseTuple( args, "(fff)", &val[0], &val[1], &val[2] ); if( !ok ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected [f,f,f] or f,f,f as arguments" ); G.vd->ofs[0] = val[0]; G.vd->ofs[1] = val[1]; G.vd->ofs[2] = val[2]; Py_RETURN_NONE; } /*****************************************************************************/ /* Function: M_Window_GetViewMatrix */ /* Python equivalent: Blender.Window.GetViewMatrix */ /*****************************************************************************/ static PyObject *M_Window_GetViewMatrix( PyObject * self ) { if( !G.vd ) Py_RETURN_NONE; return newMatrixObject( ( float * ) G.vd->viewmat, 4, 4, Py_WRAP ); } /*****************************************************************************/ /* Function: M_Window_GetPerspMatrix */ /* Python equivalent: Blender.Window.GetPerspMatrix */ /*****************************************************************************/ static PyObject *M_Window_GetPerspMatrix( PyObject * self ) { if( !G.vd ) Py_RETURN_NONE; return newMatrixObject( ( float * ) G.vd->persmat, 4, 4, Py_WRAP ); } /* update_armature_weakrefs() * helper function used in M_Window_EditMode. * rebuilds list of Armature weakrefs in __main__ */ static int update_armature_weakrefs() { /* stuff for armature weak refs */ char *list_name = ARM_WEAKREF_LIST_NAME; PyObject *maindict = NULL, *armlist = NULL; PyObject *pyarmature = NULL; int x; maindict= PyModule_GetDict(PyImport_AddModule( "__main__")); armlist = PyDict_GetItemString(maindict, list_name); if( !armlist){ printf("Oops - update_armature_weakrefs()\n"); return 0; } for (x = 0; x < PySequence_Size(armlist); x++){ pyarmature = PyWeakref_GetObject(PySequence_GetItem( armlist, x)); if (pyarmature != Py_None) Armature_RebuildEditbones(pyarmature); } return 1; } static PyObject *M_Window_EditMode( PyObject * self, PyObject * args ) { short status = -1; char *undo_str = "From script"; int undo_str_len = 11; int do_undo = 1; if( !PyArg_ParseTuple( args, "|hs#i", &status, &undo_str, &undo_str_len, &do_undo ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected optional int (bool), string and int (bool) as arguments" ); if( status >= 0 ) { if( status ) { if( !G.obedit ){ //update armatures if(! update_armature_weakrefs()){ return EXPP_ReturnPyObjError( PyExc_RuntimeError, "internal error - update_armature_weakrefs"); } //enter editmode enter_editmode(0); } } else if( G.obedit ) { if( undo_str_len > 63 ) undo_str[63] = '\0'; /* 64 is max */ BIF_undo_push( undo_str ); /* This checks user undo settings */ exit_editmode( EM_FREEDATA ); //update armatures if(! update_armature_weakrefs()){ return EXPP_ReturnPyObjError( PyExc_RuntimeError, "internal error - update_armature_weakrefs"); } } } return Py_BuildValue( "h", G.obedit ? 1 : 0 ); } static PyObject *M_Window_PoseMode( PyObject * self, PyObject * args ) { short status = -1; short is_posemode = 0; Base *base; if( !PyArg_ParseTuple( args, "|h", &status ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected optional int (bool) as argument" ); if( status >= 0 ) { if( status ) { enter_posemode(); } else if( G.obedit ) { exit_posemode(); } } base= BASACT; if (base && base->object->flag & OB_POSEMODE) { is_posemode = 1; } return Py_BuildValue( "h", is_posemode ); } static PyObject *M_Window_ViewLayers( PyObject * self, PyObject * args ) { PyObject *item = NULL; PyObject *list = NULL, *resl = NULL; int val, i, bit = 0, layer = 0, len_list; short winid = -1; if( !G.scene ) { return EXPP_ReturnPyObjError( PyExc_RuntimeError, "can't get pointer to global scene" ); } /* Pase Args, Nothing, One list, Or a list and an int */ if (PyTuple_GET_SIZE(args)!=0) { if( !PyArg_ParseTuple ( args, "O!|h", &PyList_Type, &list, &winid) ) { return EXPP_ReturnPyObjError( PyExc_TypeError, "nothing or a list and optionaly a window ID argument" ); } } if( list ) { len_list = PyList_Size(list); if (len_list == 0) return EXPP_ReturnPyObjError( PyExc_AttributeError, "list can't be empty, at list one layer must be set" ); for( i = 0; i < len_list; i++ ) { item = PyList_GetItem( list, i ); if( !PyInt_Check( item ) ) return EXPP_ReturnPyObjError ( PyExc_AttributeError, "list must contain only integer numbers" ); val = ( int ) PyInt_AsLong( item ); if( val < 1 || val > 20 ) return EXPP_ReturnPyObjError ( PyExc_AttributeError, "layer values must be in the range [1, 20]" ); layer |= 1 << ( val - 1 ); } if (winid==-1) { /* set scene and viewport */ G.scene->lay = layer; if (G.vd) { G.vd->lay = layer; while( bit < 20 ) { val = 1 << bit; if( layer & val ) { G.vd->layact = val; break; } bit++; } } } else { /* only set the windows layer */ ScrArea *sa; SpaceLink *sl; View3D *vd; if (G.curscreen) { /* can never be too careful */ for (sa=G.curscreen->areabase.first; sa; sa= sa->next) { if (winid == sa->win) { for (sl= sa->spacedata.first; sl; sl= sl->next) if(sl->spacetype==SPACE_VIEW3D) break; if (!sl) return EXPP_ReturnPyObjError( PyExc_ValueError, "The window matching the winid has no 3d viewport" ); vd= (View3D *) sl; vd->lay = layer; for(bit= 0; bit < 20; bit++) { val = 1 << bit; if( layer & val ) { vd->layact = val; break; } } winid = -1; /* so we know its done */ break; } } if (winid!=-1) return EXPP_ReturnPyObjError( PyExc_TypeError, "The winid argument did not match any window" ); } } } resl = PyList_New( 0 ); if( !resl ) return ( EXPP_ReturnPyObjError( PyExc_MemoryError, "couldn't create pylist!" ) ); layer = G.scene->lay; bit = 0; while( bit < 20 ) { val = 1 << bit; if( layer & val ) { item = Py_BuildValue( "i", bit + 1 ); PyList_Append( resl, item ); Py_DECREF( item ); } bit++; } return resl; } static PyObject *M_Window_CameraView( PyObject * self, PyObject * args ) { short camtov3d = 0; if( !PyArg_ParseTuple( args, "|i", &camtov3d ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected an int (from Window.Views) as argument" ); if( !G.vd ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, "this function can only be used after a 3d View has been initialized" ); if( !G.vd->camera ) { if( BASACT && OBACT->type == OB_CAMERA ) G.vd->camera = OBACT; else G.vd->camera = scene_find_camera( G.scene ); handle_view3d_lock( ); } G.vd->persp = 2; G.vd->view = 0; if( camtov3d ) setcameratoview3d( ); Py_RETURN_NONE; } static PyObject *M_Window_QTest( PyObject * self ) { return Py_BuildValue( "h", qtest( ) ); } static PyObject *M_Window_QRead( PyObject * self ) { short val = 0; unsigned short event; if (G.background) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "QRead is not available in background mode"); event = extern_qread( &val ); return Py_BuildValue( "ii", event, val ); } static PyObject *M_Window_QAdd( PyObject * self, PyObject * args ) { short win; short evt; /* unsigned, we check below */ short val; short after = 0; if (G.background) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "QAdd is not available in background mode"); if( !PyArg_ParseTuple( args, "hhh|h", &win, &evt, &val, &after ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected three or four ints as arguments" ); if( evt < 0 ) /* evt is unsigned short */ return EXPP_ReturnPyObjError( PyExc_AttributeError, "event value must be a positive int, check events in Blender.Draw" ); if( after ) addafterqueue( win, evt, val ); else addqueue( win, evt, val ); Py_RETURN_NONE; } static PyObject *M_Window_QHandle( PyObject * self, PyObject * args ) { short win; ScrArea *sa; ScrArea *oldsa = NULL; if (G.background) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "QHandle is not available in background mode"); if (!G.curscreen) return EXPP_ReturnPyObjError(PyExc_RuntimeError, "No screens available"); if( !PyArg_ParseTuple( args, "h", &win ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected an int as argument" ); for (sa= G.curscreen->areabase.first; sa; sa= sa->next) if( sa->win == win ) break; if( sa ) { BWinEvent evt; short do_redraw = 0, do_change = 0; if( sa != curarea || sa->win != mywinget( ) ) { oldsa = curarea; areawinset( sa->win ); set_g_activearea( sa ); } while( bwin_qread( sa->win, &evt ) ) { if( evt.event == REDRAW ) { do_redraw = 1; } else if( evt.event == CHANGED ) { sa->win_swap = 0; do_change = 1; do_redraw = 1; } else { scrarea_do_winhandle( sa, &evt ); } } } if( oldsa ) { areawinset( oldsa->win ); set_g_activearea( oldsa ); } Py_RETURN_NONE; } static PyObject *M_Window_TestBreak( PyObject * self ) { if (blender_test_break()) { G.afbreek= 0; Py_RETURN_TRUE; } else { Py_RETURN_FALSE; } } static PyObject *M_Window_GetMouseCoords( PyObject * self ) { short mval[2]; getmouse( mval ); return Py_BuildValue( "hh", mval[0], mval[1] ); } static PyObject *M_Window_SetMouseCoords( PyObject * self, PyObject * args ) { int ok, x, y; if( !G.curscreen ) return EXPP_ReturnPyObjError( PyExc_RuntimeError, "no current screen to retrieve info from!" ); x = G.curscreen->sizex / 2; y = G.curscreen->sizey / 2; if( PyObject_Length( args ) == 2 ) ok = PyArg_ParseTuple( args, "hh", &x, &y ); else ok = PyArg_ParseTuple( args, "|(hh)", &x, &y ); if( !ok ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected [i, i] or i,i as arguments (or nothing)." ); warp_pointer( x, y ); Py_RETURN_NONE; } static PyObject *M_Window_GetMouseButtons( PyObject * self ) { short mbut = get_mbut( ); return Py_BuildValue( "h", mbut ); } static PyObject *M_Window_GetKeyQualifiers( PyObject * self ) { short qual = get_qual( ); return Py_BuildValue( "h", qual ); } static PyObject *M_Window_SetKeyQualifiers( PyObject * self, PyObject * args ) { short qual = 0; if( !PyArg_ParseTuple( args, "|h", &qual ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected nothing or an int (or'ed flags) as argument" ); if( qual < 0 ) return EXPP_ReturnPyObjError( PyExc_AttributeError, "value must be a positive int, check Blender.Window.Qual" ); G.qual = qual; return Py_BuildValue( "h", qual ); } static PyObject *M_Window_GetAreaSize( PyObject * self ) { ScrArea *sa = curarea; if( !sa ) Py_RETURN_NONE; return Py_BuildValue( "hh", sa->winx, sa->winy ); } static PyObject *M_Window_GetAreaID( PyObject * self ) { ScrArea *sa = curarea; if( !sa ) Py_RETURN_NONE; return Py_BuildValue( "h", sa->win ); } static PyObject *M_Window_GetScreenSize( PyObject * self ) { bScreen *scr = G.curscreen; if( !scr ) Py_RETURN_NONE; return Py_BuildValue( "hh", scr->sizex, scr->sizey ); } static PyObject *M_Window_SetScreen( PyObject * self, PyObject * value ) { bScreen *scr = G.main->screen.first; char *name = PyString_AsString(value); if( !name ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected string as argument" ); while( scr ) { if( !strcmp( scr->id.name + 2, name ) ) { setscreen( scr ); break; } scr = scr->id.next; } if( !scr ) return EXPP_ReturnPyObjError( PyExc_AttributeError, "no such screen, check Window.GetScreens() for valid names" ); Py_RETURN_NONE; } static PyObject *M_Window_GetScreens( PyObject * self ) { bScreen *scr = G.main->screen.first; PyObject *list = PyList_New( 0 ); PyObject *str = NULL; if( !list ) return EXPP_ReturnPyObjError( PyExc_MemoryError, "couldn't create py list!" ); while( scr ) { str = PyString_FromString( scr->id.name + 2 ); if( !str ) { Py_DECREF( list ); return EXPP_ReturnPyObjError( PyExc_MemoryError, "couldn't create py string!" ); } PyList_Append( list, str ); /* incref's str */ Py_DECREF( str ); scr = scr->id.next; } return list; } static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args, PyObject * kwords ) { ScrArea *sa = G.curscreen->areabase.first; bScreen *scr = G.main->screen.first; PyObject *item, *list; rcti *rct; int type = -1; char *rect = "win"; char *screen = ""; static char *kwlist[] = { "type", "rect", "screen", NULL }; int rctype = 0; if( !PyArg_ParseTupleAndKeywords( args, kwords, "|iss", kwlist, &type, &rect, &screen ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "expected nothing or an int and two strings as arguments" ); if( !strcmp( rect, "win" ) ) rctype = 0; else if( !strcmp( rect, "total" ) ) rctype = 1; else if( !strcmp( rect, "header" ) ) rctype = 2; else return EXPP_ReturnPyObjError( PyExc_AttributeError, "requested invalid type for area rectangle coordinates." ); list = PyList_New( 0 ); if( screen && screen[0] != '\0' ) { while( scr ) { if( !strcmp( scr->id.name + 2, screen ) ) { sa = scr->areabase.first; break; } scr = scr->id.next; } } if( !scr ) { Py_DECREF( list ); return EXPP_ReturnPyObjError( PyExc_AttributeError, "no such screen, see existing ones with Window.GetScreens." ); } while( sa ) { if( type != -1 && sa->spacetype != type ) { sa = sa->next; continue; } switch ( rctype ) { case 0: rct = &sa->winrct; break; case 1: rct = &sa->totrct; break; case 2: default: rct = &sa->headrct; } item = Py_BuildValue( "{s:[h,h,h,h],s:h,s:h}", "vertices", rct->xmin, rct->ymin, rct->xmax, rct->ymax, "type", ( short ) sa->spacetype, "id", ( short ) sa->win ); PyList_Append( list, item ); Py_DECREF( item ); sa = sa->next; } return list; } static PyObject *M_Window_GetPivot( PyObject * self ) { if (G.vd) { return PyInt_FromLong( G.vd->around ); } Py_RETURN_NONE; } static PyObject *M_Window_SetPivot( PyObject * self, PyObject * value) { short pivot; if (G.vd) { pivot = (short)PyInt_AsLong( value ); if ( pivot > 4 || pivot < 0 ) return EXPP_ReturnPyObjError( PyExc_AttributeError, "Expected a constant from Window.PivotTypes" ); G.vd->around = pivot; } Py_RETURN_NONE; } /*****************************************************************************/ /* Function: Window_Init */ /*****************************************************************************/ PyObject *Window_Init( void ) { PyObject *submodule, *Types, *Qual, *MButs, *PivotTypes, *dict; submodule = Py_InitModule3( "Blender.Window", M_Window_methods, M_Window_doc ); dict = PyModule_GetDict( submodule ); if( dict ) PyDict_SetItemString( dict, "Theme", Theme_Init( ) ); Types = PyConstant_New( ); Qual = PyConstant_New( ); MButs = PyConstant_New( ); PivotTypes = PyConstant_New( ); if( Types ) { BPy_constant *d = ( BPy_constant * ) Types; PyConstant_Insert( d, "VIEW3D", PyInt_FromLong( SPACE_VIEW3D ) ); PyConstant_Insert( d, "IPO", PyInt_FromLong( SPACE_IPO ) ); PyConstant_Insert( d, "OOPS", PyInt_FromLong( SPACE_OOPS ) ); PyConstant_Insert( d, "BUTS", PyInt_FromLong( SPACE_BUTS ) ); PyConstant_Insert( d, "FILE", PyInt_FromLong( SPACE_FILE ) ); PyConstant_Insert( d, "IMAGE", PyInt_FromLong( SPACE_IMAGE ) ); PyConstant_Insert( d, "INFO", PyInt_FromLong( SPACE_INFO ) ); PyConstant_Insert( d, "SEQ", PyInt_FromLong( SPACE_SEQ ) ); PyConstant_Insert( d, "IMASEL", PyInt_FromLong( SPACE_IMASEL ) ); PyConstant_Insert( d, "SOUND", PyInt_FromLong( SPACE_SOUND ) ); PyConstant_Insert( d, "ACTION", PyInt_FromLong( SPACE_ACTION ) ); PyConstant_Insert( d, "TEXT", PyInt_FromLong( SPACE_TEXT ) ); PyConstant_Insert( d, "NLA", PyInt_FromLong( SPACE_NLA ) ); PyConstant_Insert( d, "SCRIPT", PyInt_FromLong( SPACE_SCRIPT ) ); PyConstant_Insert( d, "TIME", PyInt_FromLong( SPACE_TIME ) ); PyConstant_Insert( d, "NODE", PyInt_FromLong( SPACE_NODE ) ); PyModule_AddObject( submodule, "Types", Types ); } if( Qual ) { BPy_constant *d = ( BPy_constant * ) Qual; PyConstant_Insert( d, "LALT", PyInt_FromLong( L_ALTKEY ) ); PyConstant_Insert( d, "RALT", PyInt_FromLong( R_ALTKEY ) ); PyConstant_Insert( d, "ALT", PyInt_FromLong( LR_ALTKEY ) ); PyConstant_Insert( d, "LCTRL", PyInt_FromLong( L_CTRLKEY ) ); PyConstant_Insert( d, "RCTRL", PyInt_FromLong( R_CTRLKEY ) ); PyConstant_Insert( d, "CTRL", PyInt_FromLong( LR_CTRLKEY ) ); PyConstant_Insert( d, "LSHIFT", PyInt_FromLong( L_SHIFTKEY ) ); PyConstant_Insert( d, "RSHIFT", PyInt_FromLong( R_SHIFTKEY ) ); PyConstant_Insert( d, "SHIFT", PyInt_FromLong( LR_SHIFTKEY ) ); PyModule_AddObject( submodule, "Qual", Qual ); } if( MButs ) { BPy_constant *d = ( BPy_constant * ) MButs; PyConstant_Insert( d, "L", PyInt_FromLong( L_MOUSE ) ); PyConstant_Insert( d, "M", PyInt_FromLong( M_MOUSE ) ); PyConstant_Insert( d, "R", PyInt_FromLong( R_MOUSE ) ); PyModule_AddObject( submodule, "MButs", MButs ); } if( PivotTypes ) { BPy_constant *d = ( BPy_constant * ) PivotTypes; PyConstant_Insert(d, "BOUNDBOX", PyInt_FromLong( PIVOT_BOUNDBOX ) ); PyConstant_Insert(d, "CURSOR", PyInt_FromLong( PIVOT_CURSOR ) ); PyConstant_Insert(d, "MEDIAN", PyInt_FromLong( PIVOT_MEDIAN ) ); PyConstant_Insert(d, "ACTIVE", PyInt_FromLong( PIVOT_ACTIVE ) ); PyConstant_Insert(d, "INDIVIDUAL", PyInt_FromLong( PIVOT_INDIVIDUAL ) ); PyModule_AddObject( submodule, "PivotTypes", PivotTypes ); } return submodule; }