def createLink(link): """Creates the blender representation of a given link and its parent joint. Args: link(dict): The link you want to create a representation of. Returns: bpy_types.Object -- the newly created blender link object. """ # create armature/bone bUtils.toggleLayer(defs.layerTypes['link'], True) bpy.ops.object.select_all(action='DESELECT') bpy.ops.object.armature_add( layers=bUtils.defLayers([defs.layerTypes['link']])) newlink = bpy.context.active_object # Move bone when adding at selected objects location if 'matrix' in link: newlink.matrix_world = link['matrix'] newlink.phobostype = 'link' if link['name'] in bpy.data.objects.keys(): log('Object with name of new link already exists: ' + link['name'], 'WARNING') nUtils.safelyName(newlink, link['name']) # set the size of the link visuals, collisions = getGeometricElements(link) if visuals or collisions: scale = max((geometrymodel.getLargestDimension(e['geometry']) for e in visuals + collisions)) else: scale = 0.2 # use scaling factor provided by user if 'scale' in link: scale *= link['scale'] newlink.scale = (scale, scale, scale) bpy.ops.object.transform_apply(scale=True) # add custom properties for prop in link: if prop.startswith('$'): for tag in link[prop]: newlink['link/' + prop[1:] + '/' + tag] = link[prop][tag] # create inertial if 'inertial' in link: inertia.createInertial(link['name'], link['inertial'], newlink) # create geometric elements log( "Creating visual and collision objects for link '{0}': {1}".format( link['name'], ', '.join([elem['name'] for elem in visuals + collisions])), 'DEBUG') for v in visuals: geometrymodel.createGeometry(v, 'visual', newlink) for c in collisions: geometrymodel.createGeometry(c, 'collision', newlink) return newlink
def createLink(link): """Creates the blender representation of a given link and its parent joint. :param link: The link you want to create a representation of. :type link: dict :return: bpy_types.Object -- the newly created blender link object. """ # create armature/bone bUtils.toggleLayer(defs.layerTypes['link'], True) bpy.ops.object.select_all(action='DESELECT') bpy.ops.object.armature_add( layers=bUtils.defLayers([defs.layerTypes['link']])) newlink = bpy.context.active_object # Move bone when adding at selected objects location if 'matrix' in link: newlink.matrix_world = link['matrix'] newlink.phobostype = 'link' newlink.name = link['name'] # FIXME: This is a hack and should be checked before creation! # this is a backup in case an object with the link's name already exists newlink["link/name"] = link['name'] # FIXME geometric dimensions are not intiallized properly, thus scale always 0.2! # set the size of the link elements = getGeometricElements(link) scale = max((geometrymodel.getLargestDimension(element['geometry']) for element in elements)) if elements else 0.2 # use scaling factor provided by user #FIXME where would this *scale* come from? if 'scale' in link: scale *= link['scale'] newlink.scale = (scale, scale, scale) bpy.ops.object.transform_apply(scale=True) # add custom properties for prop in link: if prop.startswith('$'): for tag in link[prop]: newlink['link/' + prop[1:] + '/' + tag] = link[prop][tag] # create inertial if 'inertial' in link: inertiamodel.createInertialFromDictionary(link['name'], link['inertial']) # create visual elements if 'visual' in link: for v in link['visual']: visual = link['visual'][v] geometrymodel.createGeometry(visual, 'visual') # create collision elements if 'collision' in link: for c in link['collision']: collision = link['collision'][c] geometrymodel.createGeometry(collision, 'collision') return newlink
def createLink(link): """Creates the blender representation of a given link and its parent joint. The link is added to the link layer. These entries in the dictionary are mandatory: *name*: name for the link The specified dictionary may contain these entries: *matrix*: world matrix for the new link transformation *scale*: scale for the new link (single float) *visual*: list of visual dictionaries *collision*: list of collision dictionaries *inertial*: inertial dictionary (an inertial object will be created on the fly) Furthermore any generic properties, prepended by a `$` will be added as custom properties to the link. E.g. $test/etc would be put to link/test/etc. However, these properties are extracted only in the first layer of hierarchy. Args: link(dict): The link you want to create a representation of. Returns: : bpy_types.Object -- the newly created blender link object. """ log("Creating link object '{}'...".format(link['name']), 'DEBUG', prefix='\n') # create armature/bone bUtils.toggleLayer('link', True) bpy.ops.object.select_all(action='DESELECT') bpy.ops.object.armature_add() newlink = bpy.context.active_object # Move bone when adding at selected objects location if 'matrix' in link: newlink.matrix_world = link['matrix'] # give it a proper name newlink.phobostype = 'link' if link['name'] in bpy.data.objects.keys(): log('Object with name of new link already exists: ' + link['name'], 'WARNING') nUtils.safelyName(newlink, link['name']) # set the size of the link visuals, collisions = getGeometricElements(link) if visuals or collisions: scale = max((geometrymodel.getLargestDimension(e['geometry']) for e in visuals + collisions)) else: scale = 0.2 # use scaling factor provided by user if 'scale' in link: scale *= link['scale'] newlink.scale = (scale, scale, scale) bpy.ops.object.transform_apply(location=False, rotation=False, scale=True, properties=False) # add custom properties for prop in link: if prop.startswith('$'): for tag in link[prop]: newlink['link/' + prop[1:] + '/' + tag] = link[prop][tag] # create inertial if 'inertial' in link: inertia.createInertial(link['inertial'], newlink) # create geometric elements log( "Creating visual and collision objects for link '{0}':\n{1}".format( link['name'], ' \n'.join([elem['name'] for elem in visuals + collisions])), 'DEBUG', ) for vis in visuals: geometrymodel.createGeometry(vis, 'visual', newlink) for col in collisions: geometrymodel.createGeometry(col, 'collision', newlink) bUtils.sortObjectToCollection(newlink, 'link') return newlink
def createLink(link): """Creates the blender representation of a given link and its parent joint. The link is added to the link layer. These entries in the dictionary are mandatory: *name*: name for the link The specified dictionary may contain these entries: *matrix*: world matrix for the new link transformation *scale*: scale for the new link (single float) *visual*: list of visual dictionaries *collision*: list of collision dictionaries *inertial*: inertial dictionary (an inertial object will be created on the fly) Furthermore any generic properties, prepended by a `$` will be added as custom properties to the link. E.g. $test/etc would be put to link/test/etc. However, these properties are extracted only in the first layer of hierarchy. Args: link(dict): The link you want to create a representation of. Returns: : bpy_types.Object -- the newly created blender link object. """ log("Creating link object '{}'...".format(link['name']), 'DEBUG', prefix='\n') # create armature/bone bUtils.toggleLayer(defs.layerTypes['link'], True) bpy.ops.object.select_all(action='DESELECT') bpy.ops.object.armature_add(layers=bUtils.defLayers([defs.layerTypes['link']])) newlink = bpy.context.active_object # Move bone when adding at selected objects location if 'matrix' in link: newlink.matrix_world = link['matrix'] # give it a proper name newlink.phobostype = 'link' if link['name'] in bpy.data.objects.keys(): log('Object with name of new link already exists: ' + link['name'], 'WARNING') nUtils.safelyName(newlink, link['name']) # set the size of the link visuals, collisions = getGeometricElements(link) if visuals or collisions: scale = max( (geometrymodel.getLargestDimension(e['geometry']) for e in visuals + collisions) ) else: scale = 0.2 # use scaling factor provided by user if 'scale' in link: scale *= link['scale'] newlink.scale = (scale, scale, scale) bpy.ops.object.transform_apply(scale=True) # add custom properties for prop in link: if prop.startswith('$'): for tag in link[prop]: newlink['link/' + prop[1:] + '/' + tag] = link[prop][tag] # create inertial if 'inertial' in link: inertia.createInertial(link['inertial'], newlink) # create geometric elements log( "Creating visual and collision objects for link '{0}':\n{1}".format( link['name'], ' \n'.join([elem['name'] for elem in visuals + collisions]) ), 'DEBUG', ) for vis in visuals: geometrymodel.createGeometry(vis, 'visual', newlink) for col in collisions: geometrymodel.createGeometry(col, 'collision', newlink) return newlink