Streets: sidewalks, road curves, junctions and roundabouts
Deploy web Studio / deploy (push) Successful in 4m31s

Roads take sidewalks (none, both, left, right): 12 cm high paving with
kerb faces drawn where they face the viewer. Road curve (radius, angle,
left/right) carries a street round a bend; centre lines are true arcs
when cut and offset, so curve joints are seamless. A road ending on
another road's centre line opens that road's kerb and sidewalk (T
junction); two roads ending at one corner close it. Roundabout: ring
radius and width, one or two lanes, up to four arms with flared kerbs,
splitter islands, give-way lines on the entry side (traffic on the left
or right) and a central island with apron.

Studio: a road run drawn corner by corner gets a curve in each corner
(prefab meta `corner`). Tooltips list the streets each one meets.
Engine: open `polyline` primitive (Prim::Poly open) so dashes run on
round curves. examples/streets and a Streets demo in the web Studio;
MCP guidance, docs. ROADMAP: backlog 5-7 done; multi-select and the
hosted copy marked done.

Tests: Rust 72, Studio 113, web 95.
This commit is contained in:
grabowski committed 2026-10-25 12:32:52 +07:00
1 parent 2442966743
commit c91d63663b
24 files changed
+989 -29

No files matched your search

+16
View File
@@ -326,6 +326,22 @@ try:
check("(from robot-b)" in loads and flips == 32, f"robot arms pass the goods on ({flips} poses): " + loads)
shot(pg, "web-factory.jpg")
# ---------------------------------------------------------------- the streets demo: sidewalks, curves, a roundabout
pg.locator("#wb-projects").click()
pg.locator("#wb-nstreets").click()
pg.wait_for_load_state()
ready(pg)
pg.wait_for_timeout(500)
ns = len(doc(pg)["objects"])
walks = pg.evaluate("() => document.querySelectorAll('.iso-svg .iso-g-walk').length")
gw = pg.evaluate("() => document.querySelectorAll('.iso-svg .iso-giveway').length")
check(title(pg) == "isokit streets" and ns > 25 and walks > 15 and gw == 1 and pg.evaluate("() => __studio.S.warnings.length") == 0,
f"Streets demo opens a town quarter ({ns} objects, {walks} sidewalk pieces, give-way lines, no warnings)")
meets = pg.evaluate("() => Object.fromEntries((__studio.view.info('cross-st') || {rows: []}).rows)['Meets'] || ''")
ring = pg.evaluate("() => Object.fromEntries((__studio.view.info('rb') || {rows: []}).rows)['Arms'] || ''")
check(meets == "east-ave, park-rd" and ring.startswith("4:"), f"streets know what they meet: cross-st meets {meets}; roundabout arms {ring}")
shot(pg, "web-streets.jpg")
# ---------------------------------------------------------------- a system asking for less motion
# (Windows: Animation effects off): the view starts still, but the button stays and turns it on
rctx = b.new_context(viewport={"width": 1200, "height": 800}, reduced_motion="reduce")