Revision: 17616
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17616
Author:   campbellbarton
Date:     2008-11-29 14:36:08 +0100 (Sat, 29 Nov 2008)

Log Message:
-----------
Python RNA API
* Matches the C/RNA api structure
* Thin wrapper ~(600 lines)
* No functions specific to any blender object type.
* Defines 2 types, BPy_StructRNA and BPy_PropertyRNA.
* Python 3.0 target (compatible with python 2.4,5,6) 
* http://wiki.blender.org/index.php/BlenderDev/Blender2.5/PyRNA - continue 
docs/discussion here.

Todo
* Collection iterators
* Write access to data
* Define how constants should be accessed (as strings or some special type)
* Solve the "Python keeping invalid blender pointers" problem.
  This cant just be solved in the py api - we need blender to notify when ID's 
are removed 

Examples
Here are some examples that work with the current implementation of the api.

 rna.lamps["Lamp.006"].energy -> (1.0)
 rna.lamps["Lamp.007"].shadow -> ("NOSHADOW")
 rna.materials.keys() -> ['flyingsquirrel_eye', 'frankie_skin', 
'frankie_theeth']
 rna.scenes["hud"].objects["num_text_p2_4"].data.novnormalflip -> False
 rna.meshes["mymesh"].uv_layers.keys() -> ['UVTex', 'UVTex']
 rna.meshes.items()

For a dump of yo-frankie level see - http://pasteall.org/3294/python

Notes
* Added python back, can only execute scripts from the command line with -P 
script.py
* bpy_interface.c is just enough functionality to run a python file.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/screen/stubs.c
    branches/blender2.5/blender/source/blender/python/SConscript
    branches/blender2.5/blender/source/creator/creator.c

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/python/intern/bpy_compat.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_scriptlink.c

Removed Paths:
-------------
    branches/blender2.5/blender/source/blender/python/intern/BPY_scriptlink.c

Modified: branches/blender2.5/blender/source/blender/editors/screen/stubs.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/stubs.c   
2008-11-29 12:12:33 UTC (rev 17615)
+++ branches/blender2.5/blender/source/blender/editors/screen/stubs.c   
2008-11-29 13:36:08 UTC (rev 17616)
@@ -46,7 +46,7 @@
 
 /* python, will come back */
 void BPY_post_start_python() {}
-void BPY_run_python_script() {}
+//void BPY_run_python_script() {}
 void BPY_start_python() {}
 void BPY_do_all_scripts() {}
 void BPY_call_importloader() {}

Modified: branches/blender2.5/blender/source/blender/python/SConscript
===================================================================
--- branches/blender2.5/blender/source/blender/python/SConscript        
2008-11-29 12:12:33 UTC (rev 17615)
+++ branches/blender2.5/blender/source/blender/python/SConscript        
2008-11-29 13:36:08 UTC (rev 17616)
@@ -3,7 +3,7 @@
 
 sources = env.Glob('intern/*.c')
 
-incs = '. ../editors/include ../makesdna ../blenlib ../blenkernel ../nodes'
+incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel 
../nodes'
 incs += ' ../imbuf ../blenloader ../render/extern/include'
 incs += ' #intern/guardedalloc #intern/memutil'
 incs += ' ' + env['BF_PYTHON_INC']

Deleted: 
branches/blender2.5/blender/source/blender/python/intern/BPY_scriptlink.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/BPY_scriptlink.c   
2008-11-29 12:12:33 UTC (rev 17615)
+++ branches/blender2.5/blender/source/blender/python/intern/BPY_scriptlink.c   
2008-11-29 13:36:08 UTC (rev 17616)
@@ -1,73 +0,0 @@
-/**
- * $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) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_lamp_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_world_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_material_types.h"
-
-#include "BLI_blenlib.h"
-
-#include "BKE_blender.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-
-
-/* only copies internal pointers, scriptlink usually is integral part of a 
struct */
-void BPY_copy_scriptlink( struct ScriptLink *scriptlink )
-{
-       
-       if( scriptlink->totscript ) {
-               scriptlink->scripts = MEM_dupallocN(scriptlink->scripts);       
        
-               scriptlink->flag = MEM_dupallocN(scriptlink->flag);             
-       }
-       
-       return;
-}
-
-/* not free slink itself */
-void BPY_free_scriptlink( struct ScriptLink *slink )
-{
-       if( slink->totscript ) {
-               if( slink->flag ) {
-                       MEM_freeN( slink->flag );
-                       slink->flag= NULL;
-               }
-               if( slink->scripts ) {
-                       MEM_freeN( slink->scripts );
-                       slink->scripts= NULL;
-               }
-       }
-       
-       return;
-}
-

Added: branches/blender2.5/blender/source/blender/python/intern/bpy_compat.h
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_compat.h       
                        (rev 0)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_compat.h       
2008-11-29 13:36:08 UTC (rev 17616)
@@ -0,0 +1,49 @@
+/**
+ * $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.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* This file is only to contain definitions to functions that enable
+ * the python api to compile with different python versions.
+ * no utility functions please
+ */
+
+/* if you are NOT using python 3.0 - define these */
+#if PY_VERSION_HEX < 0x03000000
+#define _PyUnicode_AsString PyString_AsString
+#define PyUnicode_Check PyString_Check
+#define PyLong_FromSize_t PyInt_FromLong
+#define PyLong_AsSsize_t PyInt_AsLong
+#define PyLong_Check PyInt_Check
+#define PyUnicode_FromString PyString_FromString
+#define PyUnicode_FromFormat PyString_FromFormat
+
+#endif
+
+/* older then python 2.6 - define these */
+// #if (PY_VERSION_HEX < 0x02060000)
+// #endif
+
+/* older then python 2.5 - define these */
+#if (PY_VERSION_HEX < 0x02050000)
+#define Py_ssize_t ssize_t
+#endif

Added: branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
                        (rev 0)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c    
2008-11-29 13:36:08 UTC (rev 17616)
@@ -0,0 +1,85 @@
+
+#include <Python.h>
+#include "compile.h"           /* for the PyCodeObject */
+#include "eval.h"              /* for PyEval_EvalCode */
+
+#include "bpy_compat.h"
+
+#include "bpy_rna.h"
+
+
+/*****************************************************************************
+* Description: This function creates a new Python dictionary object.
+*****************************************************************************/
+
+static PyObject *CreateGlobalDictionary( void )
+{
+       PyObject *dict = PyDict_New(  );
+       PyObject *item = PyUnicode_FromString( "__main__" );
+       PyDict_SetItemString( dict, "__builtins__", PyEval_GetBuiltins(  ) );
+       PyDict_SetItemString( dict, "__name__", item );
+       Py_DECREF(item);
+       
+       /* Add Modules */
+       item = BPY_rna_module();
+       PyDict_SetItemString( dict, "rna", item );
+       Py_DECREF(item);
+       
+       
+       return dict;
+}
+
+static void BPY_start_python( void )
+{
+       PyThreadState *py_tstate = NULL;
+       
+       Py_Initialize(  );
+       
+       //PySys_SetArgv( argc_copy, argv_copy );
+       
+       /* Initialize thread support (also acquires lock) */
+       PyEval_InitThreads();
+       
+       // todo - sys paths - our own imports
+       
+       py_tstate = PyGILState_GetThisThreadState();
+       PyEval_ReleaseThread(py_tstate);
+       
+}
+
+static void BPY_end_python( void )
+{
+       PyGILState_Ensure(); /* finalizing, no need to grab the state */
+       
+       // free other python data.
+       
+       Py_Finalize(  );
+       return;
+}
+
+void BPY_run_python_script( const char *fn )
+{
+       PyObject *py_dict, *py_result;
+       char pystring[512];
+       PyGILState_STATE gilstate;
+       
+       /* TODO - look into a better way to run a file */
+       sprintf(pystring, "exec(open(r'%s').read())", fn);
+       
+       BPY_start_python();
+       
+       gilstate = PyGILState_Ensure();
+       
+       py_dict = CreateGlobalDictionary();
+       
+       py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
+       
+       if (!py_result)
+               PyErr_Print();
+       else
+               Py_DECREF( py_result );
+       
+       PyGILState_Release(gilstate);
+       
+       BPY_end_python();
+}

Added: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c          
                (rev 0)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c  
2008-11-29 13:36:08 UTC (rev 17616)
@@ -0,0 +1,608 @@
+/**
+ * $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.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "bpy_rna.h"
+#include "bpy_compat.h"
+
+#include "MEM_guardedalloc.h"
+#include "BKE_global.h" /* evil G.* */
+
+
+static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
+{ 
+       return (a->ptr.data==b->ptr.data) ? 0 : -1;
+}
+
+static int pyrna_prop_compare( BPy_PropertyRNA * a, BPy_PropertyRNA * b )
+{
+       return (a->prop==b->prop && a->ptr.data==b->ptr.data ) ? 0 : -1;
+}
+
+/*----------------------repr--------------------------------------------*/
+static PyObject *pyrna_struct_repr( BPy_StructRNA * self )
+{
+       return PyUnicode_FromFormat( "[BPy_StructRNA \"%s\"]", 
RNA_struct_identifier(&self->ptr));
+}
+
+static PyObject *pyrna_prop_repr( BPy_PropertyRNA * self )
+{
+       return PyUnicode_FromFormat( "[BPy_PropertyRNA \"%s\" -> \"%s\" ]", 
RNA_struct_identifier(&self->ptr), RNA_property_identifier(&self->ptr, 
self->prop) );
+}
+
+static PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
+{
+       PyObject *ret;
+       int type = RNA_property_type(ptr, prop);
+       int len = RNA_property_array_length(ptr, prop);
+       /* resolve path */
+       
+       if (len > 0) {
+               /* resolve the array from a new pytype */
+               return pyrna_prop_CreatePyObject(ptr, prop);
+       }
+       
+       /* see if we can coorce into a python type - PropertyType */
+       switch (type) {
+       case PROP_BOOLEAN:

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to