mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-28 20:29:04 +03:00
Add a tool to export a road to streetmix. Untested, because still having trouble making manual API calls.
This commit is contained in:
parent
058103b84f
commit
4a3ea8b5c7
@ -23,6 +23,7 @@ mod objects;
|
||||
pub mod path_counter;
|
||||
mod polygons;
|
||||
pub mod shared_row;
|
||||
pub mod streetmix;
|
||||
|
||||
pub struct DebugMode {
|
||||
panel: Panel,
|
||||
|
@ -3,7 +3,7 @@ use geojson::{Feature, FeatureCollection, GeoJson, Geometry, Value};
|
||||
|
||||
use map_model::{Direction, Lane, LaneType, Map, RoadID};
|
||||
|
||||
// Exports to https://github.com/d-wasserman/shared-row/, returns the filename
|
||||
/// Exports to https://github.com/d-wasserman/shared-row/, returns the filename
|
||||
pub fn export(roads: Vec<RoadID>, map: &Map) -> String {
|
||||
let path = format!(
|
||||
"shared_row_export_{}.json",
|
||||
|
63
game/src/debug/streetmix.rs
Normal file
63
game/src/debug/streetmix.rs
Normal file
@ -0,0 +1,63 @@
|
||||
use map_model::{Direction, Lane, LaneType, Map, RoadID};
|
||||
|
||||
/// Exports a single road to Streetmix's format, returns the filename
|
||||
pub fn export(r: RoadID, map: &Map) -> String {
|
||||
let path = format!("streetmix_export_{}.json", r.0);
|
||||
let street = road(r, map);
|
||||
abstutil::write_json(path.clone(), &street);
|
||||
path
|
||||
}
|
||||
|
||||
fn road(id: RoadID, map: &Map) -> serde_json::Map<String, serde_json::value::Value> {
|
||||
let r = map.get_r(id);
|
||||
let mut street = serde_json::Map::new();
|
||||
street.insert("schemaVersion".to_string(), 24.into());
|
||||
// TODO Many more fields
|
||||
|
||||
let mut segments = Vec::new();
|
||||
for (l, dir, _) in r.lanes_ltr() {
|
||||
segments.push(serde_json::value::Value::Object(lane(map.get_l(l), dir)));
|
||||
}
|
||||
street.insert(
|
||||
"segments".to_string(),
|
||||
serde_json::value::Value::Array(segments),
|
||||
);
|
||||
|
||||
street
|
||||
}
|
||||
|
||||
fn lane(lane: &Lane, dir: Direction) -> serde_json::Map<String, serde_json::value::Value> {
|
||||
let mut segment = serde_json::Map::new();
|
||||
segment.insert("id".to_string(), lane.id.to_string().into());
|
||||
segment.insert("width".to_string(), lane.width.inner_meters().into());
|
||||
|
||||
// TODO I'm taking wild stabs at these values for now. Once I can visualize the results, will
|
||||
// iterate on these.
|
||||
let (segment_type, variant) = match lane.lane_type {
|
||||
LaneType::Driving => match dir {
|
||||
Direction::Fwd => ("drive-lane", "inbound|car"),
|
||||
Direction::Back => ("drive-lane", "outbound|car"),
|
||||
},
|
||||
LaneType::Parking => match dir {
|
||||
Direction::Fwd => ("parking-lane", "inbound|left"),
|
||||
Direction::Back => ("parking-lane", "outbound|right"),
|
||||
},
|
||||
LaneType::Sidewalk => ("sidewalk", "dense"),
|
||||
LaneType::Shoulder => ("sidewalk", "dense"),
|
||||
LaneType::Biking => match dir {
|
||||
Direction::Fwd => ("bike-lane", "inbound|green|road"),
|
||||
Direction::Back => ("bike-lane", "outbound|green|road"),
|
||||
},
|
||||
LaneType::Bus => match dir {
|
||||
Direction::Fwd => ("bus-lane", "inbound|shared"),
|
||||
Direction::Back => ("bus-lane", "outbound|shared"),
|
||||
},
|
||||
LaneType::SharedLeftTurn => ("TODO", "TODO"),
|
||||
LaneType::Construction => ("TODO", "TODO"),
|
||||
LaneType::LightRail => ("TODO", "TODO"),
|
||||
};
|
||||
segment.insert("type".to_string(), segment_type.into());
|
||||
segment.insert("variant".to_string(), variant.into());
|
||||
|
||||
segment
|
||||
}
|
@ -44,6 +44,7 @@ fn make_select_panel(ctx: &mut EventCtx, selector: &RoadSelector) -> Panel {
|
||||
selector.roads.len()
|
||||
))
|
||||
.build(ctx, "export roads to shared-row", None),
|
||||
Btn::text_fg("export one road to Streetmix").build_def(ctx, None),
|
||||
Btn::text_fg("Cancel").build_def(ctx, Key::Escape),
|
||||
])
|
||||
.evenly_spaced(),
|
||||
@ -77,6 +78,21 @@ impl State for BulkSelect {
|
||||
vec![format!("Roads exported to shared-row format at {}", path)],
|
||||
));
|
||||
}
|
||||
"export one road to Streetmix" => {
|
||||
let path = crate::debug::streetmix::export(
|
||||
*self.selector.roads.iter().next().unwrap(),
|
||||
&app.primary.map,
|
||||
);
|
||||
return Transition::Push(PopupMsg::new(
|
||||
ctx,
|
||||
"One road exported",
|
||||
vec![format!(
|
||||
"One arbitrary road from your selection exported to Streetmix format \
|
||||
at {}",
|
||||
path
|
||||
)],
|
||||
));
|
||||
}
|
||||
x => {
|
||||
if self.selector.event(ctx, app, Some(x)) {
|
||||
self.panel = make_select_panel(ctx, &self.selector);
|
||||
|
Loading…
Reference in New Issue
Block a user