mirror of
https://github.com/a-b-street/abstreet.git
synced 2025-01-01 10:57:17 +03:00
woops, forgot about a block of commented stuff in apply_edits. prevent
orphaning a bus stop
This commit is contained in:
parent
2e2fd1d931
commit
83352965b0
@ -282,10 +282,10 @@ impl LaneEditor {
|
||||
fn can_change_lane_type(l: LaneID, new_lt: LaneType, map: &Map) -> Option<String> {
|
||||
let r = map.get_parent(l);
|
||||
let (fwds, idx) = r.dir_and_offset(l);
|
||||
let mut proposed_lts = if fwds {
|
||||
r.get_lane_types().0
|
||||
let (mut proposed_lts, other_side) = if fwds {
|
||||
(r.get_lane_types().0, r.get_lane_types().1)
|
||||
} else {
|
||||
r.get_lane_types().1
|
||||
(r.get_lane_types().1, r.get_lane_types().0)
|
||||
};
|
||||
proposed_lts[idx] = new_lt;
|
||||
|
||||
@ -308,22 +308,22 @@ fn can_change_lane_type(l: LaneID, new_lt: LaneType, map: &Map) -> Option<String
|
||||
));
|
||||
}
|
||||
|
||||
let types: BTreeSet<LaneType> = r
|
||||
.all_lanes()
|
||||
.iter()
|
||||
.map(|l| map.get_l(*l).lane_type)
|
||||
.collect();
|
||||
|
||||
// Don't let players orphan a bus stop.
|
||||
if !r.all_bus_stops(map).is_empty()
|
||||
&& !types.contains(&LaneType::Driving)
|
||||
&& !types.contains(&LaneType::Bus)
|
||||
&& !proposed_lts
|
||||
.iter()
|
||||
.any(|lt| *lt == LaneType::Driving || *lt == LaneType::Bus)
|
||||
{
|
||||
return Some(format!("You need a driving or bus lane for the bus stop!"));
|
||||
}
|
||||
|
||||
let all_types: BTreeSet<LaneType> = other_side
|
||||
.into_iter()
|
||||
.chain(proposed_lts.iter().cloned())
|
||||
.collect();
|
||||
|
||||
// A parking lane must have a driving lane somewhere on the road.
|
||||
if types.contains(&LaneType::Parking) && !types.contains(&LaneType::Driving) {
|
||||
if all_types.contains(&LaneType::Parking) && !all_types.contains(&LaneType::Driving) {
|
||||
return Some(format!(
|
||||
"A parking lane needs a driving lane somewhere on the same road"
|
||||
));
|
||||
|
@ -8,7 +8,7 @@ use crate::{
|
||||
};
|
||||
use abstutil;
|
||||
use abstutil::{deserialize_btreemap, serialize_btreemap, Error, Timer};
|
||||
use geom::{Bounds, GPSBounds, Polygon, Pt2D};
|
||||
use geom::{Bounds, Distance, GPSBounds, Polygon, Pt2D};
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use std::collections::{BTreeMap, BTreeSet, HashSet, VecDeque};
|
||||
use std::io;
|
||||
@ -681,6 +681,21 @@ impl Map {
|
||||
new_edits.commands.len()
|
||||
));
|
||||
|
||||
// Might need to update bus stops.
|
||||
for id in &effects.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, Distance::ZERO, self);
|
||||
self.bus_stops.get_mut(&s).unwrap().driving_pos = driving_pos;
|
||||
}
|
||||
}
|
||||
|
||||
new_edits.update_derived(self, timer);
|
||||
self.edits = new_edits;
|
||||
self.pathfinder_dirty = true;
|
||||
@ -696,49 +711,6 @@ impl Map {
|
||||
.filter(|t| self.turns.contains_key(t))
|
||||
.collect(),
|
||||
)
|
||||
|
||||
/*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, Distance::ZERO, self);
|
||||
self.bus_stops.get_mut(&s).unwrap().driving_pos = driving_pos;
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure all of the turns of modified intersections are re-added in the pathfinder;
|
||||
// they might've become banned. Lane markings may also change based on turn priorities.
|
||||
for (id, ss) in all_stop_sign_edits {
|
||||
self.stop_signs.insert(id, ss);
|
||||
for t in &self.get_i(id).turns {
|
||||
add_turns.insert(*t);
|
||||
}
|
||||
for l in &self.get_i(id).incoming_lanes {
|
||||
changed_lanes.insert(*l);
|
||||
}
|
||||
}
|
||||
for (id, ts) in all_traffic_signals {
|
||||
self.traffic_signals.insert(id, ts);
|
||||
for t in &self.get_i(id).turns {
|
||||
add_turns.insert(*t);
|
||||
}
|
||||
for l in &self.get_i(id).incoming_lanes {
|
||||
changed_lanes.insert(*l);
|
||||
}
|
||||
}
|
||||
for id in all_closed_intersections {
|
||||
let i = &mut self.intersections[id.0];
|
||||
i.intersection_type = IntersectionType::Construction;
|
||||
for id in i.turns.drain(..) {
|
||||
self.turns.remove(&id).unwrap();
|
||||
delete_turns.insert(id);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
pub fn recalculate_pathfinding_after_edits(&mut self, timer: &mut Timer) {
|
||||
|
Loading…
Reference in New Issue
Block a user