Revision: 20124
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20124
Author:   campbellbarton
Date:     2009-05-10 03:48:14 +0200 (Sun, 10 May 2009)

Log Message:
-----------
deprecate controller.getActuator(name) and controller.getSensor(name) for
controller.actuators[name] and controller.sensors[name]

Made a read-only sequence type for logic brick sensors and actuators which can 
access single items or be used like a list or dictionary.
We could use a python dictionary or CValueList but that would be slower to 
create.

So you can do...
 for s in controller.sensors: print s

 print controller.sensors["Sensor"]

 print controller.sensors[0]

 sensors = list(controller.sensors)

This sequence type keeps a reference to the proxy it came from and will raise 
an error on access if the proxy has been removed.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/PyDoc/KX_GameObject.py
    trunk/blender/source/gameengine/PyDoc/SCA_IController.py

Added Paths:
-----------
    trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.h

Modified: trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-05-09 21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/Expressions/PyObjectPlus.cpp        
2009-05-10 01:48:14 UTC (rev 20124)
@@ -981,6 +981,5 @@
 void                   PyObjectPlus::SetDeprecationWarningLinkLast(WarnLink* 
wlink) {m_base_wlink_last= wlink;}
 void                   PyObjectPlus::NullDeprecationWarning() 
{m_base_wlink_first= m_base_wlink_last= NULL;}
 
-
 #endif //NO_EXP_PYTHON_EMBEDDING
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp       
2009-05-09 21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IController.cpp       
2009-05-10 01:48:14 UTC (rev 20124)
@@ -31,6 +31,7 @@
 #include "SCA_IActuator.h"
 #include "SCA_ISensor.h"
 #include "PyObjectPlus.h"
+#include "../Ketsji/KX_PythonSeq.h" /* not nice, only need for 
KX_PythonSeq_CreatePyObject */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -241,10 +242,9 @@
 };
 
 PyMethodDef SCA_IController::Methods[] = {
-       {"getActuator", (PyCFunction) SCA_IController::sPyGetActuator, METH_O},
-       {"getSensor", (PyCFunction) SCA_IController::sPyGetSensor, METH_O},
-       
        //Deprecated functions ------>
+       {"getSensor", (PyCFunction) SCA_IController::sPyGetSensor, METH_O},
+       {"getActuator", (PyCFunction) SCA_IController::sPyGetActuator, METH_O},
        {"getSensors", (PyCFunction) SCA_IController::sPyGetSensors, 
METH_NOARGS},
        {"getActuators", (PyCFunction) SCA_IController::sPyGetActuators, 
METH_NOARGS},
        {"getState", (PyCFunction) SCA_IController::sPyGetState, METH_NOARGS},
@@ -290,7 +290,8 @@
 
 PyObject* SCA_IController::PyGetSensor(PyObject* value)
 {
-
+       ShowDeprecationWarning("getSensor(string)", "the sensors[string] 
property");
+       
        char *scriptArg = PyString_AsString(value);
        if (scriptArg==NULL) {
                PyErr_SetString(PyExc_TypeError, "controller.getSensor(string): 
Python Controller, expected a string (sensor name)");
@@ -313,7 +314,8 @@
 
 PyObject* SCA_IController::PyGetActuator(PyObject* value)
 {
-
+       ShowDeprecationWarning("getActuator(string)", "the actuators[string] 
property");
+       
        char *scriptArg = PyString_AsString(value);
        if (scriptArg==NULL) {
                PyErr_SetString(PyExc_TypeError, 
"controller.getActuator(string): Python Controller, expected a string (actuator 
name)");
@@ -360,24 +362,10 @@
 
 PyObject* SCA_IController::pyattr_get_sensors(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)
 {
-       SCA_IController* self= static_cast<SCA_IController*>(self_v);
-       vector<SCA_ISensor*> linkedsensors = self->GetLinkedSensors();
-       PyObject* resultlist = PyList_New(linkedsensors.size());
-       
-       for (unsigned int index=0;index<linkedsensors.size();index++)
-               PyList_SET_ITEM(resultlist,index, 
linkedsensors[index]->GetProxy());
-       
-       return resultlist;
+       return 
KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, 
KX_PYGENSEQ_CONT_TYPE_SENSORS);    
 }
 
 PyObject* SCA_IController::pyattr_get_actuators(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)
 {
-       SCA_IController* self= static_cast<SCA_IController*>(self_v);
-       vector<SCA_IActuator*> linkedactuators = self->GetLinkedActuators();
-       PyObject* resultlist = PyList_New(linkedactuators.size());
-       
-       for (unsigned int index=0;index<linkedactuators.size();index++)
-               PyList_SET_ITEM(resultlist,index, 
linkedactuators[index]->GetProxy());
-
-       return resultlist;
+       return 
KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, 
KX_PYGENSEQ_CONT_TYPE_ACTUATORS);  
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-05-09 
21:54:22 UTC (rev 20123)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2009-05-10 
01:48:14 UTC (rev 20124)
@@ -63,6 +63,7 @@
 #include "KX_RayCast.h"
 #include "KX_PythonInit.h"
 #include "KX_PyMath.h"
+#include "KX_PythonSeq.h"
 #include "SCA_IActuator.h"
 #include "SCA_ISensor.h"
 #include "SCA_IController.h"
@@ -1735,38 +1736,17 @@
 /* experemental! */
 PyObject* KX_GameObject::pyattr_get_sensors(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)
 {
-       KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-       SCA_SensorList& sensors= self->GetSensors();
-       PyObject* resultlist = PyList_New(sensors.size());
-       
-       for (unsigned int index=0;index<sensors.size();index++)
-               PyList_SET_ITEM(resultlist, index, sensors[index]->GetProxy());
-       
-       return resultlist;
+       return 
KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, 
KX_PYGENSEQ_OB_TYPE_SENSORS);
 }
 
 PyObject* KX_GameObject::pyattr_get_controllers(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)
 {
-       KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-       SCA_ControllerList& controllers= self->GetControllers();
-       PyObject* resultlist = PyList_New(controllers.size());
-       
-       for (unsigned int index=0;index<controllers.size();index++)
-               PyList_SET_ITEM(resultlist, index, 
controllers[index]->GetProxy());
-       
-       return resultlist;
+       return 
KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, 
KX_PYGENSEQ_OB_TYPE_CONTROLLERS);
 }
 
 PyObject* KX_GameObject::pyattr_get_actuators(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)
 {
-       KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
-       SCA_ActuatorList& actuators= self->GetActuators();
-       PyObject* resultlist = PyList_New(actuators.size());
-       
-       for (unsigned int index=0;index<actuators.size();index++)
-               PyList_SET_ITEM(resultlist, index, 
actuators[index]->GetProxy());
-       
-       return resultlist;
+       return 
KX_PythonSeq_CreatePyObject((static_cast<KX_GameObject*>(self_v))->m_proxy, 
KX_PYGENSEQ_OB_TYPE_ACTUATORS);
 }
 
 PyObject* KX_GameObject::pyattr_get_attrDict(void *self_v, const 
KX_PYATTRIBUTE_DEF *attrdef)

Added: trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp                     
        (rev 0)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonSeq.cpp     2009-05-10 
01:48:14 UTC (rev 20124)
@@ -0,0 +1,384 @@
+/**
+ * $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.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * Readonly sequence wrapper for lookups on logic bricks
+ */
+
+
+#include "KX_PythonSeq.h"
+#include "KX_GameObject.h"
+#include "SCA_ISensor.h"
+#include "SCA_IController.h"
+#include "SCA_IActuator.h"
+
+
+PyObject *KX_PythonSeq_CreatePyObject( PyObject *base, short type )
+{
+       KX_PythonSeq *seq = PyObject_NEW( KX_PythonSeq, &KX_PythonSeq_Type);
+       seq->base = base;
+       Py_INCREF(base); /* so we can always access to check if its valid */
+       seq->type = type;
+       seq->iter = -1; /* init */
+       return (PyObject *)seq;
+ }
+ 
+ static void KX_PythonSeq_dealloc( KX_PythonSeq * self )
+{
+       Py_DECREF(self->base);
+       PyObject_DEL( self );
+}
+
+static int KX_PythonSeq_len( KX_PythonSeq * self )
+{
+       PyObjectPlus *self_plus= BGE_PROXY_REF(self->base);
+        
+       if(self_plus==NULL) {
+               PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+               return -1;
+       }
+       
+       switch(self->type) {
+       case KX_PYGENSEQ_CONT_TYPE_SENSORS:
+               return ((SCA_IController 
*)self_plus)->GetLinkedSensors().size();
+       case KX_PYGENSEQ_CONT_TYPE_ACTUATORS:
+               return ((SCA_IController 
*)self_plus)->GetLinkedActuators().size();
+       case KX_PYGENSEQ_OB_TYPE_SENSORS:
+               return ((KX_GameObject *)self_plus)->GetSensors().size();
+       case KX_PYGENSEQ_OB_TYPE_CONTROLLERS:
+               return ((KX_GameObject *)self_plus)->GetControllers().size();
+       case KX_PYGENSEQ_OB_TYPE_ACTUATORS:
+               return ((KX_GameObject *)self_plus)->GetActuators().size();
+       default:
+               /* Should never happen */
+               PyErr_SetString(PyExc_SystemError, "invalid type, internal 
error");
+               return -1;
+       }
+}
+
+static PyObject *KX_PythonSeq_getIndex(KX_PythonSeq * self, int index)
+{
+       PyObjectPlus *self_plus= BGE_PROXY_REF(self->base);
+        
+       if(self_plus==NULL) {
+               PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+               NULL;
+       }
+       
+       switch(self->type) {
+               case KX_PYGENSEQ_CONT_TYPE_SENSORS:
+               {
+                       vector<SCA_ISensor*> linkedsensors = ((SCA_IController 
*)self_plus)->GetLinkedSensors();
+                       SCA_ISensor* sensor;
+                       if(index<0) index += linkedsensors.size();
+                       if(index<0 || index>= linkedsensors.size()) {
+                               PyErr_SetString(PyExc_IndexError, "seq[i]: 
index out of range");
+                               return NULL;
+                       }
+                       return linkedsensors[index]->GetProxy();
+               }
+               case KX_PYGENSEQ_CONT_TYPE_ACTUATORS:
+               {
+                       vector<SCA_IActuator*> linkedactuators = 
((SCA_IController *)self_plus)->GetLinkedActuators();
+                       SCA_IActuator* sensor;
+                       if(index<0) index += linkedactuators.size();
+                       if(index<0 || index>= linkedactuators.size()) {
+                               PyErr_SetString(PyExc_IndexError, "seq[i]: 
index out of range");
+                               return NULL;
+                       }
+                       return linkedactuators[index]->GetProxy();
+               }
+               case KX_PYGENSEQ_OB_TYPE_SENSORS:
+               {
+                       SCA_SensorList& linkedsensors= ((KX_GameObject 
*)self_plus)->GetSensors();
+                       SCA_ISensor *sensor;
+                       if(index<0) index += linkedsensors.size();
+                       if(index<0 || index>= linkedsensors.size()) {
+                               PyErr_SetString(PyExc_IndexError, "seq[i]: 
index out of range");
+                               return NULL;
+                       }
+                       return linkedsensors[index]->GetProxy();
+               }
+               case KX_PYGENSEQ_OB_TYPE_CONTROLLERS:
+               {

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to