mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-27 16:36:02 +03:00
recalculate bus stop driving_pos when editing
This commit is contained in:
parent
d7e639b5f3
commit
88f6516f79
@ -394,7 +394,7 @@ fn can_change_lane_type(r: &Road, l: &Lane, lt: LaneType, map: &Map) -> bool {
|
||||
}
|
||||
|
||||
// Don't let players orphan a bus stop.
|
||||
if r.has_bus_stop(map) && (lt == LaneType::Parking || lt == LaneType::Biking) {
|
||||
if !r.all_bus_stops(map).is_empty() && (lt == LaneType::Parking || lt == LaneType::Biking) {
|
||||
// Is this the last one?
|
||||
let mut other_bus_lane = false;
|
||||
for id in r.all_lanes() {
|
||||
|
@ -598,6 +598,7 @@ impl Map {
|
||||
|
||||
let mut changed_lanes = BTreeSet::new();
|
||||
let mut changed_intersections = BTreeSet::new();
|
||||
let mut changed_roads = BTreeSet::new();
|
||||
for (id, lt) in all_lane_edits {
|
||||
changed_lanes.insert(id);
|
||||
|
||||
@ -614,6 +615,21 @@ impl Map {
|
||||
|
||||
changed_intersections.insert(l.src_i);
|
||||
changed_intersections.insert(l.dst_i);
|
||||
changed_roads.insert(l.parent);
|
||||
}
|
||||
|
||||
for id in changed_roads {
|
||||
let stops = self.get_r(id).all_bus_stops(self);
|
||||
for s in stops {
|
||||
let sidewalk_pos = self.get_bs(s).sidewalk_pos;
|
||||
// Must exist, because we aren't allowed to orphan a bus stop.
|
||||
let driving_lane = self
|
||||
.get_r(id)
|
||||
.find_closest_lane(sidewalk_pos.lane(), vec![LaneType::Driving, LaneType::Bus])
|
||||
.unwrap();
|
||||
let driving_pos = sidewalk_pos.equiv_pos(driving_lane, self);
|
||||
self.bus_stops.get_mut(&s).unwrap().driving_pos = driving_pos;
|
||||
}
|
||||
}
|
||||
|
||||
// Recompute turns and intersection policy
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::{raw_data, IntersectionID, LaneID, LaneType, Map, LANE_THICKNESS};
|
||||
use crate::{raw_data, BusStopID, IntersectionID, LaneID, LaneType, Map, LANE_THICKNESS};
|
||||
use abstutil::{Error, Warn};
|
||||
use geom::{Distance, PolyLine, Polygon, Speed};
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
@ -401,12 +401,11 @@ impl Road {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn has_bus_stop(&self, map: &Map) -> bool {
|
||||
pub fn all_bus_stops(&self, map: &Map) -> Vec<BusStopID> {
|
||||
let mut stops = Vec::new();
|
||||
for id in self.all_lanes() {
|
||||
if !map.get_l(id).bus_stops.is_empty() {
|
||||
return true;
|
||||
}
|
||||
stops.extend(map.get_l(id).bus_stops.iter().cloned());
|
||||
}
|
||||
false
|
||||
stops
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user