mujoco_worldgen/transforms.py (35 lines of code) (raw):
from collections import OrderedDict
'''
Transforms are functions which modify the world in-place.
They can be used to add, remove or change specific attributes, tags, etc.
'''
def closure_transform(closure):
'''
Call closure on every OrderedDict.
This transform is usually not used directly, it is just called internally
by other transforms.
'''
def recursion(xml_dict):
closure(xml_dict)
for key in list(xml_dict.keys()):
values = xml_dict[key]
if not isinstance(values, list):
values = [values]
for value in values:
if isinstance(value, OrderedDict):
recursion(value)
return recursion
def set_geom_attr_transform(name, value):
''' Sets an attribute to a specific value on all geoms '''
return set_node_attr_transform('geom', name, value)
def set_node_attr_transform(nodename, attrname, value):
'''
Sets an attribute to a specific value on every node of the specified type (e.g. geoms).
'''
def fun(xml_dict):
def closure(node):
if nodename in node:
for child in node[nodename]:
child["@" + attrname] = value
return closure_transform(closure)(xml_dict)
return fun