class LocalMapFrame(wx.Frame): def __init__(self, parent, ms, map_name, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(512,512), style=wx.DEFAULT_FRAME_STYLE): title = map_name self.map_name = map_name wx.Frame.__init__(self, parent, id, title, pos, size, style) wx.GetApp().local_map_windows[map_name] = self self.ms = ms self.ms = MapService() self.wnd = LocalMapWindow(self, self.ms, map_name) self.wnd.SetSize(self.GetSize()) self.status_bar = wx.StatusBar(self) self.SetStatusBar(self.status_bar) self.SetSize((size[0], size[1] + self.status_bar.GetSize()[1])) self.wnd.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse) def OnMouse(self, event): #~ if not event.LeftDown() and not event.RightDown(): #~ return #~ log.debug("OnMouse(%s, %s)" % (event.GetX(), event.GetY())) if event.ButtonDClick(): log.debug("Close!") wx.GetApp().local_map_windows.pop(self.map_name) self.Close() hit = self.wnd.HitTest(event.GetX(), event.GetY()) if hit: hit = hit.door self.status_bar.SetStatusText(str(hit), 0) else: self.status_bar.SetStatusText("", 0) if hit and event.LeftDown(): log.debug("hit: %s" % hit) other_side = self.ms.other_side(hit) log.debug("other_side: %s" % other_side) if other_side.map_name not in wx.GetApp().local_map_windows: log.debug("other_side.map_name: %s" % other_side.map_name) win = LocalMapFrame(None, self.ms, other_side.map_name) win.Show() if not hit and event.LeftDown(): map_size = self.ms.map_size(self.map_name) zoom = map_size[0] / 512. loc = (int(event.GetX() * zoom), map_size[1] - int(event.GetY() * zoom)) log.debug("OnMouse(%s, %s) -> (%s, %s)" % (event.GetX(), event.GetY(), loc[0], loc[1])) wx.GetApp().SetNavTo(Location(self.map_name, loc))
class EhApp(wx.App): def __init__(self): wx.App.__init__(self) self.ms = MapService() self.ds = DistanceService(self.ms) self.local_map_windows = {} self.__nav_from__ = None self.__nav_to__ = None self.__route__ = None def GetLocalMapWindow(self, map_name): if map_name in self.local_map_windows: return self.local_map_windows[map_name] win = LocalMapFrame(None, self.ms, map_name) win.Show() self.local_map_windows[map_name] = win return win def SetNavFrom(self, loc): self.__nav_from__ = loc self.__nav_from_to__changed() def GetNavFrom(self): return self.__nav_from__ def SetNavTo(self, loc): self.__nav_to__ = loc self.__nav_from_to__changed() def __nav_from_to__changed(self): if self.__nav_from__ and self.__nav_to__: self.__calc_route__() for item in self.local_map_windows.values(): item.wnd.Draw() def GetNavTo(self): return self.__nav_to__ def GetRoute(self): return self.__route__ def __calc_route__(self): node_dict = {} map_dict = {} for item in self.ms.all_doors(): node = Node(item) node_dict[item] = node if not item.map_name in map_dict: map_dict[item.map_name] = [] map_dict[item.map_name].append(node) from_node = Node(wx.GetApp().GetNavFrom()) map_dict[wx.GetApp().GetNavFrom().map_name].append(from_node) to_node = Node(wx.GetApp().GetNavTo()) map_dict[wx.GetApp().GetNavTo().map_name].append(to_node) #beam beam_node = Node(self.ms.beam_location()) log.debug("beam_node: %s" % beam_node) from_node.edges.append((1, beam_node)) map_dict[beam_node.payload.map_name].append(beam_node) for map_name, map_nodes in map_dict.items(): for index, item_a in enumerate(map_nodes): for item_b in map_nodes[index + 1:]: cost = self.ds.in_map_distance(item_a.payload, item_b.payload) add_edge(cost, item_a, item_b) for item, node in node_dict.items(): other_item = self.ms.other_side(item) cost = self.ds.cost(item, other_item) cost = 1 node.edges.append((cost, node_dict[other_item])) node_dict[wx.GetApp().GetNavFrom()] = from_node node_dict[wx.GetApp().GetNavTo()] = to_node node_dict[self.ms.beam_location()] = beam_node nodes = node_dict.values() for item in nodes: log.debug(item) for item_b in item.edges: log.debug(" %s" % str(item_b)) from_node.cost = 0 solve(nodes) for item in nodes: log.debug(item) log.debug("ROUTE:") self.__route__ = get_route(nodes, node_dict[wx.GetApp().GetNavTo()])