Changes UserData to use global identifiers and makes linkIndex optional.
This removes the need to specify the body id/link index when retrieving a user data entry. Additionally, user data can now optionally be set to visual shapes as well. The following public pybullet APIs have changed (backwards incompatible) addUserData and getUserDataId Makes linkIndex parameter optional (default value is -1) Adds optional visualShapeIndex parameter (default value is -1) getUserData and removeUserData Removes required parameters bodyUniqueId and linkIndex getNumUserData Removes required bodyUniqueId parameter getUserDataInfo Removes required linkIndex parameter Changes returned tuple from (userDataId, key) to (userDataId, key, bodyUniqueId, linkIndex, visualShapeIndex)
This commit is contained in:
@@ -21,16 +21,16 @@ plane_id = client.loadURDF(PLANE_PATH)
|
||||
print ("Plane ID: %s" % plane_id)
|
||||
|
||||
print ("Adding user data to plane")
|
||||
MyKey1 = client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
MyKey2 = client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
MyKey3 = client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
MyKey4 = client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
MyKey1 = client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
MyKey2 = client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
MyKey3 = client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
MyKey4 = client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
print ("Retrieving cached user data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(plane_id, 0, MyKey2))
|
||||
print (client.getUserData(plane_id, 0, MyKey3))
|
||||
print (client.getUserData(plane_id, 0, MyKey4))
|
||||
print (client.getUserData(MyKey1))
|
||||
print (client.getUserData(MyKey2))
|
||||
print (client.getUserData(MyKey3))
|
||||
print (client.getUserData(MyKey4))
|
||||
|
||||
print ("Disconnecting")
|
||||
del client
|
||||
@@ -39,18 +39,18 @@ print ("Reconnecting")
|
||||
client = bullet_client.BulletClient(connection_mode=CONNECTION_METHOD)
|
||||
|
||||
print ("Retrieving synced user data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(plane_id, 0, MyKey2))
|
||||
print (client.getUserData(plane_id, 0, MyKey3))
|
||||
print (client.getUserData(plane_id, 0, MyKey4))
|
||||
print (client.getUserData(MyKey1))
|
||||
print (client.getUserData(MyKey2))
|
||||
print (client.getUserData(MyKey3))
|
||||
print (client.getUserData(MyKey4))
|
||||
|
||||
print ("Number of user data entries: %s" % client.getNumUserData(plane_id, 0))
|
||||
print ("Number of user data entries: %s" % client.getNumUserData(plane_id))
|
||||
|
||||
print ("Overriding user data")
|
||||
client.addUserData(plane_id, 0, "MyKey1", "MyNewValue")
|
||||
client.addUserData(plane_id, "MyKey1", "MyNewValue")
|
||||
|
||||
print ("Cached overridden data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(MyKey1))
|
||||
|
||||
|
||||
print ("Disconnecting")
|
||||
@@ -61,50 +61,50 @@ client = bullet_client.BulletClient(connection_mode=CONNECTION_METHOD)
|
||||
|
||||
|
||||
print ("Synced overridden data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(MyKey1))
|
||||
|
||||
print ("Getting user data ID")
|
||||
print ("Retrieved ID: %s, ID retrieved from addUserData: %s" % (client.getUserDataId(plane_id, 0, "MyKey2"), MyKey2))
|
||||
print ("Retrieved ID: %s, ID retrieved from addUserData: %s" % (client.getUserDataId(plane_id, "MyKey2"), MyKey2))
|
||||
|
||||
print ("Removing user data")
|
||||
client.removeUserData(plane_id, 0, MyKey2)
|
||||
client.removeUserData(MyKey2)
|
||||
|
||||
print ("Retrieving cached removed data")
|
||||
print (client.getUserData(plane_id, 0, MyKey2))
|
||||
print (client.getUserData(MyKey2))
|
||||
|
||||
print ("Syncing")
|
||||
client.syncUserData()
|
||||
|
||||
print ("Retrieving removed removed data")
|
||||
print (client.getUserData(plane_id, 0, MyKey2))
|
||||
print (client.getUserData(MyKey2))
|
||||
|
||||
print ("Iterating over all user data entries and printing results")
|
||||
for i in range(client.getNumUserData(plane_id, 0)):
|
||||
userDataId, key = client.getUserDataInfo(plane_id, 0, i)
|
||||
print ("Info: (%s, %s)" % (userDataId, key))
|
||||
print ("Value: %s" % client.getUserData(plane_id, 0, userDataId))
|
||||
for i in range(client.getNumUserData(plane_id)):
|
||||
userDataId, key, bodyId, linkIndex, visualShapeIndex = client.getUserDataInfo(plane_id, i)
|
||||
print ("Info: (%s, %s, %s, %s, %s)" % (userDataId, key, bodyId, linkIndex, visualShapeIndex))
|
||||
print ("Value: %s" % client.getUserData(userDataId))
|
||||
|
||||
print ("Removing body")
|
||||
client.removeBody(plane_id)
|
||||
|
||||
print ("Retrieving user data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(plane_id, 0, MyKey3))
|
||||
print (client.getUserData(plane_id, 0, MyKey4))
|
||||
print (client.getUserData(MyKey1))
|
||||
print (client.getUserData(MyKey3))
|
||||
print (client.getUserData(MyKey4))
|
||||
|
||||
print ("Syncing")
|
||||
client.syncUserData()
|
||||
|
||||
print ("Retrieving user data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(plane_id, 0, MyKey3))
|
||||
print (client.getUserData(plane_id, 0, MyKey4))
|
||||
print (client.getUserData(MyKey1))
|
||||
print (client.getUserData(MyKey3))
|
||||
print (client.getUserData(MyKey4))
|
||||
|
||||
plane_id2 = client.loadURDF(PLANE_PATH)
|
||||
print ("Plane1: %s, plane2: %s" % (plane_id, plane_id2))
|
||||
|
||||
print ("Retrieving user data")
|
||||
print (client.getUserData(plane_id, 0, MyKey1))
|
||||
print (client.getUserData(plane_id, 0, MyKey3))
|
||||
print (client.getUserData(plane_id, 0, MyKey4))
|
||||
print (client.getUserData(MyKey1))
|
||||
print (client.getUserData(MyKey3))
|
||||
print (client.getUserData(MyKey4))
|
||||
|
||||
|
||||
@@ -689,18 +689,19 @@ static PyObject* pybullet_addUserData(PyObject* self, PyObject* args, PyObject*
|
||||
b3PhysicsClientHandle sm = 0;
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -2;
|
||||
int linkIndex = -1;
|
||||
int visualShapeIndex = -1;
|
||||
const char* key = "";
|
||||
const char* value = ""; // TODO: Change this to a PyObject and detect the type dynamically.
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "key", "value", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"bodyUniqueId", "key", "value", "linkIndex", "visualShapeIndex", "physicsClientId", NULL};
|
||||
b3SharedMemoryCommandHandle command;
|
||||
b3SharedMemoryStatusHandle statusHandle;
|
||||
int statusType;
|
||||
int userDataId;
|
||||
int valueLen=-1;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iiss|i", kwlist, &bodyUniqueId, &linkIndex, &key, &value, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iss|iii", kwlist, &bodyUniqueId, &key, &value, &linkIndex, &visualShapeIndex, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -712,7 +713,7 @@ static PyObject* pybullet_addUserData(PyObject* self, PyObject* args, PyObject*
|
||||
}
|
||||
|
||||
valueLen = strlen(value)+1;
|
||||
command = b3InitAddUserDataCommand(sm, bodyUniqueId, linkIndex, key, USER_DATA_VALUE_TYPE_STRING, valueLen, value);
|
||||
command = b3InitAddUserDataCommand(sm, bodyUniqueId, linkIndex, visualShapeIndex, key, USER_DATA_VALUE_TYPE_STRING, valueLen, value);
|
||||
statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command);
|
||||
statusType = b3GetStatusType(statusHandle);
|
||||
|
||||
@@ -730,16 +731,14 @@ static PyObject* pybullet_removeUserData(PyObject* self, PyObject* args, PyObjec
|
||||
{
|
||||
b3PhysicsClientHandle sm = 0;
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -1;
|
||||
int userDataId = -1;
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "userDataId", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"userDataId", "physicsClientId", NULL};
|
||||
b3SharedMemoryCommandHandle command;
|
||||
b3SharedMemoryStatusHandle statusHandle;
|
||||
int statusType;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iii|i", kwlist, &bodyUniqueId, &linkIndex, &userDataId, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|i", kwlist, &userDataId, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -750,7 +749,7 @@ static PyObject* pybullet_removeUserData(PyObject* self, PyObject* args, PyObjec
|
||||
return NULL;
|
||||
}
|
||||
|
||||
command = b3InitRemoveUserDataCommand(sm, bodyUniqueId, linkIndex, userDataId);
|
||||
command = b3InitRemoveUserDataCommand(sm, userDataId);
|
||||
statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command);
|
||||
statusType = b3GetStatusType(statusHandle);
|
||||
|
||||
@@ -770,15 +769,16 @@ static PyObject* pybullet_getUserDataId(PyObject* self, PyObject* args, PyObject
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -1;
|
||||
int visualShapeIndex = -1;
|
||||
const char* key = "";
|
||||
int userDataId;
|
||||
|
||||
|
||||
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "key", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"bodyUniqueId", "key", "linkIndex", "visualShapeIndex", "physicsClientId", NULL};
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iis|i", kwlist, &bodyUniqueId, &linkIndex, &key, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "is|iii", kwlist, &bodyUniqueId, &key, &linkIndex, &visualShapeIndex, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -789,7 +789,7 @@ static PyObject* pybullet_getUserDataId(PyObject* self, PyObject* args, PyObject
|
||||
return NULL;
|
||||
}
|
||||
|
||||
userDataId = b3GetUserDataId(sm, bodyUniqueId, linkIndex, key);
|
||||
userDataId = b3GetUserDataId(sm, bodyUniqueId, linkIndex, visualShapeIndex, key);
|
||||
return PyInt_FromLong(userDataId);
|
||||
}
|
||||
|
||||
@@ -797,16 +797,14 @@ static PyObject* pybullet_getUserData(PyObject* self, PyObject* args, PyObject*
|
||||
{
|
||||
b3PhysicsClientHandle sm = 0;
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -1;
|
||||
int userDataId = -1;
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "userDataId", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"userDataId", "physicsClientId", NULL};
|
||||
|
||||
|
||||
|
||||
struct b3UserDataValue value;
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iii|i", kwlist, &bodyUniqueId, &linkIndex, &userDataId, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|i", kwlist, &userDataId, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -818,7 +816,7 @@ static PyObject* pybullet_getUserData(PyObject* self, PyObject* args, PyObject*
|
||||
}
|
||||
|
||||
|
||||
if (!b3GetUserData(sm, bodyUniqueId, linkIndex, userDataId, &value)) {
|
||||
if (!b3GetUserData(sm, userDataId, &value)) {
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
@@ -837,15 +835,14 @@ static PyObject* pybullet_getNumUserData(PyObject* self, PyObject* args, PyObjec
|
||||
b3PhysicsClientHandle sm = 0;
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -1;
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"bodyUniqueId", "physicsClientId", NULL};
|
||||
|
||||
|
||||
|
||||
int numUserData;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "ii|i", kwlist, &bodyUniqueId, &linkIndex, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|i", kwlist, &bodyUniqueId, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -856,7 +853,7 @@ static PyObject* pybullet_getNumUserData(PyObject* self, PyObject* args, PyObjec
|
||||
return NULL;
|
||||
}
|
||||
|
||||
numUserData = b3GetNumUserData(sm, bodyUniqueId, linkIndex);
|
||||
numUserData = b3GetNumUserData(sm, bodyUniqueId);
|
||||
return PyInt_FromLong(numUserData);
|
||||
}
|
||||
|
||||
@@ -865,16 +862,17 @@ static PyObject* pybullet_getUserDataInfo(PyObject* self, PyObject* args, PyObje
|
||||
b3PhysicsClientHandle sm = 0;
|
||||
int physicsClientId = 0;
|
||||
int bodyUniqueId = -1;
|
||||
int linkIndex = -1;
|
||||
int userDataIndex = -1;
|
||||
int linkIndex = -1;
|
||||
int visualShapeIndex = -1;
|
||||
|
||||
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "userDataIndex", "physicsClientId", NULL};
|
||||
static char* kwlist[] = {"bodyUniqueId", "userDataIndex", "physicsClientId", NULL};
|
||||
|
||||
|
||||
const char* key = 0;
|
||||
int userDataId = -1;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "iii|i", kwlist, &bodyUniqueId, &linkIndex, &userDataIndex, &physicsClientId))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, keywds, "ii|i", kwlist, &bodyUniqueId, &userDataIndex, &physicsClientId))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -885,16 +883,19 @@ static PyObject* pybullet_getUserDataInfo(PyObject* self, PyObject* args, PyObje
|
||||
return NULL;
|
||||
}
|
||||
|
||||
b3GetUserDataInfo(sm, bodyUniqueId, linkIndex, userDataIndex, &key, &userDataId);
|
||||
b3GetUserDataInfo(sm, bodyUniqueId, userDataIndex, &key, &userDataId, &linkIndex, &visualShapeIndex);
|
||||
if (key == 0 || userDataId == -1) {
|
||||
PyErr_SetString(SpamError, "Could not get user data info.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
{
|
||||
PyObject *userDataInfoTuple = PyTuple_New(2);
|
||||
PyObject *userDataInfoTuple = PyTuple_New(5);
|
||||
PyTuple_SetItem(userDataInfoTuple, 0, PyInt_FromLong(userDataId));
|
||||
PyTuple_SetItem(userDataInfoTuple, 1, PyString_FromString(key));
|
||||
PyTuple_SetItem(userDataInfoTuple, 2, PyInt_FromLong(bodyUniqueId));
|
||||
PyTuple_SetItem(userDataInfoTuple, 3, PyInt_FromLong(linkIndex));
|
||||
PyTuple_SetItem(userDataInfoTuple, 4, PyInt_FromLong(visualShapeIndex));
|
||||
return userDataInfoTuple;
|
||||
}
|
||||
}
|
||||
@@ -9131,28 +9132,28 @@ static PyMethodDef SpamMethods[] = {
|
||||
"Update user data, in case other clients made changes."},
|
||||
|
||||
{"addUserData", (PyCFunction)pybullet_addUserData, METH_VARARGS | METH_KEYWORDS,
|
||||
"addUserData(bodyUniqueId, linkIndex, key, value, physicsClientId=0)\n"
|
||||
"Adds or updates a user data entry to a link. Returns user data identifier."},
|
||||
"addUserData(bodyUniqueId, key, value, linkIndex=-1, visualShapeIndex=-1, physicsClientId=0)\n"
|
||||
"Adds or updates a user data entry. Returns user data identifier."},
|
||||
|
||||
{"getUserData", (PyCFunction)pybullet_getUserData, METH_VARARGS | METH_KEYWORDS,
|
||||
"getUserData(bodyUniqueId, linkIndex, userDataId, physicsClientId=0)\n"
|
||||
"getUserData(userDataId, physicsClientId=0)\n"
|
||||
"Returns the user data value."},
|
||||
|
||||
{"removeUserData", (PyCFunction)pybullet_removeUserData, METH_VARARGS | METH_KEYWORDS,
|
||||
"removeUserData(bodyUniqueId, linkIndex, userDataId, physicsClientId=0)\n"
|
||||
"removeUserData(userDataId, physicsClientId=0)\n"
|
||||
"Removes a user data entry."},
|
||||
|
||||
{"getUserDataId", (PyCFunction)pybullet_getUserDataId, METH_VARARGS | METH_KEYWORDS,
|
||||
"getUserDataId(bodyUniqueId, linkIndex, key, physicsClientId=0)\n"
|
||||
"Retrieves the userDataId on a link given the key."},
|
||||
"getUserDataId(bodyUniqueId, key, linkIndex=-1, visualShapeIndex=-1, physicsClientId=0)\n"
|
||||
"Retrieves the userDataId given the key and optionally link and visual shape index."},
|
||||
|
||||
{"getNumUserData", (PyCFunction)pybullet_getNumUserData, METH_VARARGS | METH_KEYWORDS,
|
||||
"getNumUserData(bodyUniqueId, linkIndex, physicsClientId=0)\n"
|
||||
"Retrieves the number of user data entries in a link."},
|
||||
"getNumUserData(bodyUniqueId physicsClientId=0)\n"
|
||||
"Retrieves the number of user data entries in a body."},
|
||||
|
||||
{"getUserDataInfo", (PyCFunction)pybullet_getUserDataInfo, METH_VARARGS | METH_KEYWORDS,
|
||||
"getUserDataInfo(bodyUniqueId, linkIndex, userDataIndex, physicsClientId=0)\n"
|
||||
"Retrieves the key and the identifier of a user data as (id, key)."},
|
||||
"getUserDataInfo(bodyUniqueId, userDataIndex, physicsClientId=0)\n"
|
||||
"Retrieves the key and the identifier of a user data as (userDataId, key, bodyUniqueId, linkIndex, visualShapeIndex)."},
|
||||
|
||||
{"removeBody", (PyCFunction)pybullet_removeBody, METH_VARARGS | METH_KEYWORDS,
|
||||
"Remove a body by its body unique id."},
|
||||
|
||||
@@ -26,169 +26,170 @@ class TestUserDataMethods(unittest.TestCase):
|
||||
|
||||
def testAddUserData(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
# Retrieve user data and make sure it's correct.
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(b"MyValue2", self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(uid1))
|
||||
self.assertEqual(b"MyValue2", self.client.getUserData(uid2))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(uid4))
|
||||
|
||||
# Disconnect/reconnect and make sure that the user data is synced back.
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(b"MyValue2", self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(uid1))
|
||||
self.assertEqual(b"MyValue2", self.client.getUserData(uid2))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(uid4))
|
||||
|
||||
self.client.resetSimulation()
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(None, self.client.getUserData(uid1))
|
||||
self.assertEqual(None, self.client.getUserData(uid2))
|
||||
self.assertEqual(None, self.client.getUserData(uid3))
|
||||
self.assertEqual(None, self.client.getUserData(uid4))
|
||||
|
||||
|
||||
def testGetNumUserData(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
self.assertEqual(4, self.client.getNumUserData(plane_id, 0))
|
||||
self.assertEqual(4, self.client.getNumUserData(plane_id))
|
||||
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(4, self.client.getNumUserData(plane_id, 0))
|
||||
self.assertEqual(4, self.client.getNumUserData(plane_id))
|
||||
|
||||
|
||||
def testReplaceUserData(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid = self.client.addUserData(plane_id, 0, "MyKey", "MyValue")
|
||||
uid = self.client.addUserData(plane_id, "MyKey", "MyValue")
|
||||
|
||||
self.assertEqual(b"MyValue", self.client.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(b"MyValue", self.client.getUserData(uid))
|
||||
|
||||
new_uid = self.client.addUserData(plane_id, 0, "MyKey", "MyNewValue")
|
||||
new_uid = self.client.addUserData(plane_id, "MyKey", "MyNewValue")
|
||||
self.assertEqual(uid, new_uid)
|
||||
self.assertEqual(b"MyNewValue", self.client.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(b"MyNewValue", self.client.getUserData(uid))
|
||||
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(b"MyNewValue", self.client.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(b"MyNewValue", self.client.getUserData(uid))
|
||||
|
||||
def testGetUserDataId(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
self.assertEqual(uid1, self.client.getUserDataId(plane_id, 0, "MyKey1"))
|
||||
self.assertEqual(uid2, self.client.getUserDataId(plane_id, 0, "MyKey2"))
|
||||
self.assertEqual(uid3, self.client.getUserDataId(plane_id, 0, "MyKey3"))
|
||||
self.assertEqual(uid4, self.client.getUserDataId(plane_id, 0, "MyKey4"))
|
||||
self.assertEqual(uid1, self.client.getUserDataId(plane_id, "MyKey1"))
|
||||
self.assertEqual(uid2, self.client.getUserDataId(plane_id, "MyKey2"))
|
||||
self.assertEqual(uid3, self.client.getUserDataId(plane_id, "MyKey3"))
|
||||
self.assertEqual(uid4, self.client.getUserDataId(plane_id, "MyKey4"))
|
||||
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(uid1, self.client.getUserDataId(plane_id, 0, "MyKey1"))
|
||||
self.assertEqual(uid2, self.client.getUserDataId(plane_id, 0, "MyKey2"))
|
||||
self.assertEqual(uid3, self.client.getUserDataId(plane_id, 0, "MyKey3"))
|
||||
self.assertEqual(uid4, self.client.getUserDataId(plane_id, 0, "MyKey4"))
|
||||
self.assertEqual(uid1, self.client.getUserDataId(plane_id, "MyKey1"))
|
||||
self.assertEqual(uid2, self.client.getUserDataId(plane_id, "MyKey2"))
|
||||
self.assertEqual(uid3, self.client.getUserDataId(plane_id, "MyKey3"))
|
||||
self.assertEqual(uid4, self.client.getUserDataId(plane_id, "MyKey4"))
|
||||
|
||||
|
||||
def testRemoveUserData(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
self.client.removeUserData(plane_id, 0, uid2)
|
||||
self.client.removeUserData(uid2)
|
||||
|
||||
self.assertEqual(3, self.client.getNumUserData(plane_id, 0))
|
||||
self.assertEqual(-1, self.client.getUserDataId(plane_id, 0, "MyKey2"))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(3, self.client.getNumUserData(plane_id))
|
||||
self.assertEqual(-1, self.client.getUserDataId(plane_id, "MyKey2"))
|
||||
self.assertEqual(None, self.client.getUserData(uid2))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(uid1))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(uid4))
|
||||
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(3, self.client.getNumUserData(plane_id, 0))
|
||||
self.assertEqual(-1, self.client.getUserDataId(plane_id, 0, "MyKey2"))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(3, self.client.getNumUserData(plane_id))
|
||||
self.assertEqual(-1, self.client.getUserDataId(plane_id, "MyKey2"))
|
||||
self.assertEqual(None, self.client.getUserData(uid2))
|
||||
self.assertEqual(b"MyValue1", self.client.getUserData(uid1))
|
||||
self.assertEqual(b"MyValue3", self.client.getUserData(uid3))
|
||||
self.assertEqual(b"MyValue4", self.client.getUserData(uid4))
|
||||
|
||||
|
||||
def testIterateAllUserData(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
entries = set()
|
||||
for i in range(self.client.getNumUserData(plane_id, 0)):
|
||||
userDataId, key = self.client.getUserDataInfo(plane_id, 0, i)
|
||||
value = self.client.getUserData(plane_id, 0, userDataId);
|
||||
entries.add((userDataId, key, value))
|
||||
for i in range(self.client.getNumUserData(plane_id)):
|
||||
userDataId, key, bodyId, linkIndex, visualShapeIndex = self.client.getUserDataInfo(plane_id, i)
|
||||
value = self.client.getUserData(userDataId);
|
||||
entries.add((userDataId, key, value, bodyId, linkIndex, visualShapeIndex))
|
||||
|
||||
self.assertTrue((uid1, b"MyKey1", b"MyValue1") in entries)
|
||||
self.assertTrue((uid2, b"MyKey2", b"MyValue2") in entries)
|
||||
self.assertTrue((uid3, b"MyKey3", b"MyValue3") in entries)
|
||||
self.assertTrue((uid4, b"MyKey4", b"MyValue4") in entries)
|
||||
self.assertTrue((uid1, b"MyKey1", b"MyValue1", plane_id, -1, -1) in entries)
|
||||
self.assertTrue((uid2, b"MyKey2", b"MyValue2", plane_id, -1, -1) in entries)
|
||||
self.assertTrue((uid3, b"MyKey3", b"MyValue3", plane_id, -1, -1) in entries)
|
||||
self.assertTrue((uid4, b"MyKey4", b"MyValue4", plane_id, -1, -1) in entries)
|
||||
self.assertEqual(4, len(entries))
|
||||
|
||||
|
||||
def testRemoveBody(self):
|
||||
plane_id = self.client.loadURDF(PLANE_PATH)
|
||||
uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
|
||||
uid1 = self.client.addUserData(plane_id, "MyKey1", "MyValue1")
|
||||
uid2 = self.client.addUserData(plane_id, "MyKey2", "MyValue2")
|
||||
uid3 = self.client.addUserData(plane_id, "MyKey3", "MyValue3")
|
||||
uid4 = self.client.addUserData(plane_id, "MyKey4", "MyValue4")
|
||||
|
||||
self.client.removeBody(plane_id)
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(None, self.client.getUserData(uid1))
|
||||
self.assertEqual(None, self.client.getUserData(uid2))
|
||||
self.assertEqual(None, self.client.getUserData(uid3))
|
||||
self.assertEqual(None, self.client.getUserData(uid4))
|
||||
|
||||
del self.client
|
||||
self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
|
||||
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
|
||||
self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
|
||||
self.assertEqual(None, self.client.getUserData(uid1))
|
||||
self.assertEqual(None, self.client.getUserData(uid2))
|
||||
self.assertEqual(None, self.client.getUserData(uid3))
|
||||
self.assertEqual(None, self.client.getUserData(uid4))
|
||||
|
||||
|
||||
def testMultipleBodies(self):
|
||||
plane1 = self.client.loadURDF(PLANE_PATH)
|
||||
plane2 = self.client.loadURDF(PLANE_PATH)
|
||||
|
||||
uid1 = self.client.addUserData(plane1, 0, "MyKey1", "This is plane 1 - 1")
|
||||
uid2 = self.client.addUserData(plane1, 0, "MyKey2", "This is plane 1 - 2")
|
||||
uid1 = self.client.addUserData(plane1, "MyKey1", "This is plane 1 - 1")
|
||||
uid2 = self.client.addUserData(plane1, "MyKey2", "This is plane 1 - 2")
|
||||
|
||||
uid3 = self.client.addUserData(plane2, 0, "MyKey1", "This is plane 2 - 1")
|
||||
uid4 = self.client.addUserData(plane2, 0, "MyKey2", "This is plane 2 - 2")
|
||||
uid5 = self.client.addUserData(plane2, 0, "MyKey3", "This is plane 2 - 3")
|
||||
uid3 = self.client.addUserData(plane2, "MyKey1", "This is plane 2 - 1")
|
||||
uid4 = self.client.addUserData(plane2, "MyKey2", "This is plane 2 - 2")
|
||||
uid5 = self.client.addUserData(plane2, "MyKey3", "This is plane 2 - 3")
|
||||
|
||||
self.assertEqual(b"This is plane 1 - 1", self.client.getUserData(plane1, 0, self.client.getUserDataId(plane1, 0, "MyKey1")))
|
||||
self.assertEqual(b"This is plane 1 - 2", self.client.getUserData(plane1, 0, self.client.getUserDataId(plane1, 0, "MyKey2")))
|
||||
self.assertEqual(b"This is plane 1 - 1", self.client.getUserData(self.client.getUserDataId(plane1, "MyKey1")))
|
||||
self.assertEqual(b"This is plane 1 - 2", self.client.getUserData(self.client.getUserDataId(plane1, "MyKey2")))
|
||||
|
||||
self.assertEqual(b"This is plane 2 - 1", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey1")))
|
||||
self.assertEqual(b"This is plane 2 - 2", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey2")))
|
||||
self.assertEqual(b"This is plane 2 - 3", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey3")))
|
||||
self.assertEqual(b"This is plane 2 - 1", self.client.getUserData(self.client.getUserDataId(plane2, "MyKey1")))
|
||||
self.assertEqual(b"This is plane 2 - 2", self.client.getUserData(self.client.getUserDataId(plane2, "MyKey2")))
|
||||
self.assertEqual(b"This is plane 2 - 3", self.client.getUserData(self.client.getUserDataId(plane2, "MyKey3")))
|
||||
|
||||
|
||||
def testMultipleLinks(self):
|
||||
@@ -198,14 +199,15 @@ class TestUserDataMethods(unittest.TestCase):
|
||||
self.assertTrue(num_links > 1)
|
||||
|
||||
for link_index in range(num_links):
|
||||
uid1 = self.client.addUserData(body_id, link_index, "MyKey1", "Value1 for link %s" % link_index)
|
||||
uid2 = self.client.addUserData(body_id, link_index, "MyKey2", "Value2 for link %s" % link_index)
|
||||
uid1 = self.client.addUserData(body_id, "MyKey1", "Value1 for link %s" % link_index, link_index)
|
||||
uid2 = self.client.addUserData(body_id, "MyKey2", "Value2 for link %s" % link_index, link_index)
|
||||
|
||||
for link_index in range(num_links):
|
||||
uid1 = self.client.getUserDataId(body_id, link_index, "MyKey1")
|
||||
uid2 = self.client.getUserDataId(body_id, link_index, "MyKey2")
|
||||
self.assertEqual(("Value1 for link %s" % link_index).encode(), self.client.getUserData(body_id, link_index, uid1))
|
||||
self.assertEqual(("Value2 for link %s" % link_index).encode(), self.client.getUserData(body_id, link_index, uid2))
|
||||
uid1 = self.client.getUserDataId(body_id, "MyKey1", link_index)
|
||||
uid2 = self.client.getUserDataId(body_id, "MyKey2", link_index)
|
||||
self.assertEqual(("Value1 for link %s" % link_index).encode(), self.client.getUserData(uid1))
|
||||
self.assertEqual(("Value2 for link %s" % link_index).encode(), self.client.getUserData(uid2))
|
||||
|
||||
|
||||
def testMultipleClients(self):
|
||||
client1 = self.client
|
||||
@@ -215,25 +217,48 @@ class TestUserDataMethods(unittest.TestCase):
|
||||
client2.syncBodyInfo()
|
||||
|
||||
# Add user data on client 1, check on client 1
|
||||
uid = client1.addUserData(plane_id, 0, "MyKey", "MyValue")
|
||||
self.assertEqual(None, client2.getUserData(plane_id, 0, uid))
|
||||
uid = client1.addUserData(plane_id, "MyKey", "MyValue")
|
||||
self.assertEqual(None, client2.getUserData(uid))
|
||||
client2.syncUserData()
|
||||
self.assertEqual(b"MyValue", client2.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(b"MyValue", client2.getUserData(uid))
|
||||
|
||||
# Overwrite the value on client 2, check on client 1
|
||||
client2.addUserData(plane_id, 0, "MyKey", "MyNewValue")
|
||||
self.assertEqual(b"MyValue", client1.getUserData(plane_id, 0, uid))
|
||||
client2.addUserData(plane_id, "MyKey", "MyNewValue")
|
||||
self.assertEqual(b"MyValue", client1.getUserData(uid))
|
||||
client1.syncUserData()
|
||||
self.assertEqual(b"MyNewValue", client1.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(b"MyNewValue", client1.getUserData(uid))
|
||||
|
||||
# Remove user data on client 1, check on client 2
|
||||
client1.removeUserData(plane_id, 0, uid)
|
||||
self.assertEqual(b"MyNewValue", client2.getUserData(plane_id, 0, uid))
|
||||
client1.removeUserData(uid)
|
||||
self.assertEqual(b"MyNewValue", client2.getUserData(uid))
|
||||
client2.syncUserData()
|
||||
self.assertEqual(None, client2.getUserData(plane_id, 0, uid))
|
||||
self.assertEqual(None, client2.getUserData(uid))
|
||||
|
||||
del client2
|
||||
|
||||
|
||||
def testUserDataOnVisualShapes(self):
|
||||
body_id = self.client.loadURDF(ROBOT_PATH)
|
||||
num_links = self.client.getNumJoints(body_id)
|
||||
visual_shapes = self.client.getVisualShapeData(body_id)
|
||||
|
||||
self.assertTrue(num_links > 0)
|
||||
self.assertTrue(len(visual_shapes) > 0)
|
||||
|
||||
user_data_entries = set()
|
||||
for link_index in range(-1, num_links):
|
||||
num_shapes = sum([1 for shape in visual_shapes if shape[1] == link_index])
|
||||
for shape_index in range(num_shapes):
|
||||
key = "MyKey"
|
||||
value = "MyValue %s, %s" % (link_index, shape_index)
|
||||
uid = self.client.addUserData(body_id, key, value, link_index, shape_index)
|
||||
user_data_entries.add((uid, key, value.encode(), body_id, link_index, shape_index))
|
||||
|
||||
self.assertEqual(len(visual_shapes), self.client.getNumUserData(body_id))
|
||||
for uid, key, value, body_id, link_index, shape_index in user_data_entries:
|
||||
self.assertEqual(value, self.client.getUserData(uid))
|
||||
self.assertEqual(uid, self.client.getUserDataId(body_id, key, link_index, shape_index))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user