Esempio n. 1
0
    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
Esempio n. 2
0
 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
Esempio n. 3
0
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()])