def Draw(self): log.debug("Draw()") dc = wx.BufferedPaintDC(self, self._Buffer) dc.Clear() if not self.image: return png_dc = wx.MemoryDC() png_dc.SelectObject(self.image) dc.Blit(0, 0, self.image.GetWidth(), self.image.GetHeight(), png_dc, 0, 0) dc.SetPen(wx.Pen('black')) for item in self.sprites: item.Draw(dc) if self.current_map: dc.SetPen(wx.Pen('yellow')) self.current_map.Draw(dc) ms = MapService() ds = DistanceService(ms) if wx.GetApp().GetNavTo(): dc.SetPen(wx.Pen('red')) DrawElLocation(dc, wx.GetApp().GetNavTo()) dc.SetPen(wx.Pen('yellow')) for item in ms.doors(wx.GetApp().GetNavTo().map_name): DrawElLocation(dc, item) dc.SetPen(wx.Pen('green')) DrawElLocation(dc, ds.nearest_door(wx.GetApp().GetNavTo())) if wx.GetApp().GetNavFrom(): dc.SetPen(wx.Pen('blue')) DrawElLocation(dc, wx.GetApp().GetNavFrom()) dc.SetPen(wx.Pen('yellow')) for item in ms.doors(wx.GetApp().GetNavFrom().map_name): DrawElLocation(dc, item) dc.SetPen(wx.Pen('green')) DrawElLocation(dc, ds.nearest_door(wx.GetApp().GetNavFrom())) if wx.GetApp().GetNavTo() and wx.GetApp().GetNavFrom(): route = wx.GetApp().GetRoute() #~ for item in route: #~ log.debug(item) dc.SetPen(wx.Pen('blue')) last_pos = el_to_dc(route[0].payload) for item in route[1:]: pos = el_to_dc(item.payload) dc.DrawLine(last_pos[0], last_pos[1], pos[0], pos[1]) last_pos = pos
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
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()])