def execute(self, context): """ Args: context: Returns: """ objects = context.selected_objects annotation = defs.definitions[self.annotationtype][self.devicetype] # add annotation (objects) to the selected objects annot_objects = [] for obj in objects: if self.asObject: annot_objects.append( eUtils.addAnnotationObject( obj, annotation, name=obj.name + '_annotation', namespace=self.annotationtype.rstrip('s'), ) ) else: eUtils.addAnnotation(obj, annotation, namespace=self.annotationtype.rstrip('s')) # reselect the original objects and additional annotation objects sUtils.selectObjects(objects + annot_objects, clear=True) bUtils.toggleLayer(defs.layerTypes['annotation'], value=True) return {'FINISHED'}
def execute(self, context): """ Args: context: Returns: """ objects = context.selected_objects annotation = defs.definitions[self.annotationtype][self.devicetype] # add annotation (objects) to the selected objects annot_objects = [] for obj in objects: if self.asObject: annot_objects.append( eUtils.addAnnotationObject( obj, annotation, name=obj.name + '_annotation', namespace=self.annotationtype.rstrip('s'), ) ) else: eUtils.addAnnotation(obj, annotation, namespace=self.annotationtype.rstrip('s')) # reselect the original objects and additional annotation objects sUtils.selectObjects(objects + annot_objects, clear=True) bUtils.toggleLayer('annotation', value=True) return {'FINISHED'}
def createSensor(sensor, reference, origin=mathutils.Matrix()): """This function creates a new sensor specified by its parameters. The sensor dictionary has to contain these keys: *name*: name of the new sensor *type*: type specifier of the sensor *shape*: a shape specifier for the sensor *props*: custom properties to be written to the sensor object Args: sensor(dict): phobos representation of the new sensor reference(bpy_types.Object): object to add a parent relationship to origin(mathutils.Matrix, optional): new sensors origin (Default value = mathutils.Matrix()) Returns: : The newly created sensor object """ layers = defs.layerTypes['sensor'] bUtils.toggleLayer(layers, value=True) # create sensor object if sensor['shape'].startswith('resource'): newsensor = bUtils.createPrimitive( sensor['name'], 'box', [1, 1, 1], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=sensor['material'], phobostype='sensor', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource( ['sensor'] + sensor['shape'].split('://')[1].split('_')) if resource_obj: log("Assigned resource mesh and materials to new sensor object.", 'DEBUG') newsensor.data = resource_obj.data newsensor.scale = (sensor['size'], ) * 3 else: log( "Could not use resource mesh for sensor. Default cube used instead.", 'WARNING') else: newsensor = bUtils.createPrimitive( sensor['name'], sensor['shape'], sensor['size'], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=sensor['material'], phobostype='sensor', ) # assign the parent if available if reference is not None: eUtils.parentObjectsTo(newsensor, reference) # TODO we need to deal with other types of parameters for sensors # TODO cameraRotLock() use or dispose? # contact, force and torque sensors (or unknown sensors) # else: # newsensor = bUtils.createPrimitive( # sensor['name'], 'ico', 0.05, layers, 'phobos_sensor', # origin.to_translation(), protation=origin.to_euler()) # if sensor['name'] == 'Joint6DOF': # # TODO delete me? handle this # #newsensor['sensor/nodes'] = nUtils.getObjectName(reference) # pass # elif 'Node' in sensor['type']: # newsensor['sensor/nodes'] = sorted([nUtils.getObjectName(ref) for ref in reference]) # elif 'Joint' in sensor['type'] or 'Motor' in sensor['type']: # newsensor['sensor/joints'] = sorted([nUtils.getObjectName(ref) for ref in reference]) # elif sensor['type'] in ['Joint6DOF']: # for obj in context.selected_objects: # if obj.phobostype == 'link': # sensor['name'] = "sensor_joint6dof_" + nUtils.getObjectName(obj, phobostype="joint") # sensors.createSensor(sensor, obj, obj.matrix_world) # elif 'Node' in sensor['type']: # sensors.createSensor(sensor, [obj for obj in context.selected_objects if obj.phobostype == 'collision'], # mathutils.Matrix.Translation(context.scene.cursor_location)) # elif 'Motor' in sensor['type'] or 'Joint' in sensor['type']: # sensors.createSensor(sensor, [obj for obj in context.selected_objects if obj.phobostype == 'link'], # mathutils.Matrix.Translation(context.scene.cursor_location)) # set sensor properties newsensor.phobostype = 'sensor' newsensor.name = sensor['name'] newsensor['sensor/name'] = sensor['name'] newsensor['sensor/type'] = sensor['type'] # write the custom properties to the sensor eUtils.addAnnotation(newsensor, sensor['props'], namespace='sensor') # throw warning if type is not known # TODO we need to link this error to the sensor type specifications if sensor['type'] not in [ key.lower() for key in defs.def_settings['sensors'] ]: log( "Sensor " + sensor['name'] + " is of unknown/custom type: " + sensor['type'] + ".", 'WARNING', ) # select the new sensor sUtils.selectObjects([newsensor], clear=True, active=0) return newsensor
def createController(controller, reference, origin=mathutils.Matrix(), annotations=None): """This function creates a new controller specified by its parameters. If an annotation category or the keyword 'all' is specified, the respective annotations for the controller will be added as objects. Args: controller(dict): phobos representation of the new controller reference(bpy_types.Object): object to add a parent relationship to origin(mathutils.Matrix, optional): new controllers origin (Default value = mathutils.Matrix()) annotations(list(str, optional): list of annotation keys or 'all' to add to as annotation objects (Default value = None) Returns: : bpy.types.Object -- new created controller object """ layers = defs.layerTypes['controller'] bUtils.toggleLayer(layers, value=True) # create controller object if controller['shape'].startswith('resource'): newcontroller = bUtils.createPrimitive( controller['name'], 'box', [1, 1, 1], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=controller['material'], phobostype='controller', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource( ['controller'] + controller['shape'].split('://')[1].split('_') ) if resource_obj: log("Assigned resource mesh and materials to new controller object.", 'DEBUG') newcontroller.data = resource_obj.data newcontroller.scale = (controller['size'],) * 3 else: log("Could not use resource mesh for controller. Default cube used instead.", 'WARNING') else: newcontroller = bUtils.createPrimitive( controller['name'], controller['shape'], controller['size'], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=controller['material'], phobostype='controller', ) newcontroller.name = controller['name'] newcontroller['controller/type'] = controller['type'] # write the custom properties to the controller eUtils.addAnnotation(newcontroller, controller['props'], namespace='controller') if controller['annotations'] and annotations: if annotations == 'all': keys = controller['annotations'].keys() elif isinstance(annotations, list): keys = [key for key in annotations if key in controller['annotations']] else: keys = [] for key in keys: eUtils.addAnnotationObject( newcontroller, controller['annotations'][key], namespace='controller/' + key ) # assign the parent if available if reference is not None: sUtils.selectObjects([newcontroller, reference], clear=True, active=1) if reference.phobostype == 'link': bpy.ops.object.parent_set(type='BONE_RELATIVE') else: bpy.ops.object.parent_set(type='OBJECT') return newcontroller
def createController(controller, reference, origin=mathutils.Matrix(), annotations=None): """This function creates a new controller specified by its parameters. If an annotation category or the keyword 'all' is specified, the respective annotations for the controller will be added as objects. Args: controller(dict): phobos representation of the new controller reference(bpy_types.Object): object to add a parent relationship to origin(mathutils.Matrix, optional): new controllers origin (Default value = mathutils.Matrix()) annotations(list(str, optional): list of annotation keys or 'all' to add to as annotation objects (Default value = None) Returns: : bpy.types.Object -- new created controller object """ bUtils.toggleLayer('controller', value=True) # create controller object if controller['shape'].startswith('resource'): newcontroller = bUtils.createPrimitive( controller['name'], 'box', [1, 1, 1], [], plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=controller['material'], phobostype='controller', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource( ['controller'] + controller['shape'].split('://')[1].split('_')) if resource_obj: log( "Assigned resource mesh and materials to new controller object.", 'DEBUG') newcontroller.data = resource_obj.data newcontroller.scale = (controller['size'], ) * 3 else: log( "Could not use resource mesh for controller. Default cube used instead.", 'WARNING') else: newcontroller = bUtils.createPrimitive( controller['name'], controller['shape'], controller['size'], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=controller['material'], phobostype='controller', ) newcontroller.name = controller['name'] newcontroller['controller/type'] = controller['type'] # write the custom properties to the controller eUtils.addAnnotation(newcontroller, controller['props'], namespace='controller') if controller['annotations'] and annotations: if annotations == 'all': keys = controller['annotations'].keys() elif isinstance(annotations, list): keys = [ key for key in annotations if key in controller['annotations'] ] else: keys = [] for key in keys: eUtils.addAnnotationObject(newcontroller, controller['annotations'][key], namespace='controller/' + key) # assign the parent if available if reference is not None: sUtils.selectObjects([newcontroller, reference], clear=True, active=1) if reference.phobostype == 'link': bpy.ops.object.parent_set(type='BONE_RELATIVE') else: bpy.ops.object.parent_set(type='OBJECT') return newcontroller
def createSensor(sensor, reference, origin=mathutils.Matrix()): """This function creates a new sensor specified by its parameters. The sensor dictionary has to contain these keys: *name*: name of the new sensor *type*: type specifier of the sensor *shape*: a shape specifier for the sensor *props*: custom properties to be written to the sensor object Args: sensor(dict): phobos representation of the new sensor reference(bpy_types.Object): object to add a parent relationship to origin(mathutils.Matrix, optional): new sensors origin (Default value = mathutils.Matrix()) Returns: : The newly created sensor object """ layers = defs.layerTypes['sensor'] bUtils.toggleLayer(layers, value=True) # create sensor object if sensor['shape'].startswith('resource'): newsensor = bUtils.createPrimitive( sensor['name'], 'box', [1, 1, 1], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=sensor['material'], phobostype='sensor', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource(['sensor'] + sensor['shape'].split('://')[1].split('_')) if resource_obj: log("Assigned resource mesh and materials to new sensor object.", 'DEBUG') newsensor.data = resource_obj.data newsensor.scale = (sensor['size'],) * 3 else: log("Could not use resource mesh for sensor. Default cube used instead.", 'WARNING') else: newsensor = bUtils.createPrimitive( sensor['name'], sensor['shape'], sensor['size'], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=sensor['material'], phobostype='sensor', ) # assign the parent if available if reference is not None: eUtils.parentObjectsTo(newsensor, reference) # TODO we need to deal with other types of parameters for sensors # TODO cameraRotLock() use or dispose? # contact, force and torque sensors (or unknown sensors) # else: # newsensor = bUtils.createPrimitive( # sensor['name'], 'ico', 0.05, layers, 'phobos_sensor', # origin.to_translation(), protation=origin.to_euler()) # if sensor['name'] == 'Joint6DOF': # # TODO delete me? handle this # #newsensor['sensor/nodes'] = nUtils.getObjectName(reference) # pass # elif 'Node' in sensor['type']: # newsensor['sensor/nodes'] = sorted([nUtils.getObjectName(ref) for ref in reference]) # elif 'Joint' in sensor['type'] or 'Motor' in sensor['type']: # newsensor['sensor/joints'] = sorted([nUtils.getObjectName(ref) for ref in reference]) # elif sensor['type'] in ['Joint6DOF']: # for obj in context.selected_objects: # if obj.phobostype == 'link': # sensor['name'] = "sensor_joint6dof_" + nUtils.getObjectName(obj, phobostype="joint") # sensors.createSensor(sensor, obj, obj.matrix_world) # elif 'Node' in sensor['type']: # sensors.createSensor(sensor, [obj for obj in context.selected_objects if obj.phobostype == 'collision'], # mathutils.Matrix.Translation(context.scene.cursor_location)) # elif 'Motor' in sensor['type'] or 'Joint' in sensor['type']: # sensors.createSensor(sensor, [obj for obj in context.selected_objects if obj.phobostype == 'link'], # mathutils.Matrix.Translation(context.scene.cursor_location)) # set sensor properties newsensor.phobostype = 'sensor' newsensor.name = sensor['name'] newsensor['sensor/name'] = sensor['name'] newsensor['sensor/type'] = sensor['type'] # write the custom properties to the sensor eUtils.addAnnotation(newsensor, sensor['props'], namespace='sensor') # throw warning if type is not known # TODO we need to link this error to the sensor type specifications if sensor['type'] not in [key.lower() for key in defs.def_settings['sensors']]: log( "Sensor " + sensor['name'] + " is of unknown/custom type: " + sensor['type'] + ".", 'WARNING', ) # select the new sensor sUtils.selectObjects([newsensor], clear=True, active=0) return newsensor
def createMotor(motor, parentobj, origin=mathutils.Matrix(), addcontrollers=False): """This function creates a new motor specified by its parameters. If *addcontrollers* is set, a controller object will be created from the controller definition which is specified in the motor dictionary (key *controller*). Args: motor(dict): phobos representation of the new motor. parentobj(bpy_types.Object): object to parent new motor to origin(mathutils.Matrix, optional): new motors origin (Default value = mathutils.Matrix()) addcontrollers(bool, optional): whether to add the defined controller as object (Default value = False) Returns: bpy.types.Object: new motor object or a list of the new motor_object and the new controller object """ bUtils.toggleLayer('motor', value=True) primitive_name = '' # create name if not given by motor dict if not 'name' in motor or len(motor['name']) == 0: motor['name'] = parentobj.name primitive_name = "motor_" + motor['name'] else: primitive_name = motor['name'] primitive_name = '' # create name if not given by motor dict if not 'name' in motor or len(motor['name']) == 0: motor['name'] = parentobj.name primitive_name = "motor_" + motor['name'] else: primitive_name = motor['name'] # create motor object if motor['shape'].startswith('resource'): newmotor = bUtils.createPrimitive( primitive_name, 'box', [1, 1, 1], [], plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=motor['material'], phobostype='motor', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource( ['motor'] + motor['shape'].split('://')[1].split('_')) if resource_obj: log("Assigned resource mesh and materials to new motor object.", 'DEBUG') newmotor.data = resource_obj.data newmotor.scale = (motor['size'], ) * 3 else: log( "Could not use resource mesh for motor. Default cube used instead.", 'WARNING') else: newmotor = bUtils.createPrimitive( primitive_name, motor['shape'], motor['size'], [], plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=motor['material'], phobostype='motor', ) # assign the parent if available if parentobj is not None: sUtils.selectObjects([newmotor, parentobj], clear=True, active=1) bpy.ops.object.parent_set(type='BONE_RELATIVE') # set motor properties newmotor.phobostype = 'motor' # should not be nessaccary: newmotor.name = motor['name'] defname = motor['defname'] # write the custom properties to the motor eUtils.addAnnotation(newmotor, motor['props'], namespace='motor', ignore=['defname']) # fix motor name since it can differe from object name newmotor['motor/name'] = motor['name'] if 'controller' in defs.definitions['motors'][defname] and addcontrollers: import phobos.model.controllers as controllermodel motorcontroller = defs.definitions['motors'][defname]['controller'] controllerdefs = ioUtils.getDictFromYamlDefs( 'controller', motorcontroller, newmotor.name + '_controller') newcontroller = controllermodel.createController( controllerdefs, newmotor, origin=newmotor.matrix_world, annotations='all') else: newcontroller = None # select the new motor sUtils.selectObjects( [newmotor] if not newcontroller else [newmotor, newcontroller], clear=True, active=0) return newmotor if not newcontroller else [newmotor, newcontroller]
def createMotor(motor, parentobj, origin=mathutils.Matrix(), addcontrollers=False): """This function creates a new motor specified by its parameters. If *addcontrollers* is set, a controller object will be created from the controller definition which is specified in the motor dictionary (key *controller*). Args: motor(dict): phobos representation of the new motor. parentobj(bpy_types.Object): object to parent new motor to origin(mathutils.Matrix, optional): new motors origin (Default value = mathutils.Matrix()) addcontrollers(bool, optional): whether to add the defined controller as object (Default value = False) Returns: bpy.types.Object: new motor object or a list of the new motor_object and the new controller object """ layers = defs.layerTypes['motor'] bUtils.toggleLayer(layers, value=True) # create motor object if motor['shape'].startswith('resource'): newmotor = bUtils.createPrimitive( motor['name'], 'box', [1, 1, 1], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=motor['material'], phobostype='motor', ) # use resource name provided as: "resource:whatever_name" resource_obj = ioUtils.getResource(['motor'] + motor['shape'].split('://')[1].split('_')) if resource_obj: log("Assigned resource mesh and materials to new motor object.", 'DEBUG') newmotor.data = resource_obj.data newmotor.scale = (motor['size'],) * 3 else: log("Could not use resource mesh for motor. Default cube used instead.", 'WARNING') else: newmotor = bUtils.createPrimitive( motor['name'], motor['shape'], motor['size'], layers, plocation=origin.to_translation(), protation=origin.to_euler(), pmaterial=motor['material'], phobostype='motor', ) # assign the parent if available if parentobj is not None: sUtils.selectObjects([newmotor, parentobj], clear=True, active=1) bpy.ops.object.parent_set(type='BONE_RELATIVE') # set motor properties newmotor.phobostype = 'motor' newmotor.name = motor['name'] defname = motor['defname'] # write the custom properties to the motor eUtils.addAnnotation(newmotor, motor['props'], namespace='motor', ignore=['defname']) if 'controller' in defs.definitions['motors'][defname] and addcontrollers: import phobos.model.controllers as controllermodel motorcontroller = defs.definitions['motors'][defname]['controller'] controllerdefs = ioUtils.getDictFromYamlDefs( 'controller', motorcontroller, newmotor.name + '_controller' ) newcontroller = controllermodel.createController( controllerdefs, newmotor, origin=newmotor.matrix_world, annotations='all' ) else: newcontroller = None # select the new motor sUtils.selectObjects( [newmotor] if not newcontroller else [newmotor, newcontroller], clear=True, active=0 ) return newmotor if not newcontroller else [newmotor, newcontroller]