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)
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)
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)
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()
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