added bpy.config, more configuration options still need adding.
authorCampbell Barton <ideasman42@gmail.com>
Sun, 18 Mar 2007 04:46:54 +0000 (04:46 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 18 Mar 2007 04:46:54 +0000 (04:46 +0000)
source/blender/python/api2_2x/Config.c [new file with mode: 0644]
source/blender/python/api2_2x/Config.h [new file with mode: 0644]
source/blender/python/api2_2x/Main.c

diff --git a/source/blender/python/api2_2x/Config.c b/source/blender/python/api2_2x/Config.c
new file mode 100644 (file)
index 0000000..cd081a3
--- /dev/null
@@ -0,0 +1,429 @@
+/* 
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * 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): Campbell Barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+/* python types */
+#include "DNA_userdef_types.h"
+#include "gen_utils.h"
+#include "Config.h"
+
+enum conf_consts {
+       /*string*/
+       EXPP_CONF_ATTR_PATH_YF_EXPORT = 0,
+       EXPP_CONF_ATTR_PATH_FONT,
+       EXPP_CONF_ATTR_PATH_RENDER,
+       EXPP_CONF_ATTR_PATH_TEXTURE,
+       EXPP_CONF_ATTR_PATH_PYTHON,
+       EXPP_CONF_ATTR_PATH_TEX_PLUGIN,
+       EXPP_CONF_ATTR_PATH_SOUND,
+       EXPP_CONF_ATTR_PATH_SEQ_PLUGIN,
+       EXPP_CONF_ATTR_PATH_TEMP,
+       
+       /*int*/
+       EXPP_CONF_ATTR_UNDOSTEPS,
+       EXPP_CONF_ATTR_TEX_TIMEOUT,
+       EXPP_CONF_ATTR_TEX_COLLECT_RATE,
+       EXPP_CONF_ATTR_MEM_CACHE_LIMIT,
+       EXPP_CONF_ATTR_FONT_SIZE
+};
+
+PyObject *Config_CreatePyObject( )
+{
+       BPy_Config *conf = PyObject_NEW( BPy_Config, &Config_Type);
+       return (PyObject *)conf;
+}
+
+/*
+ * repr function
+ * callback functions building meaninful string to representations
+ */
+static PyObject *Config_repr( BPy_Config * self )
+{
+       return PyString_FromFormat( "[Blender Configuration Data]");
+}
+
+
+/*-----------------------Config module Init())-----------------------------*/
+/* see Main.c */
+/*
+static struct PyMethodDef BPy_Config_methods[] = {
+       {"new", (PyCFunction)MainSeq_new, METH_VARARGS,
+               "(name) - Create a new object in this scene from the obdata given and return a new object"},
+       {"load", (PyCFunction)MainSeq_load, METH_VARARGS,
+               "(filename) - loads the given filename for image, font and sound types"},
+       {"unlink", (PyCFunction)MainSeq_unlink, METH_VARARGS,
+               "unlinks the object from the scene"},
+       {NULL, NULL, 0, NULL}
+};*/
+
+/*
+ * get integer attributes
+ */
+static PyObject *getStrAttr( BPy_Config *self, void *type )
+{
+       PyObject *attr = NULL;
+       char *param = NULL;
+       
+       
+       switch( (int)type ) {
+       case EXPP_CONF_ATTR_PATH_YF_EXPORT:
+               param = U.yfexportdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_FONT:
+               param = U.fontdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_RENDER:
+               param = U.renderdir;
+               break;  
+       case EXPP_CONF_ATTR_PATH_TEXTURE:
+               param = U.textudir;
+               break;
+       case EXPP_CONF_ATTR_PATH_PYTHON:
+               param = U.pythondir;
+               break;
+       case EXPP_CONF_ATTR_PATH_TEX_PLUGIN:
+               param = U.plugtexdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_SOUND:
+               param = U.sounddir;
+               break;
+       case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN:
+               param = U.plugseqdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_TEMP:
+               param = U.tempdir;
+               break;  
+       
+       default:
+               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                               "undefined type in getStrAttr" );
+       }
+
+       attr = PyString_FromString( param );
+       
+       if( attr )
+               return attr;
+
+       return EXPP_ReturnPyObjError( PyExc_MemoryError,
+                               "PyString_FromString() failed!" );
+}
+
+/*
+ * set integer attributes which require clamping
+ */
+
+static int setStrAttr( BPy_Config *self, PyObject *value, void *type )
+{
+       char *param;
+       int len=160;
+       char *str = PyString_AsString(value);
+       
+       if (!str)
+               return EXPP_ReturnIntError( PyExc_TypeError,
+                       "error, must assign a python string for setStrAttr");
+       
+       switch( (int)type ) {
+       case EXPP_CONF_ATTR_PATH_YF_EXPORT:
+               param = U.yfexportdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_FONT:
+               param = U.fontdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_RENDER:
+               param = U.renderdir;
+               break;  
+       case EXPP_CONF_ATTR_PATH_TEXTURE:
+               param = U.textudir;
+               break;
+       case EXPP_CONF_ATTR_PATH_PYTHON:
+               param = U.pythondir;
+               break;
+       case EXPP_CONF_ATTR_PATH_TEX_PLUGIN:
+               param = U.plugtexdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_SOUND:
+               param = U.sounddir;
+               break;
+       case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN:
+               param = U.plugseqdir;
+               break;
+       case EXPP_CONF_ATTR_PATH_TEMP:
+               param = U.tempdir;
+               break;
+               
+       default:
+               return EXPP_ReturnIntError( PyExc_RuntimeError,
+                               "undefined type in setStrAttr");
+       }
+       
+       strncpy(param, str, len);
+       return 0;
+}
+
+
+/*
+ * get integer attributes
+ */
+
+static PyObject *getIntAttr( BPy_Config *self, void *type )
+{
+       PyObject *attr = NULL;
+       int param;
+
+       switch( (int)type ) {
+       case EXPP_CONF_ATTR_UNDOSTEPS:
+               param = (int)U.undosteps;
+               break;
+       case EXPP_CONF_ATTR_TEX_TIMEOUT:
+               param = U.textimeout;
+               break;          
+       case EXPP_CONF_ATTR_TEX_COLLECT_RATE:
+               param = U.texcollectrate;
+               break;
+       case EXPP_CONF_ATTR_MEM_CACHE_LIMIT:
+               param = U.memcachelimit;
+               break;          
+       case EXPP_CONF_ATTR_FONT_SIZE:
+               param = U.fontsize;
+               break;
+       
+       default:
+               return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                               "undefined type in getIntAttr" );
+       }
+
+       attr = PyInt_FromLong( param );
+       
+       if( attr )
+               return attr;
+
+       return EXPP_ReturnPyObjError( PyExc_MemoryError,
+                               "PyInt_FromLong() failed!" );
+}
+
+/*
+ * set integer attributes which require clamping
+ */
+
+static int setIntAttrClamp( BPy_Config *self, PyObject *value, void *type )
+{
+       void *param;
+       int min, max, size;
+
+       switch( (int)type ) {
+       case EXPP_CONF_ATTR_UNDOSTEPS:
+               min = 0;
+               max = 64;
+               size = 'h';
+               param = (void *)&U.undosteps;
+               break;
+       case EXPP_CONF_ATTR_TEX_TIMEOUT:
+               min = 1;
+               max = 3600;
+               size = 'i';
+               param = (void *)&U.textimeout;
+               break;
+       case EXPP_CONF_ATTR_TEX_COLLECT_RATE:
+               min = 1;
+               max = 3600;
+               size = 'i';
+               param = (void *)&U.texcollectrate;
+               break;
+       case EXPP_CONF_ATTR_MEM_CACHE_LIMIT:
+               min = 1;
+               max = 1024;
+               size = 'i';
+               param = (void *)&U.memcachelimit;
+               break;  
+       case EXPP_CONF_ATTR_FONT_SIZE:
+               min = 8;
+               max = 16;
+               size = 'i';
+               param = (void *)&U.fontsize;
+               break;
+               
+       default:
+               return EXPP_ReturnIntError( PyExc_RuntimeError,
+                               "undefined type in setIntAttrClamp");
+       }
+       return EXPP_setIValueClamped( value, param, min, max, size );
+}
+
+static PyGetSetDef Config_getseters[] = {
+       
+       /* ints & shorts */
+       {"undoSteps",
+        (getter)getIntAttr, (setter)setIntAttrClamp,
+        "undo steps",
+        (void *)EXPP_CONF_ATTR_UNDOSTEPS},
+       {"textureTimeout",
+        (getter)getIntAttr, (setter)setIntAttrClamp,
+        "undo steps",
+        (void *)EXPP_CONF_ATTR_TEX_TIMEOUT},
+       {"textureCollectRate",
+        (getter)getIntAttr, (setter)setIntAttrClamp,
+        "undo steps",
+        (void *)EXPP_CONF_ATTR_TEX_COLLECT_RATE},
+       {"sequenceMemCacheLimit",
+        (getter)getIntAttr, (setter)setIntAttrClamp,
+        "undo steps",
+        (void *)EXPP_CONF_ATTR_MEM_CACHE_LIMIT},
+       {"fontSize",
+        (getter)getIntAttr, (setter)setIntAttrClamp,
+        "undo steps",
+        (void *)EXPP_CONF_ATTR_FONT_SIZE},
+        
+       /* Paths */
+       {"yfExportDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "yafray export path",
+        (void *)EXPP_CONF_ATTR_PATH_YF_EXPORT},         
+       {"fontDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "default font path",
+        (void *)EXPP_CONF_ATTR_PATH_FONT},
+       {"renderDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "default render path",
+        (void *)EXPP_CONF_ATTR_PATH_RENDER},
+       {"textureDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "default texture path",
+        (void *)EXPP_CONF_ATTR_PATH_TEXTURE},
+       {"userScriptsDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "user scripts path",
+        (void *)EXPP_CONF_ATTR_PATH_PYTHON}, 
+       {"texturePluginsDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "default texture plugins path",
+        (void *)EXPP_CONF_ATTR_PATH_TEX_PLUGIN},
+       {"soundDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "default sound path",
+        (void *)EXPP_CONF_ATTR_PATH_SOUND},
+       {"sequencePluginsDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "sequencer plugins path",
+        (void *)EXPP_CONF_ATTR_PATH_SEQ_PLUGIN},
+       {"tempDir",
+        (getter)getStrAttr, (setter)setStrAttr,
+        "temporary file path",
+        (void *)EXPP_CONF_ATTR_PATH_TEMP},
+       
+       {NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
+};
+
+
+/*
+ *  Python Config_Type structure definition
+ */
+PyTypeObject Config_Type = {
+       PyObject_HEAD_INIT( NULL )  /* required py macro */
+       0,                          /* ob_size */
+       /*  For printing, in format "<module>.<name>" */
+       "Blender Config",           /* char *tp_name; */
+       sizeof( BPy_Config ),       /* int tp_basicsize; */
+       0,                          /* tp_itemsize;  For allocation */
+
+       /* Methods to implement standard operations */
+
+       NULL,                                           /* destructor tp_dealloc; */
+       NULL,                       /* printfunc tp_print; */
+       NULL,                       /* getattrfunc tp_getattr; */
+       NULL,                       /* setattrfunc tp_setattr; */
+       NULL, /* cmpfunc tp_compare; */
+       (reprfunc)Config_repr,   /* reprfunc tp_repr; */
+
+       /* Method suites for standard classes */
+
+       NULL,                       /* PyNumberMethods *tp_as_number; */
+       NULL,       /* PySequenceMethods *tp_as_sequence; */
+       NULL,                       /* PyMappingMethods *tp_as_mapping; */
+
+       /* More standard operations (here for binary compatibility) */
+
+       NULL,                       /* hashfunc tp_hash; */
+       NULL,                       /* ternaryfunc tp_call; */
+       NULL,                       /* reprfunc tp_str; */
+       NULL,                       /* getattrofunc tp_getattro; */
+       NULL,                       /* setattrofunc tp_setattro; */
+
+       /* Functions to access object as input/output buffer */
+       NULL,                       /* PyBufferProcs *tp_as_buffer; */
+
+  /*** Flags to define presence of optional/expanded features ***/
+       Py_TPFLAGS_DEFAULT,         /* long tp_flags; */
+
+       NULL,                       /*  char *tp_doc;  Documentation string */
+  /*** Assigned meaning in release 2.0 ***/
+       /* call function for all accessible objects */
+       NULL,                       /* traverseproc tp_traverse; */
+
+       /* delete references to contained objects */
+       NULL,                       /* inquiry tp_clear; */
+
+  /***  Assigned meaning in release 2.1 ***/
+  /*** rich comparisons ***/
+       NULL,                       /* richcmpfunc tp_richcompare; */
+
+  /***  weak reference enabler ***/
+       0,                          /* long tp_weaklistoffset; */
+
+  /*** Added in release 2.2 ***/
+       /*   Iterators */
+       NULL, /* getiterfunc tp_iter; */
+       NULL, /* iternextfunc tp_iternext; */
+
+  /*** Attribute descriptor and subclassing stuff ***/
+       NULL,  /*BPy_Config_methods*/     /* struct PyMethodDef *tp_methods; */
+       NULL,                       /* struct PyMemberDef *tp_members; */
+       Config_getseters,       /* struct PyGetSetDef *tp_getset; */
+       NULL,                       /* struct _typeobject *tp_base; */
+       NULL,                       /* PyObject *tp_dict; */
+       NULL,                       /* descrgetfunc tp_descr_get; */
+       NULL,                       /* descrsetfunc tp_descr_set; */
+       0,                          /* long tp_dictoffset; */
+       NULL,                       /* initproc tp_init; */
+       NULL,                       /* allocfunc tp_alloc; */
+       NULL,                       /* newfunc tp_new; */
+       /*  Low-level free-memory routine */
+       NULL,                       /* freefunc tp_free;  */
+       /* For PyObject_IS_GC */
+       NULL,                       /* inquiry tp_is_gc;  */
+       NULL,                       /* PyObject *tp_bases; */
+       /* method resolution order */
+       NULL,                       /* PyObject *tp_mro;  */
+       NULL,                       /* PyObject *tp_cache; */
+       NULL,                       /* PyObject *tp_subclasses; */
+       NULL,                       /* PyObject *tp_weaklist; */
+       NULL
+};
diff --git a/source/blender/python/api2_2x/Config.h b/source/blender/python/api2_2x/Config.h
new file mode 100644 (file)
index 0000000..61580a0
--- /dev/null
@@ -0,0 +1,52 @@
+/* 
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * 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): Campbell Barton
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+*/
+
+#ifndef EXPP_CONFIG_H
+#define EXPP_CONFIG_H
+
+#include <Python.h>
+
+/* The Main PyType Object defined in Main.c */
+extern PyTypeObject Config_Type;
+
+#define BPy_Config_Check(v) \
+    ((v)->ob_type == &Config_Type)
+
+/* Main sequence, iterate on the libdatas listbase*/
+typedef struct {
+       PyObject_VAR_HEAD /* required python macro   */
+} BPy_Config;
+
+PyObject *Config_CreatePyObject();
+
+
+#endif                         /* EXPP_CONFIG_H */
index f25ef8bcf0ed7ed292ffb1ae82d35726e6829b3e..4eddea59ab0f27fc65a6eb5aad4aa20f0fe4eb59 100644 (file)
 #include "Main.h"
 #include "Scene.h"
 
+
+#include "Config.h" /* config pydata */
+
 /* used only for texts.active */
 #include "BIF_screen.h"
 #include "DNA_space_types.h"
@@ -746,9 +749,12 @@ PyObject *Main_Init( void )
 
        if( PyType_Ready( &MainSeq_Type ) < 0 )
                return NULL;
-
+       if( PyType_Ready( &Config_Type ) < 0 ) /* see Config.c */
+               return NULL;    
+       
        submodule = Py_InitModule3( "Blender.Main", NULL, M_Main_doc );
        
+       /* Python Data Types */
        PyModule_AddObject( submodule, "scenes", MainSeq_CreatePyObject(NULL, ID_SCE) );
        PyModule_AddObject( submodule, "objects", MainSeq_CreatePyObject(NULL, ID_OB) );
        PyModule_AddObject( submodule, "meshes", MainSeq_CreatePyObject(NULL, ID_ME) );
@@ -769,5 +775,8 @@ PyObject *Main_Init( void )
        PyModule_AddObject( submodule, "armatures", MainSeq_CreatePyObject(NULL, ID_AR) );
        PyModule_AddObject( submodule, "actions", MainSeq_CreatePyObject(NULL, ID_AC) );
        
+       /* Other Types */
+       PyModule_AddObject( submodule, "config", Config_CreatePyObject() );
+       
        return submodule;
 }