fix crosswalk coupling in intersection editors, not sure when this broke

This commit is contained in:
Dustin Carlino 2019-05-16 10:43:58 -07:00
parent 1d5e5a2795
commit b6cdd0f99c
6 changed files with 26 additions and 16 deletions

View File

@ -24,7 +24,8 @@ https://gis-kingcounty.opendata.arcgis.com/datasets/acs-means-of-transportation-
https://gis-kingcounty.opendata.arcgis.com/datasets/acs-travel-time-to-work-acs-b08303-traveltime
https://gis-kingcounty.opendata.arcgis.com/datasets/consolidated-demographics-index-for-king-county-census-tracts-demographic-index-area
https://gis-kingcounty.opendata.arcgis.com/datasets/acs-household-size-by-vehicles-available-acs-b08201-householdvehicles
https://lehd.ces.census.gov/
https://movement.uber.com/explore/seattle/
- indications of population
https://gis-kingcounty.opendata.arcgis.com/datasets/acs-total-population-acs-b01003-totalpop

View File

@ -26,6 +26,8 @@
- https://commuteseattle.com/
- https://www.theurbanist.org/
- https://humantransit.org/2019/03/notes-on-simcity-at-30.html
- https://mynorthwest.com/category/chokepoints/
- https://blogs.uw.edu/ceadvice/2019/05/08/infrastructure-week-2019-welcome-uw-cee-students-and-faculty/
## Similar projects

View File

@ -142,7 +142,7 @@ impl TrafficSignalEditor {
Key::Space,
&format!("toggle from {:?} to {:?}", cycle.get_priority(id), pri),
) {
cycle.edit_turn(id, pri);
cycle.edit_turn(ui.primary.map.get_t(id), pri);
changed = true;
}
}
@ -201,11 +201,8 @@ impl TrafficSignalEditor {
} else if has_sidewalks && self.menu.action("add a new pedestrian scramble cycle") {
let mut cycle = Cycle::new(self.i, signal.cycles.len());
for t in ui.primary.map.get_turns_in_intersection(self.i) {
// edit_turn adds the other_crosswalk_id and asserts no duplicates.
if t.turn_type == TurnType::SharedSidewalkCorner
|| (t.turn_type == TurnType::Crosswalk && t.id.src < t.id.dst)
{
cycle.edit_turn(t.id, TurnPriority::Priority);
if t.between_sidewalks() {
cycle.edit_turn(t, TurnPriority::Priority);
}
}
signal.cycles.insert(self.current_cycle, cycle);

View File

@ -154,7 +154,11 @@ impl ControlStopSign {
}
pub fn change(&mut self, t: TurnID, pri: TurnPriority, map: &Map) {
let turn = map.get_t(t);
self.turns.insert(t, pri);
if turn.turn_type == TurnType::Crosswalk {
self.turns.insert(turn.other_crosswalk_id(), pri);
}
self.recalculate_stop_signs(map);
}

View File

@ -1,4 +1,4 @@
use crate::{IntersectionID, Map, RoadID, TurnID, TurnPriority, TurnType};
use crate::{IntersectionID, Map, RoadID, Turn, TurnID, TurnPriority, TurnType};
use abstutil::{Error, Timer, Warn};
use geom::Duration;
use serde_derive::{Deserialize, Serialize};
@ -314,13 +314,19 @@ impl Cycle {
}
}
pub fn edit_turn(&mut self, t: TurnID, pri: TurnPriority) {
self.priority_turns.remove(&t);
self.yield_turns.remove(&t);
if pri == TurnPriority::Priority {
self.priority_turns.insert(t);
} else if pri == TurnPriority::Yield {
self.yield_turns.insert(t);
pub fn edit_turn(&mut self, t: &Turn, pri: TurnPriority) {
let mut ids = vec![t.id];
if t.turn_type == TurnType::Crosswalk {
ids.push(t.other_crosswalk_id());
}
for id in ids {
self.priority_turns.remove(&id);
self.yield_turns.remove(&id);
if pri == TurnPriority::Priority {
self.priority_turns.insert(id);
} else if pri == TurnPriority::Yield {
self.yield_turns.insert(id);
}
}
}
}

View File

@ -107,7 +107,7 @@ impl Turn {
pub fn between_sidewalks(&self) -> bool {
self.turn_type == TurnType::SharedSidewalkCorner || self.turn_type == TurnType::Crosswalk
}
pub fn other_crosswalk_id(&self) -> TurnID {
pub(crate) fn other_crosswalk_id(&self) -> TurnID {
assert_eq!(self.turn_type, TurnType::Crosswalk);
TurnID {
parent: self.id.parent,