Ejemplo n.º 1
0
    def on_merge(self, event):
        track1 = None
        item1 = 0
        i = 0
        org_track_list = []
        for track_line in self.g.edit_track_list:
            if track_line.is_checked:
                track1 = track_line
                org_track_list.append(copy.deepcopy(track1))
                item1 = i
                break
            i += 1

        if track1 is None:
            do_log('请先在多选框选择两条以上轨迹...')
            return

        item2_list = []
        for j in range(i + 1, len(self.g.edit_track_list)):
            if self.g.edit_track_list[j].is_checked:
                item2_list.append(j)

        if not item2_list:
            do_log('请先在多选框选择两条以上轨迹...')
            return

        for item2 in item2_list:
            track2 = self.g.edit_track_list[item2]
            track1.track_points[len(track1.track_points
                                    ):] = track2.track_points
            if not track2.has_timestamp:
                track1.has_timestamp = False
        for track_point in track1.track_points:
            track_point.track_line = track1
        track1.compute_track_line_args()
        track1.selected_point = None
        track1.name = '合并%05d' % auto_id.get_id()

        for item2 in item2_list[-1::-1]:
            self.g.track_edit.DeleteItem(item2)
            org_track_list.append(self.g.edit_track_list.pop(item2))
        self.g.track_edit.DeleteItem(item1)
        self.g.edit_track_list.pop(item1)

        self.g.track_edit.InsertStringItem(len(self.g.edit_track_list),
                                           track1.name)
        self.g.edit_track_list.append(track1)
        track1.is_checked = False
        self.g.track_edit.set_selected_track_line(track1)

        undo_action = {}
        undo_action['action'] = 'merge'
        undo_action['org_track_list'] = org_track_list
        undo_action['new_track'] = track1
        self.g.undo_list = [undo_action]

        self.enable_undo()
        do_log('已将%d个轨迹合并为一个...' % len(org_track_list))
        self.repaint(canvas=const.REDRAW_TRACK)
Ejemplo n.º 2
0
    def on_search_route(self, event):
        dlg = RouteSearchDlg()
        dlg.CentreOnParent()
        if dlg.ShowModal() == wx.ID_OK:
            wpt_start = None
            wpt_end = None
            start_idx = dlg.start.GetCurrentSelection()
            if start_idx < 0:
                start_name = dlg.start.GetValue()
                if start_name:
                    way_points = search.find_pos_from_name(
                        start_name, g.search_api)
                    if way_points:
                        wpt_start = WayPoint(way_points[0][0],
                                             way_points[0][1],
                                             way_points[0][2],
                                             bmp_index=g.default_wpt_bmp_index)
                    else:
                        wpt_start = None
            else:
                wpt_start = g.wpt_list[start_idx]

            end_idx = dlg.end.GetCurrentSelection()
            if end_idx < 0:
                end_name = dlg.end.GetValue()
                if end_name:
                    way_points = search.find_pos_from_name(
                        end_name, g.search_api)
                    if way_points:
                        wpt_end = WayPoint(way_points[0][0],
                                           way_points[0][1],
                                           way_points[0][2],
                                           bmp_index=g.default_wpt_bmp_index)
                    else:
                        wpt_end = None
            else:
                wpt_end = g.wpt_list[end_idx]

            if wpt_start and wpt_end:
                routes = search.find_drive_route(
                    (wpt_start.lon, wpt_start.lat), (wpt_end.lon, wpt_end.lat),
                    g.search_api)
                if len(routes) > 0:
                    folder_name = '路径搜索结果:%s --> %s' % (wpt_start.name,
                                                        wpt_end.name)
                    new_folder = g.track_tree.create_child_folder(
                        g.data_root, folder_name)
                    first_track = None
                    for route in routes:
                        track_line = TrackLine(new_folder.uuid,
                                               name='行车路径%05d' %
                                               auto_id.get_id())
                        track_line.load_from_points(route)
                        g.add_data(new_folder, track_line, commit=False)
                        if not first_track:
                            first_track = track_line

                    if not wpt_start.parent:
                        wpt_start.parent = new_folder.uuid
                        g.add_data(new_folder, wpt_start, commit=False)

                    if not wpt_end.parent:
                        wpt_end.parent = new_folder.uuid
                        g.add_data(new_folder, wpt_end, commit=False)

                    g.db_mgr.commit()

                    g.track_tree.selected_track_line = first_track
                    g.track_tree.SelectItem(first_track.tree_node)
                    g.map_canvas.zoom_to_track_line(first_track)
                    do_log('找到%d条行车路线' % len(routes))
                else:
                    do_log('未找到合适的行车路线...')
            else:
                do_log('地名为空或无效...')
        dlg.Destroy()
Ejemplo n.º 3
0
    def on_undo(self, event):
        if not g.undo_list:
            self.enable_undo(False)
            return

        undo_action = g.undo_list.pop()
        if undo_action['action'] == 'tree_del_track':
            track_line = undo_action['track']
            parent = g.get_parent_folder(track_line)
            g.add_data(parent, track_line)
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才删除的轨迹“%s”被恢复至文件夹“%s”' % (track_line.name, parent.name))
        elif undo_action['action'] == 'tree_del_folder':
            deleted = undo_action['deleted']
            for data in deleted:
                parent = g.get_parent_folder(data)
                g.add_data(parent, data, commit=False)
            g.db_mgr.commit()
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才删除的文件夹“%s”被恢复')
        elif undo_action['action'] == 'edit_del_track':
            track_line = undo_action['track']
            g.track_edit.InsertStringItem(len(g.edit_track_list),
                                          track_line.name)
            g.edit_track_list.append(track_line)
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才删除的轨迹“%s”已恢复' % track_line.name)
        elif undo_action['action'] == 'del_seg':
            track_line = undo_action['track']
            start_idx = undo_action['start']
            track_line.track_points[start_idx:start_idx] = undo_action[
                'del_seg']
            g.track_edit.selected_track_line = track_line
            track_line.sel_start_idx = start_idx
            track_line.sel_end_idx = undo_action['end']
            track_line.compute_track_line_args()
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才删除的轨迹段(%d点)已恢复' % len(undo_action['del_seg']))
        elif undo_action['action'] == 'del_point':
            track_line = undo_action['track']
            point = undo_action['point']
            index = undo_action['index']
            track_line.track_points[index:index] = [point]
            g.track_edit.selected_track_line = track_line
            track_line.sel_start_idx = index
            track_line.sel_end_idx = index
            track_line.selected_point = point
            track_line.compute_track_line_args()
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才删除的轨迹点已恢复...')
        elif undo_action['action'] == 'split':
            track_org = undo_action['track_org']
            track1 = undo_action['track1']
            track2 = undo_action['track2']
            track_list = g.edit_track_list
            g.track_edit.DeleteItem(track_list.index(track2))
            g.track_edit.DeleteItem(track_list.index(track1))
            track_list.pop(track_list.index(track2))
            track_list.pop(track_list.index(track1))
            g.track_edit.InsertStringItem(len(track_list), track_org.name)
            track_list.append(track_org)
            g.track_edit.set_selected_track_line(track_org)
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才被分割的轨迹已重新合并...')
        elif undo_action['action'] == 'merge':
            org_track_list = undo_action['org_track_list']
            new_track = undo_action['new_track']
            track_list = g.edit_track_list
            g.track_edit.DeleteItem(track_list.index(new_track))
            track_list.pop(track_list.index(new_track))

            for track_line in org_track_list:
                g.track_edit.InsertStringItem(len(track_list), track_line.name)
                track_list.append(track_line)
                track_line.is_checked = False
                for point in track_line.track_points:
                    point.track_line = track_line

            g.track_edit.set_selected_track_line(None)
            self.enable_undo(False)
            self.repaint(const.REDRAW_TRACK)
            do_log('刚才被合并的轨迹已重新分割为多个...')
        elif undo_action['action'] == 'reverse':
            track_line = undo_action['track']
            track_line.track_points.reverse()
            track_line.has_timestamp = undo_action['has_timestamp']
            track_line.compute_track_line_args()
            g.track_edit.set_selected_track_line(track_line)
            self.enable_undo(False)
            self.repaint(canvas=const.REDRAW_TRACK)
            do_log('刚才翻转的轨迹已恢复至原来方向...')
        elif undo_action['action'] == 'del_all_wpts':
            redo_dir = '被删路点恢复%05d' % auto_id.get_id()
            wpt_folder = g.track_tree.create_child_folder(
                g.data_root, redo_dir)
            for wpt in g.wpt_list_deleted:
                wpt.parent = wpt_folder.uuid
                g.add_data(wpt_folder, wpt, commit=False)
            g.db_mgr.commit()
            g.wpt_list_deleted = []
            self.repaint(canvas=const.REDRAW_COPY)
            do_log('刚才被删除的路点统一被恢复至<%s>文件夹...' % redo_dir)