diff --git a/flatland/utils/editor.py b/flatland/utils/editor.py index 5819b741731a58df5a133cfc60e2817fd481ee04..671faf3acb0b38f9bf1530b00f1ac50128712436 100644 --- a/flatland/utils/editor.py +++ b/flatland/utils/editor.py @@ -134,19 +134,19 @@ class View(object): # abbreviated description of buttons and the methods they call ldButtons = [ - dict(name="Refresh", method=self.controller.refresh, tip="Redraw only"), - dict(name="Clear", method=self.controller.clear, tip="Clear rails and agents"), - dict(name="Reset", method=self.controller.reset, - tip="Standard env reset, including regen rail + agents"), - dict(name="Rotate Agent", method=self.controller.rotate_agent, tip="Rotate selected agent"), - dict(name="Restart Agents", method=self.controller.restartAgents, - tip="Move agents back to start positions"), - dict(name="Regenerate", method=self.controller.regenerate, - tip="Regenerate the rails using the method selected below"), - dict(name="Load", method=self.controller.load), - dict(name="Save", method=self.controller.save), - dict(name="Step", method=self.controller.step), - dict(name="Run Steps", method=self.controller.start_run)] + dict(name="Refresh", method=self.controller.refresh, tip="Redraw only"), + dict(name="Clear", method=self.controller.clear, tip="Clear rails and agents"), + dict(name="Reset", method=self.controller.reset, + tip="Standard env reset, including regen rail + agents"), + dict(name="Rotate Agent", method=self.controller.rotate_agent, tip="Rotate selected agent"), + dict(name="Restart Agents", method=self.controller.restartAgents, + tip="Move agents back to start positions"), + dict(name="Regenerate", method=self.controller.regenerate, + tip="Regenerate the rails using the method selected below"), + dict(name="Load", method=self.controller.load), + dict(name="Save", method=self.controller.save), + dict(name="Step", method=self.controller.step) + ] self.lwButtons = [] for dButton in ldButtons: @@ -361,7 +361,17 @@ class Controller(object): def restartAgents(self, event): self.log("Restart Agents - nAgents:", self.view.wRegenNAgents.value) - self.model.restartAgents() + if self.model.init_agents_static is not None: + print("Restart Agents ...................") + print(self.model.env.agents_static) + self.model.env.agents_static = [EnvAgentStatic(d[0], d[1], d[2]) for d in self.model.init_agents_static ] + print(self.model.env.agents_static) + self.model.env.agents = None + self.model.init_agents_static = None + self.player = None + self.model.env.restart_agents() + self.model.env.reset(False,False) + self.refresh(event) def regenerate(self, event): method = self.view.wRegenMethod.value @@ -383,8 +393,6 @@ class Controller(object): def step(self, event): self.model.step() - def start_run(self, event): - self.model.start_run() def log(self, *args, **kwargs): if self.view is None: @@ -415,6 +423,7 @@ class EditorModel(object): self.set_env(env) self.iSelectedAgent = None self.player = None + self.init_agents_static = None self.thread = None def set_env(self, env): @@ -641,12 +650,12 @@ class EditorModel(object): # if replace_agents: # self.env.agents_handles = range(nAgents) self.env.reset(regen_rail=True, replace_agents=replace_agents) - self.player = Player(self.env) + self.player = None self.redraw() def restartAgents(self): self.env.agents = EnvAgent.list_from_static(self.env.agents_static) - self.player = Player(self.env) + self.player = None self.redraw() def setFilename(self, filename): @@ -666,7 +675,7 @@ class EditorModel(object): self.env.restart_agents() self.env.reset(False,False) - + self.init_agents_static = None self.fix_env() self.set_env(self.env) self.redraw() @@ -707,7 +716,7 @@ class EditorModel(object): self.env.reset(regen_rail=True) self.fix_env() self.set_env(self.env) - self.player = Player(self.env) + self.player = None self.view.new_env() # self.view.init_canvas() # Can't do init_canvas - need to keep the same canvas widget! self.redraw() @@ -761,21 +770,18 @@ class EditorModel(object): def add_target(self, rcCell): if self.iSelectedAgent is not None: self.env.agents_static[self.iSelectedAgent].target = rcCell + self.init_agents_static = None self.redraw() def step(self): + if self.init_agents_static is None: + self.init_agents_static = [agent.to_list() for agent in self.env.agents_static] if self.player is None: self.player = Player(self.env) self.env.reset(regen_rail=False, replace_agents=False) self.player.step() self.redraw() - def start_run(self): - if self.thread is None: - self.thread = threading.Thread(target=self.bg_updater, args=(self.view.wProg_steps,)) - self.thread.start() - else: - self.log("thread already present") def bg_updater(self, wProg_steps): try: diff --git a/notebooks/Editor2.ipynb b/notebooks/Editor2.ipynb index 023d665c1f41f11a852e2607330a6311bda4c5f6..00250ea80c931d2bbaa1afcb3a3aa1fdebf27c23 100644 --- a/notebooks/Editor2.ipynb +++ b/notebooks/Editor2.ipynb @@ -9,18 +9,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" @@ -28,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -41,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -63,50 +54,32 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cairo installed: OK\n" + ] + } + ], "source": [ "from flatland.utils.editor import EditorMVC, EditorModel, View, Controller" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "<flatland.utils.graphics_pil.PILSVG object at 0x0000020D4CDD2E10> <class 'flatland.utils.graphics_pil.PILSVG'>\n", + "<flatland.utils.graphics_pil.PILSVG object at 0x0000021AB01F0198> <class 'flatland.utils.graphics_pil.PILSVG'>\n", "<super: <class 'PILSVG'>, <PILSVG object>> <class 'super'>\n", - " 0000000000000000 Background_#91D1DD.svg\n", - "WE 0000000000000100 Gleis_Deadend.svg\n", - "WW EE NN SS 1000010000100001 Gleis_Diamond_Crossing.svg\n", - "WW EE 0000010000000001 Gleis_horizontal.svg\n", - "EN SW 0000100000010000 Gleis_Kurve_oben_links.svg\n", - "WN SE 0000000001001000 Gleis_Kurve_oben_rechts.svg\n", - "ES NW 0001001000000000 Gleis_Kurve_unten_links.svg\n", - "NE WS 0100000000000010 Gleis_Kurve_unten_rechts.svg\n", - "NN SS 1000000000100000 Gleis_vertikal.svg\n", - "NN SS EE WW ES NW SE WN 1001011001101001 Weiche_Double_Slip.svg\n", - "EE WW EN SW 0000110000010001 Weiche_horizontal_oben_links.svg\n", - "EE WW SE WN 0000010001001001 Weiche_horizontal_oben_rechts.svg\n", - "EE WW ES NW 0001011000000001 Weiche_horizontal_unten_links.svg\n", - "EE WW NE WS 0100010000000011 Weiche_horizontal_unten_rechts.svg\n", - "NN SS EE WW NW ES 1001011000100001 Weiche_Single_Slip.svg\n", - "NE NW ES WS 0101001000000010 Weiche_Symetrical.svg\n", - "NN SS EN SW 1000100000110000 Weiche_vertikal_oben_links.svg\n", - "NN SS SE WN 1000000001101000 Weiche_vertikal_oben_rechts.svg\n", - "NN SS NW ES 1001001000100000 Weiche_vertikal_unten_links.svg\n", - "NN SS NE WS 1100000000100010 Weiche_vertikal_unten_rechts.svg\n", - "EW 0000000100000000 Bahnhof_#d50000_Deadend_links.svg\n", - "NS 0010000000000000 Bahnhof_#d50000_Deadend_oben.svg\n", - "WE 0000000000000100 Bahnhof_#d50000_Deadend_rechts.svg\n", - "SN 0000000010000000 Bahnhof_#d50000_Deadend_unten.svg\n", - "EE WW 0000010000000001 Bahnhof_#d50000_Gleis_horizontal.svg\n", - "NN SS 1000000000100000 Bahnhof_#d50000_Gleis_vertikal.svg\n", "Clear rails\n" ] }, @@ -142,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": { "scrolled": false }, @@ -150,7 +123,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4c81e4d508834d7f93d104fd2642bc3a", + "model_id": "0f3ff6aff8954f3cb369b80b053f9f1a", "version_major": 2, "version_minor": 0 }, @@ -162,37 +135,15 @@ "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "<flatland.utils.graphics_pil.PILSVG object at 0x0000020D4CF49D30> <class 'flatland.utils.graphics_pil.PILSVG'>\n", - "<super: <class 'PILSVG'>, <PILSVG object>> <class 'super'>\n", - " 0000000000000000 Background_#91D1DD.svg\n", - "WE 0000000000000100 Gleis_Deadend.svg\n", - "WW EE NN SS 1000010000100001 Gleis_Diamond_Crossing.svg\n", - "WW EE 0000010000000001 Gleis_horizontal.svg\n", - "EN SW 0000100000010000 Gleis_Kurve_oben_links.svg\n", - "WN SE 0000000001001000 Gleis_Kurve_oben_rechts.svg\n", - "ES NW 0001001000000000 Gleis_Kurve_unten_links.svg\n", - "NE WS 0100000000000010 Gleis_Kurve_unten_rechts.svg\n", - "NN SS 1000000000100000 Gleis_vertikal.svg\n", - "NN SS EE WW ES NW SE WN 1001011001101001 Weiche_Double_Slip.svg\n", - "EE WW EN SW 0000110000010001 Weiche_horizontal_oben_links.svg\n", - "EE WW SE WN 0000010001001001 Weiche_horizontal_oben_rechts.svg\n", - "EE WW ES NW 0001011000000001 Weiche_horizontal_unten_links.svg\n", - "EE WW NE WS 0100010000000011 Weiche_horizontal_unten_rechts.svg\n", - "NN SS EE WW NW ES 1001011000100001 Weiche_Single_Slip.svg\n", - "NE NW ES WS 0101001000000010 Weiche_Symetrical.svg\n", - "NN SS EN SW 1000100000110000 Weiche_vertikal_oben_links.svg\n", - "NN SS SE WN 1000000001101000 Weiche_vertikal_oben_rechts.svg\n", - "NN SS NW ES 1001001000100000 Weiche_vertikal_unten_links.svg\n", - "NN SS NE WS 1100000000100010 Weiche_vertikal_unten_rechts.svg\n", - "EW 0000000100000000 Bahnhof_#d50000_Deadend_links.svg\n", - "NS 0010000000000000 Bahnhof_#d50000_Deadend_oben.svg\n", - "WE 0000000000000100 Bahnhof_#d50000_Deadend_rechts.svg\n", - "SN 0000000010000000 Bahnhof_#d50000_Deadend_unten.svg\n", - "EE WW 0000010000000001 Bahnhof_#d50000_Gleis_horizontal.svg\n", - "NN SS 1000000000100000 Bahnhof_#d50000_Gleis_vertikal.svg\n" + "ename": "AttributeError", + "evalue": "'EditorModel' object has no attribute 'model'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\users\\u216993\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\flatland_rl-0.1.1-py3.6.egg\\flatland\\utils\\editor.py\u001b[0m in \u001b[0;36mstep\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 386\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 387\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mevent\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 388\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 389\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 390\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mstart_run\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mevent\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mc:\\users\\u216993\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\flatland_rl-0.1.1-py3.6.egg\\flatland\\utils\\editor.py\u001b[0m in \u001b[0;36mstep\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 771\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 772\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplayer\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 773\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minit_agents_static\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0menv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0magents_static\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 774\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplayer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPlayer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0menv\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 775\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0menv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreset\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mregen_rail\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreplace_agents\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'EditorModel' object has no attribute 'model'" ] } ], @@ -202,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 7, "metadata": { "scrolled": false }, @@ -210,7 +161,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "83b942888352481995b35116bb2237d9", + "model_id": "8df099a612d94e34bc64abd0263ae21f", "version_major": 2, "version_minor": 0 }, @@ -229,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -238,7 +189,7 @@ "(0, 0)" ] }, - "execution_count": 16, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }