in habitat/datasets/rearrange/receptacle.py [0:0]
def get_all_scenedataset_receptacles(sim) -> Dict[str, Dict[str, List[str]]]:
"""
Scrapes the active SceneDataset from a Simulator for all receptacle names defined in rigid/articulated object and stage templates for investigation and preview purposes.
Note this will not include scene-specific overrides defined in scene_config.json files. Only receptacles defined in object_config.json, ao_config.json, and stage_config.json files or added programmatically to associated Attributes objects will be found.
Returns a dict with keys {"stage", "rigid", "articulated"} mapping object template handles to lists of receptacle names.
"""
# cache the rigid and articulated receptacles seperately
receptacles: Dict[str, Dict[str, List[str]]] = {
"stage": {},
"rigid": {},
"articulated": {},
}
# scrape stage configs:
stm = sim.get_stage_template_manager()
for template_handle in stm.get_template_handles(""):
stage_template = stm.get_template_by_handle(template_handle)
for item in stage_template.get_user_config().get_subconfig_keys():
if item.startswith("receptacle_"):
if template_handle not in receptacles["stage"]:
receptacles["stage"][template_handle] = []
receptacles["stage"][template_handle].append(item)
# scrape the rigid object configs:
rotm = sim.get_object_template_manager()
for template_handle in rotm.get_template_handles(""):
obj_template = rotm.get_template_by_handle(template_handle)
for item in obj_template.get_user_config().get_subconfig_keys():
if item.startswith("receptacle_"):
if template_handle not in receptacles["rigid"]:
receptacles["rigid"][template_handle] = []
receptacles["rigid"][template_handle].append(item)
# TODO: we currently need to load every URDF to get at the configs. This should change once AO templates are better managed.
aom = sim.get_articulated_object_manager()
for urdf_handle, urdf_path in sim.metadata_mediator.urdf_paths.items():
ao = aom.add_articulated_object_from_urdf(urdf_path)
for item in ao.user_attributes.get_subconfig_keys():
if item.startswith("receptacle_"):
if urdf_handle not in receptacles["articulated"]:
receptacles["articulated"][urdf_handle] = []
receptacles["articulated"][urdf_handle].append(item)
aom.remove_object_by_handle(ao.handle)
return receptacles