Revision: 19582
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19582
Author:   campbellbarton
Date:     2009-04-07 18:00:32 +0200 (Tue, 07 Apr 2009)

Log Message:
-----------
BGE Python API (small changes)
- Make BGE's ListValue types convert to python lists for printing since the 
CValue GetText() function didnt work well- printing lists as [,,,,,] for scene 
objects and mesh materials for eg.
- Check attributes are descriptor types before casting.
- py_getattr_dict use the Type dict rather then Method and Attribute array.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/ListValue.h
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp

Modified: trunk/blender/source/gameengine/Expressions/ListValue.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/ListValue.h     2009-04-07 
15:20:12 UTC (rev 19581)
+++ trunk/blender/source/gameengine/Expressions/ListValue.h     2009-04-07 
16:00:32 UTC (rev 19582)
@@ -60,6 +60,12 @@
        bool CheckEqual(CValue* first,CValue* second);
 
        virtual PyObject* py_getattro(PyObject* attr);
+       virtual PyObject* py_repr(void) {
+               PyObject *py_list= PySequence_List((PyObject *)this);
+               PyObject *py_string= PyObject_Repr(py_list);
+               Py_DECREF(py_list);
+               return py_string;
+       }
 
        KX_PYMETHOD_O(CListValue,append);
        KX_PYMETHOD_NOARGS(CListValue,reverse);

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-04-07 15:20:12 UTC (rev 19581)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-04-07 16:00:32 UTC (rev 19582)
@@ -115,7 +115,7 @@
        PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
        if (descr == NULL) {
                if (strcmp(PyString_AsString(attr), "__dict__")==0) {
-                       return py_getattr_dict(NULL, Methods, NULL); /* no 
Attributes yet */
+                       return py_getattr_dict(NULL, Type.tp_dict); /* no 
Attributes yet */
                }
                PyErr_SetString(PyExc_AttributeError, "attribute not found");
                return NULL;
@@ -767,25 +767,14 @@
  * Other then making dir() useful the value returned from __dict__() is not 
useful
  * since every value is a Py_None
  * */
-PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef 
*attrdef)
+PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict)
 {
     if(pydict==NULL) { /* incase calling __dict__ on the parent of this object 
raised an error */
        PyErr_Clear();
        pydict = PyDict_New();
     }
        
-    if(meth) {
-               for (; meth->ml_name != NULL; meth++) {
-                       PyDict_SetItemString(pydict, meth->ml_name, Py_None);
-               }
-       }
-       
-    if(attrdef) {
-               for (; attrdef->m_name != NULL; attrdef++) {
-                       PyDict_SetItemString(pydict, attrdef->m_name, Py_None);
-               }
-       }
-
+       PyDict_Update(pydict, tp_dict);
        return pydict;
 }
 

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.h  2009-04-07 
15:20:12 UTC (rev 19581)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.h  2009-04-07 
16:00:32 UTC (rev 19582)
@@ -105,15 +105,18 @@
        if(descr) { \
                if (PyCObject_Check(descr)) { \
                        return py_get_attrdef((void *)this, (const 
PyAttributeDef*)PyCObject_AsVoidPtr(descr)); \
+               } else if (descr->ob_type->tp_descr_get) { \
+                       return PyCFunction_New(((PyMethodDescrObject 
*)descr)->d_method, (PyObject *)this); \
                } else { \
-                       return PyCFunction_New(((PyMethodDescrObject 
*)descr)->d_method, (PyObject *)this); \
+                       fprintf(stderr, "unknown attribute type"); \
+                       return descr; \
                } \
        } else { \
                PyErr_Clear(); \
                PyObject *rvalue= Parent::py_getattro(attr); \
                 \
                if (strcmp(PyString_AsString(attr), "__dict__")==0) { \
-                       return py_getattr_dict(rvalue, Methods, Attributes); \
+                       return py_getattr_dict(rvalue, Type.tp_dict); \
                } \
                 \
                return rvalue; \
@@ -434,7 +437,7 @@
        }
 };
 
-PyObject *py_getattr_dict(PyObject *pydict, PyMethodDef *meth, PyAttributeDef 
*attrdef);
+PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict);
 
 #endif //  _adr_py_lib_h_
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-04-07 
15:20:12 UTC (rev 19581)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-04-07 
16:00:32 UTC (rev 19582)
@@ -1486,7 +1486,7 @@
 {
        KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
        PyObject *dict_str = PyString_FromString("__dict__");
-       PyObject *dict= 
py_getattr_dict(self->SCA_IObject::py_getattro(dict_str), 
KX_GameObject::Methods, KX_GameObject::Attributes);
+       PyObject *dict= 
py_getattr_dict(self->SCA_IObject::py_getattro(dict_str), Type.tp_dict);
        Py_DECREF(dict_str);
        
        if(dict==NULL)

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2009-04-07 15:20:12 UTC 
(rev 19581)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2009-04-07 16:00:32 UTC 
(rev 19582)
@@ -1574,7 +1574,7 @@
        KX_Scene* self= static_cast<KX_Scene*>(self_v);
        /* Useually done by py_getattro_up but in this case we want to include 
m_attrlist dict */
        PyObject *dict_str= PyString_FromString("__dict__");
-       PyObject *dict= 
py_getattr_dict(self->PyObjectPlus::py_getattro(dict_str), KX_Scene::Methods, 
KX_Scene::Attributes);
+       PyObject *dict= 
py_getattr_dict(self->PyObjectPlus::py_getattro(dict_str), Type.tp_dict);
        Py_DECREF(dict_str);
        
        PyDict_Update(dict, self->m_attrlist);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to