Beispiel #1
0
    def mousePressEvent(self, event):
        if event.button() & QtCore.Qt.RightButton:
            if self.edit_form:
                show_error_message(
                    "You are currently editing one or more road-items.  "
                    "Click on the <Ok> or <Cancel> button to close the edit-form before "
                    "selecting another item.")
                super(Graphics_view, self).mousePressEvent(event)
                return

            if self.scraping:
                self.mouse_press_events_for_scraping(event)
                super(Graphics_view, self).mousePressEvent(event)
                return

            if event.modifiers() == (QtCore.Qt.ControlModifier
                                     | QtCore.Qt.AltModifier):
                self.selections.show_rubber_band(event.pos())
            elif event.modifiers() != QtCore.Qt.ControlModifier:
                self.mouse_press_events_for_scraping(event)
            else:
                if event.modifiers() != QtCore.Qt.ShiftModifier:
                    self.selections.reset_selected_items()
                for graphics_item in self.items(event.x(), event.y(), 5, 5):
                    if not graphics_item.is_selectable:
                        continue
                    self.selections.add_item(graphics_item)

                road_info = ''
                for selected_item in self.selections.selected_items:
                    road_info = road_info + selected_item.graphics_item.road_item.road_info(
                    )
                self.main_window.show_selected_road_items_info(road_info)
        super(Graphics_view, self).mousePressEvent(event)
Beispiel #2
0
 def on_action_create_missing_stop_line_triggered(self, is_checked):
     if not self.view.selections.selection_region:
         show_error_message(
             "You must select a rectangular region which includes a crossing "
             "and the lane-markings that would end at the (missing) stop-line.  Use <Control> "
             "+ <Alt> + Right-mouse-button to create the selection region.")
         return
     path = self.view.selections.selection_region.path()
     self.view.selections.reset_selection_region()
     self.wanderlust.create_missing_stop_line(path)
Beispiel #3
0
 def on_action_extract_road_segments_triggered(self, is_checked):
     if not self.view.selections.selection_region:
         show_error_message(
             "You must select a rectangular region which includes the "
             "lane-markings between two intersections and the crossings and stop-lines at the "
             "start/end of those lane-markings.  Use <Control> + <Alt> + Right-mouse-button "
             "to create the selection region.")
         return
     path = self.view.selections.selection_region.path()
     self.view.selections.reset_selection_region()
     self.wanderlust.extract_road_segments(path)
Beispiel #4
0
 def delete_selected_item(self):
     if len(self.selections.selected_items) != 1:
         show_error_message("You must select a lane-edge to delete.")
         return
     selected_item = self.selections.selected_items[0]
     graphics_item = selected_item.graphics_item
     if not isinstance(graphics_item.road_item, Lane_edge):
         show_error_message("You must select a lane-edge to delete.")
         return
     self.selections.reset_selected_items()
     self.scene().removeItem(graphics_item)
     lane_edge = graphics_item.road_item
     lane_edge.delete()
Beispiel #5
0
 def edit_selected_items(self):
     if len(self.selections.selected_items) == 0:
         show_error_message("Select a road-item and try again.")
         return
     if len(self.selections.selected_items) == 1:
         road_item = self.selections.selected_items[
             0].graphics_item.road_item
         self.edit_form = Edit_form(road_item, self.main_window)
     else:
         #road_items = [item.graphics_item.road_item for item in self.selections.selected_items]
         #self.edit_form = Multiple_edit_form(road_items, self.main_window)
         return
     self.connect(self.edit_form, QtCore.SIGNAL("finish_editing"),
                  self.finish_editing)
     self.edit_form.setVisible(True)
    def create_missing_stop_line(self, path):
        crossings, lane_markings, kerb_lines = self.items_in_selection_region(
            path)
        if len(kerb_lines) < 2:
            show_error_message(
                "The selection region must include at least 2 kerb-lines.")
            return

        important_marking_types = ("B", "C", "A", "L", "S", "S1", "A1")
        for lane_marking in lane_markings:
            if lane_marking.marking_type in important_marking_types:
                break
        else:
            msg = "The selection region must contain at least one lane-marking of the types: "
            msg = msg + "'%s'" % important_marking_types[0]
            for type in important_marking_types[1:]:
                msg = msg + ", '%s'" % type
            show_error_message(msg)
            return

        crossing = crossings[0]
        ref_point = self.get_reference_point(lane_marking, crossing)
        stop_line = self.calc_stop_line(ref_point, crossing, kerb_lines)

        for lane_marking in lane_markings:
            polyline = self.get_polyline(lane_marking, crossing)
            p1 = polyline[-1]
            p2 = polyline[-2]
            p = intersection_point(p1, p2, stop_line[0], stop_line[-1])
            if is_between(p, stop_line[0], stop_line[-1]) and is_between(
                    p, p1, p2):
                polyline[-1] = p
                self.adjust_lane_marking(lane_marking, polyline)

        lane_marking = self.main_window.digital_map.add_lane_marking(
            "M", "discard", stop_line)
        self.main_window.scene.draw_lane_marking(lane_marking)
        self.load_lane_marking(lane_marking)
    def extract_road_segments(self, path):
        lane_edges = list()
        bounding_box = QtCore.QRectF()
        for graphics_item in self.tracing_paper.items(path):
            road_item = graphics_item.road_item
            if isinstance(road_item,
                          Lane_edge) and road_item.marking_type == "e":
                for point in road_item.polyline:
                    if not path.contains(QtCore.QPointF(point.x, point.y)):
                        break
                else:
                    lane_edges.append(road_item)
                    point1 = QtCore.QPointF(road_item.polyline[0].x,
                                            road_item.polyline[0].y)
                    point2 = QtCore.QPointF(road_item.polyline[-1].x,
                                            road_item.polyline[-1].y)
                    bounding_box = bounding_box.united(
                        QtCore.QRectF(point1, point2))

        if len(lane_edges) < 4:
            show_error_message(
                "Sorry, this feature is not supported when there are 3 or less "
                "lane edges.")
            return

        crossings = list()
        stop_lines = list()
        for graphics_item in self.tracing_paper.items(bounding_box):
            road_item = graphics_item.road_item
            if isinstance(road_item,
                          Lane_edge) and road_item.marking_type == "J":
                crossings.append(road_item)
            elif isinstance(road_item,
                            Lane_edge) and road_item.marking_type == "M":
                stop_lines.append(road_item)

        for stop_line in stop_lines:
            self.get_lane_edges_ending_at_stop_line(lane_edges, stop_line)
            self.order_lane_edges(stop_line.lane_edges, stop_line)

        for stop_line in stop_lines:
            self.get_crossing_at_start_of_lane_edges(stop_line.lane_edges,
                                                     crossings)

        self.create_side_walk_edges(stop_lines)
        self.create_lanes(stop_lines)

        for stop_line in stop_lines:
            self.redraw(stop_line)
            for lane_edge in stop_line.lane_edges:
                self.redraw(lane_edge)
            self.redraw(stop_line.lane_edges[-1].crossing)

        bus_zones = list()
        yellow_boxes = list()

        #if len(stop_lines) == 1:
        #    point = stop_lines[0].polyline[0]
        #    outer_path = QtGui.QPainterPath(QtCore.QPointF(point.x, point.y))
        #    for point in stop_lines[0].polyline[1:]:
        #        outer_path.lineTo(point.x, point.y)
        #    for point in stop_lines[0].lane_edges[-1].
        #else:
        #    outer_path

        #for graphics_item in self.tracing_paper.items(outer_path):
        #    if isinstance(road_item, Lane_edge) and road_item.marking_type == "R":
        #        bus_zones.append(road_item)
        #    elif isinstance(road_item, Lane_edge) and road_item.marking_type == "N":
        #        yellow_boxes.append(road_item)

        return lane_edges