def after_renaming(self): if self._blender_filename == 'mocap_human': # no need for mocap return # Store the human real name (ie, after renaming) in its link 'POS_EMPTY' and 'Human_Camera' object, for later control. pos_empty = bpymorse.get_object("POS_EMPTY" + self.suffix) bpymorse.select_only(pos_empty) bpymorse.new_game_property() prop = pos_empty.game.properties # select the last property in the list (which is the one we just added) prop[-1].name = "human_name" prop[-1].type = "STRING" prop[-1].value = self.name human_camera = bpymorse.get_object("Human_Camera" + self.suffix) bpymorse.select_only(human_camera) bpymorse.new_game_property() prop = human_camera.game.properties # select the last property in the list (which is the one we just added) prop[-1].name = "human_name" prop[-1].type = "STRING" prop[-1].value = self.name
def __init__(self, name, category, action = APPEND_EMPTY, blendfile = "", blendobject = None, make_morseable = True): """ ComponentCreator constructor This class allow to create simulation components from MORSE builder scripts. It initially consists in an Empty object, to which you can then add meshs of your choice. It adds automaticaly the logic (Always sensor link to a Python controller). And set the default physics_type to 'NO_COLLISION'. :param name: (string) component name (used as Blender object name) :param category: (string) one of ['actuators', 'sensors', 'robots'] :param action: indicate what to do with the `blendfile` and `blendobject` parameters. Must be one of [APPEND_EMPTY, USE_BLEND, LINK_EXISTING_OBJECT]. - If APPEND_EMPTY (default), a new Blender `Empty` is created and `blendfile` and `blendobject` are ignored. - If USE_BLEND, `blendfile` is treated as the path to a Blender file, and if `blendobject` is also specified, the given object is selected (otherwise, the last object selected in the Blender file is returned). - If LINK_EXISTING_OBJECT, `blendfile` is ignored and `blendobject` is treated as the name of a Blender object which is already present in the scene. :param blendfile: (string, default:"") path to a Blender file (.blend) containing meshes for the component. Must be in MORSE_RESOURCE_PATH. :param blendobject: (string, default:None) Name of the Blender object to use (cf above for details). :param make_morseable: (boolean) Add Morse logic. Make it false if you add some blend file which already contains the necessary logic (default: True). """ AbstractComponent.__init__(self, filename=blendfile, category=category) bpymorse.deselect_all() if action == ComponentCreator.APPEND_EMPTY: bpymorse.add_morse_empty() elif action == ComponentCreator.USE_BLEND: self.append_meshes() if blendobject: bpymorse.select_only(bpymorse.get_object(blendobject)) elif action == ComponentCreator.LINK_EXISTING_OBJECT: bpymorse.select_only(bpymorse.get_object(blendobject)) obj = bpymorse.get_first_selected_object() if name: obj.name = name self.basename = name # no collision by default for components obj.game.physics_type = 'NO_COLLISION' self.set_blender_object(obj) # Add MORSE logic if make_morseable: self.morseable() self.properties(Component_Tag = True, classpath = self.__class__._classpath)
def make_grasper(self, obj_name): obj = bpymorse.get_object(obj_name) bpymorse.select_only(obj) bpymorse.add_sensor(type='NEAR') sens = obj.game.sensors[-1] sens.name = 'Near' sens.distance = 5.0 sens.reset_distance = 0.075 sens.property = "Graspable" bpymorse.add_controller() contr = obj.game.controllers[-1] contr.link(sensor=sens)
def make_grasper(self, obj_name): obj = bpymorse.get_object(obj_name) bpymorse.select_only(obj) bpymorse.add_sensor(type = 'NEAR') sens = obj.game.sensors[-1] sens.name = 'Near' sens.distance = 5.0 sens.reset_distance = 0.075 sens.property = "Graspable" bpymorse.add_controller() contr = obj.game.controllers[-1] contr.link(sensor = sens)
def select(self): bpymorse.select_only(self._bpy_object)
def __init__(self, name, category, action=APPEND_EMPTY, blendfile="", blendobject=None, make_morseable=True): """ ComponentCreator constructor This class allow to create simulation components from MORSE builder scripts. It initially consists in an Empty object, to which you can then add meshs of your choice. It adds automaticaly the logic (Always sensor link to a Python controller). And set the default physics_type to 'NO_COLLISION'. :param name: (string) component name (used as Blender object name) :param category: (string) one of ['actuators', 'sensors', 'robots'] :param action: indicate what to do with the `blendfile` and `blendobject` parameters. Must be one of [APPEND_EMPTY, USE_BLEND, LINK_EXISTING_OBJECT]. - If APPEND_EMPTY (default), a new Blender `Empty` is created and `blendfile` and `blendobject` are ignored. - If USE_BLEND, `blendfile` is treated as the path to a Blender file, and if `blendobject` is also specified, the given object is selected (otherwise, the last object selected in the Blender file is returned). - If LINK_EXISTING_OBJECT, `blendfile` is ignored and `blendobject` is treated as the name of a Blender object which is already present in the scene. :param blendfile: (string, default:"") path to a Blender file (.blend) containing meshes for the component. Must be in MORSE_RESOURCE_PATH. :param blendobject: (string, default:None) Name of the Blender object to use (cf above for details). :param make_morseable: (boolean) Add Morse logic. Make it false if you add some blend file which already contains the necessary logic (default: True). """ AbstractComponent.__init__(self, filename=blendfile, category=category) bpymorse.deselect_all() if action == ComponentCreator.APPEND_EMPTY: bpymorse.add_morse_empty() elif action == ComponentCreator.USE_BLEND: self.append_meshes() if blendobject: bpymorse.select_only(bpymorse.get_object(blendobject)) elif action == ComponentCreator.LINK_EXISTING_OBJECT: bpymorse.select_only(bpymorse.get_object(blendobject)) obj = bpymorse.get_first_selected_object() if name: obj.name = name self.basename = name # no collision by default for components obj.game.physics_type = 'NO_COLLISION' self.set_blender_object(obj) # Add MORSE logic if make_morseable: self.morseable() self.properties(Component_Tag=True, classpath=self.__class__._classpath)