コード例 #1
0
    def __init__(self, state):
        wx.Frame.__init__(self, None, wx.ID_ANY, state.title)
        try:
            self.SetIcon(icon.SimpleIcon("MAP").get_ico())
        except Exception:
            pass
        self.state = state
        state.frame = self
        state.grid = True
        state.follow = True
        state.download = True
        state.popup_object = None
        state.popup_latlon = None
        state.popup_started = False
        state.default_popup = None
        state.panel = MPSlipMapPanel(self, state)
        self.last_layout_send = time.time()
        self.Bind(wx.EVT_IDLE, self.on_idle)
        self.Bind(wx.EVT_SIZE, state.panel.on_size)
        self.legend_checkbox_menuitem_added = False

        # create the View menu
        self.menu = MPMenuTop([
            MPMenuSubMenu('View',
                          items=[
                              MPMenuCheckbox('Follow\tCtrl+F',
                                             'Follow Aircraft',
                                             'toggleFollow',
                                             checked=state.follow),
                              MPMenuCheckbox('Grid\tCtrl+G',
                                             'Enable Grid',
                                             'toggleGrid',
                                             checked=state.grid),
                              MPMenuItem('Goto\tCtrl+P', 'Goto Position',
                                         'gotoPosition'),
                              MPMenuItem('Brightness +\tCtrl+B',
                                         'Increase Brightness',
                                         'increaseBrightness'),
                              MPMenuItem('Brightness -\tCtrl+Shift+B',
                                         'Decrease Brightness',
                                         'decreaseBrightness'),
                              MPMenuItem('Zoom +\t+', 'Zoom In', 'zoomIn'),
                              MPMenuItem('Zoom -\t-', 'Zoom Out', 'zoomOut'),
                              MPMenuCheckbox('Download Tiles\tCtrl+D',
                                             'Enable Tile Download',
                                             'toggleDownload',
                                             checked=state.download),
                              MPMenuRadio('Service',
                                          'Select map service',
                                          returnkey='setService',
                                          selected=state.mt.get_service(),
                                          items=state.mt.get_service_list())
                          ])
        ])
        self.SetMenuBar(self.menu.wx_menu())
        self.Bind(wx.EVT_MENU, self.on_menu)
コード例 #2
0
ファイル: mp_slipmap_ui.py プロジェクト: Dronecode/MAVProxy
 def __init__(self, state):
     wx.Frame.__init__(self, None, wx.ID_ANY, state.title)
     self.state = state
     state.frame = self
     state.grid = True
     state.follow = True
     state.download = True
     state.popup_object = None
     state.popup_latlon = None
     state.popup_started = False
     state.default_popup = None
     state.panel = MPSlipMapPanel(self, state)
     self.last_layout_send = time.time()
     self.Bind(wx.EVT_IDLE, self.on_idle)
     self.Bind(wx.EVT_SIZE, state.panel.on_size)
     self.legend_checkbox_menuitem_added = False
     
     # create the View menu
     self.menu = MPMenuTop([
         MPMenuSubMenu('View', items=[
             MPMenuCheckbox('Follow\tCtrl+F',
                            'Follow Aircraft',
                            'toggleFollow',
                            checked=state.follow),
             MPMenuCheckbox('Grid\tCtrl+G',
                            'Enable Grid',
                            'toggleGrid',
                            checked=state.grid),
             MPMenuItem('Goto\tCtrl+P',
                        'Goto Position',
                        'gotoPosition'),
             MPMenuItem('Brightness +\tCtrl+B',
                        'Increase Brightness',
                        'increaseBrightness'),
             MPMenuItem('Brightness -\tCtrl+Shift+B',
                        'Decrease Brightness',
                        'decreaseBrightness'),
             MPMenuCheckbox('Download Tiles\tCtrl+D',
                            'Enable Tile Download',
                            'toggleDownload',
                            checked=state.download),
             MPMenuRadio('Service', 'Select map service',
                         returnkey='setService',
                         selected=state.mt.get_service(),
                         items=state.mt.get_service_list())])])
     self.SetMenuBar(self.menu.wx_menu())
     self.Bind(wx.EVT_MENU, self.on_menu)
コード例 #3
0
class MPSlipMapFrame(wx.Frame):
    """ The main frame of the viewer
    """
    def __init__(self, state):
        wx.Frame.__init__(self, None, wx.ID_ANY, state.title)
        self.state = state
        state.frame = self
        state.grid = True
        state.follow = True
        state.download = True
        state.popup_object = None
        state.popup_latlon = None
        state.popup_started = False
        state.default_popup = None
        state.panel = MPSlipMapPanel(self, state)
        self.last_layout_send = time.time()
        self.Bind(wx.EVT_IDLE, self.on_idle)
        self.Bind(wx.EVT_SIZE, state.panel.on_size)
        self.legend_checkbox_menuitem_added = False

        # create the View menu
        self.menu = MPMenuTop([
            MPMenuSubMenu('View',
                          items=[
                              MPMenuCheckbox('Follow\tCtrl+F',
                                             'Follow Aircraft',
                                             'toggleFollow',
                                             checked=state.follow),
                              MPMenuCheckbox('Grid\tCtrl+G',
                                             'Enable Grid',
                                             'toggleGrid',
                                             checked=state.grid),
                              MPMenuItem('Goto\tCtrl+P', 'Goto Position',
                                         'gotoPosition'),
                              MPMenuItem('Brightness +\tCtrl+B',
                                         'Increase Brightness',
                                         'increaseBrightness'),
                              MPMenuItem('Brightness -\tCtrl+Shift+B',
                                         'Decrease Brightness',
                                         'decreaseBrightness'),
                              MPMenuCheckbox('Download Tiles\tCtrl+D',
                                             'Enable Tile Download',
                                             'toggleDownload',
                                             checked=state.download),
                              MPMenuRadio('Service',
                                          'Select map service',
                                          returnkey='setService',
                                          selected=state.mt.get_service(),
                                          items=state.mt.get_service_list())
                          ])
        ])
        self.SetMenuBar(self.menu.wx_menu())
        self.Bind(wx.EVT_MENU, self.on_menu)

    def on_menu(self, event):
        '''handle menu selection'''
        state = self.state
        # see if it is a popup menu
        if state.popup_object is not None:
            obj = state.popup_object
            ret = obj.popup_menu.find_selected(event)
            if ret is not None:
                ret.call_handler()
                state.event_queue.put(
                    SlipMenuEvent(state.popup_latlon, event, [
                        SlipObjectSelection(obj.key, 0, obj.layer,
                                            obj.selection_info())
                    ], ret))
                state.popup_object = None
                state.popup_latlon = None
        if state.default_popup is not None:
            ret = state.default_popup.popup.find_selected(event)
            if ret is not None:
                ret.call_handler()
                state.event_queue.put(
                    SlipMenuEvent(state.popup_latlon, event, [], ret))

        # otherwise a normal menu
        ret = self.menu.find_selected(event)
        if ret is None:
            return
        ret.call_handler()
        if ret.returnkey == 'toggleGrid':
            state.grid = ret.IsChecked()
        elif ret.returnkey == 'toggleLegend':
            state.legend = ret.IsChecked()
        elif ret.returnkey == 'toggleFollow':
            state.follow = ret.IsChecked()
        elif ret.returnkey == 'toggleDownload':
            state.download = ret.IsChecked()
        elif ret.returnkey == 'setService':
            state.mt.set_service(ret.get_choice())
        elif ret.returnkey == 'gotoPosition':
            state.panel.enter_position()
        elif ret.returnkey == 'increaseBrightness':
            state.brightness += 20
            if state.brightness > 255:
                state.brightness = 255
        elif ret.returnkey == 'decreaseBrightness':
            state.brightness -= 20
            if state.brightness < -255:
                state.brightness = -255
        state.need_redraw = True

    def find_object(self, key, layers):
        '''find an object to be modified'''
        state = self.state

        if layers is None or layers == '':
            layers = state.layers.keys()
        for layer in layers:
            if key in state.layers[layer]:
                return state.layers[layer][key]
        return None

    def follow(self, object):
        '''follow an object on the map'''
        state = self.state
        (px, py) = state.panel.pixmapper(object.latlon)
        ratio = 0.25
        if (px > ratio * state.width and px < (1.0 - ratio) * state.width
                and py > ratio * state.height and py <
            (1.0 - ratio) * state.height):
            # we're in the mid part of the map already, don't move
            return

        if not state.follow:
            # the user has disabled following
            return

        (lat, lon) = object.latlon
        state.panel.re_center(state.width / 2, state.height / 2, lat, lon)

    def add_legend_checkbox_menuitem(self):
        self.menu.add_to_submenu(['View'], [
            MPMenuCheckbox('Legend\tCtrl+L',
                           'Enable Legend',
                           'toggleLegend',
                           checked=self.state.legend)
        ])

    def add_object(self, obj):
        '''add an object to a layer'''
        state = self.state
        if not obj.layer in state.layers:
            # its a new layer
            state.layers[obj.layer] = {}
        state.layers[obj.layer][obj.key] = obj
        state.need_redraw = True
        if (not self.legend_checkbox_menuitem_added
                and isinstance(obj, SlipFlightModeLegend)):
            self.add_legend_checkbox_menuitem()
            self.legend_checkbox_menuitem_added = True
            self.SetMenuBar(self.menu.wx_menu())

    def remove_object(self, key):
        '''remove an object by key from all layers'''
        state = self.state
        for layer in state.layers:
            state.layers[layer].pop(key, None)
        state.need_redraw = True

    def on_idle(self, event):
        '''prevent the main loop spinning too fast'''
        state = self.state

        if state.close_window.acquire(False):
            self.state.app.ExitMainLoop()

        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            state.event_queue.put(win_layout.get_wx_window_layout(self))

        # receive any display objects from the parent
        obj = None

        while not state.object_queue.empty():
            obj = state.object_queue.get()

            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)

            if isinstance(obj, SlipObject):
                self.add_object(obj)

            if isinstance(obj, SlipPosition):
                # move an object
                object = self.find_object(obj.key, obj.layer)
                if object is not None:
                    object.update_position(obj)
                    if getattr(object, 'follow', False):
                        self.follow(object)
                    if obj.label is not None:
                        object.label = obj.label
                    if obj.colour is not None:
                        object.colour = obj.colour
                    state.need_redraw = True

            if isinstance(obj, SlipDefaultPopup):
                state.default_popup = obj

            if isinstance(obj, SlipInformation):
                # see if its a existing one or a new one
                if obj.key in state.info:
                    #                    print('update %s' % str(obj.key))
                    state.info[obj.key].update(obj)
                else:
                    #                    print('add %s' % str(obj.key))
                    state.info[obj.key] = obj
                state.need_redraw = True

            if isinstance(obj, SlipCenter):
                # move center
                (lat, lon) = obj.latlon
                state.panel.re_center(state.width / 2, state.height / 2, lat,
                                      lon)
                state.need_redraw = True

            if isinstance(obj, SlipZoom):
                # change zoom
                state.panel.set_ground_width(obj.ground_width)
                state.need_redraw = True

            if isinstance(obj, SlipFollow):
                # enable/disable follow
                state.follow = obj.enable

            if isinstance(obj, SlipFollowObject):
                # enable/disable follow on an object
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        if hasattr(state.layers[layer][obj.key], 'follow'):
                            state.layers[layer][obj.key].follow = obj.enable

            if isinstance(obj, SlipBrightness):
                # set map brightness
                state.brightness = obj.brightness
                state.need_redraw = True

            if isinstance(obj, SlipClearLayer):
                # remove all objects from a layer
                if obj.layer in state.layers:
                    state.layers.pop(obj.layer)
                state.need_redraw = True

            if isinstance(obj, SlipRemoveObject):
                # remove an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer].pop(obj.key)
                state.need_redraw = True

            if isinstance(obj, SlipHideObject):
                # hide an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer][obj.key].set_hidden(obj.hide)
                state.need_redraw = True

        if state.timelim_pipe is not None:
            while state.timelim_pipe[1].poll():
                try:
                    obj = state.timelim_pipe[1].recv()
                except Exception:
                    state.timelim_pipe = None
                    break
                for layer in state.layers:
                    for key in state.layers[layer].keys():
                        state.layers[layer][key].set_time_range(obj)
                state.need_redraw = True

        if obj is None:
            time.sleep(0.05)
コード例 #4
0
ファイル: mp_slipmap_ui.py プロジェクト: Dronecode/MAVProxy
class MPSlipMapFrame(wx.Frame):
    """ The main frame of the viewer
    """
    def __init__(self, state):
        wx.Frame.__init__(self, None, wx.ID_ANY, state.title)
        self.state = state
        state.frame = self
        state.grid = True
        state.follow = True
        state.download = True
        state.popup_object = None
        state.popup_latlon = None
        state.popup_started = False
        state.default_popup = None
        state.panel = MPSlipMapPanel(self, state)
        self.last_layout_send = time.time()
        self.Bind(wx.EVT_IDLE, self.on_idle)
        self.Bind(wx.EVT_SIZE, state.panel.on_size)
        self.legend_checkbox_menuitem_added = False
        
        # create the View menu
        self.menu = MPMenuTop([
            MPMenuSubMenu('View', items=[
                MPMenuCheckbox('Follow\tCtrl+F',
                               'Follow Aircraft',
                               'toggleFollow',
                               checked=state.follow),
                MPMenuCheckbox('Grid\tCtrl+G',
                               'Enable Grid',
                               'toggleGrid',
                               checked=state.grid),
                MPMenuItem('Goto\tCtrl+P',
                           'Goto Position',
                           'gotoPosition'),
                MPMenuItem('Brightness +\tCtrl+B',
                           'Increase Brightness',
                           'increaseBrightness'),
                MPMenuItem('Brightness -\tCtrl+Shift+B',
                           'Decrease Brightness',
                           'decreaseBrightness'),
                MPMenuCheckbox('Download Tiles\tCtrl+D',
                               'Enable Tile Download',
                               'toggleDownload',
                               checked=state.download),
                MPMenuRadio('Service', 'Select map service',
                            returnkey='setService',
                            selected=state.mt.get_service(),
                            items=state.mt.get_service_list())])])
        self.SetMenuBar(self.menu.wx_menu())
        self.Bind(wx.EVT_MENU, self.on_menu)

    def on_menu(self, event):
        '''handle menu selection'''
        state = self.state
        # see if it is a popup menu
        if state.popup_object is not None:
            obj = state.popup_object
            ret = obj.popup_menu.find_selected(event)
            if ret is not None:
                ret.call_handler()
                state.event_queue.put(SlipMenuEvent(state.popup_latlon, event,
                                                    [SlipObjectSelection(obj.key, 0, obj.layer, obj.selection_info())],
                                                    ret))
                state.popup_object = None
                state.popup_latlon = None
        if state.default_popup is not None:
            ret = state.default_popup.popup.find_selected(event)
            if ret is not None:
                ret.call_handler()
                state.event_queue.put(SlipMenuEvent(state.popup_latlon, event, [], ret))

        # otherwise a normal menu
        ret = self.menu.find_selected(event)
        if ret is None:
            return
        ret.call_handler()
        if ret.returnkey == 'toggleGrid':
            state.grid = ret.IsChecked()
        elif ret.returnkey == 'toggleLegend':
            state.legend = ret.IsChecked()
        elif ret.returnkey == 'toggleFollow':
            state.follow = ret.IsChecked()
        elif ret.returnkey == 'toggleDownload':
            state.download = ret.IsChecked()
        elif ret.returnkey == 'setService':
            state.mt.set_service(ret.get_choice())
        elif ret.returnkey == 'gotoPosition':
            state.panel.enter_position()
        elif ret.returnkey == 'increaseBrightness':
            state.brightness += 20
            if state.brightness > 255:
                state.brightness = 255
        elif ret.returnkey == 'decreaseBrightness':
            state.brightness -= 20
            if state.brightness < -255:
                state.brightness = -255
        state.need_redraw = True

    def find_object(self, key, layers):
        '''find an object to be modified'''
        state = self.state

        if layers is None or layers == '':
            layers = state.layers.keys()
        for layer in layers:
            if key in state.layers[layer]:
                return state.layers[layer][key]
        return None

    def follow(self, object):
        '''follow an object on the map'''
        state = self.state
        (px,py) = state.panel.pixmapper(object.latlon)
        ratio = 0.25
        if (px > ratio*state.width and
            px < (1.0-ratio)*state.width and
            py > ratio*state.height and
            py < (1.0-ratio)*state.height):
            # we're in the mid part of the map already, don't move
            return

        if not state.follow:
            # the user has disabled following
            return

        (lat, lon) = object.latlon
        state.panel.re_center(state.width/2, state.height/2, lat, lon)

    def add_legend_checkbox_menuitem(self):
        self.menu.add_to_submenu(['View'], [MPMenuCheckbox('Legend\tCtrl+L',
                                                         'Enable Legend',
                                                         'toggleLegend',
                                                         checked=self.state.legend)
        ])

    def add_object(self, obj):
        '''add an object to a layer'''
        state = self.state
        if not obj.layer in state.layers:
            # its a new layer
            state.layers[obj.layer] = {}
        state.layers[obj.layer][obj.key] = obj
        state.need_redraw = True
        if (not self.legend_checkbox_menuitem_added and
            isinstance(obj, SlipFlightModeLegend)):
            self.add_legend_checkbox_menuitem()
            self.legend_checkbox_menuitem_added = True
            self.SetMenuBar(self.menu.wx_menu())

    def remove_object(self, key):
        '''remove an object by key from all layers'''
        state = self.state
        for layer in state.layers:
            state.layers[layer].pop(key, None)
        state.need_redraw = True

    def on_idle(self, event):
        '''prevent the main loop spinning too fast'''
        state = self.state

        if state.close_window.acquire(False):
            self.state.app.ExitMainLoop()

        now = time.time()
        if now - self.last_layout_send > 1:
            self.last_layout_send = now
            state.event_queue.put(win_layout.get_wx_window_layout(self))

        # receive any display objects from the parent
        obj = None

        while not state.object_queue.empty():
            obj = state.object_queue.get()

            if isinstance(obj, win_layout.WinLayout):
                win_layout.set_wx_window_layout(self, obj)
                
            if isinstance(obj, SlipObject):
                self.add_object(obj)

            if isinstance(obj, SlipPosition):
                # move an object
                object = self.find_object(obj.key, obj.layer)
                if object is not None:
                    object.update_position(obj)
                    if getattr(object, 'follow', False):
                        self.follow(object)
                    if obj.label is not None:
                        object.label = obj.label
                    if obj.colour is not None:
                        object.colour = obj.colour
                    state.need_redraw = True

            if isinstance(obj, SlipDefaultPopup):
                state.default_popup = obj

            if isinstance(obj, SlipInformation):
                # see if its a existing one or a new one
                if obj.key in state.info:
#                    print('update %s' % str(obj.key))
                    state.info[obj.key].update(obj)
                else:
#                    print('add %s' % str(obj.key))
                    state.info[obj.key] = obj
                state.need_redraw = True

            if isinstance(obj, SlipCenter):
                # move center
                (lat,lon) = obj.latlon
                state.panel.re_center(state.width/2, state.height/2, lat, lon)
                state.need_redraw = True

            if isinstance(obj, SlipZoom):
                # change zoom
                state.panel.set_ground_width(obj.ground_width)
                state.need_redraw = True
                
            if isinstance(obj, SlipFollow):
                # enable/disable follow
                state.follow = obj.enable

            if isinstance(obj, SlipFollowObject):
                # enable/disable follow on an object
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        if hasattr(state.layers[layer][obj.key], 'follow'):
                            state.layers[layer][obj.key].follow = obj.enable
                
            if isinstance(obj, SlipBrightness):
                # set map brightness
                state.brightness = obj.brightness
                state.need_redraw = True

            if isinstance(obj, SlipClearLayer):
                # remove all objects from a layer
                if obj.layer in state.layers:
                    state.layers.pop(obj.layer)
                state.need_redraw = True

            if isinstance(obj, SlipRemoveObject):
                # remove an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer].pop(obj.key)
                state.need_redraw = True

            if isinstance(obj, SlipHideObject):
                # hide an object by key
                for layer in state.layers:
                    if obj.key in state.layers[layer]:
                        state.layers[layer][obj.key].set_hidden(obj.hide)
                state.need_redraw = True

        if obj is None:
            time.sleep(0.05)