def runFromConfig(config, shared): from ev3sim.robot import initialise_bot, RobotInteractor from ev3sim.file_helper import find_abs sl = ScriptLoader(**config.get("loader", {})) sl.setSharedData(shared) sl.active_scripts = [] ev3sim.visual.utils.GLOBAL_COLOURS = config.get("colours", {}) for index, robot in enumerate(config.get("robots", [])): robot_path = find_abs(robot, allowed_areas=[ "local", "local/robots/", "package", "package/robots/" ]) initialise_bot(config, robot_path, f"Robot-{index}") for opt in config.get("interactors", []): try: sl.active_scripts.append(fromOptions(opt)) except Exception as exc: print( f"Failed to load interactor with the following options: {opt}. Got error: {exc}" ) if sl.active_scripts: sl.startUp(**config.get("screen", {})) sl.loadElements(config.get("elements", [])) for interactor in sl.active_scripts: if isinstance(interactor, RobotInteractor): interactor.connectDevices() sl.simulate() else: print("No interactors successfully loaded. Quitting...")
def initialiseFromConfig(config, send_queues, recv_queues): from collections import defaultdict from ev3sim.robot import initialise_bot, RobotInteractor ev3sim.visual.utils.GLOBAL_COLOURS = config.get("colours", {}) # Keep track of index w.r.t. filename. robot_paths = defaultdict(lambda: 0) for index, robot in enumerate(config.get("robots", [])): robot_path = find_abs(robot, allowed_areas=bot_locations()) initialise_bot(config, robot_path, f"Robot-{index}", robot_paths[robot_path]) robot_paths[robot_path] += 1 ScriptLoader.instance.setRobotQueues(f"Robot-{index}", send_queues[index], recv_queues[index]) for opt in config.get("interactors", []): try: ScriptLoader.instance.addActiveScript(fromOptions(opt)) except Exception as exc: print( f"Failed to load interactor with the following options: {opt}. Got error: {exc}" ) SettingsManager.instance.setMany(config["settings"]) if ScriptLoader.instance.active_scripts: ScriptLoader.instance.startUp() ScriptLoader.instance.loadElements(config.get("elements", [])) for interactor in ScriptLoader.instance.active_scripts: if isinstance(interactor, RobotInteractor): interactor.connectDevices() for interactor in ScriptLoader.instance.active_scripts: interactor.startUp() else: print("No interactors successfully loaded. Quitting...")
def captureBotImage(self, directory, filename): self.resetVisualElements() from os.path import join from ev3sim.simulation.loader import ScriptLoader from ev3sim.robot import initialise_bot, RobotInteractor from ev3sim.simulation.randomisation import Randomiser Randomiser.createGlobalRandomiserWithSeed(0) ScriptLoader.instance.reset() ScriptLoader.instance.startUp() elems = {} initialise_bot(elems, find_abs(filename, [directory]), "", 0) ScriptLoader.instance.loadElements(elems.get("elements", [])) for interactor in ScriptLoader.instance.active_scripts: if isinstance(interactor, RobotInteractor): interactor.connectDevices() interactor.initialiseDevices() for interactor in ScriptLoader.instance.active_scripts: interactor.startUp() interactor.tick(0) interactor.afterPhysics() screen = pygame.Surface((480, 480), pygame.SRCALPHA) custom_map = { "SCREEN_WIDTH": 480, "SCREEN_HEIGHT": 480, "MAP_WIDTH": 25, "MAP_HEIGHT": 25, } for elem in self.objects.values(): elem.customMap = custom_map elem.calculatePoints() self.applyToScreen(screen, bg=pygame.Color(self.instance.background_colour)) colorkey = pygame.Color(self.instance.background_colour) for x in range(480): for y in range(480): val = screen.get_at((x, y)) val.a = 0 if (val.r == colorkey.r and val.g == colorkey.g and val.b == colorkey.b) else 255 screen.set_at((x, y), val) self.resetVisualElements() ScriptLoader.instance.reset() config_path = join(find_abs(filename, [directory]), "config.bot") with open(config_path, "r") as f: config = yaml.safe_load(f) pygame.image.save(screen, join(find_abs(filename, [directory]), config.get("preview_path", "preview.png")))