def execute(self, context): """ Args: context: Returns: """ phobos_dict = ioUtils.getDictFromYamlDefs(self.phobostype, self.preset_name, self.obj_name) selected_objs = context.selected_objects # store collected object data properties in the props dictionary for i in range(len(self.phobos_data)): if self.phobos_data[i].name[0] == 'b': store = '$' + str(bool( self.phobos_data[i]['boolProp'])).lower() elif self.phobos_data[i].name[0] == 'i': store = self.phobos_data[i]['intProp'] elif self.phobos_data[i].name[0] == 's': store = self.phobos_data[i]['stringProp'] elif self.phobos_data[i].name[0] == 'f': store = self.phobos_data[i]['floatProp'] phobos_dict['props'][self.phobos_data[i].name[2:]] = store annotations = {} # add annotation objects for other categories for custom_anno in self.annotation_checks: if custom_anno.boolProp: # parse object dictionaries if "$selected_objects:..." syntax is found annot = defs.definitions[self.phobostype + 's'][ self.preset_name][custom_anno.name[2:]] annotations[custom_anno.name[2:]] = linkObjectLists( annot, selected_objs) # let the exectute function handle the object creation new_objs, annot_objs, otherobjs = execute_func( phobos_dict, annotations, selected_objs, context.active_object, *args) # select the newly added objects sUtils.selectObjects(new_objs + annot_objs + otherobjs, clear=True, active=0) bUtils.toggleLayer(defs.layerTypes[self.phobostype], value=True) if annot_objs: bUtils.toggleLayer(defs.layerTypes['annotation'], value=True) # toggle layers for generic objects if otherobjs: for obj in otherobjs: bUtils.toggleLayer(defs.layerTypes[obj.phobostype], value=True) return {'FINISHED'}
def execute(self, context): """ Args: context: Returns: """ phobos_dict = ioUtils.getDictFromYamlDefs( self.phobostype, self.preset_name, self.obj_name ) selected_objs = context.selected_objects # store collected object data properties in the props dictionary for i in range(len(self.phobos_data)): if self.phobos_data[i].name[0] == 'b': store = '$' + str(bool(self.phobos_data[i]['boolProp'])).lower() elif self.phobos_data[i].name[0] == 'i': store = self.phobos_data[i]['intProp'] elif self.phobos_data[i].name[0] == 's': store = self.phobos_data[i]['stringProp'] elif self.phobos_data[i].name[0] == 'f': store = self.phobos_data[i]['floatProp'] phobos_dict['props'][self.phobos_data[i].name[2:]] = store annotations = {} # add annotation objects for other categories for custom_anno in self.annotation_checks: if custom_anno.boolProp: # parse object dictionaries if "$selected_objects:..." syntax is found annot = defs.definitions[self.phobostype + 's'][self.preset_name][ custom_anno.name[2:] ] annotations[custom_anno.name[2:]] = linkObjectLists(annot, selected_objs) # let the exectute function handle the object creation new_objs, annot_objs, otherobjs = execute_func( phobos_dict, annotations, selected_objs, context.active_object, *args ) # select the newly added objects sUtils.selectObjects(new_objs + annot_objs + otherobjs, clear=True, active=0) bUtils.toggleLayer(defs.layerTypes[self.phobostype], value=True) if annot_objs: bUtils.toggleLayer(defs.layerTypes['annotation'], value=True) # toggle layers for generic objects if otherobjs: for obj in otherobjs: bUtils.toggleLayer(defs.layerTypes[obj.phobostype], value=True) return {'FINISHED'}
del obj[prop] except: pass if 'motor/type' in obj.keys(): del obj['motor/type'] elif child.phobostype == 'controller': child.name = obj.name + '_Controller' child['controller/name'] = obj.name for new, old in controller_map.items(): try: child[new] = obj[old] del obj[old] except: pass selected_only = True objectlist = bpy.context.selected_objects if selected_only else bpy.data.objects for obj in objectlist: if obj.phobostype == 'link': motor_found = any('motor' in key for key in obj.keys()) if motor_found: new_motor_dict = derive_oldMotor(obj) motor_dict = getDictFromYamlDefs( 'motor', new_motor_dict['motor/type'], new_motor_dict['motor/name'] ) new_objects = createMotor(motor_dict, obj, origin=obj.matrix_world, addcontrollers=True) update_child(new_objects, obj)
if 'motor/type' in obj.keys(): del obj['motor/type'] elif child.phobostype == 'controller': child.name = obj.name + '_Controller' child['controller/name'] = obj.name for new, old in controller_map.items(): try: child[new] = obj[old] del obj[old] except: pass selected_only = True objectlist = bpy.context.selected_objects if selected_only else bpy.data.objects for obj in objectlist: if obj.phobostype == 'link': motor_found = any('motor' in key for key in obj.keys()) if motor_found: new_motor_dict = derive_oldMotor(obj) motor_dict = getDictFromYamlDefs('motor', new_motor_dict['motor/type'], new_motor_dict['motor/name']) new_objects = createMotor(motor_dict, obj, origin=obj.matrix_world, addcontrollers=True) update_child(new_objects, obj)
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]