def deriveVisual(obj): """This function derives the visual information from an object. :param obj: The blender object to derive the visuals from. :type obj: bpy_types.Object :return: dict """ try: visual = initObjectProperties(obj, phobostype='visual', ignoretypes='geometry') visual['geometry'] = deriveGeometry(obj) visual['pose'] = deriveObjectPose(obj) if obj.lod_levels: if 'lodmaxdistances' in obj: maxdlist = obj['lodmaxdistances'] else: maxdlist = [ obj.lod_levels[i + 1].distance for i in range(len(obj.lod_levels) - 1) ] + [100.0] lodlist = [] for i in range(len(obj.lod_levels)): filename = obj.lod_levels[ i].object.data.name + ioUtils.getOutputMeshtype() lodlist.append({ 'start': obj.lod_levels[i].distance, 'end': maxdlist[i], 'filename': os.path.join('meshes', filename) }) visual['lod'] = lodlist except KeyError: log("Missing data in visual object " + obj.name, "ERROR") return None return visual
def writeURDFGeometry(output, element): """This functions writes the URDF geometry for a given element at the end of a given String. :param output: The String to append the URDF output string on. :type output: str :param element: A certain element to parse into URDF. :type element: dict :return: str -- The extended String """ geometry = element['geometry'] try: output.append(indent * 4 + '<geometry>\n') if geometry['type'] == 'box': output.append(xmlline(5, 'box', ['size'], [l2str(geometry['size'])])) elif geometry['type'] == "cylinder": output.append(xmlline(5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']])) elif geometry['type'] == "sphere": output.append(xmlline(5, 'sphere', ['radius'], [geometry['radius']])) elif geometry['type'] == 'mesh': output.append(xmlline(5, 'mesh', ['filename', 'scale'], [os.path.join(ioUtils.getRelativeMeshpath(), geometry['filename'] + '.' + ioUtils.getOutputMeshtype()), l2str(geometry['scale'])])) elif geometry['type'] == 'capsule': output.append(xmlline(5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']])) # FIXME: real capsules here! else: raise TypeError("Unknown geometry type") output.append(indent * 4 + '</geometry>\n') except (KeyError, TypeError) as err: log("Misdefined geometry in element " + element['name'] + " " + str(err), "ERROR", "writeURDFGeometry")
def writeURDFGeometry(output, element, filepath): """This functions writes the URDF geometry for a given element at the end of a given String. :param output: The String to append the URDF output string on. :type output: str :param element: A certain element to parse into URDF. :type element: dict :return: str -- The extended String """ geometry = element['geometry'] try: output.append(indent * 4 + '<geometry>\n') if geometry['type'] == 'box': output.append( xmlline(5, 'box', ['size'], [l2str(geometry['size'])])) elif geometry['type'] == "cylinder": output.append( xmlline(5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']])) elif geometry['type'] == "sphere": output.append( xmlline(5, 'sphere', ['radius'], [geometry['radius']])) elif geometry['type'] == 'mesh': # FIXME: the following will crash if unstructured export is used log( "writeURDFGeometry: " + filepath + ' ' + ioUtils.getOutputMeshpath(path.dirname(filepath)), "DEBUG") meshpath = ioUtils.getOutputMeshpath(path.dirname(filepath)) output.append( xmlline(5, 'mesh', ['filename', 'scale'], [ path.join( path.relpath(meshpath, filepath), geometry['filename'] + '.' + ioUtils.getOutputMeshtype()), l2str(geometry['scale']) ])) elif geometry['type'] == 'capsule': # FIXME: real capsules here! output.append( xmlline(5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']])) else: raise TypeError("Unknown geometry type") output.append(indent * 4 + '</geometry>\n') except (KeyError, TypeError) as err: log( "Misdefined geometry in element " + element['name'] + " " + str(err), "ERROR")
def writeURDFGeometry(output, element, filepath): """This functions writes the URDF geometry for a given element at the end of a given String. Args: output(str): The String to append the URDF output string on. element(dict): A certain element to parse into URDF. filepath: Returns: : str -- The extended String """ geometry = element['geometry'] try: output.append(indent * 4 + '<geometry>\n') if geometry['type'] == 'box': output.append( xmlline(5, 'box', ['size'], [l2str(geometry['size'])])) elif geometry['type'] == "cylinder": output.append( xmlline(5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']])) elif geometry['type'] == "sphere": output.append( xmlline(5, 'sphere', ['radius'], [geometry['radius']])) elif geometry['type'] == 'mesh': meshpath = ioUtils.getOutputMeshpath( path.dirname(filepath), None, None ) + geometry['filename'] + '.' + ioUtils.getOutputMeshtype() if not "package://" in meshpath: meshpath = path.relpath(meshpath, filepath) output.append( xmlline( 5, 'mesh', ['filename', 'scale'], [ meshpath, l2str(geometry['scale']), ], )) else: raise TypeError("Unknown geometry type") output.append(indent * 4 + '</geometry>\n') except (KeyError, TypeError) as err: log( "Misdefined geometry in element " + element['name'] + " " + str(err), "ERROR")
def deriveVisual(obj, logging=True, **kwargs): """This function derives the visual information from an object. Contains these keys: *name*: name of the visual *geometry*: derived according to `deriveGeometry` *pose*: derived according to `deriveObjectPose` *lod*: (opt.) level of detail levels Args: obj(bpy.types.Object): object to derive the visual representation from logging: (Default value = True) **kwargs: Returns: : dict -- model representation of the visual object """ visual = initObjectProperties(obj, phobostype='visual', ignoretypes='geometry') visual['geometry'] = deriveGeometry(obj, logging=logging) visual['pose'] = deriveObjectPose(obj, logging=logging) # check for material of the visual material = deriveMaterial(obj.active_material, logging=logging) if material: visual['material'] = material['name'] if obj.lod_levels: if 'lodmaxdistances' in obj: maxdlist = obj['lodmaxdistances'] else: maxdlist = [ obj.lod_levels[i + 1].distance for i in range(len(obj.lod_levels) - 1) ] + [100.0] lodlist = [] for i in range(len(obj.lod_levels)): filename = obj.lod_levels[ i].object.data.name + ioUtils.getOutputMeshtype() lodlist.append({ 'start': obj.lod_levels[i].distance, 'end': maxdlist[i], 'filename': os.path.join('meshes', filename), }) visual['lod'] = lodlist return visual
def writeURDFGeometry(output, element, filepath): """This functions writes the URDF geometry for a given element at the end of a given String. Args: output(str): The String to append the URDF output string on. element(dict): A certain element to parse into URDF. filepath: Returns: : str -- The extended String """ geometry = element['geometry'] try: output.append(indent * 4 + '<geometry>\n') if geometry['type'] == 'box': output.append(xmlline(5, 'box', ['size'], [l2str(geometry['size'])])) elif geometry['type'] == "cylinder": output.append( xmlline( 5, 'cylinder', ['radius', 'length'], [geometry['radius'], geometry['length']] ) ) elif geometry['type'] == "sphere": output.append(xmlline(5, 'sphere', ['radius'], [geometry['radius']])) elif geometry['type'] == 'mesh': meshpath = ioUtils.getOutputMeshpath(path.dirname(filepath)) output.append( xmlline( 5, 'mesh', ['filename', 'scale'], [ path.join( path.relpath(meshpath, filepath), geometry['filename'] + '.' + ioUtils.getOutputMeshtype(), ), l2str(geometry['scale']), ], ) ) else: raise TypeError("Unknown geometry type") output.append(indent * 4 + '</geometry>\n') except (KeyError, TypeError) as err: log("Misdefined geometry in element " + element['name'] + " " + str(err), "ERROR")