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 buildModelFromDictionary(model): """Creates the Blender representation of the imported model, using a model dictionary. """ # DOCU add some more docstring log("Creating Blender model...", 'INFO') log("Creating links...", 'INFO') for l in model['links']: link = model['links'][l] linkmodel.createLink(link) log("Creating joints...", 'INFO') for j in model['joints']: joint = model['joints'][j] jointmodel.createJoint(joint) # build tree recursively and correct translation & rotation on the fly log("Placing links...", 'INFO') for l in model['links']: if 'parent' not in model['links'][l]: root = model['links'][l] linkmodel.placeChildLinks(model, root) log("Assigning model name...", 'INFO') try: rootlink = sUtils.getRoot(bpy.data.objects[root['name']]) rootlink['modelname'] = model['name'] rootlink.location = (0, 0, 0) except KeyError: log("Could not assign model name to root link.", "ERROR") log("Placing visual and collision objects...", 'INFO') for link in model['links']: linkmodel.placeLinkSubelements(model['links'][link]) try: log("Creating sensors...", 'INFO') for s in model['sensors']: sensormodel.createSensor(model['sensors'][s]) except KeyError: log("No sensors in model " + model['name'], 'INFO') try: log("Creating motors...", 'INFO') for m in model['motors']: eUtils.addDictionaryToObj( model['motors'][m], model['joints'][model['motors'][m]['joint']], category='motor') except KeyError: log("No motors in model " + model['name'], 'INFO') try: log("Creating controllers...", 'INFO') for c in model['controllers']: controllermodel.createController(model['controllers'][c]) except KeyError: log("No controllers in model " + model['name'], 'INFO') try: log("Creating groups...", 'INFO') for g in model['groups']: createGroup(model['groups'][g]) except KeyError: log("No kinematic groups in model " + model['name'], 'INFO') try: log("Creating chains...", 'INFO') for ch in model['chains']: createChain(model['chains'][ch]) except KeyError: log("No kinematic chains in model " + model['name'], 'INFO') try: log("Creating lights...", 'INFO') for l in model['lights']: lightmodel.createLight(model['lights'][l]) except KeyError: log("No lights in model " + model['name'], 'INFO') # FIXME: this is a trick to force Blender to apply matrix_local # AAAAAARGH: THIS DOES NOT WORK! for obj in bpy.data.objects: bUtils.setObjectLayersActive(obj) bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.select_all(action='SELECT') bpy.ops.transform.translate(value=(0, 0, 0))
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]