From c1378a141f2ed5b51f12b671c08df0f21ef945e1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 2 Feb 2018 19:58:09 -0500 Subject: [PATCH 01/55] Add support for complex intersection and via way restrictions --- css/80_app.css | 2 +- modules/actions/restrict_turn.js | 73 +-- modules/actions/split.js | 5 +- modules/osm/intersection.js | 683 +++++++++++++++++++------ modules/osm/relation.js | 34 +- modules/svg/turns.js | 36 +- modules/ui/fields/restrictions.js | 199 ++++---- modules/ui/init.js | 4 +- test/spec/actions/restrict_turn.js | 711 ++++++++++---------------- test/spec/osm/intersection.js | 793 ++++++++++++++--------------- test/spec/osm/relation.js | 666 ++++++++++++++---------- 11 files changed, 1771 insertions(+), 1435 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 63208b068..275bd7e2a 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1836,7 +1836,7 @@ input[type=number] { .form-field-restrictions .preset-input-wrap { position: relative; - height: 300px; + height: 400px; } .form-field-restrictions svg.surface { diff --git a/modules/actions/restrict_turn.js b/modules/actions/restrict_turn.js index eb59644a4..df45ece81 100644 --- a/modules/actions/restrict_turn.js +++ b/modules/actions/restrict_turn.js @@ -1,9 +1,6 @@ -import { actionSplit } from './split'; - import { osmInferRestriction, - osmRelation, - osmWay + osmRelation } from '../osm'; @@ -11,21 +8,20 @@ import { // // { // from: { node: , way: }, -// via: { node: }, +// via: { node: , ways: [,,...] }, // to: { node: , way: }, // restriction: <'no_right_turn', 'no_left_turn', etc.> // } // // This specifies a restriction of type `restriction` when traveling from -// `from.node` in `from.way` toward `to.node` in `to.way` via `via.node`. +// `from.node` in `from.way` toward `to.node` in `to.way` via `via.node` OR `via.ways`. // (The action does not check that these entities form a valid intersection.) // // If `restriction` is not provided, it is automatically determined by // osmInferRestriction. // -// If necessary, the `from` and `to` ways are split. In these cases, `from.node` -// and `to.node` are used to determine which portion of the split ways become -// members of the restriction. +// From, to, and via ways should be split before calling this action. +// (old versions of the code would split the ways here, but we no longer do it) // // For testing convenience, accepts an ID to assign to the new relation. // Normally, this will be undefined and the relation will automatically @@ -34,47 +30,23 @@ import { export function actionRestrictTurn(turn, projection, restrictionId) { return function(graph) { - var from = graph.entity(turn.from.way), - via = graph.entity(turn.via.node), - to = graph.entity(turn.to.way); + var fromWay = graph.entity(turn.from.way); + var toWay = graph.entity(turn.to.way); + var viaNode = turn.via.node && graph.entity(turn.via.node); + var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); }); + var members = []; - function isClosingNode(way, nodeId) { - return nodeId === way.first() && nodeId === way.last(); + members.push({ id: fromWay.id, type: 'way', role: 'from' }); + + if (viaNode) { + members.push({ id: viaNode.id, type: 'node', role: 'via' }); + } else if (viaWays) { + viaWays.forEach(function(viaWay) { + members.push({ id: viaWay.id, type: 'way', role: 'via' }); + }); } - function split(toOrFrom) { - var newID = toOrFrom.newID || osmWay().id; - graph = actionSplit(via.id, [newID]) - .limitWays([toOrFrom.way])(graph); - - var a = graph.entity(newID), - b = graph.entity(toOrFrom.way); - - if (a.nodes.indexOf(toOrFrom.node) !== -1) { - return [a, b]; - } else { - return [b, a]; - } - } - - if (!from.affix(via.id) || isClosingNode(from, via.id)) { - if (turn.from.node === turn.to.node) { - // U-turn - from = to = split(turn.from)[0]; - } else if (turn.from.way === turn.to.way) { - // Straight-on or circular - var s = split(turn.from); - from = s[0]; - to = s[1]; - } else { - // Other - from = split(turn.from)[0]; - } - } - - if (!to.affix(via.id) || isClosingNode(to, via.id)) { - to = split(turn.to)[0]; - } + members.push({ id: toWay.id, type: 'way', role: 'to' }); return graph.replace(osmRelation({ id: restrictionId, @@ -84,15 +56,10 @@ export function actionRestrictTurn(turn, projection, restrictionId) { osmInferRestriction( graph, turn.from, - turn.via, turn.to, projection) }, - members: [ - {id: from.id, type: 'way', role: 'from'}, - {id: via.id, type: 'node', role: 'via'}, - {id: to.id, type: 'way', role: 'to'} - ] + members: members })); }; } diff --git a/modules/actions/split.js b/modules/actions/split.js index 1763274ac..982632484 100644 --- a/modules/actions/split.js +++ b/modules/actions/split.js @@ -53,7 +53,10 @@ export function actionSplit(nodeId, newWayIds) { } function dist(nA, nB) { - return geoSphericalDistance(graph.entity(nA).loc, graph.entity(nB).loc); + var locA = graph.entity(nA).loc; + var locB = graph.entity(nB).loc; + var epsilon = 1e-6; + return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon; } // calculate lengths diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 59e87e525..a9ca41f69 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -1,195 +1,556 @@ -import _each from 'lodash-es/each'; +import _clone from 'lodash-es/clone'; +import _every from 'lodash-es/every'; import _extend from 'lodash-es/extend'; -import _find from 'lodash-es/find'; -import _indexOf from 'lodash-es/indexOf'; -import _keys from 'lodash-es/keys'; -import _values from 'lodash-es/values'; +import _uniq from 'lodash-es/uniq'; -import { geoAngle } from '../geo/index'; -import { osmWay } from './way'; +import { + actionDeleteRelation, + actionReverse, + actionSplit +} from '../actions'; + +import { coreGraph } from '../core'; +import { geoAngle, geoSphericalDistance } from '../geo'; +import { osmEntity } from './entity'; export function osmTurn(turn) { - if (!(this instanceof osmTurn)) + if (!(this instanceof osmTurn)) { return new osmTurn(turn); + } _extend(this, turn); } -export function osmIntersection(graph, vertexId) { - var vertex = graph.entity(vertexId), - parentWays = graph.parentWays(vertex), - coincident = [], - highways = {}; +export function osmIntersection(graph, startVertexId) { + var vgraph = coreGraph(), // virtual graph + i, j, k; - function addHighway(way, adjacentNodeId) { - if (highways[adjacentNodeId]) { - coincident.push(adjacentNodeId); - } else { - highways[adjacentNodeId] = way; + + function memberOfRestriction(entity) { + return graph.parentRelations(entity) + .some(function(r) { return r.isRestriction(); }); + } + + function isRoad(way) { + if (way.isArea() || way.isDegenerate()) return false; + var roads = { + 'motorway': true, + 'motorway_link': true, + 'trunk': true, + 'trunk_link': true, + 'primary': true, + 'primary_link': true, + 'secondary': true, + 'secondary_link': true, + 'tertiary': true, + 'tertiary_link': true, + 'residential': true, + 'unclassified': true, + 'living_street': true, + 'service': true, + 'road': true, + 'track': true + }; + return roads[way.tags.highway]; + } + + + var distCutoff = 20; // meters + var checkVertices = [graph.entity(startVertexId)]; + var checkWays; + var vertices = []; + var vertexIds = []; + var vertex; + var ways = []; + var wayIds = []; + var way; + var nodes = []; + var node; + var parents = []; + var parent; + + // `actions` will store whatever actions must be performed to satisfy + // preconditions for adding a turn restriction to this intersection. + // - Remove any existing degenerate turn restrictions (missing from/to, etc) + // - Reverse oneways so that they are drawn in the forward direction + // - Split ways on key vertices + var actions = []; + + + // STEP 1: walk the graph outwards from starting vertex to search + // for more key vertices and ways to include in the intersection.. + + while (checkVertices.length) { + vertex = checkVertices.pop(); + + // check this vertex for parent ways that are roads + checkWays = graph.parentWays(vertex); + var hasWays = false; + for (i = 0; i < checkWays.length; i++) { + way = checkWays[i]; + if (!isRoad(way) && !memberOfRestriction(way)) continue; + + ways.push(way); // it's a road, or it's already in a turn restriction + hasWays = true; + + // check the way's children for more key vertices + nodes = _uniq(graph.childNodes(way)); + for (j = 0; j < nodes.length; j++) { + node = nodes[j]; + if (node === vertex) continue; // same thing + if (vertices.indexOf(node) !== -1) continue; // seen it already + if (node.loc && vertex.loc && geoSphericalDistance(node.loc, vertex.loc) > distCutoff) continue; // too far + + // a key vertex will have parents that are also roads + var hasParents = false; + parents = graph.parentWays(node); + for (k = 0; k < parents.length; k++) { + parent = parents[k]; + if (parent === way) continue; // same thing + if (ways.indexOf(parent) !== -1) continue; // seen it already + if (!isRoad(parent)) continue; // not a road + hasParents = true; + break; + } + + if (hasParents) { + checkVertices.push(node); + } + } + } + + if (hasWays) { + vertices.push(vertex); } } - // Pre-split ways that would need to be split in - // order to add a restriction. The real split will - // happen when the restriction is added. - parentWays.forEach(function(way) { - if (!way.tags.highway || way.isArea() || way.isDegenerate()) - return; - - var isFirst = (vertexId === way.first()), - isLast = (vertexId === way.last()), - isAffix = (isFirst || isLast), - isClosingNode = (isFirst && isLast); - - if (isAffix && !isClosingNode) { - var index = (isFirst ? 1 : way.nodes.length - 2); - addHighway(way, way.nodes[index]); - - } else { - var splitIndex, wayA, wayB, indexA, indexB; - if (isClosingNode) { - splitIndex = Math.ceil(way.nodes.length / 2); // split at midpoint - wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)}); - wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)}); - indexA = 1; - indexB = way.nodes.length - 2; - } else { - splitIndex = _indexOf(way.nodes, vertex.id, 1); // split at vertexid - wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)}); - wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)}); - indexA = splitIndex - 1; - indexB = splitIndex + 1; - } - graph = graph.replace(wayA).replace(wayB); - addHighway(wayA, way.nodes[indexA]); - addHighway(wayB, way.nodes[indexB]); - } - }); - - // remove any ways from this intersection that are coincident - // (i.e. any adjacent node used by more than one intersecting way) - coincident.forEach(function (n) { - delete highways[n]; - }); + vertices = _uniq(vertices); + ways = _uniq(ways); - var intersection = { - highways: highways, - ways: _values(highways), - graph: graph - }; - - - intersection.adjacentNodeId = function(fromWayId) { - return _find(_keys(highways), function(k) { - return highways[k].id === fromWayId; + // STEP 2: Build a virtual graph containing only the entities in the intersection.. + // Everything done after this step should act on the virtual graph + // Any actions that must be performed later to the main graph go in `actions` array + ways.forEach(function(way) { + graph.childNodes(way).forEach(function(node) { + vgraph = vgraph.replace(node); }); - }; + vgraph = vgraph.replace(way); - intersection.turns = function(fromNodeId) { - var start = highways[fromNodeId]; - if (!start) - return []; - - if (start.first() === vertex.id && start.tags.oneway === 'yes') - return []; - if (start.last() === vertex.id && start.tags.oneway === '-1') - return []; - - function withRestriction(turn) { - graph.parentRelations(graph.entity(turn.from.way)).forEach(function(relation) { - if (relation.tags.type !== 'restriction') - return; - - var f = relation.memberByRole('from'), - t = relation.memberByRole('to'), - v = relation.memberByRole('via'); - - if (f && f.id === turn.from.way && - v && v.id === turn.via.node && - t && t.id === turn.to.way) { - turn.restriction = relation.id; - } else if (/^only_/.test(relation.tags.restriction) && - f && f.id === turn.from.way && - v && v.id === turn.via.node && - t && t.id !== turn.to.way) { - turn.restriction = relation.id; - turn.indirect_restriction = true; + graph.parentRelations(way).forEach(function(relation) { + if (relation.isRestriction()) { + if (relation.isValidRestriction(graph)) { + vgraph = vgraph.replace(relation); + } else if (relation.isComplete(graph)) { + actions.push(actionDeleteRelation(relation.id)); } - }); - - return osmTurn(turn); - } - - - var from = { - node: fromNodeId, - way: start.id.split(/-(a|b)/)[0] - }, - via = { node: vertex.id }, - turns = []; - - _each(highways, function(end, adjacentNodeId) { - if (end === start) - return; - - // backward - if (end.first() !== vertex.id && end.tags.oneway !== 'yes') { - turns.push(withRestriction({ - from: from, - via: via, - to: { - node: adjacentNodeId, - way: end.id.split(/-(a|b)/)[0] - } - })); } - - // forward - if (end.last() !== vertex.id && end.tags.oneway !== '-1') { - turns.push(withRestriction({ - from: from, - via: via, - to: { - node: adjacentNodeId, - way: end.id.split(/-(a|b)/)[0] - } - })); - } - }); + }); + + + // STEP 3: Force all oneways to be drawn in the forward direction + ways.forEach(function(w) { + var way = vgraph.entity(w.id); + if (way.tags.oneway === '-1') { + var action = actionReverse(way.id, { reverseOneway: true }); + actions.push(action); + vgraph = action(vgraph); + } + }); + + + // STEP 4: Split ways on key vertices + var origCount = osmEntity.id.next.way; + vertices.forEach(function(v) { + // This is an odd way to do it, but we need to find all the ways that + // will be split here, then split them one at a time to ensure that these + // actions can be replayed on the main graph exactly in the same order. + // (It is unintuitive, but the order of ways returned from graph.parentWays() + // is arbitrary, depending on how the main graph and vgraph were built) + var splitAll = actionSplit(v.id); + if (!splitAll.disabled(vgraph)) { + splitAll.ways(vgraph).forEach(function(way) { + var splitOne = actionSplit(v.id).limitWays([way.id]); + actions.push(splitOne); + vgraph = splitOne(vgraph); + }); + } + }); + + // In here is where we should also split the intersection at nearby junction. + // for https://github.com/mapbox/iD-internal/issues/31 + // nearbyVertices.forEach(function(v) { + // }); + + // Reasons why we reset the way id count here: + // 1. Continuity with way ids created by the splits so that we can replay + // these actions later if the user decides to create a turn restriction + // 2. Avoids churning way ids just by hovering over a vertex + // and displaying the turn restriction editor + osmEntity.id.next.way = origCount; + + + // STEP 5: Update arrays to point to vgraph entities + vertexIds = vertices.map(function(v) { return v.id; }); + vertices = []; + ways = []; + + vertexIds.forEach(function(id) { + var vertex = vgraph.entity(id); + var parents = vgraph.parentWays(vertex); + + vertices.push(vertex); + ways = ways.concat(parents); + }); + + vertices = _uniq(vertices); + ways = _uniq(ways); + + vertexIds = vertices.map(function(v) { return v.id; }); + wayIds = ways.map(function(w) { return w.id; }); + + + // STEP 6: Update the ways with some metadata that will be useful for + // walking the intersection graph later and rendering turn arrows. + + function withMetadata(way, vertexIds) { + var __oneWay = way.isOneWay(); + + // which affixes are key vertices? + var __first = (vertexIds.indexOf(way.first()) !== -1); + var __last = (vertexIds.indexOf(way.last()) !== -1); + + // what roles is this way eligible for? + var __via = (__first && __last); + var __from = ((__first && !__oneWay) || __last); + var __to = (__first || (__last && !__oneWay)); + + return way.update({ + __first: __first, + __last: __last, + __from: __from, + __via: __via, + __to: __to, + __oneWay: __oneWay + }); + } + + ways = []; + wayIds.forEach(function(id) { + var way = withMetadata(vgraph.entity(id), vertexIds); + vgraph = vgraph.replace(way); + ways.push(way); + }); + + + // STEP 7: Simplify - This is an iterative process where we: + // 1. Find trivial vertices with only 2 parents + // 2. trim off the leaf way from those vertices and remove from vgraph + + var keepGoing; + var removeWayIds = []; + var removeVertexIds = []; + + do { + keepGoing = false; + checkVertices = vertexIds.slice(); + + for (i = 0; i < checkVertices.length; i++) { + var vertexId = checkVertices[i]; + vertex = vgraph.hasEntity(vertexId); + + if (!vertex) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + removeVertexIds.push(vertexId); + continue; + } + + parents = vgraph.parentWays(vertex); + if (parents.length < 3) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } + + if (parents.length === 2) { // vertex with 2 parents is trivial + var a = parents[0]; + var b = parents[1]; + var aIsLeaf = a && !a.__via; + var bIsLeaf = b && !b.__via; + var leaf, survivor; + + if (aIsLeaf && !bIsLeaf) { + leaf = a; + survivor = b; + } else if (!aIsLeaf && bIsLeaf) { + leaf = b; + survivor = a; + } + + if (leaf && survivor) { + survivor = withMetadata(survivor, vertexIds); // update survivor way + vgraph = vgraph.replace(survivor).remove(leaf); // update graph + removeWayIds.push(leaf.id); + keepGoing = true; + } + } + + parents = vgraph.parentWays(vertex); + + if (parents.length < 2) { // vertex is no longer a key vertex + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + removeVertexIds.push(vertexId); + keepGoing = true; + } + + if (parents.length < 1) { // vertex is no longer attached to anything + vgraph = vgraph.remove(vertex); + } + + } + } while (keepGoing); + + + vertices = vertices + .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; }) + .map(function(vertex) { return vgraph.entity(vertex.id); }); + ways = ways + .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; }) + .map(function(way) { return vgraph.entity(way.id); }); + + + // OK! Here is our intersection.. + var intersection = { + graph: vgraph, + actions: actions, + vertices: vertices, + ways: ways, + }; + + + + // Get all the valid turns through this intersection given a starting way id. + // This operates on the virtual graph for everything. + // + // Basically, walk through all possible paths from starting way, + // honoring the existing turn restrictions as we go (watch out for loops!) + // + // For each path found, generate and return a `osmTurn` datastructure. + // + intersection.turns = function(fromWayId) { + if (!fromWayId) return []; + + var vgraph = intersection.graph; + var keyVertexIds = intersection.vertices.map(function(v) { return v.id; }); + var keyWayIds = intersection.ways.map(function(w) { return w.id; }); + + var start = vgraph.entity(fromWayId); + if (!start || !(start.__from || start.__via)) return []; + + var maxPathLength = 7; // from-*-via-*-via-*-to (2 vias max) + var maxStepDist = 20; // meters + var turns = []; + + step(start); + return turns; + + + // traverse the intersection graph and find all the valid paths + function step(entity, currPath, currRestrictions, matchedRestriction) { + currPath = _clone(currPath || []); + if (currPath.length >= maxPathLength) return; + currPath.push(entity.id); + currRestrictions = _clone(currRestrictions || []); + + if (entity.type === 'node') { + var parents = vgraph.parentWays(entity); + var nextWays = []; + + // which ways can we step into? + for (var i = 0; i < parents.length; i++) { + var way = parents[i]; + + // if next way is a oneway incoming to this vertex, skip + if (way.__oneWay && way.nodes[0] !== entity.id) continue; + + // if we have seen it before (allowing for an initial u-turn), skip + if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue; + + // Check all "current" restrictions (where we've already walked the `from`) + var restrict = undefined; + for (var j = 0; j < currRestrictions.length; j++) { + var restriction = currRestrictions[j]; + var v = restriction.membersByRole('via'); + var t = restriction.memberByRole('to'); + var isOnly = /^only_/.test(restriction.tags.restriction); + + // Are all the vias part of this local intersection? + // This matters for flagging "indirect" restrictions + var isLocalVia; + if (v.length === 1 && v[0].type === 'node') { + isLocalVia = (keyVertexIds.indexOf(v[0].id) !== -1); + } else { + isLocalVia = _every(v, function(via) { return keyWayIds.indexOf(via.id) !== -1; }); + } + + // Does this path match the turn restriction? + var isMatch = false; + if ( // match via node, to way + v.length === 1 && + v[0].type === 'node' && + v[0].id === entity.id && + t.id === way.id + ) { + isMatch = true; + } else if ( // match via ways, to way + _every(v, function(via) { return currPath.indexOf(via.id) !== -1; }) && + t.id === way.id + ) { + isMatch = true; + } + + if (isMatch && isOnly) { + restrict = { id: restriction.id, only: true }; + break; + } else if (isMatch && !isOnly) { + restrict = { id: restriction.id, direct: true }; + break; + } else if (!isMatch && isOnly && isLocalVia) { + restrict = { id: restriction.id, indirect: true }; + // no break - keep looking for a "better" direct or only + } + } + + nextWays.push({ way: way, restrict: restrict }); + } + + nextWays.forEach(function(nextWay) { + step(nextWay.way, currPath, currRestrictions, nextWay.restrict); + }); + + + } else { // entity.type === 'way' + if (currPath.length >= 3) { // this is a "complete" path.. + var turn = pathToTurn(currPath); + if (turn) { + if (matchedRestriction) { + turn.restriction = matchedRestriction.id; + turn.only = matchedRestriction.only; + turn.direct = matchedRestriction.direct; + turn.indirect = matchedRestriction.indirect; + } + turns.push(osmTurn(turn)); + } + + if (currPath[0] === currPath[2]) return; // we made a u-turn - stop here + } + + if (matchedRestriction) return; // don't advance any further + + // which nodes can we step into? + var n1 = vgraph.entity(entity.first()), + n2 = vgraph.entity(entity.last()), + dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc), + nextNodes = []; + + if (currPath.length > 1) { + if (dist > maxStepDist) return; // the next node is too far + if (!entity.__via) return; // this way is a leaf / can't be a via + } + + if (!entity.__oneWay && // bidirectional.. + keyVertexIds.indexOf(n1.id) !== -1 && // key vertex.. + currPath.indexOf(n1.id) === -1) { // haven't seen it yet.. + nextNodes.push(n1); // can advance to first node + } + if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex.. + currPath.indexOf(n2.id) === -1) { // haven't seen it yet.. + nextNodes.push(n2); // can advance to last node + } + + // gather restrictions FROM this way + var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) { + if (!r.isRestriction()) return false; + var f = r.memberByRole('from'); + return f && f.id === entity.id; + }); + + nextNodes.forEach(function(node) { + step(node, currPath, currRestrictions.concat(fromRestrictions), false); + }); + } + } + + + // assumes path is alternating way-node-way of odd length + function pathToTurn(path) { + if (path.length < 3) return; + var fromWayId, fromNodeId, fromVertexId; + var toWayId, toNodeId, toVertexId; + var viaWayIds, viaNodeId, isUturn; + + fromWayId = path[0]; + toWayId = path[path.length - 1]; + + if (path.length === 3 && fromWayId === toWayId) { // u turn + var way = vgraph.entity(fromWayId); + if (way.__oneWay) return null; + + isUturn = true; + viaNodeId = fromVertexId = toVertexId = path[1]; + fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId); + + } else { + isUturn = false; + fromVertexId = path[1]; + fromNodeId = adjacentNode(fromWayId, fromVertexId); + toVertexId = path[path.length - 2]; + toNodeId = adjacentNode(toWayId, toVertexId); + + if (path.length === 3) { + viaNodeId = path[1]; + } else { + viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; }); + viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last + } + } + + return { + key: path.join(','), + path: path, + from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId }, + via: { node: viaNodeId, ways: viaWayIds }, + to: { node: toNodeId, way: toWayId, vertex: toVertexId }, + u: isUturn + }; + + + function adjacentNode(wayId, affixId) { + var nodes = vgraph.entity(wayId).nodes; + return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2]; + } - // U-turn - if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') { - turns.push(withRestriction({ - from: from, - via: via, - to: from, - u: true - })); } - return turns; }; return intersection; } -export function osmInferRestriction(graph, from, via, to, projection) { - var fromWay = graph.entity(from.way), - fromNode = graph.entity(from.node), - toWay = graph.entity(to.way), - toNode = graph.entity(to.node), - viaNode = graph.entity(via.node), - fromOneWay = (fromWay.tags.oneway === 'yes' && fromWay.last() === via.node) || - (fromWay.tags.oneway === '-1' && fromWay.first() === via.node), - toOneWay = (toWay.tags.oneway === 'yes' && toWay.first() === via.node) || - (toWay.tags.oneway === '-1' && toWay.last() === via.node), - angle = geoAngle(viaNode, fromNode, projection) - - geoAngle(viaNode, toNode, projection); +export function osmInferRestriction(graph, from, to, projection) { + var fromWay = graph.entity(from.way); + var fromNode = graph.entity(from.node); + var fromVertex = graph.entity(from.vertex); + var toWay = graph.entity(to.way); + var toNode = graph.entity(to.node); + var toVertex = graph.entity(to.vertex); + + var fromOneWay = (fromWay.tags.oneway === 'yes'); + var toOneWay = (toWay.tags.oneway === 'yes'); + var angle = geoAngle(fromVertex, fromNode, projection) - + geoAngle(toVertex, toNode, projection); angle = angle * 180 / Math.PI; diff --git a/modules/osm/relation.js b/modules/osm/relation.js index b44dbd420..8532990ed 100644 --- a/modules/osm/relation.js +++ b/modules/osm/relation.js @@ -109,6 +109,16 @@ _extend(osmRelation.prototype, { } }, + // Same as memberByRole, but returns all members with the given role + membersByRole: function(role) { + var result = []; + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].role === role) { + result.push(_extend({}, this.members[i], {index: i})); + } + } + return result; + }, // Return the first member with the given id. A copy of the member object // is returned, extended with an 'index' property whose value is the member index. @@ -253,6 +263,26 @@ _extend(osmRelation.prototype, { }, + isValidRestriction: function() { + if (!this.isRestriction()) return false; + + var froms = this.members.filter(function(m) { return m.role === 'from'; }); + var vias = this.members.filter(function(m) { return m.role === 'via'; }); + var tos = this.members.filter(function(m) { return m.role === 'to'; }); + + if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false; + if (froms.some(function(m) { return m.type !== 'way'; })) return false; + + if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false; + if (tos.some(function(m) { return m.type !== 'way'; })) return false; + + if (vias.length === 0) return false; + if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false; + + return true; + }, + + // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm], // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings. // @@ -264,8 +294,8 @@ _extend(osmRelation.prototype, { // rings not matched with the intended outer ring. // multipolygon: function(resolver) { - var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }), - inners = this.members.filter(function(m) { return 'inner' === m.role; }); + var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }); + var inners = this.members.filter(function(m) { return 'inner' === m.role; }); outers = osmJoinWays(outers, resolver); inners = osmJoinWays(inners, resolver); diff --git a/modules/svg/turns.js b/modules/svg/turns.js index cd16bd0dd..77c413563 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -1,26 +1,28 @@ -import { geoAngle } from '../geo'; +import { geoAngle } from '../geo/index'; export function svgTurns(projection) { return function drawTurns(selection, graph, turns) { - function key(turn) { - return [turn.from.node + turn.via.node + turn.to.node].join('-'); - } - function icon(turn) { var u = turn.u ? '-u' : ''; - if (!turn.restriction) - return '#turn-yes' + u; - var restriction = graph.entity(turn.restriction).tags.restriction; - return '#turn-' + - (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u; + if (turn.direct || turn.indirect) return '#turn-no' + u; + if (turn.only) return '#turn-only' + u; + return '#turn-yes' + u; } - var layer = selection.selectAll('.layer-points .layer-points-turns'); + var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns') + .data([0]); + + layer = layer.enter() + .append('g') + .attr('class', 'layer-osm layer-turns') + .merge(layer); + + var groups = layer.selectAll('g.turn') - .data(turns, key); + .data(turns, function(d) { return d.key; }); groups.exit() .remove(); @@ -61,11 +63,11 @@ export function svgTurns(projection) { groups .attr('transform', function (turn) { - var v = graph.entity(turn.via.node), - t = graph.entity(turn.to.node), - a = geoAngle(v, t, projection), - p = projection(v.loc), - r = turn.u ? 0 : 60; + var t = graph.entity(turn.to.node); + var v = graph.entity(turn.to.vertex); + var a = geoAngle(v, t, projection); + var p = projection(v.loc); + var r = turn.u ? 0 : 60; return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index dde654d45..e9aa6930f 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -6,44 +6,14 @@ import { } from 'd3-selection'; import { t } from '../../util/locale'; - -import { - behaviorBreathe, - behaviorHover -} from '../../behavior'; - -import { - osmEntity, - osmIntersection, - osmInferRestriction, - osmTurn -} from '../../osm'; - -import { - actionRestrictTurn, - actionUnrestrictTurn -} from '../../actions'; - -import { - geoExtent, - geoRawMercator, - geoZoomToScale -} from '../../geo'; - -import { - svgLayers, - svgLines, - svgTurns, - svgVertices -} from '../../svg'; - +import { actionRestrictTurn, actionUnrestrictTurn } from '../../actions'; +import { behaviorBreathe, behaviorHover } from '../../behavior'; +import { geoExtent, geoRawMercator } from '../../geo'; +import { osmIntersection, osmInferRestriction, osmTurn, osmWay } from '../../osm'; +import { svgLabels, svgLayers, svgLines, svgTurns, svgVertices } from '../../svg'; import { utilRebind } from '../../util/rebind'; import { utilFunctor } from '../../util'; - -import { - utilGetDimensions, - utilSetDimensions -} from '../../util/dimensions'; +import { utilGetDimensions, utilSetDimensions } from '../../util/dimensions'; export function uiFieldRestrictions(field, context) { @@ -51,19 +21,31 @@ export function uiFieldRestrictions(field, context) { var breathe = behaviorBreathe(context); var hover = behaviorHover(context); var initialized = false; + var graph; var vertexID; - var fromNodeID; + var fromWayID; - function restrictions(selection) { + function restrictions(selection, intersection) { // if form field is hidden or has detached from dom, clean up. - if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) { + if (!d3_select('.inspector-wrap.inspector-hidden').empty() || + !selection.node().parentNode || !selection.node().parentNode.parentNode) { selection.call(restrictions.off); return; } + // try to reuse the intersection, but always rebuild it if the graph has changed + if (context.graph() !== graph || !intersection) { + graph = context.graph(); + intersection = osmIntersection(graph, vertexID); + } + var ok = (intersection.vertices.length && intersection.ways.length); + var wrap = selection.selectAll('.preset-input-wrap') - .data([0]); + .data(ok ? [0] : []); + + wrap.exit() + .remove(); var enter = wrap.enter() .append('div') @@ -73,31 +55,35 @@ export function uiFieldRestrictions(field, context) { .append('div') .attr('class', 'restriction-help'); + // hack: no actual intersection exists here, just dont show the field + if (!ok) return; - var intersection = osmIntersection(context.graph(), vertexID); - var graph = intersection.graph; - var vertex = graph.entity(vertexID); + var vgraph = intersection.graph; var filter = utilFunctor(true); + var extent = geoExtent(); var projection = geoRawMercator(); var d = utilGetDimensions(wrap.merge(enter)); var c = [d[0] / 2, d[1] / 2]; - var z = 24; + var z = intersection.vertices.length === 1 ? 22 : 20; projection - .scale(geoZoomToScale(z)); + .scale(256 * Math.pow(2, z) / (2 * Math.PI)); - var s = projection(vertex.loc); + // fit extent to include all key vertices + for (var i = 0; i < intersection.vertices.length; i++) { + extent._extend(intersection.vertices[i].extent()); + } + var s = projection(extent.center()); projection .translate([c[0] - s[0], c[1] - s[1]]) .clipExtent([[0, 0], d]); - var extent = geoExtent(projection.invert([0, d[1]]), projection.invert([d[0], 0])); - var drawLayers = svgLayers(projection, context).only('osm').dimensions(d); var drawVertices = svgVertices(projection, context); var drawLines = svgLines(projection, context); + // var drawLabels = svgLabels(projection, context, true); var drawTurns = svgTurns(projection, context); enter @@ -117,9 +103,10 @@ export function uiFieldRestrictions(field, context) { surface .call(utilSetDimensions, d) - .call(drawVertices, graph, [vertex], filter, extent, true) - .call(drawLines, graph, intersection.ways, filter) - .call(drawTurns, graph, intersection.turns(fromNodeID)); + .call(drawVertices, vgraph, intersection.vertices, filter, extent, z) + .call(drawLines, vgraph, intersection.ways, filter) + // .call(drawLabels, vgraph, intersection.ways, filter, d, true) + .call(drawTurns, vgraph, intersection.turns(fromWayID)); surface .on('click.restrictions', click) @@ -130,9 +117,9 @@ export function uiFieldRestrictions(field, context) { .selectAll('.selected') .classed('selected', false); - if (fromNodeID) { + if (fromWayID) { surface - .selectAll('.' + intersection.highways[fromNodeID].id) + .selectAll('.' + fromWayID) .classed('selected', true); } @@ -155,69 +142,111 @@ export function uiFieldRestrictions(field, context) { var datum = d3_event.target.__data__; var entity = datum && datum.properties && datum.properties.entity; - if (entity) datum = entity; + if (entity) { + datum = entity; + } - if (datum instanceof osmEntity) { - fromNodeID = intersection.adjacentNodeId(datum.id); + if (datum instanceof osmWay && (datum.__from || datum.__via)) { + fromWayID = datum.id; render(); } else if (datum instanceof osmTurn) { + var actions; if (datum.restriction) { - context.perform( + actions = intersection.actions.concat([ actionUnrestrictTurn(datum, projection), t('operations.restriction.annotation.delete') - ); + ]); } else { - context.perform( + actions = intersection.actions.concat([ actionRestrictTurn(datum, projection), t('operations.restriction.annotation.create') - ); + ]); } + context.perform.apply(context, actions); + + } else { + fromWayID = null; + render(); } } function mouseover() { var datum = d3_event.target.__data__; - if (datum instanceof osmTurn) { - var graph = context.graph(); - var presets = context.presets(); - var preset; + var entity = datum && datum.properties && datum.properties.entity; + if (entity) { + datum = entity; + } + if (datum instanceof osmWay) { + wrap.selectAll('.restriction-help') + .text(datum.id); + + } else if (datum instanceof osmTurn) { + + //DEBUG + var str = ''; if (datum.restriction) { - preset = presets.match(graph.entity(datum.restriction), graph); - } else { - preset = presets.item('type/restriction/' + - osmInferRestriction( - graph, - datum.from, - datum.via, - datum.to, - projection - ) - ); + if (datum.only) { str += 'ONLY_ '; } + if (datum.direct) { str += 'NO_ '; } + if (datum.indirect) { str += 'indirect '; } + str += datum.restriction; } + str += ' FROM ' + datum.from.way + + ' VIA ' + (datum.via.node || datum.via.ways.join(',')) + + ' TO ' + datum.to.way; + wrap.selectAll('.restriction-help') - .text(t('operations.restriction.help.' + - (datum.restriction ? 'toggle_off' : 'toggle_on'), - { restriction: preset.name() }) - ); + .text(str); + +// return; + // var presets = context.presets(), + // preset; + + // if (datum.restriction) { + // preset = presets.match(vgraph.entity(datum.restriction), vgraph); + // } else { + // preset = presets.item('type/restriction/' + + // osmInferRestriction( + // vgraph, + // datum.from, + // datum.to, + // projection + // ) + // ); + // } + + // wrap.selectAll('.restriction-help') + // .text(t('operations.restriction.help.' + + // (datum.restriction ? 'toggle_off' : 'toggle_on'), + // { restriction: preset.name() }) + // ); } } function mouseout() { - wrap.selectAll('.restriction-help') - .text(t('operations.restriction.help.' + - (fromNodeID ? 'toggle' : 'select')) - ); + + if (fromWayID) { + wrap.selectAll('.restriction-help') + .text('FROM ' + fromWayID); + } else { + wrap.selectAll('.restriction-help') + .text('Click to select the FROM way'); + } + + // wrap.selectAll('.restriction-help') + // .text(t('operations.restriction.help.' + + // (fromWayID ? 'toggle' : 'select')) + // ); } function render() { if (context.hasEntity(vertexID)) { - restrictions(selection); + restrictions(selection, intersection); } } } @@ -225,7 +254,7 @@ export function uiFieldRestrictions(field, context) { restrictions.entity = function(_) { if (!vertexID || vertexID !== _.id) { - fromNodeID = null; + fromWayID = null; vertexID = _.id; } }; diff --git a/modules/ui/init.js b/modules/ui/init.js index adeb376fb..3ceebb45c 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -68,7 +68,7 @@ export function uiInit(context) { container .append('div') .attr('id', 'sidebar') - .attr('class', 'col4') + .attr('class', 'col5') .call(ui.sidebar); var content = container @@ -94,7 +94,7 @@ export function uiInit(context) { bar .append('div') - .attr('class', 'spacer col4'); + .attr('class', 'spacer col5'); var limiter = bar.append('div') .attr('class', 'limiter'); diff --git a/test/spec/actions/restrict_turn.js b/test/spec/actions/restrict_turn.js index b5f685d96..96de8be59 100644 --- a/test/spec/actions/restrict_turn.js +++ b/test/spec/actions/restrict_turn.js @@ -1,483 +1,288 @@ describe('iD.actionRestrictTurn', function() { var projection = d3.geoMercator().scale(250 / Math.PI); - it('adds a restriction to an unrestricted turn', function() { - // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*']}), - iD.Way({id: '-', nodes: ['*', 'w']}) - ]), - action = iD.actionRestrictTurn({ + describe('via node', function() { + + it('adds a via node restriction to an unrestricted turn', function() { + // u====*--->w + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*']}), + iD.osmWay({id: '-', nodes: ['*', 'w']}) + ]); + var action = iD.actionRestrictTurn({ from: {node: 'u', way: '='}, via: {node: '*'}, to: {node: 'w', way: '-'}, restriction: 'no_right_turn' }, projection, 'r'); - graph = action(graph); + graph = action(graph); - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); - expect(r.memberByRole('from').id).to.eql('='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('-'); - expect(r.memberByRole('to').type).to.eql('way'); - }); + var r = graph.entity('r'); + expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); - it('splits the from way when necessary (forward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ + var f = r.memberByRole('from'); + expect(f.id).to.eql('='); + expect(f.type).to.eql('way'); + + var v = r.memberByRole('via'); + expect(v.id).to.eql('*'); + expect(v.type).to.eql('node'); + + var t = r.memberByRole('to'); + expect(t.id).to.eql('-'); + expect(t.type).to.eql('way'); + }); + +//TODO? + it.skip('infers the restriction type based on the turn angle', function() { + // u====*~~~~w + // | + // x + var graph = iD.coreGraph([ + iD.osmNode({id: 'u', loc: [-1, 0]}), + iD.osmNode({id: '*', loc: [ 0, 0]}), + iD.osmNode({id: 'w', loc: [ 1, 0]}), + iD.osmNode({id: 'x', loc: [ 0, -1]}), + iD.osmWay({id: '=', nodes: ['u', '*']}), + iD.osmWay({id: '-', nodes: ['*', 'x']}), + iD.osmWay({id: '~', nodes: ['*', 'w']}) + ]); + + var r1 = iD.actionRestrictTurn({ from: {node: 'u', way: '='}, via: {node: '*'}, - to: {node: 'x', way: '-'}, - restriction: 'no_right_turn' - }, projection, 'r'); + to: {node: 'x', way: '-'} + }, projection, 'r')(graph); + expect(r1.entity('r').tags.restriction).to.equal('no_right_turn'); - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); - expect(r.memberByRole('from').id).to.eql('='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('-'); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from way when necessary (backward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'w', way: '=', newID: '=='}, - via: {node: '*'}, - to: {node: 'x', way: '-'}, - restriction: 'no_left_turn' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_left_turn'}); - expect(r.memberByRole('from').id).to.eql('=='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('-'); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from way when necessary (straight on forward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'u', way: '=', newID: '=='}, - via: {node: '*'}, - to: {node: 'w', way: '='}, - restriction: 'no_straight_on' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_straight_on'}); - expect(r.memberByRole('from').id).to.eql('='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('=='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from way when necessary (straight on backward)', function() { - // u<===*====w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['w', '*', 'u']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'u', way: '=', newID: '=='}, - via: {node: '*'}, - to: {node: 'w', way: '='}, - restriction: 'no_straight_on' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_straight_on'}); - expect(r.memberByRole('from').id).to.eql('=='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from way when necessary (vertex closes from)', function() { - // - // b -- c - // | | - // a -- * === w - // - var graph = iD.Graph([ - iD.Node({id: 'a', loc: [-1, 0]}), - iD.Node({id: 'b', loc: [-1, 1]}), - iD.Node({id: 'c', loc: [ 0, 1]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'w', loc: [ 1, 0]}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*']}), - iD.Way({id: '=', nodes: ['*', 'w']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'c', way: '-', newID: '--'}, - via: {node: '*'}, - to: {node: 'w', way: '='}, - restriction: 'no_left_turn' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_left_turn'}); - expect(r.memberByRole('from').id).to.eql('--'); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from/to way when necessary (vertex closes from/to)', function() { - // - // b -- c - // | | - // a -- * === w - // - var graph = iD.Graph([ - iD.Node({id: 'a', loc: [-1, 0]}), - iD.Node({id: 'b', loc: [-1, 1]}), - iD.Node({id: 'c', loc: [ 0, 1]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'w', loc: [ 1, 0]}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*']}), - iD.Way({id: '=', nodes: ['*', 'w']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'a', way: '-', newID: '--'}, - via: {node: '*'}, - to: {node: 'c', way: '-'}, - restriction: 'no_left_turn' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_left_turn'}); - expect(r.memberByRole('from').id).to.eql('-'); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('--'); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the to way when necessary (forward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ + var r2 = iD.actionRestrictTurn({ from: {node: 'x', way: '-'}, via: {node: '*'}, - to: {node: 'w', way: '=', newID: '=='}, - restriction: 'no_right_turn' - }, projection, 'r'); + to: {node: 'w', way: '~'} + }, projection, 'r')(graph); + expect(r2.entity('r').tags.restriction).to.equal('no_right_turn'); - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); - expect(r.memberByRole('from').id).to.eql('-'); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('=='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the to way when necessary (backward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ + var l1 = iD.actionRestrictTurn({ from: {node: 'x', way: '-'}, via: {node: '*'}, - to: {node: 'u', way: '='}, - restriction: 'no_left_turn' - }, projection, 'r'); + to: {node: 'u', way: '='} + }, projection, 'r')(graph); + expect(l1.entity('r').tags.restriction).to.equal('no_left_turn'); - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_left_turn'}); - expect(r.memberByRole('from').id).to.eql('-'); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the to way when necessary (vertex closes to)', function() { - // - // b -- c - // | | - // a -- * === w - // - var graph = iD.Graph([ - iD.Node({id: 'a', loc: [-1, 0]}), - iD.Node({id: 'b', loc: [-1, 1]}), - iD.Node({id: 'c', loc: [ 0, 1]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'w', loc: [ 1, 0]}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*']}), - iD.Way({id: '=', nodes: ['*', 'w']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'w', way: '='}, + var l2 = iD.actionRestrictTurn({ + from: {node: 'w', way: '~'}, via: {node: '*'}, - to: {node: 'c', way: '-', newID: '--'}, - restriction: 'no_right_turn' - }, projection, 'r'); + to: {node: 'x', way: '-'} + }, projection, 'r')(graph); + expect(l2.entity('r').tags.restriction).to.equal('no_left_turn'); - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); - expect(r.memberByRole('from').id).to.eql('='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('--'); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('splits the from/to way of a U-turn (forward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ + var s = iD.actionRestrictTurn({ from: {node: 'u', way: '='}, via: {node: '*'}, - to: {node: 'u', way: '='}, + to: {node: 'w', way: '~'} + }, projection, 'r')(graph); + expect(s.entity('r').tags.restriction).to.equal('no_straight_on'); + + var u = iD.actionRestrictTurn({ + from: {node: 'u', way: '='}, + via: {node: '*'}, + to: {node: 'u', way: '='} + }, projection, 'r')(graph); + expect(u.entity('r').tags.restriction).to.equal('no_u_turn'); + }); + +//TODO? + it.skip('infers no_u_turn from acute angle made by forward oneways', function() { + // * + // / \ + // w2/ \w1 + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({id: 'u', loc: [-1, -20]}), + iD.osmNode({id: '*', loc: [ 0, 0]}), + iD.osmNode({id: 'x', loc: [ 1, -20]}), + iD.osmWay({id: 'w1', nodes: ['x', '*'], tags: {oneway: 'yes'}}), + iD.osmWay({id: 'w2', nodes: ['*', 'u'], tags: {oneway: 'yes'}}) + ]); + + var r = iD.actionRestrictTurn({ + from: {node: 'x', way: 'w1'}, + via: {node: '*'}, + to: {node: 'u', way: 'w2'} + }, projection, 'r')(graph); + expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); + }); + +//TODO? + it.skip('infers no_u_turn from acute angle made by reverse oneways', function() { + // * + // / \ + // w2/ \w1 + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({id: 'u', loc: [-1, -20]}), + iD.osmNode({id: '*', loc: [ 0, 0]}), + iD.osmNode({id: 'x', loc: [ 1, -20]}), + iD.osmWay({id: 'w1', nodes: ['*', 'x'], tags: {oneway: '-1'}}), + iD.osmWay({id: 'w2', nodes: ['u', '*'], tags: {oneway: '-1'}}) + ]); + + var r = iD.actionRestrictTurn({ + from: {node: 'x', way: 'w1'}, + via: {node: '*'}, + to: {node: 'u', way: 'w2'} + }, projection, 'r')(graph); + expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); + }); + }); + + + describe('via way', function() { + + it('adds a via way restriction to an unrestricted turn', function() { + // u ==== VIA ---> w + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: 'V1'}), + iD.osmNode({id: 'V2'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', 'V1']}), + iD.osmWay({id: 'VIA', nodes: ['V1', 'V2']}), + iD.osmWay({id: '-', nodes: ['V2', 'w']}) + ]); + var action = iD.actionRestrictTurn({ + from: {node: 'u', way: '='}, + via: {ways: ['VIA']}, + to: {node: 'w', way: '-'}, restriction: 'no_u_turn' }, projection, 'r'); - graph = action(graph); + graph = action(graph); - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_u_turn'}); - expect(r.memberByRole('from').id).to.eql('='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('='); - expect(r.memberByRole('to').type).to.eql('way'); + var r = graph.entity('r'); + expect(r.tags).to.eql({type: 'restriction', restriction: 'no_u_turn'}); + + var f = r.memberByRole('from'); + expect(f.id).to.eql('='); + expect(f.type).to.eql('way'); + + var v = r.memberByRole('via'); + expect(v.id).to.eql('VIA'); + expect(v.type).to.eql('way'); + + var t = r.memberByRole('to'); + expect(t.id).to.eql('-'); + expect(t.type).to.eql('way'); + }); + + +// TODO? + + // it('infers the restriction type based on the turn angle', function() { + // // u====*~~~~w + // // | + // // x + // var graph = iD.coreGraph([ + // iD.osmNode({id: 'u', loc: [-1, 0]}), + // iD.osmNode({id: '*', loc: [ 0, 0]}), + // iD.osmNode({id: 'w', loc: [ 1, 0]}), + // iD.osmNode({id: 'x', loc: [ 0, -1]}), + // iD.osmWay({id: '=', nodes: ['u', '*']}), + // iD.osmWay({id: '-', nodes: ['*', 'x']}), + // iD.osmWay({id: '~', nodes: ['*', 'w']}) + // ]); + + // var r1 = iD.actionRestrictTurn({ + // from: {node: 'u', way: '='}, + // via: {node: '*'}, + // to: {node: 'x', way: '-'} + // }, projection, 'r')(graph); + // expect(r1.entity('r').tags.restriction).to.equal('no_right_turn'); + + // var r2 = iD.actionRestrictTurn({ + // from: {node: 'x', way: '-'}, + // via: {node: '*'}, + // to: {node: 'w', way: '~'} + // }, projection, 'r')(graph); + // expect(r2.entity('r').tags.restriction).to.equal('no_right_turn'); + + // var l1 = iD.actionRestrictTurn({ + // from: {node: 'x', way: '-'}, + // via: {node: '*'}, + // to: {node: 'u', way: '='} + // }, projection, 'r')(graph); + // expect(l1.entity('r').tags.restriction).to.equal('no_left_turn'); + + // var l2 = iD.actionRestrictTurn({ + // from: {node: 'w', way: '~'}, + // via: {node: '*'}, + // to: {node: 'x', way: '-'} + // }, projection, 'r')(graph); + // expect(l2.entity('r').tags.restriction).to.equal('no_left_turn'); + + // var s = iD.actionRestrictTurn({ + // from: {node: 'u', way: '='}, + // via: {node: '*'}, + // to: {node: 'w', way: '~'} + // }, projection, 'r')(graph); + // expect(s.entity('r').tags.restriction).to.equal('no_straight_on'); + + // var u = iD.actionRestrictTurn({ + // from: {node: 'u', way: '='}, + // via: {node: '*'}, + // to: {node: 'u', way: '='} + // }, projection, 'r')(graph); + // expect(u.entity('r').tags.restriction).to.equal('no_u_turn'); + // }); + + // it('infers no_u_turn from acute angle made by forward oneways', function() { + // // * + // // / \ + // // w2/ \w1 + // // / \ + // // u x + // var graph = iD.coreGraph([ + // iD.osmNode({id: 'u', loc: [-1, -20]}), + // iD.osmNode({id: '*', loc: [ 0, 0]}), + // iD.osmNode({id: 'x', loc: [ 1, -20]}), + // iD.osmWay({id: 'w1', nodes: ['x', '*'], tags: {oneway: 'yes'}}), + // iD.osmWay({id: 'w2', nodes: ['*', 'u'], tags: {oneway: 'yes'}}) + // ]); + + // var r = iD.actionRestrictTurn({ + // from: {node: 'x', way: 'w1'}, + // via: {node: '*'}, + // to: {node: 'u', way: 'w2'} + // }, projection, 'r')(graph); + // expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); + // }); + + // it('infers no_u_turn from acute angle made by reverse oneways', function() { + // // * + // // / \ + // // w2/ \w1 + // // / \ + // // u x + // var graph = iD.coreGraph([ + // iD.osmNode({id: 'u', loc: [-1, -20]}), + // iD.osmNode({id: '*', loc: [ 0, 0]}), + // iD.osmNode({id: 'x', loc: [ 1, -20]}), + // iD.osmWay({id: 'w1', nodes: ['*', 'x'], tags: {oneway: '-1'}}), + // iD.osmWay({id: 'w2', nodes: ['u', '*'], tags: {oneway: '-1'}}) + // ]); + + // var r = iD.actionRestrictTurn({ + // from: {node: 'x', way: 'w1'}, + // via: {node: '*'}, + // to: {node: 'u', way: 'w2'} + // }, projection, 'r')(graph); + // expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); + // }); }); - - it('splits the from/to way of a U-turn (backward)', function() { - // u====*===>w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*', 'w']}), - iD.Way({id: '-', nodes: ['*', 'x']}) - ]), - action = iD.actionRestrictTurn({ - from: {node: 'w', way: '=', newID: '=='}, - via: {node: '*'}, - to: {node: 'w', way: '=', newID: '~~'}, - restriction: 'no_u_turn' - }, projection, 'r'); - - graph = action(graph); - - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_u_turn'}); - expect(r.memberByRole('from').id).to.eql('=='); - expect(r.memberByRole('from').type).to.eql('way'); - expect(r.memberByRole('via').id).to.eql('*'); - expect(r.memberByRole('via').type).to.eql('node'); - expect(r.memberByRole('to').id).to.eql('=='); - expect(r.memberByRole('to').type).to.eql('way'); - }); - - it('infers the restriction type based on the turn angle', function() { - // u====*~~~~w - // | - // x - var graph = iD.Graph([ - iD.Node({id: 'u', loc: [-1, 0]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'w', loc: [ 1, 0]}), - iD.Node({id: 'x', loc: [ 0, -1]}), - iD.Way({id: '=', nodes: ['u', '*']}), - iD.Way({id: '-', nodes: ['*', 'x']}), - iD.Way({id: '~', nodes: ['*', 'w']}) - ]); - - var r1 = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }, projection, 'r')(graph); - expect(r1.entity('r').tags.restriction).to.equal('no_right_turn'); - - var r2 = iD.actionRestrictTurn({ - from: {node: 'x', way: '-'}, - via: {node: '*'}, - to: {node: 'w', way: '~'} - }, projection, 'r')(graph); - expect(r2.entity('r').tags.restriction).to.equal('no_right_turn'); - - var l1 = iD.actionRestrictTurn({ - from: {node: 'x', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }, projection, 'r')(graph); - expect(l1.entity('r').tags.restriction).to.equal('no_left_turn'); - - var l2 = iD.actionRestrictTurn({ - from: {node: 'w', way: '~'}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }, projection, 'r')(graph); - expect(l2.entity('r').tags.restriction).to.equal('no_left_turn'); - - var s = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '~'} - }, projection, 'r')(graph); - expect(s.entity('r').tags.restriction).to.equal('no_straight_on'); - - var u = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }, projection, 'r')(graph); - expect(u.entity('r').tags.restriction).to.equal('no_u_turn'); - }); - - it('infers no_u_turn from acute angle made by forward oneways', function() { - // * - // / \ - // w2/ \w1 - // / \ - // u x - var graph = iD.Graph([ - iD.Node({id: 'u', loc: [-1, -20]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'x', loc: [ 1, -20]}), - iD.Way({id: 'w1', nodes: ['x', '*'], tags: {oneway: 'yes'}}), - iD.Way({id: 'w2', nodes: ['*', 'u'], tags: {oneway: 'yes'}}) - ]); - - var r = iD.actionRestrictTurn({ - from: {node: 'x', way: 'w1'}, - via: {node: '*'}, - to: {node: 'u', way: 'w2'} - }, projection, 'r')(graph); - expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - }); - - it('infers no_u_turn from acute angle made by reverse oneways', function() { - // * - // / \ - // w2/ \w1 - // / \ - // u x - var graph = iD.Graph([ - iD.Node({id: 'u', loc: [-1, -20]}), - iD.Node({id: '*', loc: [ 0, 0]}), - iD.Node({id: 'x', loc: [ 1, -20]}), - iD.Way({id: 'w1', nodes: ['*', 'x'], tags: {oneway: '-1'}}), - iD.Way({id: 'w2', nodes: ['u', '*'], tags: {oneway: '-1'}}) - ]); - - var r = iD.actionRestrictTurn({ - from: {node: 'x', way: 'w1'}, - via: {node: '*'}, - to: {node: 'u', way: 'w2'} - }, projection, 'r')(graph); - expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - }); - }); diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index ac4d481e0..a0a3818e4 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -1,108 +1,114 @@ describe('iD.osmIntersection', function() { describe('highways', function() { it('excludes non-highways', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*']}), - iD.Way({id: '-', nodes: ['*', 'w']}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*']}), + iD.osmWay({id: '-', nodes: ['*', 'w']}) ]); expect(iD.osmIntersection(graph, '*').ways).to.eql([]); }); it('excludes degenerate highways', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*'], tags: {highway: 'residential'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*'], tags: {highway: 'residential'}}) ]); - var ids = iD.osmIntersection(graph, '*').ways.map(function (w) { return w.id; }); - expect(ids).to.have.same.members(['=']); + var result = iD.osmIntersection(graph, '*').ways; + expect(result.map(function(i) { return i.id; })).to.eql(['=']); }); - it('excludes coincident highways', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['u', '*'], tags: {highway: 'residential'}}) - ]); - expect(iD.osmIntersection(graph, '*').ways).to.eql([]); - }); +//TODO? + // it('excludes coincident highways', function() { + // var graph = iD.coreGraph([ + // iD.osmNode({id: 'u'}), + // iD.osmNode({id: '*'}), + // iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + // iD.osmWay({id: '-', nodes: ['u', '*'], tags: {highway: 'residential'}}) + // ]); + // expect(iD.osmIntersection(graph, '*').ways).to.eql([]); + // }); it('includes line highways', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w']}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*', 'w']}) ]); - var ids = iD.osmIntersection(graph, '*').ways.map(function (w) { return w.id; }); - expect(ids).to.have.same.members(['=']); + var result = iD.osmIntersection(graph, '*').ways; + expect(result.map(function(i) { return i.id; })).to.eql(['=']); }); it('excludes area highways', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*', 'w'], tags: {highway: 'pedestrian', area: 'yes'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*', 'w'], tags: {highway: 'pedestrian', area: 'yes'}}) ]); expect(iD.osmIntersection(graph, '*').ways).to.eql([]); }); it('auto-splits highways at the intersection', function() { - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*', 'w'], tags: {highway: 'residential'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*', 'w'], tags: {highway: 'residential'}}) ]); - var ids = iD.osmIntersection(graph, '*').ways.map(function (w) { return w.id; }); - expect(ids).to.have.ordered.members(['=-a', '=-b']); + expect(iD.osmIntersection(graph, '*').ways.length).to.eql(2); }); }); describe('#turns', function() { it('permits turns onto a way forward', function() { // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; }); it('permits turns onto a way backward', function() { // u====*<---w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; }); it('permits turns from a way that must be split', function() { @@ -111,33 +117,29 @@ describe('iD.osmIntersection', function() { // u===* // | // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*', 'x'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('w'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmNode({id: 'x'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*', 'x'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('-'); expect(turns.length).to.eql(3); - expect(turns[0]).to.eql({ - from: {node: 'w', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }); - expect(turns[1]).to.eql({ - from: {node: 'w', way: '-'}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }); - expect(turns[2]).to.eql({ - from: {node: 'w', way: '-'}, - via: {node: '*'}, - to: {node: 'w', way: '-'}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('-,*,='); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('-,*,-'); + expect(turns[1].u).to.be.true; + + expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[2].key).to.match(/^-,\*,w-\d+$/); // new way + expect(turns[2].u).to.be.not.ok; }); it('permits turns to a way that must be split', function() { @@ -146,244 +148,243 @@ describe('iD.osmIntersection', function() { // u===* // | // x - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Node({id: 'x'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*', 'x'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmNode({id: 'x'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*', 'x'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(3); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }); - expect(turns[2]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; + + expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[2].key).to.match(/^=,\*,w-\d+$/); // new way + expect(turns[2].u).to.be.not.ok; }); it('permits turns from a oneway forward', function() { // u===>v----w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential', oneway: 'yes'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential', oneway: 'yes'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) + ]); - expect(turns).to.eql([{ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }]); + var turns = iD.osmIntersection(graph, '*').turns('='); + expect(turns.length).to.eql(1); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].u).to.be.not.ok; }); it('permits turns from a reverse oneway backward', function() { // u<===*----w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential', oneway: '-1'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential', oneway: '-1'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) + ]); - expect(turns).to.eql([{ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }]); + var turns = iD.osmIntersection(graph, '*').turns('='); + expect(turns.length).to.eql(1); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].u).to.be.not.ok; }); it('omits turns from a oneway backward', function() { // u<===*----w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential', oneway: 'yes'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential', oneway: 'yes'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) ]); expect(iD.osmIntersection(graph, '*').turns('u')).to.eql([]); }); it('omits turns from a reverse oneway forward', function() { // u===>*----w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential', oneway: '-1'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential', oneway: '-1'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) ]); expect(iD.osmIntersection(graph, '*').turns('u')).to.eql([]); }); it('permits turns onto a oneway forward', function() { // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential', oneway: 'yes'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential', oneway: 'yes'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; }); it('permits turns onto a reverse oneway backward', function() { // u====*<---w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*'], tags: {highway: 'residential', oneway: '-1'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*'], tags: {highway: 'residential', oneway: '-1'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; }); it('omits turns onto a oneway backward', function() { // u====*<---w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*'], tags: {highway: 'residential', oneway: 'yes'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*'], tags: {highway: 'residential', oneway: 'yes'}}) ]); - expect(iD.osmIntersection(graph, '*').turns('u').length).to.eql(1); + + var turns = iD.osmIntersection(graph, '*').turns('='); + expect(turns.length).to.eql(1); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; }); it('omits turns onto a reverse oneway forward', function() { // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential', oneway: '-1'}}) + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential', oneway: '-1'}}) ]); - expect(iD.osmIntersection(graph, '*').turns('u').length).to.eql(1); - }); - it('includes U-turns', function() { - // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var turns = iD.osmIntersection(graph, '*').turns('='); + expect(turns.length).to.eql(1); - expect(turns.length).to.eql(2); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - u: true - }); + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; }); it('restricts turns with a restriction relation', function() { // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}), - iD.Relation({id: 'r', tags: {type: 'restriction'}, members: [ - {id: '=', role: 'from', type: 'way'}, - {id: '-', role: 'to', type: 'way'}, - {id: '*', role: 'via', type: 'node'} - ]}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}), + iD.osmRelation({id: 'r', tags: {type: 'restriction'}, members: [ + {id: '=', role: 'from', type: 'way'}, + {id: '-', role: 'to', type: 'way'}, + {id: '*', role: 'via', type: 'node'} + ]}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'}, - restriction: 'r' - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].u).to.be.not.ok; + expect(turns[1].restriction).to.eql('r'); + expect(turns[1].direct).to.be.true; + expect(turns[1].indirect).to.be.not.ok; + expect(turns[1].only).to.be.not.ok; }); it('restricts turns affected by an only_* restriction relation', function() { // u====*~~~~v // | // w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: 'v'}), - iD.Node({id: 'w'}), - iD.Node({id: '*'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '~', nodes: ['v', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['w', '*'], tags: {highway: 'residential'}}), - iD.Relation({id: 'r', tags: {type: 'restriction', restriction: 'only_right_turn'}, members: [ - {id: '=', role: 'from', type: 'way'}, - {id: '-', role: 'to', type: 'way'}, - {id: '*', role: 'via', type: 'node'} - ]}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: 'v'}), + iD.osmNode({id: 'w'}), + iD.osmNode({id: '*'}), + iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '~', nodes: ['v', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '-', nodes: ['w', '*'], tags: {highway: 'residential'}}), + iD.osmRelation({id: 'r', tags: {type: 'restriction', restriction: 'only_right_turn'}, members: [ + {id: '=', role: 'from', type: 'way'}, + {id: '-', role: 'to', type: 'way'}, + {id: '*', role: 'via', type: 'node'} + ]}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(3); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'v', way: '~'}, - restriction: 'r', - indirect_restriction: true - }); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'}, - restriction: 'r' - }); - expect(turns[2]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - restriction: 'r', - indirect_restriction: true, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,~'); + expect(turns[1].restriction).to.eql('r'); + expect(turns[1].u).to.be.not.ok; + expect(turns[1].direct).to.be.not.ok; + expect(turns[1].indirect).to.be.true; + expect(turns[1].only).to.be.not.ok; + + expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[2].key).to.eql('=,*,-'); + expect(turns[2].restriction).to.eql('r'); + expect(turns[2].u).to.be.not.ok; + expect(turns[2].direct).to.be.not.ok; + expect(turns[2].indirect).to.be.not.ok; + expect(turns[2].only).to.be.true; }); it('permits turns to a circular way', function() { @@ -392,34 +393,30 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(3); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'a', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'c', way: '-'} - }); - expect(turns[2]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].u).to.be.true; + + expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[2].key).to.match(/^=,\*,w-\d+$/); // new way + expect(turns[2].u).to.be.not.ok; }); it('permits turns from a circular way', function() { @@ -428,34 +425,30 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('a'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('-'); expect(turns.length).to.eql(3); - expect(turns[0]).to.eql({ - from: {node: 'a', way: '-'}, - via: {node: '*'}, - to: {node: 'c', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'a', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }); - expect(turns[2]).to.eql({ - from: {node: 'a', way: '-'}, - via: {node: '*'}, - to: {node: 'a', way: '-'}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('-,*,-'); + expect(turns[0].u).to.be.true; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('-,*,='); + expect(turns[1].u).to.be.not.ok; + + expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[2].key).to.match(/^-,\*,w-\d+$/); // new way + expect(turns[2].u).to.be.not.ok; }); it('permits turns to a oneway circular way', function() { @@ -464,29 +457,26 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: 'yes'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: 'yes'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'a', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].u).to.be.true; }); it('permits turns to a reverse oneway circular way', function() { @@ -495,29 +485,26 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: '-1'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('u'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: '-1'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var turns = iD.osmIntersection(graph, '*').turns('='); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'c', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='}, - u: true - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].u).to.be.true; }); it('permits turns from a oneway circular way', function() { @@ -526,28 +513,28 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: 'yes'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('c'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: 'yes'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var intersection = iD.osmIntersection(graph, '*'); + var newWay = intersection.ways.find(function(w) { return /^w-\d+$/.test(w.id); }); + var turns = iD.osmIntersection(graph, '*').turns(newWay.id); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'c', way: '-'}, - via: {node: '*'}, - to: {node: 'a', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'c', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql(newWay.id + ',*,-'); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql(newWay.id + ',*,='); + expect(turns[1].u).to.be.not.ok; }); it('permits turns from a reverse oneway circular way', function() { @@ -556,28 +543,28 @@ describe('iD.osmIntersection', function() { // | | // a -- * === u // - var graph = iD.Graph([ - iD.Node({id: 'a'}), - iD.Node({id: 'b'}), - iD.Node({id: 'c'}), - iD.Node({id: '*'}), - iD.Node({id: 'u'}), - iD.Way({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: '-1'}}), - iD.Way({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) - ]), - turns = iD.osmIntersection(graph, '*').turns('a'); + var graph = iD.coreGraph([ + iD.osmNode({id: 'a'}), + iD.osmNode({id: 'b'}), + iD.osmNode({id: 'c'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'u'}), + iD.osmWay({id: '-', nodes: ['*', 'a', 'b', 'c', '*'], tags: {highway: 'residential', oneway: '-1'}}), + iD.osmWay({id: '=', nodes: ['*', 'u'], tags: {highway: 'residential'}}) + ]); + var intersection = iD.osmIntersection(graph, '*'); + var newWay = intersection.ways.find(function(w) { return /^w-\d+$/.test(w.id); }); + var turns = iD.osmIntersection(graph, '*').turns(newWay.id); expect(turns.length).to.eql(2); - expect(turns[0]).to.eql({ - from: {node: 'a', way: '-'}, - via: {node: '*'}, - to: {node: 'c', way: '-'} - }); - expect(turns[1]).to.eql({ - from: {node: 'a', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }); + + expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[0].key).to.eql(newWay.id + ',*,-'); + expect(turns[0].u).to.be.not.ok; + + expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); + expect(turns[1].key).to.eql(newWay.id + ',*,='); + expect(turns[1].u).to.be.not.ok; }); }); diff --git a/test/spec/osm/relation.js b/test/spec/osm/relation.js index 4d449d226..17fcc222c 100644 --- a/test/spec/osm/relation.js +++ b/test/spec/osm/relation.js @@ -1,98 +1,98 @@ describe('iD.osmRelation', function () { if (iD.debug) { it('freezes nodes', function () { - expect(Object.isFrozen(iD.Relation().members)).to.be.true; + expect(Object.isFrozen(iD.osmRelation().members)).to.be.true; }); } it('returns a relation', function () { - expect(iD.Relation()).to.be.an.instanceOf(iD.Relation); - expect(iD.Relation().type).to.equal('relation'); + expect(iD.osmRelation()).to.be.an.instanceOf(iD.osmRelation); + expect(iD.osmRelation().type).to.equal('relation'); }); it('defaults members to an empty array', function () { - expect(iD.Relation().members).to.eql([]); + expect(iD.osmRelation().members).to.eql([]); }); it('sets members as specified', function () { - expect(iD.Relation({members: ['n-1']}).members).to.eql(['n-1']); + expect(iD.osmRelation({members: ['n-1']}).members).to.eql(['n-1']); }); it('defaults tags to an empty object', function () { - expect(iD.Relation().tags).to.eql({}); + expect(iD.osmRelation().tags).to.eql({}); }); it('sets tags as specified', function () { - expect(iD.Relation({tags: {foo: 'bar'}}).tags).to.eql({foo: 'bar'}); + expect(iD.osmRelation({tags: {foo: 'bar'}}).tags).to.eql({foo: 'bar'}); }); describe('#copy', function () { it('returns a new Relation', function () { - var r = iD.Relation({id: 'r'}), - result = r.copy(null, {}); + var r = iD.osmRelation({id: 'r'}); + var result = r.copy(null, {}); - expect(result).to.be.an.instanceof(iD.Relation); + expect(result).to.be.an.instanceof(iD.osmRelation); expect(result).not.to.equal(r); }); it('adds the new Relation to input object', function () { - var r = iD.Relation({id: 'r'}), - copies = {}, - result = r.copy(null, copies); + var r = iD.osmRelation({id: 'r'}); + var copies = {}; + var result = r.copy(null, copies); expect(Object.keys(copies)).to.have.length(1); expect(copies.r).to.equal(result); }); it('returns an existing copy in input object', function () { - var r = iD.Relation({id: 'r'}), - copies = {}, - result1 = r.copy(null, copies), - result2 = r.copy(null, copies); + var r = iD.osmRelation({id: 'r'}); + var copies = {}; + var result1 = r.copy(null, copies); + var result2 = r.copy(null, copies); expect(Object.keys(copies)).to.have.length(1); expect(result1).to.equal(result2); }); it('deep copies members', function () { - var a = iD.Node({id: 'a'}), - b = iD.Node({id: 'b'}), - c = iD.Node({id: 'c'}), - w = iD.Way({id: 'w', nodes: ['a','b','c','a']}), - r = iD.Relation({id: 'r', members: [{id: 'w', role: 'outer'}]}), - graph = iD.Graph([a, b, c, w, r]), - copies = {}, - result = r.copy(graph, copies); + var a = iD.osmNode({id: 'a'}); + var b = iD.osmNode({id: 'b'}); + var c = iD.osmNode({id: 'c'}); + var w = iD.osmWay({id: 'w', nodes: ['a','b','c','a']}); + var r = iD.osmRelation({id: 'r', members: [{id: 'w', role: 'outer'}]}); + var graph = iD.coreGraph([a, b, c, w, r]); + var copies = {}; + var result = r.copy(graph, copies); expect(Object.keys(copies)).to.have.length(5); - expect(copies.w).to.be.an.instanceof(iD.Way); - expect(copies.a).to.be.an.instanceof(iD.Node); - expect(copies.b).to.be.an.instanceof(iD.Node); - expect(copies.c).to.be.an.instanceof(iD.Node); + expect(copies.w).to.be.an.instanceof(iD.osmWay); + expect(copies.a).to.be.an.instanceof(iD.osmNode); + expect(copies.b).to.be.an.instanceof(iD.osmNode); + expect(copies.c).to.be.an.instanceof(iD.osmNode); expect(result.members[0].id).not.to.equal(r.members[0].id); expect(result.members[0].role).to.equal(r.members[0].role); }); it('deep copies non-tree relation graphs without duplicating children', function () { - var w = iD.Way({id: 'w'}), - r1 = iD.Relation({id: 'r1', members: [{id: 'r2'}, {id: 'w'}]}), - r2 = iD.Relation({id: 'r2', members: [{id: 'w'}]}), - graph = iD.Graph([w, r1, r2]), - copies = {}; + var w = iD.osmWay({id: 'w'}); + var r1 = iD.osmRelation({id: 'r1', members: [{id: 'r2'}, {id: 'w'}]}); + var r2 = iD.osmRelation({id: 'r2', members: [{id: 'w'}]}); + var graph = iD.coreGraph([w, r1, r2]); + var copies = {}; r1.copy(graph, copies); expect(Object.keys(copies)).to.have.length(3); - expect(copies.r1).to.be.an.instanceof(iD.Relation); - expect(copies.r2).to.be.an.instanceof(iD.Relation); - expect(copies.w).to.be.an.instanceof(iD.Way); + expect(copies.r1).to.be.an.instanceof(iD.osmRelation); + expect(copies.r2).to.be.an.instanceof(iD.osmRelation); + expect(copies.w).to.be.an.instanceof(iD.osmWay); expect(copies.r1.members[0].id).to.equal(copies.r2.id); expect(copies.r1.members[1].id).to.equal(copies.w.id); expect(copies.r2.members[0].id).to.equal(copies.w.id); }); it('deep copies cyclical relation graphs without issue', function () { - var r1 = iD.Relation({id: 'r1', members: [{id: 'r2'}]}), - r2 = iD.Relation({id: 'r2', members: [{id: 'r1'}]}), - graph = iD.Graph([r1, r2]), - copies = {}; + var r1 = iD.osmRelation({id: 'r1', members: [{id: 'r2'}]}); + var r2 = iD.osmRelation({id: 'r2', members: [{id: 'r1'}]}); + var graph = iD.coreGraph([r1, r2]); + var copies = {}; r1.copy(graph, copies); expect(Object.keys(copies)).to.have.length(2); @@ -101,9 +101,9 @@ describe('iD.osmRelation', function () { }); it('deep copies self-referencing relations without issue', function () { - var r = iD.Relation({id: 'r', members: [{id: 'r'}]}), - graph = iD.Graph([r]), - copies = {}; + var r = iD.osmRelation({id: 'r', members: [{id: 'r'}]}); + var graph = iD.coreGraph([r]); + var copies = {}; r.copy(graph, copies); expect(Object.keys(copies)).to.have.length(1); @@ -113,53 +113,53 @@ describe('iD.osmRelation', function () { describe('#extent', function () { it('returns the minimal extent containing the extents of all members', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [5, 10]}), - r = iD.Relation({members: [{id: a.id}, {id: b.id}]}), - graph = iD.Graph([a, b, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [5, 10]}); + var r = iD.osmRelation({members: [{id: a.id}, {id: b.id}]}); + var graph = iD.coreGraph([a, b, r]); expect(r.extent(graph).equals([[0, 0], [5, 10]])).to.be.ok; }); it('returns the known extent of incomplete relations', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [5, 10]}), - r = iD.Relation({members: [{id: a.id}, {id: b.id}]}), - graph = iD.Graph([a, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [5, 10]}); + var r = iD.osmRelation({members: [{id: a.id}, {id: b.id}]}); + var graph = iD.coreGraph([a, r]); expect(r.extent(graph).equals([[0, 0], [0, 0]])).to.be.ok; }); it('does not error on self-referencing relations', function () { - var r = iD.Relation(); + var r = iD.osmRelation(); r = r.addMember({id: r.id}); - expect(r.extent(iD.Graph([r]))).to.eql(iD.geoExtent()); + expect(r.extent(iD.coreGraph([r]))).to.eql(iD.geoExtent()); }); }); describe('#geometry', function () { it('returns \'area\' for multipolygons', function () { - expect(iD.Relation({tags: {type: 'multipolygon'}}).geometry(iD.Graph())).to.equal('area'); + expect(iD.osmRelation({tags: {type: 'multipolygon'}}).geometry(iD.coreGraph())).to.equal('area'); }); it('returns \'relation\' for other relations', function () { - expect(iD.Relation().geometry(iD.Graph())).to.equal('relation'); + expect(iD.osmRelation().geometry(iD.coreGraph())).to.equal('relation'); }); }); describe('#isDegenerate', function () { it('returns true for a relation without members', function () { - expect(iD.Relation().isDegenerate()).to.equal(true); + expect(iD.osmRelation().isDegenerate()).to.equal(true); }); it('returns false for a relation with members', function () { - expect(iD.Relation({members: [{id: 'a', role: 'inner'}]}).isDegenerate()).to.equal(false); + expect(iD.osmRelation({members: [{id: 'a', role: 'inner'}]}).isDegenerate()).to.equal(false); }); }); describe('#memberByRole', function () { it('returns the first member with the given role', function () { - var r = iD.Relation({members: [ + var r = iD.osmRelation({members: [ {id: 'a', role: 'inner'}, {id: 'b', role: 'outer'}, {id: 'c', role: 'outer'}]}); @@ -167,13 +167,13 @@ describe('iD.osmRelation', function () { }); it('returns undefined if no members have the given role', function () { - expect(iD.Relation().memberByRole('outer')).to.be.undefined; + expect(iD.osmRelation().memberByRole('outer')).to.be.undefined; }); }); describe('#memberById', function () { it('returns the first member with the given id', function () { - var r = iD.Relation({members: [ + var r = iD.osmRelation({members: [ {id: 'a', role: 'outer'}, {id: 'b', role: 'outer'}, {id: 'b', role: 'inner'}]}); @@ -181,101 +181,247 @@ describe('iD.osmRelation', function () { }); it('returns undefined if no members have the given role', function () { - expect(iD.Relation().memberById('b')).to.be.undefined; + expect(iD.osmRelation().memberById('b')).to.be.undefined; }); }); describe('#isRestriction', function () { it('returns true for \'restriction\' type', function () { - expect(iD.Relation({tags: {type: 'restriction'}}).isRestriction()).to.be.true; + expect(iD.osmRelation({tags: {type: 'restriction'}}).isRestriction()).to.be.true; }); it('returns true for \'restriction:type\' types', function () { - expect(iD.Relation({tags: {type: 'restriction:bus'}}).isRestriction()).to.be.true; + expect(iD.osmRelation({tags: {type: 'restriction:bus'}}).isRestriction()).to.be.true; }); it('returns false otherwise', function () { - expect(iD.Relation().isRestriction()).to.be.false; - expect(iD.Relation({tags: {type: 'multipolygon'}}).isRestriction()).to.be.false; + expect(iD.osmRelation().isRestriction()).to.be.false; + expect(iD.osmRelation({tags: {type: 'multipolygon'}}).isRestriction()).to.be.false; + }); + }); + + describe('#isValidRestriction', function () { + it('not a restriction', function () { + var r = iD.osmRelation({ id: 'r', tags: { type: 'multipolygon' }}); + var graph = iD.coreGraph([r]); + expect(r.isValidRestriction(graph)).to.be.false; + }); + + it('typical restriction (from way, via node, to way) is valid', function () { + var f = iD.osmWay({id: 'f'}); + var v = iD.osmNode({id: 'v'}); + var t = iD.osmWay({id: 't'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_left_turn' }, + members: [ + { role: 'from', id: 'f', type: 'way' }, + { role: 'via', id: 'v', type: 'node' }, + { role: 'to', id: 't', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f, v, t, r]); + + expect(r.isValidRestriction(graph)).to.be.true; + }); + + it('multiple froms, normal restriction is invalid', function () { + var f1 = iD.osmWay({id: 'f1'}); + var f2 = iD.osmWay({id: 'f2'}); + var v = iD.osmNode({id: 'v'}); + var t = iD.osmWay({id: 't'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_left_turn' }, + members: [ + { role: 'from', id: 'f1', type: 'way' }, + { role: 'from', id: 'f2', type: 'way' }, + { role: 'via', id: 'v', type: 'node' }, + { role: 'to', id: 't', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f1, f2, v, t, r]); + + expect(r.isValidRestriction(graph)).to.be.false; + }); + + it('multiple froms, no_entry restriction is valid', function () { + var f1 = iD.osmWay({id: 'f1'}); + var f2 = iD.osmWay({id: 'f2'}); + var v = iD.osmNode({id: 'v'}); + var t = iD.osmWay({id: 't'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_entry' }, + members: [ + { role: 'from', id: 'f1', type: 'way' }, + { role: 'from', id: 'f2', type: 'way' }, + { role: 'via', id: 'v', type: 'node' }, + { role: 'to', id: 't', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f1, f2, v, t, r]); + + expect(r.isValidRestriction(graph)).to.be.true; + }); + + it('multiple tos, normal restriction is invalid', function () { + var f = iD.osmWay({id: 'f'}); + var v = iD.osmNode({id: 'v'}); + var t1 = iD.osmWay({id: 't1'}); + var t2 = iD.osmWay({id: 't2'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_left_turn' }, + members: [ + { role: 'from', id: 'f', type: 'way' }, + { role: 'via', id: 'v', type: 'node' }, + { role: 'to', id: 't1', type: 'way' }, + { role: 'to', id: 't2', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f, v, t1, t2, r]); + + expect(r.isValidRestriction(graph)).to.be.false; + }); + + it('multiple tos, no_exit restriction is valid', function () { + var f = iD.osmWay({id: 'f'}); + var v = iD.osmNode({id: 'v'}); + var t1 = iD.osmWay({id: 't1'}); + var t2 = iD.osmWay({id: 't2'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_exit' }, + members: [ + { role: 'from', id: 'f', type: 'way' }, + { role: 'via', id: 'v', type: 'node' }, + { role: 'to', id: 't1', type: 'way' }, + { role: 'to', id: 't2', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f, v, t1, t2, r]); + + expect(r.isValidRestriction(graph)).to.be.true; + }); + + it('multiple vias, with some as node is invalid', function () { + var f = iD.osmWay({id: 'f'}); + var v1 = iD.osmNode({id: 'v1'}); + var v2 = iD.osmWay({id: 'v2'}); + var t = iD.osmWay({id: 't'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_left_turn' }, + members: [ + { role: 'from', id: 'f', type: 'way' }, + { role: 'via', id: 'v1', type: 'node' }, + { role: 'via', id: 'v2', type: 'way' }, + { role: 'to', id: 't', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f, v1, v2, t, r]); + + expect(r.isValidRestriction(graph)).to.be.false; + }); + + it('multiple vias, with all as way is valid', function () { + var f = iD.osmWay({id: 'f'}); + var v1 = iD.osmWay({id: 'v1'}); + var v2 = iD.osmWay({id: 'v2'}); + var t = iD.osmWay({id: 't'}); + var r = iD.osmRelation({ + id: 'r', + tags: { type: 'restriction', restriction: 'no_left_turn' }, + members: [ + { role: 'from', id: 'f', type: 'way' }, + { role: 'via', id: 'v1', type: 'way' }, + { role: 'via', id: 'v2', type: 'way' }, + { role: 'to', id: 't', type: 'way' }, + ] + }); + var graph = iD.coreGraph([f, v1, v2, t, r]); + + expect(r.isValidRestriction(graph)).to.be.true; }); }); describe('#indexedMembers', function () { it('returns an array of members extended with indexes', function () { - var r = iD.Relation({members: [{id: '1'}, {id: '3'}]}); + var r = iD.osmRelation({members: [{id: '1'}, {id: '3'}]}); expect(r.indexedMembers()).to.eql([{id: '1', index: 0}, {id: '3', index: 1}]); }); }); describe('#addMember', function () { it('adds a member at the end of the relation', function () { - var r = iD.Relation(); + var r = iD.osmRelation(); expect(r.addMember({id: '1'}).members).to.eql([{id: '1'}]); }); it('adds a member at index 0', function () { - var r = iD.Relation({members: [{id: '1'}]}); + var r = iD.osmRelation({members: [{id: '1'}]}); expect(r.addMember({id: '2'}, 0).members).to.eql([{id: '2'}, {id: '1'}]); }); it('adds a member at a positive index', function () { - var r = iD.Relation({members: [{id: '1'}, {id: '3'}]}); + var r = iD.osmRelation({members: [{id: '1'}, {id: '3'}]}); expect(r.addMember({id: '2'}, 1).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]); }); it('adds a member at a negative index', function () { - var r = iD.Relation({members: [{id: '1'}, {id: '3'}]}); + var r = iD.osmRelation({members: [{id: '1'}, {id: '3'}]}); expect(r.addMember({id: '2'}, -1).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]); }); }); describe('#updateMember', function () { it('updates the properties of the relation member at the specified index', function () { - var r = iD.Relation({members: [{role: 'forward'}]}); + var r = iD.osmRelation({members: [{role: 'forward'}]}); expect(r.updateMember({role: 'backward'}, 0).members).to.eql([{role: 'backward'}]); }); }); describe('#removeMember', function () { it('removes the member at the specified index', function () { - var r = iD.Relation({members: [{id: 'a'}, {id: 'b'}, {id: 'c'}]}); + var r = iD.osmRelation({members: [{id: 'a'}, {id: 'b'}, {id: 'c'}]}); expect(r.removeMember(1).members).to.eql([{id: 'a'}, {id: 'c'}]); }); }); describe('#removeMembersWithID', function () { it('removes members with the given ID', function () { - var r = iD.Relation({members: [{id: 'a'}, {id: 'b'}, {id: 'a'}]}); + var r = iD.osmRelation({members: [{id: 'a'}, {id: 'b'}, {id: 'a'}]}); expect(r.removeMembersWithID('a').members).to.eql([{id: 'b'}]); }); }); describe('#replaceMember', function () { it('returns self if self does not contain needle', function () { - var r = iD.Relation({members: []}); + var r = iD.osmRelation({members: []}); expect(r.replaceMember({id: 'a'}, {id: 'b'})).to.equal(r); }); it('replaces a member which doesn\'t already exist', function () { - var r = iD.Relation({members: [{id: 'a', role: 'a'}]}); + var r = iD.osmRelation({members: [{id: 'a', role: 'a'}]}); expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'node'}).members) .to.eql([{id: 'b', role: 'a', type: 'node'}]); }); it('preserves the existing role', function () { - var r = iD.Relation({members: [{id: 'a', role: 'a', type: 'node'}]}); + var r = iD.osmRelation({members: [{id: 'a', role: 'a', type: 'node'}]}); expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'node'}).members) .to.eql([{id: 'b', role: 'a', type: 'node'}]); }); it('uses the replacement type', function () { - var r = iD.Relation({members: [{id: 'a', role: 'a', type: 'node'}]}); + var r = iD.osmRelation({members: [{id: 'a', role: 'a', type: 'node'}]}); expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'way'}).members) .to.eql([{id: 'b', role: 'a', type: 'way'}]); }); it('removes members if replacing them would produce duplicates', function () { - var r = iD.Relation({members: [ + var r = iD.osmRelation({members: [ {id: 'a', role: 'b', type: 'node'}, {id: 'b', role: 'b', type: 'node'} ]}); @@ -283,7 +429,7 @@ describe('iD.osmRelation', function () { .to.eql([{id: 'b', role: 'b', type: 'node'}]); }); it('keeps duplicate members if `keepDuplicates = true`', function () { - var r = iD.Relation({members: [ + var r = iD.osmRelation({members: [ {id: 'a', role: 'b', type: 'node'}, {id: 'b', role: 'b', type: 'node'} ]}); @@ -294,7 +440,7 @@ describe('iD.osmRelation', function () { describe('#asJXON', function () { it('converts a relation to jxon', function() { - var relation = iD.Relation({id: 'r-1', members: [{id: 'w1', role: 'forward', type: 'way'}], tags: {type: 'route'}}); + var relation = iD.osmRelation({id: 'r-1', members: [{id: 'w1', role: 'forward', type: 'way'}], tags: {type: 'route'}}); expect(relation.asJXON()).to.eql({relation: { '@id': '-1', '@version': 0, @@ -303,56 +449,56 @@ describe('iD.osmRelation', function () { }); it('includes changeset if provided', function() { - expect(iD.Relation().asJXON('1234').relation['@changeset']).to.equal('1234'); + expect(iD.osmRelation().asJXON('1234').relation['@changeset']).to.equal('1234'); }); }); - describe('#asGeoJSON', function (){ + describe('#asGeoJSON', function () { it('converts a multipolygon to a GeoJSON MultiPolygon geometry', function() { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - r = iD.Relation({tags: {type: 'multipolygon'}, members: [{id: w.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w, r]), - json = r.asGeoJSON(g); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var r = iD.osmRelation({tags: {type: 'multipolygon'}, members: [{id: w.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w, r]); + var json = r.asGeoJSON(g); expect(json.type).to.equal('MultiPolygon'); expect(json.coordinates).to.eql([[[a.loc, b.loc, c.loc, a.loc]]]); }); it('forces clockwise winding order for outer multipolygon ways', function() { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - w = iD.Way({nodes: [a.id, c.id, b.id, a.id]}), - r = iD.Relation({tags: {type: 'multipolygon'}, members: [{id: w.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w, r]), - json = r.asGeoJSON(g); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var w = iD.osmWay({nodes: [a.id, c.id, b.id, a.id]}); + var r = iD.osmRelation({tags: {type: 'multipolygon'}, members: [{id: w.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w, r]); + var json = r.asGeoJSON(g); expect(json.coordinates[0][0]).to.eql([a.loc, b.loc, c.loc, a.loc]); }); it('forces counterclockwise winding order for inner multipolygon ways', function() { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - d = iD.Node({loc: [0.1, 0.1]}), - e = iD.Node({loc: [0.1, 0.2]}), - f = iD.Node({loc: [0.2, 0.1]}), - outer = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - inner = iD.Way({nodes: [d.id, e.id, f.id, d.id]}), - r = iD.Relation({members: [{id: outer.id, type: 'way'}, {id: inner.id, role: 'inner', type: 'way'}]}), - g = iD.Graph([a, b, c, d, e, f, outer, inner, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var d = iD.osmNode({loc: [0.1, 0.1]}); + var e = iD.osmNode({loc: [0.1, 0.2]}); + var f = iD.osmNode({loc: [0.2, 0.1]}); + var outer = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var inner = iD.osmWay({nodes: [d.id, e.id, f.id, d.id]}); + var r = iD.osmRelation({members: [{id: outer.id, type: 'way'}, {id: inner.id, role: 'inner', type: 'way'}]}); + var g = iD.coreGraph([a, b, c, d, e, f, outer, inner, r]); expect(r.multipolygon(g)[0][1]).to.eql([d.loc, f.loc, e.loc, d.loc]); }); it('converts a relation to a GeoJSON FeatureCollection', function() { - var a = iD.Node({loc: [1, 1]}), - r = iD.Relation({tags: {type: 'type'}, members: [{id: a.id, role: 'role'}]}), - g = iD.Graph([a, r]), - json = r.asGeoJSON(g); + var a = iD.osmNode({loc: [1, 1]}); + var r = iD.osmRelation({tags: {type: 'type'}, members: [{id: a.id, role: 'role'}]}); + var g = iD.coreGraph([a, r]); + var json = r.asGeoJSON(g); expect(json.type).to.equal('FeatureCollection'); expect(json.properties).to.eql({type: 'type'}); @@ -365,214 +511,220 @@ describe('iD.osmRelation', function () { describe('#multipolygon', function () { specify('single polygon consisting of a single way', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - r = iD.Relation({members: [{id: w.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var r = iD.osmRelation({members: [{id: w.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc]]]); }); specify('single polygon consisting of multiple ways', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w1 = iD.Way({nodes: [a.id, b.id]}), - w2 = iD.Way({nodes: [b.id, c.id, a.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w1 = iD.osmWay({nodes: [a.id, b.id]}); + var w2 = iD.osmWay({nodes: [b.id, c.id, a.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc]]]); }); specify('single polygon consisting of multiple ways, one needing reversal', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w1 = iD.Way({nodes: [a.id, b.id]}), - w2 = iD.Way({nodes: [a.id, c.id, b.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w1 = iD.osmWay({nodes: [a.id, b.id]}); + var w2 = iD.osmWay({nodes: [a.id, c.id, b.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc]]]); }); specify('multiple polygons consisting of single ways', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - d = iD.Node({loc: [4, 4]}), - e = iD.Node({loc: [6, 6]}), - f = iD.Node({loc: [5, 5]}), - w1 = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - w2 = iD.Way({nodes: [d.id, e.id, f.id, d.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, d, e, f, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var d = iD.osmNode({loc: [4, 4]}); + var e = iD.osmNode({loc: [6, 6]}); + var f = iD.osmNode({loc: [5, 5]}); + var w1 = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var w2 = iD.osmWay({nodes: [d.id, e.id, f.id, d.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, d, e, f, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc]], [[d.loc, e.loc, f.loc, d.loc]]]); }); specify('invalid geometry: unclosed ring consisting of a single way', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w = iD.Way({nodes: [a.id, b.id, c.id]}), - r = iD.Relation({members: [{id: w.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w = iD.osmWay({nodes: [a.id, b.id, c.id]}); + var r = iD.osmRelation({members: [{id: w.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc]]]); }); specify('invalid geometry: unclosed ring consisting of multiple ways', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [3, 3]}), - c = iD.Node({loc: [2, 2]}), - w1 = iD.Way({nodes: [a.id, b.id]}), - w2 = iD.Way({nodes: [b.id, c.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [3, 3]}); + var c = iD.osmNode({loc: [2, 2]}); + var w1 = iD.osmWay({nodes: [a.id, b.id]}); + var w2 = iD.osmWay({nodes: [b.id, c.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc]]]); }); specify('invalid geometry: unclosed ring consisting of multiple ways, alternate order', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [2, 2]}), - c = iD.Node({loc: [3, 3]}), - d = iD.Node({loc: [4, 4]}), - w1 = iD.Way({nodes: [c.id, d.id]}), - w2 = iD.Way({nodes: [a.id, b.id, c.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, d, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [2, 2]}); + var c = iD.osmNode({loc: [3, 3]}); + var d = iD.osmNode({loc: [4, 4]}); + var w1 = iD.osmWay({nodes: [c.id, d.id]}); + var w2 = iD.osmWay({nodes: [a.id, b.id, c.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, d, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[d.loc, c.loc, b.loc, a.loc]]]); }); specify('invalid geometry: unclosed ring consisting of multiple ways, one needing reversal', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [2, 2]}), - c = iD.Node({loc: [3, 3]}), - d = iD.Node({loc: [4, 4]}), - w1 = iD.Way({nodes: [a.id, b.id, c.id]}), - w2 = iD.Way({nodes: [d.id, c.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, d, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [2, 2]}); + var c = iD.osmNode({loc: [3, 3]}); + var d = iD.osmNode({loc: [4, 4]}); + var w1 = iD.osmWay({nodes: [a.id, b.id, c.id]}); + var w2 = iD.osmWay({nodes: [d.id, c.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, d, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[d.loc, c.loc, b.loc, a.loc]]]); }); specify('invalid geometry: unclosed ring consisting of multiple ways, one needing reversal, alternate order', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [2, 2]}), - c = iD.Node({loc: [3, 3]}), - d = iD.Node({loc: [4, 4]}), - w1 = iD.Way({nodes: [c.id, d.id]}), - w2 = iD.Way({nodes: [c.id, b.id, a.id]}), - r = iD.Relation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}), - g = iD.Graph([a, b, c, d, w1, w2, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [2, 2]}); + var c = iD.osmNode({loc: [3, 3]}); + var d = iD.osmNode({loc: [4, 4]}); + var w1 = iD.osmWay({nodes: [c.id, d.id]}); + var w2 = iD.osmWay({nodes: [c.id, b.id, a.id]}); + var r = iD.osmRelation({members: [{id: w1.id, type: 'way'}, {id: w2.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, d, w1, w2, r]); expect(r.multipolygon(g)).to.eql([[[d.loc, c.loc, b.loc, a.loc]]]); }); specify('single polygon with single single-way inner', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - d = iD.Node({loc: [0.1, 0.1]}), - e = iD.Node({loc: [0.2, 0.1]}), - f = iD.Node({loc: [0.1, 0.2]}), - outer = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - inner = iD.Way({nodes: [d.id, e.id, f.id, d.id]}), - r = iD.Relation({members: [{id: outer.id, type: 'way'}, {id: inner.id, role: 'inner', type: 'way'}]}), - g = iD.Graph([a, b, c, d, e, f, outer, inner, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var d = iD.osmNode({loc: [0.1, 0.1]}); + var e = iD.osmNode({loc: [0.2, 0.1]}); + var f = iD.osmNode({loc: [0.1, 0.2]}); + var outer = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var inner = iD.osmWay({nodes: [d.id, e.id, f.id, d.id]}); + var r = iD.osmRelation({members: [ + {id: outer.id, type: 'way'}, + {id: inner.id, role: 'inner', type: 'way'} + ]}); + var g = iD.coreGraph([a, b, c, d, e, f, outer, inner, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc], [d.loc, e.loc, f.loc, d.loc]]]); }); specify('single polygon with single multi-way inner', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - d = iD.Node({loc: [0.1, 0.1]}), - e = iD.Node({loc: [0.2, 0.1]}), - f = iD.Node({loc: [0.2, 0.1]}), - outer = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - inner1 = iD.Way({nodes: [d.id, e.id]}), - inner2 = iD.Way({nodes: [e.id, f.id, d.id]}), - r = iD.Relation({members: [ - {id: outer.id, type: 'way'}, - {id: inner1.id, role: 'inner', type: 'way'}, - {id: inner2.id, role: 'inner', type: 'way'}]}), - graph = iD.Graph([a, b, c, d, e, f, outer, inner1, inner2, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var d = iD.osmNode({loc: [0.1, 0.1]}); + var e = iD.osmNode({loc: [0.2, 0.1]}); + var f = iD.osmNode({loc: [0.2, 0.1]}); + var outer = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var inner1 = iD.osmWay({nodes: [d.id, e.id]}); + var inner2 = iD.osmWay({nodes: [e.id, f.id, d.id]}); + var r = iD.osmRelation({members: [ + {id: outer.id, type: 'way'}, + {id: inner1.id, role: 'inner', type: 'way'}, + {id: inner2.id, role: 'inner', type: 'way'} + ]}); + var graph = iD.coreGraph([a, b, c, d, e, f, outer, inner1, inner2, r]); expect(r.multipolygon(graph)).to.eql([[[a.loc, b.loc, c.loc, a.loc], [d.loc, e.loc, f.loc, d.loc]]]); }); specify('single polygon with multiple single-way inners', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - d = iD.Node({loc: [0.1, 0.1]}), - e = iD.Node({loc: [0.2, 0.1]}), - f = iD.Node({loc: [0.1, 0.2]}), - g = iD.Node({loc: [0.2, 0.2]}), - h = iD.Node({loc: [0.3, 0.2]}), - i = iD.Node({loc: [0.2, 0.3]}), - outer = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - inner1 = iD.Way({nodes: [d.id, e.id, f.id, d.id]}), - inner2 = iD.Way({nodes: [g.id, h.id, i.id, g.id]}), - r = iD.Relation({members: [ - {id: outer.id, type: 'way'}, - {id: inner1.id, role: 'inner', type: 'way'}, - {id: inner2.id, role: 'inner', type: 'way'}]}), - graph = iD.Graph([a, b, c, d, e, f, g, h, i, outer, inner1, inner2, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var d = iD.osmNode({loc: [0.1, 0.1]}); + var e = iD.osmNode({loc: [0.2, 0.1]}); + var f = iD.osmNode({loc: [0.1, 0.2]}); + var g = iD.osmNode({loc: [0.2, 0.2]}); + var h = iD.osmNode({loc: [0.3, 0.2]}); + var i = iD.osmNode({loc: [0.2, 0.3]}); + var outer = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var inner1 = iD.osmWay({nodes: [d.id, e.id, f.id, d.id]}); + var inner2 = iD.osmWay({nodes: [g.id, h.id, i.id, g.id]}); + var r = iD.osmRelation({members: [ + {id: outer.id, type: 'way'}, + {id: inner1.id, role: 'inner', type: 'way'}, + {id: inner2.id, role: 'inner', type: 'way'} + ]}); + var graph = iD.coreGraph([a, b, c, d, e, f, g, h, i, outer, inner1, inner2, r]); expect(r.multipolygon(graph)).to.eql([[[a.loc, b.loc, c.loc, a.loc], [d.loc, e.loc, f.loc, d.loc], [g.loc, h.loc, i.loc, g.loc]]]); }); specify('multiple polygons with single single-way inner', function () { - var a = iD.Node({loc: [0, 0]}), - b = iD.Node({loc: [0, 1]}), - c = iD.Node({loc: [1, 0]}), - d = iD.Node({loc: [0.1, 0.1]}), - e = iD.Node({loc: [0.2, 0.1]}), - f = iD.Node({loc: [0.1, 0.2]}), - g = iD.Node({loc: [0, 0]}), - h = iD.Node({loc: [0, -1]}), - i = iD.Node({loc: [-1, 0]}), - outer1 = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - outer2 = iD.Way({nodes: [g.id, h.id, i.id, g.id]}), - inner = iD.Way({nodes: [d.id, e.id, f.id, d.id]}), - r = iD.Relation({members: [ - {id: outer1.id, type: 'way'}, - {id: outer2.id, type: 'way'}, - {id: inner.id, role: 'inner', type: 'way'}]}), - graph = iD.Graph([a, b, c, d, e, f, g, h, i, outer1, outer2, inner, r]); + var a = iD.osmNode({loc: [0, 0]}); + var b = iD.osmNode({loc: [0, 1]}); + var c = iD.osmNode({loc: [1, 0]}); + var d = iD.osmNode({loc: [0.1, 0.1]}); + var e = iD.osmNode({loc: [0.2, 0.1]}); + var f = iD.osmNode({loc: [0.1, 0.2]}); + var g = iD.osmNode({loc: [0, 0]}); + var h = iD.osmNode({loc: [0, -1]}); + var i = iD.osmNode({loc: [-1, 0]}); + var outer1 = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var outer2 = iD.osmWay({nodes: [g.id, h.id, i.id, g.id]}); + var inner = iD.osmWay({nodes: [d.id, e.id, f.id, d.id]}); + var r = iD.osmRelation({members: [ + {id: outer1.id, type: 'way'}, + {id: outer2.id, type: 'way'}, + {id: inner.id, role: 'inner', type: 'way'} + ]}); + var graph = iD.coreGraph([a, b, c, d, e, f, g, h, i, outer1, outer2, inner, r]); expect(r.multipolygon(graph)).to.eql([[[a.loc, b.loc, c.loc, a.loc], [d.loc, e.loc, f.loc, d.loc]], [[g.loc, h.loc, i.loc, g.loc]]]); }); specify('invalid geometry: unmatched inner', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [2, 2]}), - c = iD.Node({loc: [3, 3]}), - w = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), - r = iD.Relation({members: [{id: w.id, role: 'inner', type: 'way'}]}), - g = iD.Graph([a, b, c, w, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [2, 2]}); + var c = iD.osmNode({loc: [3, 3]}); + var w = iD.osmWay({nodes: [a.id, b.id, c.id, a.id]}); + var r = iD.osmRelation({members: [{id: w.id, role: 'inner', type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc, a.loc]]]); }); specify('incomplete relation', function () { - var a = iD.Node({loc: [1, 1]}), - b = iD.Node({loc: [2, 2]}), - c = iD.Node({loc: [3, 3]}), - w1 = iD.Way({nodes: [a.id, b.id, c.id]}), - w2 = iD.Way(), - r = iD.Relation({members: [{id: w2.id, type: 'way'}, {id: w1.id, type: 'way'}]}), - g = iD.Graph([a, b, c, w1, r]); + var a = iD.osmNode({loc: [1, 1]}); + var b = iD.osmNode({loc: [2, 2]}); + var c = iD.osmNode({loc: [3, 3]}); + var w1 = iD.osmWay({nodes: [a.id, b.id, c.id]}); + var w2 = iD.osmWay(); + var r = iD.osmRelation({members: [{id: w2.id, type: 'way'}, {id: w1.id, type: 'way'}]}); + var g = iD.coreGraph([a, b, c, w1, r]); expect(r.multipolygon(g)).to.eql([[[a.loc, b.loc, c.loc]]]); }); @@ -580,17 +732,17 @@ describe('iD.osmRelation', function () { describe('.creationOrder comparator', function () { specify('orders existing relations newest-first', function () { - var a = iD.Relation({ id: 'r1' }), - b = iD.Relation({ id: 'r2' }); - expect(iD.Relation.creationOrder(a, b)).to.be.above(0); - expect(iD.Relation.creationOrder(b, a)).to.be.below(0); + var a = iD.osmRelation({ id: 'r1' }); + var b = iD.osmRelation({ id: 'r2' }); + expect(iD.osmRelation.creationOrder(a, b)).to.be.above(0); + expect(iD.osmRelation.creationOrder(b, a)).to.be.below(0); }); specify('orders new relations newest-first', function () { - var a = iD.Relation({ id: 'r-1' }), - b = iD.Relation({ id: 'r-2' }); - expect(iD.Relation.creationOrder(a, b)).to.be.above(0); - expect(iD.Relation.creationOrder(b, a)).to.be.below(0); + var a = iD.osmRelation({ id: 'r-1' }); + var b = iD.osmRelation({ id: 'r-2' }); + expect(iD.osmRelation.creationOrder(a, b)).to.be.above(0); + expect(iD.osmRelation.creationOrder(b, a)).to.be.below(0); }); }); }); From 520cfd3276266c438006733576ecd14b433880b2 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 6 Feb 2018 14:34:26 -0500 Subject: [PATCH 02/55] Fix bug causing improper calc of from/via/to metadata after trimming This is the part of the algorithm where trivial sections get trimmed from the vgraph. Removing a vertex from `vertexIds` means "stop checking this one". But there were some situations where it could get removed twice, so we now just verify that `vertexId` is actually in the array before calling `splice`. --- modules/osm/intersection.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index a9ca41f69..1f1a6d6ed 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -263,14 +263,18 @@ export function osmIntersection(graph, startVertexId) { vertex = vgraph.hasEntity(vertexId); if (!vertex) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } removeVertexIds.push(vertexId); continue; } parents = vgraph.parentWays(vertex); if (parents.length < 3) { - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } } if (parents.length === 2) { // vertex with 2 parents is trivial @@ -299,7 +303,9 @@ export function osmIntersection(graph, startVertexId) { parents = vgraph.parentWays(vertex); if (parents.length < 2) { // vertex is no longer a key vertex - vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + if (vertexIds.indexOf(vertexId) !== -1) { + vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one + } removeVertexIds.push(vertexId); keepGoing = true; } From aa7925a918b622dfe0f3b29b251858fa4862a363 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 00:07:38 -0500 Subject: [PATCH 03/55] Extend leaf ways, so they don't stop within the viewport --- modules/osm/intersection.js | 28 +++++++++++++++++++++++++++- modules/ui/fields/restrictions.js | 21 ++++++++++++++------- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 1f1a6d6ed..7f918a815 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -10,10 +10,17 @@ import { } from '../actions'; import { coreGraph } from '../core'; -import { geoAngle, geoSphericalDistance } from '../geo'; + +import { + geoAngle, + geoSphericalDistance, + geoVecInterp +} from '../geo'; + import { osmEntity } from './entity'; + export function osmTurn(turn) { if (!(this instanceof osmTurn)) { return new osmTurn(turn); @@ -326,6 +333,25 @@ export function osmIntersection(graph, startVertexId) { .map(function(way) { return vgraph.entity(way.id); }); + // STEP 8: Extend leaf ways + ways.forEach(function(way) { + var n1, n2; + if (way.__via) return; // not a leaf + if (way.__first) { + n1 = vgraph.entity(way.nodes[way.nodes.length - 2]); + n2 = vgraph.entity(way.nodes[way.nodes.length - 1]); + } else { + n1 = vgraph.entity(way.nodes[1]); + n2 = vgraph.entity(way.nodes[0]); + } + + var toLoc = geoVecInterp(n1.loc, n2.loc, 10); // extend 1000% + n2 = n2.move(toLoc); + vgraph = vgraph.replace(n2); + }); + + + // OK! Here is our intersection.. var intersection = { graph: vgraph, diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index e9aa6930f..024c61dc1 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -8,7 +8,15 @@ import { import { t } from '../../util/locale'; import { actionRestrictTurn, actionUnrestrictTurn } from '../../actions'; import { behaviorBreathe, behaviorHover } from '../../behavior'; -import { geoExtent, geoRawMercator } from '../../geo'; + +import { + geoExtent, + geoRawMercator, + geoVecScale, + geoVecSubtract, + geoZoomToScale +} from '../../geo'; + import { osmIntersection, osmInferRestriction, osmTurn, osmWay } from '../../osm'; import { svgLabels, svgLayers, svgLines, svgTurns, svgVertices } from '../../svg'; import { utilRebind } from '../../util/rebind'; @@ -64,20 +72,19 @@ export function uiFieldRestrictions(field, context) { var projection = geoRawMercator(); var d = utilGetDimensions(wrap.merge(enter)); - var c = [d[0] / 2, d[1] / 2]; - var z = intersection.vertices.length === 1 ? 22 : 20; + var c = geoVecScale(d, 0.5); + var z = intersection.vertices.length === 1 ? 22 : 19.5; - projection - .scale(256 * Math.pow(2, z) / (2 * Math.PI)); + projection.scale(geoZoomToScale(z)); // fit extent to include all key vertices for (var i = 0; i < intersection.vertices.length; i++) { extent._extend(intersection.vertices[i].extent()); } - var s = projection(extent.center()); + var center = projection(extent.center()); projection - .translate([c[0] - s[0], c[1] - s[1]]) + .translate(geoVecSubtract(c, center)) .clipExtent([[0, 0], d]); var drawLayers = svgLayers(projection, context).only('osm').dimensions(d); From 1007cfe2527d6a5fa8fa6b3568c00889e4fe62e7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 01:10:26 -0500 Subject: [PATCH 04/55] Better calculation for fitting the whole intersection into view --- modules/ui/fields/restrictions.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 024c61dc1..7a6f50ffd 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -68,23 +68,38 @@ export function uiFieldRestrictions(field, context) { var vgraph = intersection.graph; var filter = utilFunctor(true); - var extent = geoExtent(); var projection = geoRawMercator(); var d = utilGetDimensions(wrap.merge(enter)); var c = geoVecScale(d, 0.5); - var z = intersection.vertices.length === 1 ? 22 : 19.5; + var z = 22; projection.scale(geoZoomToScale(z)); - // fit extent to include all key vertices + // Calculate extent of all key vertices + var extent = geoExtent(); for (var i = 0; i < intersection.vertices.length; i++) { extent._extend(intersection.vertices[i].extent()); } - var center = projection(extent.center()); + // If this is a large intersection, adjust zoom to fit extent + if (intersection.vertices.length > 1) { + var padding = 220; + var tl = projection([extent[0][0], extent[1][1]]); + var br = projection([extent[1][0], extent[0][1]]); + var hFactor = (br[0] - tl[0]) / (d[0] - padding); + var vFactor = (br[1] - tl[1]) / (d[1] - padding); + var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2; + var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2; + z = z - Math.max(hZoomDiff, vZoomDiff); + projection.scale(geoZoomToScale(z)); + } + + var padTop = 30; + var extentCenter = projection(extent.center()); + extentCenter[1] = extentCenter[1] - padTop; projection - .translate(geoVecSubtract(c, center)) + .translate(geoVecSubtract(c, extentCenter)) .clipExtent([[0, 0], d]); var drawLayers = svgLayers(projection, context).only('osm').dimensions(d); From 5ca56b68734ad1e6411721259dfb1da4cc25ff9a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 01:16:14 -0500 Subject: [PATCH 05/55] Handle situation where nodes have no `loc` (like in tests) --- modules/osm/intersection.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 7f918a815..bb89efea3 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -345,9 +345,11 @@ export function osmIntersection(graph, startVertexId) { n2 = vgraph.entity(way.nodes[0]); } - var toLoc = geoVecInterp(n1.loc, n2.loc, 10); // extend 1000% - n2 = n2.move(toLoc); - vgraph = vgraph.replace(n2); + if (n1.loc && n2.loc) { + var toLoc = geoVecInterp(n1.loc, n2.loc, 10); // extend 1000% + n2 = n2.move(toLoc); + vgraph = vgraph.replace(n2); + } }); From ea4ac80fee36580c878f8086c27c0eae8bf40b71 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 09:27:54 -0500 Subject: [PATCH 06/55] Extend max distance to 30m, but as measured from starting vertex --- modules/osm/intersection.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index bb89efea3..7b97f9af0 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -30,8 +30,8 @@ export function osmTurn(turn) { export function osmIntersection(graph, startVertexId) { - var vgraph = coreGraph(), // virtual graph - i, j, k; + var vgraph = coreGraph(); // virtual graph + var i, j, k; function memberOfRestriction(entity) { @@ -63,8 +63,9 @@ export function osmIntersection(graph, startVertexId) { } - var distCutoff = 20; // meters - var checkVertices = [graph.entity(startVertexId)]; + var distCutoff = 30; // meters + var startNode = graph.entity(startVertexId); + var checkVertices = [startNode]; var checkWays; var vertices = []; var vertexIds = []; @@ -107,7 +108,8 @@ export function osmIntersection(graph, startVertexId) { node = nodes[j]; if (node === vertex) continue; // same thing if (vertices.indexOf(node) !== -1) continue; // seen it already - if (node.loc && vertex.loc && geoSphericalDistance(node.loc, vertex.loc) > distCutoff) continue; // too far + if (node.loc && startNode.loc && + geoSphericalDistance(node.loc, startNode.loc) > distCutoff) continue; // too far from start // a key vertex will have parents that are also roads var hasParents = false; @@ -333,7 +335,7 @@ export function osmIntersection(graph, startVertexId) { .map(function(way) { return vgraph.entity(way.id); }); - // STEP 8: Extend leaf ways + // STEP 8: Extend leaf ways, so they don't end within the viewer ways.forEach(function(way) { var n1, n2; if (way.__via) return; // not a leaf @@ -345,7 +347,7 @@ export function osmIntersection(graph, startVertexId) { n2 = vgraph.entity(way.nodes[0]); } - if (n1.loc && n2.loc) { + if (n1.loc && n2.loc && vgraph.parentWays(n2).length === 1) { var toLoc = geoVecInterp(n1.loc, n2.loc, 10); // extend 1000% n2 = n2.move(toLoc); vgraph = vgraph.replace(n2); @@ -383,7 +385,7 @@ export function osmIntersection(graph, startVertexId) { if (!start || !(start.__from || start.__via)) return []; var maxPathLength = 7; // from-*-via-*-via-*-to (2 vias max) - var maxStepDist = 20; // meters + var maxStepDist = 30; // meters var turns = []; step(start); From cf1226ca33d27100ec42b1611713d874bd4343f1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 17:00:22 -0500 Subject: [PATCH 07/55] Better calc of turn arrow placmenet along short segments --- modules/svg/turns.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 77c413563..62c43aa03 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -1,4 +1,4 @@ -import { geoAngle } from '../geo/index'; +import { geoAngle, geoVecLength } from '../geo'; export function svgTurns(projection) { @@ -67,7 +67,9 @@ export function svgTurns(projection) { var v = graph.entity(turn.to.vertex); var a = geoAngle(v, t, projection); var p = projection(v.loc); - var r = turn.u ? 0 : 60; + var q = projection(t.loc); + var mid = geoVecLength(p, q) / 2; + var r = turn.u ? 0 : Math.min(mid, 60); return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; From 3c340a0362d64920d29a2a1490e3e75161b1ea5d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 17:00:53 -0500 Subject: [PATCH 08/55] Trying out more intuitive restriction help message - includes in the message the names of the streets - also highlights related segments and nodes along the path The messages are currently a bit rough: U-Turns FROM Black Horse Pike IS allowed... VIA Main Street TO Black Horse Pike --- css/80_app.css | 11 +- modules/ui/fields/restrictions.js | 283 ++++++++++++++++++++---------- 2 files changed, 203 insertions(+), 91 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 275bd7e2a..78792e46a 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1852,10 +1852,19 @@ input[type=number] { right: 0; padding: 2px 6px; background-color: rgba(255, 255, 255, .8); - color: #999; + color: #888; text-align: center; } +.form-field-restrictions .restriction-help span { + margin: 2px; +} + +.form-field-restrictions .restriction-help span.qualifier { + color: #666; + font-weight: bold; +} + /* Changeset editor while comment text is empty */ .form-field-comment:not(.present) #preset-input-comment { diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 7a6f50ffd..81df760e8 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -17,24 +17,48 @@ import { geoZoomToScale } from '../../geo'; -import { osmIntersection, osmInferRestriction, osmTurn, osmWay } from '../../osm'; -import { svgLabels, svgLayers, svgLines, svgTurns, svgVertices } from '../../svg'; -import { utilRebind } from '../../util/rebind'; -import { utilFunctor } from '../../util'; -import { utilGetDimensions, utilSetDimensions } from '../../util/dimensions'; +import { + osmIntersection, + osmInferRestriction, + osmTurn, + osmWay +} from '../../osm'; + +import { + svgLayers, + svgLines, + svgTurns, + svgVertices +} from '../../svg'; + +import { + utilDisplayName, + utilDisplayType, + utilEntitySelector, + utilFunctor, + utilRebind +} from '../../util'; + +import { + utilGetDimensions, + utilSetDimensions +} from '../../util/dimensions'; export function uiFieldRestrictions(field, context) { var dispatch = d3_dispatch('change'); var breathe = behaviorBreathe(context); var hover = behaviorHover(context); - var initialized = false; - var graph; - var vertexID; - var fromWayID; + + var _initialized = false; + var _wrap = d3_select(null); + var _graph; + var _vertexID; + var _intersection; + var _fromWayID; - function restrictions(selection, intersection) { + function restrictions(selection) { // if form field is hidden or has detached from dom, clean up. if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode || !selection.node().parentNode.parentNode) { @@ -42,35 +66,42 @@ export function uiFieldRestrictions(field, context) { return; } - // try to reuse the intersection, but always rebuild it if the graph has changed - if (context.graph() !== graph || !intersection) { - graph = context.graph(); - intersection = osmIntersection(graph, vertexID); - } - var ok = (intersection.vertices.length && intersection.ways.length); - var wrap = selection.selectAll('.preset-input-wrap') - .data(ok ? [0] : []); + .data([0]); - wrap.exit() - .remove(); - - var enter = wrap.enter() + _wrap = wrap.enter() .append('div') - .attr('class', 'preset-input-wrap'); + .attr('class', 'preset-input-wrap') + .merge(wrap); - enter + var help = _wrap.selectAll('.restriction-help') + .data([0]); + + help.enter() .append('div') .attr('class', 'restriction-help'); - // hack: no actual intersection exists here, just dont show the field - if (!ok) return; - var vgraph = intersection.graph; + // try to reuse the intersection, but always rebuild it if the graph has changed + if (context.graph() !== _graph || !_intersection) { + _graph = context.graph(); + _intersection = osmIntersection(_graph, _vertexID); + } + var ok = (_intersection.vertices.length && _intersection.ways.length); + + _wrap + .call(renderViewer); + } + + + function renderViewer(selection) { + if (!_intersection) return; + + var vgraph = _intersection.graph; var filter = utilFunctor(true); var projection = geoRawMercator(); - var d = utilGetDimensions(wrap.merge(enter)); + var d = utilGetDimensions(_wrap); var c = geoVecScale(d, 0.5); var z = 22; @@ -78,12 +109,12 @@ export function uiFieldRestrictions(field, context) { // Calculate extent of all key vertices var extent = geoExtent(); - for (var i = 0; i < intersection.vertices.length; i++) { - extent._extend(intersection.vertices[i].extent()); + for (var i = 0; i < _intersection.vertices.length; i++) { + extent._extend(_intersection.vertices[i].extent()); } // If this is a large intersection, adjust zoom to fit extent - if (intersection.vertices.length > 1) { + if (_intersection.vertices.length > 1) { var padding = 220; var tl = projection([extent[0][0], extent[1][1]]); var br = projection([extent[1][0], extent[0][1]]); @@ -95,9 +126,10 @@ export function uiFieldRestrictions(field, context) { projection.scale(geoZoomToScale(z)); } - var padTop = 30; + var padTop = 30; // reserve top space for hints var extentCenter = projection(extent.center()); extentCenter[1] = extentCenter[1] - padTop; + projection .translate(geoVecSubtract(c, extentCenter)) .clipExtent([[0, 0], d]); @@ -105,30 +137,39 @@ export function uiFieldRestrictions(field, context) { var drawLayers = svgLayers(projection, context).only('osm').dimensions(d); var drawVertices = svgVertices(projection, context); var drawLines = svgLines(projection, context); - // var drawLabels = svgLabels(projection, context, true); var drawTurns = svgTurns(projection, context); - enter + var firstTime = selection.selectAll('.surface').empty(); + + selection .call(drawLayers); - wrap = wrap - .merge(enter); + var surface = selection.selectAll('.surface'); - var surface = wrap.selectAll('.surface'); + if (firstTime) { + _initialized = true; - if (!enter.empty()) { - initialized = true; surface .call(breathe) .call(hover); + +// entity editor will redraw all fields anyway? + // context.history() + // .on('change.restrictions', redraw); + + d3_select(window) + .on('resize.restrictions', function() { + utilSetDimensions(_wrap, null); + redraw(); + }); } + surface .call(utilSetDimensions, d) - .call(drawVertices, vgraph, intersection.vertices, filter, extent, z) - .call(drawLines, vgraph, intersection.ways, filter) - // .call(drawLabels, vgraph, intersection.ways, filter, d, true) - .call(drawTurns, vgraph, intersection.turns(fromWayID)); + .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z) + .call(drawLines, vgraph, _intersection.ways, filter) + .call(drawTurns, vgraph, _intersection.turns(_fromWayID)); surface .on('click.restrictions', click) @@ -139,23 +180,14 @@ export function uiFieldRestrictions(field, context) { .selectAll('.selected') .classed('selected', false); - if (fromWayID) { + if (_fromWayID) { surface - .selectAll('.' + fromWayID) + .selectAll('.' + _fromWayID) .classed('selected', true); } mouseout(); - context.history() - .on('change.restrictions', render); - - d3_select(window) - .on('resize.restrictions', function() { - utilSetDimensions(wrap, null); - render(); - }); - function click() { surface @@ -169,18 +201,18 @@ export function uiFieldRestrictions(field, context) { } if (datum instanceof osmWay && (datum.__from || datum.__via)) { - fromWayID = datum.id; - render(); + _fromWayID = datum.id; + redraw(); } else if (datum instanceof osmTurn) { var actions; if (datum.restriction) { - actions = intersection.actions.concat([ + actions = _intersection.actions.concat([ actionUnrestrictTurn(datum, projection), t('operations.restriction.annotation.delete') ]); } else { - actions = intersection.actions.concat([ + actions = _intersection.actions.concat([ actionRestrictTurn(datum, projection), t('operations.restriction.annotation.create') ]); @@ -188,40 +220,96 @@ export function uiFieldRestrictions(field, context) { context.perform.apply(context, actions); } else { - fromWayID = null; - render(); + _fromWayID = null; + redraw(); } } function mouseover() { + var help = _wrap.selectAll('.restriction-help').html(''); + var div, d; + var datum = d3_event.target.__data__; var entity = datum && datum.properties && datum.properties.entity; if (entity) { datum = entity; } + surface.selectAll('.related') + .classed('related', false); + if (datum instanceof osmWay) { - wrap.selectAll('.restriction-help') - .text(datum.id); + d = display(vgraph.entity(datum.id), vgraph); + div = help.append('div'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); } else if (datum instanceof osmTurn) { + surface.selectAll(utilEntitySelector(datum.key.split(','))) + .classed('related', true); - //DEBUG - var str = ''; + var turnType = { + 'no_left_turn': 'Left Turns', + 'no_right_turn': 'Right Turns', + 'no_u_turn': 'U-Turns', + 'no_straight_on': 'Continuing' + }[osmInferRestriction(vgraph, datum.from, datum.to, projection)]; + + var restrictType = 'IS'; if (datum.restriction) { - if (datum.only) { str += 'ONLY_ '; } - if (datum.direct) { str += 'NO_ '; } - if (datum.indirect) { str += 'indirect '; } - str += datum.restriction; + if (datum.only) { restrictType = 'IS ONLY'; } + if (datum.direct) { restrictType = 'IS NOT'; } + if (datum.indirect) { restrictType = 'IS NOT '; } } - str += ' FROM ' + datum.from.way + - ' VIA ' + (datum.via.node || datum.via.ways.join(',')) + - ' TO ' + datum.to.way; - wrap.selectAll('.restriction-help') - .text(str); + d = display(vgraph.entity(datum.from.way), vgraph); + div = help.append('div'); + div.append('span').text(turnType); + // div.append('span').text('Travel'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); + div.append('span').attr('class', 'qualifier').text(restrictType); + div.append('span').text('allowed...'); + + div = help.append('div'); + + if (datum.via.ways) { + div = help.append('div'); + div.append('span').attr('class', 'qualifier').text('VIA'); + + var curr, prev; + for (var i = 0; i < datum.via.ways.length; i++) { + d = display(vgraph.entity(datum.via.ways[i]), vgraph); + curr = d.name || d.type; + if (curr === prev) continue; // collapse identical names + + if (prev) div.append('span').text(','); + div.append('span').text(curr); + prev = curr; + } + } + d = display(vgraph.entity(datum.to.way), vgraph); + div.append('span').attr('class', 'qualifier').text('TO'); + div.append('span').text(d.name || d.type); + + + //DEBUG + // var str = ''; + // if (datum.restriction) { + // if (datum.only) { str += 'ONLY_ '; } + // if (datum.direct) { str += 'NO_ '; } + // if (datum.indirect) { str += 'indirect '; } + // str += datum.restriction; + // } + + // str += ' FROM ' + datum.from.way + + // ' VIA ' + (datum.via.node || datum.via.ways.join(',')) + + // ' TO ' + datum.to.way; + + // _wrap.selectAll('.restriction-help') + // .text(str); // return; // var presets = context.presets(), @@ -240,7 +328,7 @@ export function uiFieldRestrictions(field, context) { // ); // } - // wrap.selectAll('.restriction-help') + // _wrap.selectAll('.restriction-help') // .text(t('operations.restriction.help.' + // (datum.restriction ? 'toggle_off' : 'toggle_on'), // { restriction: preset.name() }) @@ -250,34 +338,49 @@ export function uiFieldRestrictions(field, context) { function mouseout() { + var help = _wrap.selectAll('.restriction-help').html(''); + var div = help.append('div'); + var d; + + if (_fromWayID) { + d = display(vgraph.entity(_fromWayID), vgraph); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); - if (fromWayID) { - wrap.selectAll('.restriction-help') - .text('FROM ' + fromWayID); } else { - wrap.selectAll('.restriction-help') - .text('Click to select the FROM way'); + div.append('span').text('Click to select the'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text('way'); } - // wrap.selectAll('.restriction-help') + // _wrap.selectAll('.restriction-help') // .text(t('operations.restriction.help.' + - // (fromWayID ? 'toggle' : 'select')) + // (_fromWayID ? 'toggle' : 'select')) // ); } - function render() { - if (context.hasEntity(vertexID)) { - restrictions(selection, intersection); + function redraw() { + if (context.hasEntity(_vertexID)) { + _wrap.call(renderViewer); } } } + function display(entity, graph) { + var name = utilDisplayName(entity) || ''; + var matched = context.presets().match(entity, graph); + var type = (matched && matched.name()) || utilDisplayType(entity.id); + return { name: name, type: type }; + } + + restrictions.entity = function(_) { - if (!vertexID || vertexID !== _.id) { - fromWayID = null; - vertexID = _.id; + if (!_vertexID || _vertexID !== _.id) { + _intersection = null; + _fromWayID = null; + _vertexID = _.id; } }; @@ -287,7 +390,7 @@ export function uiFieldRestrictions(field, context) { restrictions.off = function(selection) { - if (!initialized) return; + if (!_initialized) return; selection.selectAll('.surface') .call(hover.off) @@ -296,8 +399,8 @@ export function uiFieldRestrictions(field, context) { .on('mouseover.restrictions', null) .on('mouseout.restrictions', null); - context.history() - .on('change.restrictions', null); + // context.history() + // .on('change.restrictions', null); d3_select(window) .on('resize.restrictions', null); From 0cbff57dc9ac12d54c33e043f40416168496b3dd Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 7 Feb 2018 19:04:28 -0500 Subject: [PATCH 09/55] Cycle through `only_` turn restriction states (re: #2622) --- modules/actions/restrict_turn.js | 11 +++-------- modules/actions/unrestrict_turn.js | 8 ++++---- modules/osm/intersection.js | 2 +- modules/ui/fields/restrictions.js | 23 +++++++++++++++++----- test/spec/actions/unrestrict_turn.js | 29 +++++++++++++--------------- test/spec/osm/intersection.js | 6 +++--- 6 files changed, 42 insertions(+), 37 deletions(-) diff --git a/modules/actions/restrict_turn.js b/modules/actions/restrict_turn.js index df45ece81..60284c381 100644 --- a/modules/actions/restrict_turn.js +++ b/modules/actions/restrict_turn.js @@ -27,7 +27,7 @@ import { // Normally, this will be undefined and the relation will automatically // be assigned a new ID. // -export function actionRestrictTurn(turn, projection, restrictionId) { +export function actionRestrictTurn(turn, projection, restrictionID) { return function(graph) { var fromWay = graph.entity(turn.from.way); @@ -49,15 +49,10 @@ export function actionRestrictTurn(turn, projection, restrictionId) { members.push({ id: toWay.id, type: 'way', role: 'to' }); return graph.replace(osmRelation({ - id: restrictionId, + id: restrictionID, tags: { type: 'restriction', - restriction: turn.restriction || - osmInferRestriction( - graph, - turn.from, - turn.to, - projection) + restriction: turn.restriction || osmInferRestriction(graph, turn.from, turn.to, projection) }, members: members })); diff --git a/modules/actions/unrestrict_turn.js b/modules/actions/unrestrict_turn.js index 3e0a794c5..4210b3a7b 100644 --- a/modules/actions/unrestrict_turn.js +++ b/modules/actions/unrestrict_turn.js @@ -8,19 +8,19 @@ import { actionDeleteRelation } from './delete_relation'; // from: { node: , way: }, // via: { node: }, // to: { node: , way: }, -// restriction: +// restrictionID: // } // -// In the simple case, `restriction` is a reference to a `no_*` restriction +// In the simple case, `restrictionID` is a reference to a `no_*` restriction // on the turn itself. In this case, it is simply deleted. // -// The more complex case is where `restriction` references an `only_*` +// The more complex case is where `restrictionID` references an `only_*` // restriction on a different turn in the same intersection. In that case, // that restriction is also deleted, but at the same time restrictions on // the turns other than the first two are created. // export function actionUnrestrictTurn(turn) { return function(graph) { - return actionDeleteRelation(turn.restriction)(graph); + return actionDeleteRelation(turn.restrictionID)(graph); }; } diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 7b97f9af0..236fa9c5f 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -471,7 +471,7 @@ export function osmIntersection(graph, startVertexId) { var turn = pathToTurn(currPath); if (turn) { if (matchedRestriction) { - turn.restriction = matchedRestriction.id; + turn.restrictionID = matchedRestriction.id; turn.only = matchedRestriction.only; turn.direct = matchedRestriction.direct; turn.indirect = matchedRestriction.indirect; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 81df760e8..8ea0b5b95 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -1,3 +1,5 @@ +import _cloneDeep from 'lodash-es/cloneDeep'; + import { dispatch as d3_dispatch } from 'd3-dispatch'; import { @@ -206,7 +208,18 @@ export function uiFieldRestrictions(field, context) { } else if (datum instanceof osmTurn) { var actions; - if (datum.restriction) { + datum.restriction = osmInferRestriction(vgraph, datum.from, datum.to, projection); + + if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state + var datumOnly = _cloneDeep(datum); + datumOnly.only = true; + datumOnly.restriction = datumOnly.restriction.replace(/^no\_/, 'only_'); + actions = _intersection.actions.concat([ + actionUnrestrictTurn(datum, projection), + actionRestrictTurn(datumOnly, projection), + t('operations.restriction.annotation.create') + ]); + } else if (datum.restrictionID) { actions = _intersection.actions.concat([ actionUnrestrictTurn(datum, projection), t('operations.restriction.annotation.delete') @@ -250,14 +263,14 @@ export function uiFieldRestrictions(field, context) { .classed('related', true); var turnType = { - 'no_left_turn': 'Left Turns', - 'no_right_turn': 'Right Turns', - 'no_u_turn': 'U-Turns', + 'no_left_turn': 'Left Turn', + 'no_right_turn': 'Right Turn', + 'no_u_turn': 'U-Turn', 'no_straight_on': 'Continuing' }[osmInferRestriction(vgraph, datum.from, datum.to, projection)]; var restrictType = 'IS'; - if (datum.restriction) { + if (datum.restrictionID) { if (datum.only) { restrictType = 'IS ONLY'; } if (datum.direct) { restrictType = 'IS NOT'; } if (datum.indirect) { restrictType = 'IS NOT '; } diff --git a/test/spec/actions/unrestrict_turn.js b/test/spec/actions/unrestrict_turn.js index 991439da8..9ab094c6e 100644 --- a/test/spec/actions/unrestrict_turn.js +++ b/test/spec/actions/unrestrict_turn.js @@ -1,24 +1,21 @@ describe('iD.actionUnrestrictTurn', function() { it('removes a restriction from a restricted turn', function() { // u====*--->w - var graph = iD.Graph([ - iD.Node({id: 'u'}), - iD.Node({id: '*'}), - iD.Node({id: 'w'}), - iD.Way({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - iD.Way({id: '-', nodes: ['*', 'w'], tags: {highway: 'residential'}}), - iD.Relation({id: 'r', tags: {type: 'restriction'}, members: [ - {id: '=', role: 'from', type: 'way'}, - {id: '-', role: 'to', type: 'way'}, - {id: '*', role: 'via', type: 'node'} - ]}) - ]), - action = iD.actionUnrestrictTurn({ - restriction: 'r' - }); + var graph = iD.coreGraph([ + iD.osmNode({ id: 'u' }), + iD.osmNode({ id: '*' }), + iD.osmNode({ id: 'w' }), + iD.osmWay({ id: '=', nodes: ['u', '*'], tags: { highway: 'residential' } }), + iD.osmWay({ id: '-', nodes: ['*', 'w'], tags: { highway: 'residential' } }), + iD.osmRelation({ id: 'r', tags: { type: 'restriction' }, members: [ + { id: '=', role: 'from', type: 'way' }, + { id: '-', role: 'to', type: 'way' }, + { id: '*', role: 'via', type: 'node' } + ]}) + ]); + var action = iD.actionUnrestrictTurn({ restrictionID: 'r' }); graph = action(graph); - expect(graph.hasEntity('r')).to.be.undefined; }); }); diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index a0a3818e4..e27772754 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -338,7 +338,7 @@ describe('iD.osmIntersection', function() { expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); expect(turns[1].key).to.eql('=,*,-'); expect(turns[1].u).to.be.not.ok; - expect(turns[1].restriction).to.eql('r'); + expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].direct).to.be.true; expect(turns[1].indirect).to.be.not.ok; expect(turns[1].only).to.be.not.ok; @@ -372,7 +372,7 @@ describe('iD.osmIntersection', function() { expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); expect(turns[1].key).to.eql('=,*,~'); - expect(turns[1].restriction).to.eql('r'); + expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].u).to.be.not.ok; expect(turns[1].direct).to.be.not.ok; expect(turns[1].indirect).to.be.true; @@ -380,7 +380,7 @@ describe('iD.osmIntersection', function() { expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); expect(turns[2].key).to.eql('=,*,-'); - expect(turns[2].restriction).to.eql('r'); + expect(turns[2].restrictionID).to.eql('r'); expect(turns[2].u).to.be.not.ok; expect(turns[2].direct).to.be.not.ok; expect(turns[2].indirect).to.be.not.ok; From 47eb5256cc85e2025e4c7d68e8f389f742a49e8f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 9 Feb 2018 16:22:49 -0500 Subject: [PATCH 10/55] WIP: add detail slider to restriction editor --- css/80_app.css | 12 +++-- modules/osm/intersection.js | 13 ++++- modules/ui/fields/restrictions.js | 82 ++++++++++++++++++++++--------- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 78792e46a..e851b66ec 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1834,7 +1834,11 @@ input[type=number] { /* Restrictions editor */ -.form-field-restrictions .preset-input-wrap { +.form-field-restrictions .restriction-detail { + height: 30px; +} + +.form-field-restrictions .restriction-container { position: relative; height: 400px; } @@ -1844,7 +1848,7 @@ input[type=number] { height: 100%; } -.form-field-restrictions .restriction-help { +.restriction-container .restriction-help { z-index: 1; position: absolute; top: 0; @@ -1856,11 +1860,11 @@ input[type=number] { text-align: center; } -.form-field-restrictions .restriction-help span { +.restriction-help span { margin: 2px; } -.form-field-restrictions .restriction-help span.qualifier { +.restriction-help span.qualifier { color: #666; font-weight: bold; } diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 236fa9c5f..6947e1240 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -29,7 +29,12 @@ export function osmTurn(turn) { } -export function osmIntersection(graph, startVertexId) { +// +// detail = 0 - via node only +// detail = 1 - via node / 1 via way +// detail = 2 - via node / up to 2 via ways +// +export function osmIntersection(graph, startVertexId, detail) { var vgraph = coreGraph(); // virtual graph var i, j, k; @@ -101,6 +106,7 @@ export function osmIntersection(graph, startVertexId) { ways.push(way); // it's a road, or it's already in a turn restriction hasWays = true; + if (!detail) continue; // check the way's children for more key vertices nodes = _uniq(graph.childNodes(way)); @@ -384,7 +390,10 @@ export function osmIntersection(graph, startVertexId) { var start = vgraph.entity(fromWayId); if (!start || !(start.__from || start.__via)) return []; - var maxPathLength = 7; // from-*-via-*-via-*-to (2 vias max) + // detail=0 from-*-to (0 vias) + // detail=1 from-*-via-*-to (1 via max) + // detail=2 from-*-via-*-via-*-to (2 vias max) + var maxPathLength = (detail * 2) + 3; var maxStepDist = 30; // meters var turns = []; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 8ea0b5b95..1ce8d6c12 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -52,8 +52,9 @@ export function uiFieldRestrictions(field, context) { var breathe = behaviorBreathe(context); var hover = behaviorHover(context); + var _detail = 0; var _initialized = false; - var _wrap = d3_select(null); + var _container = d3_select(null); var _graph; var _vertexID; var _intersection; @@ -71,27 +72,72 @@ export function uiFieldRestrictions(field, context) { var wrap = selection.selectAll('.preset-input-wrap') .data([0]); - _wrap = wrap.enter() + wrap = wrap.enter() .append('div') .attr('class', 'preset-input-wrap') .merge(wrap); - var help = _wrap.selectAll('.restriction-help') + var detailEnter = wrap.selectAll('.restriction-detail') + .data([0]) + .enter() + .append('div') + .attr('class', 'restriction-detail'); + + detailEnter + .append('span') + .attr('class', 'restriction-detail-label') + .text('Max Detail: '); + + detailEnter + .append('input') + .attr('class', 'restriction-detail-input') + .attr('type', 'range') + .attr('min', '0') + .attr('max', '2') + .attr('step', '1') + .on('input', function(d) { + var val = d3_select(this).property('value'); + _detail = +val; + _intersection = null; + _container.selectAll('.layer-osm *').remove(); + selection.call(restrictions); + }); + + detailEnter + .append('span') + .attr('class', 'restriction-detail-text'); + + // update + wrap.selectAll('.restriction-detail-input') + .property('value', _detail); + + var t = ['via node only', 'via 1 way', 'via 2 ways']; + wrap.selectAll('.restriction-detail-text') + .text(t[_detail]); + + + var container = wrap.selectAll('.restriction-container') .data([0]); - help.enter() + var containerEnter = container.enter() + .append('div') + .attr('class', 'restriction-container'); + + containerEnter .append('div') .attr('class', 'restriction-help'); + _container = containerEnter + .merge(container); // try to reuse the intersection, but always rebuild it if the graph has changed if (context.graph() !== _graph || !_intersection) { _graph = context.graph(); - _intersection = osmIntersection(_graph, _vertexID); + _intersection = osmIntersection(_graph, _vertexID, _detail); } var ok = (_intersection.vertices.length && _intersection.ways.length); - _wrap + _container .call(renderViewer); } @@ -103,7 +149,7 @@ export function uiFieldRestrictions(field, context) { var filter = utilFunctor(true); var projection = geoRawMercator(); - var d = utilGetDimensions(_wrap); + var d = utilGetDimensions(_container); var c = geoVecScale(d, 0.5); var z = 22; @@ -155,18 +201,13 @@ export function uiFieldRestrictions(field, context) { .call(breathe) .call(hover); -// entity editor will redraw all fields anyway? - // context.history() - // .on('change.restrictions', redraw); - d3_select(window) .on('resize.restrictions', function() { - utilSetDimensions(_wrap, null); + utilSetDimensions(_container, null); redraw(); }); } - surface .call(utilSetDimensions, d) .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z) @@ -240,7 +281,7 @@ export function uiFieldRestrictions(field, context) { function mouseover() { - var help = _wrap.selectAll('.restriction-help').html(''); + var help = _container.selectAll('.restriction-help').html(''); var div, d; var datum = d3_event.target.__data__; @@ -321,7 +362,7 @@ export function uiFieldRestrictions(field, context) { // ' VIA ' + (datum.via.node || datum.via.ways.join(',')) + // ' TO ' + datum.to.way; - // _wrap.selectAll('.restriction-help') + // _container.selectAll('.restriction-help') // .text(str); // return; @@ -341,7 +382,7 @@ export function uiFieldRestrictions(field, context) { // ); // } - // _wrap.selectAll('.restriction-help') + // _container.selectAll('.restriction-help') // .text(t('operations.restriction.help.' + // (datum.restriction ? 'toggle_off' : 'toggle_on'), // { restriction: preset.name() }) @@ -351,7 +392,7 @@ export function uiFieldRestrictions(field, context) { function mouseout() { - var help = _wrap.selectAll('.restriction-help').html(''); + var help = _container.selectAll('.restriction-help').html(''); var div = help.append('div'); var d; @@ -366,7 +407,7 @@ export function uiFieldRestrictions(field, context) { div.append('span').text('way'); } - // _wrap.selectAll('.restriction-help') + // _container.selectAll('.restriction-help') // .text(t('operations.restriction.help.' + // (_fromWayID ? 'toggle' : 'select')) // ); @@ -375,7 +416,7 @@ export function uiFieldRestrictions(field, context) { function redraw() { if (context.hasEntity(_vertexID)) { - _wrap.call(renderViewer); + _container.call(renderViewer); } } } @@ -412,9 +453,6 @@ export function uiFieldRestrictions(field, context) { .on('mouseover.restrictions', null) .on('mouseout.restrictions', null); - // context.history() - // .on('change.restrictions', null); - d3_select(window) .on('resize.restrictions', null); }; From 3bd8d8d43d839a40c216e05ba5beca0544c24420 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 9 Feb 2018 17:39:36 -0500 Subject: [PATCH 11/55] Style tweaks, persist max detail to localstorage --- css/80_app.css | 7 +++++++ modules/ui/fields/restrictions.js | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index e851b66ec..8a251a902 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1835,9 +1835,16 @@ input[type=number] { /* Restrictions editor */ .form-field-restrictions .restriction-detail { + padding: 5px 10px; + background-color: #fff; height: 30px; } +.restriction-detail input { + margin: 0px 10px; + vertical-align: middle; +} + .form-field-restrictions .restriction-container { position: relative; height: 400px; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 1ce8d6c12..56809ac5d 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -51,8 +51,9 @@ export function uiFieldRestrictions(field, context) { var dispatch = d3_dispatch('change'); var breathe = behaviorBreathe(context); var hover = behaviorHover(context); + var storedDetail = context.storage('turn-restriction-detail'); - var _detail = 0; + var _detail = storedDetail !== null ? (+storedDetail) : 0; var _initialized = false; var _container = d3_select(null); var _graph; @@ -95,11 +96,12 @@ export function uiFieldRestrictions(field, context) { .attr('min', '0') .attr('max', '2') .attr('step', '1') - .on('input', function(d) { + .on('input', function() { var val = d3_select(this).property('value'); _detail = +val; _intersection = null; _container.selectAll('.layer-osm *').remove(); + context.storage('turn-restriction-detail', _detail); selection.call(restrictions); }); @@ -135,6 +137,7 @@ export function uiFieldRestrictions(field, context) { _graph = context.graph(); _intersection = osmIntersection(_graph, _vertexID, _detail); } + var ok = (_intersection.vertices.length && _intersection.ways.length); _container @@ -208,6 +211,13 @@ export function uiFieldRestrictions(field, context) { }); } + + // This can happen if we've lowered the detail while a FROM way + // is selected, and that way is no longer part of the intersection. + if (_fromWayID && !vgraph.hasEntity(_fromWayID)) { + _fromWayID = null; + } + surface .call(utilSetDimensions, d) .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z) From 4e1bafc22132d61ae51b2aa278d508174b4ab997 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 9 Feb 2018 17:58:06 -0500 Subject: [PATCH 12/55] Trying help text with color hint --- css/80_app.css | 9 +++++++++ modules/ui/fields/restrictions.js | 28 +++++++++++++++------------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 8a251a902..7af6387bb 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1875,6 +1875,15 @@ input[type=number] { color: #666; font-weight: bold; } +.restriction-help span.qualifier.allow { + color: #8cd05f; +} +.restriction-help span.qualifier.restrict { + color: #e06d5f; +} +.restriction-help span.qualifier.only { + color: #7092ff; +} /* Changeset editor while comment text is empty */ diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 56809ac5d..8efba00cb 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -320,24 +320,29 @@ export function uiFieldRestrictions(field, context) { 'no_straight_on': 'Continuing' }[osmInferRestriction(vgraph, datum.from, datum.to, projection)]; - var restrictType = 'IS'; + var restrictType = ''; + var klass = 'allow'; if (datum.restrictionID) { - if (datum.only) { restrictType = 'IS ONLY'; } - if (datum.direct) { restrictType = 'IS NOT'; } - if (datum.indirect) { restrictType = 'IS NOT '; } + if (datum.direct) { restrictType = 'NO'; klass = 'restrict'; } + if (datum.indirect) { restrictType = 'NO'; klass = 'restrict'; } + if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } } + var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); - d = display(vgraph.entity(datum.from.way), vgraph); div = help.append('div'); - div.append('span').text(turnType); - // div.append('span').text('Travel'); + div.append('span') + .attr('class', 'qualifier ' + klass) + .text(s); + + div = help.append('div'); + d = display(vgraph.entity(datum.from.way), vgraph); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); - div.append('span').attr('class', 'qualifier').text(restrictType); - div.append('span').text('allowed...'); - div = help.append('div'); + d = display(vgraph.entity(datum.to.way), vgraph); + div.append('span').attr('class', 'qualifier').text('TO'); + div.append('span').text(d.name || d.type); if (datum.via.ways) { div = help.append('div'); @@ -354,9 +359,6 @@ export function uiFieldRestrictions(field, context) { prev = curr; } } - d = display(vgraph.entity(datum.to.way), vgraph); - div.append('span').attr('class', 'qualifier').text('TO'); - div.append('span').text(d.name || d.type); //DEBUG From 957896656aadacd64817ecef8da189f162ae15e4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 9 Feb 2018 22:11:22 -0500 Subject: [PATCH 13/55] Detail slider affects turns, but not geometry (I decided that the larger context of the intersection is important and shouldn't be hidden from the user) Also - show detail slider only if the intersection is complex - hide the restriction editor completely if there is no real intersection (e.g. junction of `highway=path`) --- modules/osm/intersection.js | 15 ++++----- modules/ui/fields/restrictions.js | 56 ++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 6947e1240..409471add 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -29,12 +29,7 @@ export function osmTurn(turn) { } -// -// detail = 0 - via node only -// detail = 1 - via node / 1 via way -// detail = 2 - via node / up to 2 via ways -// -export function osmIntersection(graph, startVertexId, detail) { +export function osmIntersection(graph, startVertexId) { var vgraph = coreGraph(); // virtual graph var i, j, k; @@ -106,7 +101,6 @@ export function osmIntersection(graph, startVertexId, detail) { ways.push(way); // it's a road, or it's already in a turn restriction hasWays = true; - if (!detail) continue; // check the way's children for more key vertices nodes = _uniq(graph.childNodes(way)); @@ -380,8 +374,13 @@ export function osmIntersection(graph, startVertexId, detail) { // // For each path found, generate and return a `osmTurn` datastructure. // - intersection.turns = function(fromWayId) { + // detail = 0 - via node only + // detail = 1 - via node / 1 via way + // detail = 2 - via node / up to 2 via ways + // + intersection.turns = function(fromWayId, detail) { if (!fromWayId) return []; + if (!detail) detail = 0; var vgraph = intersection.graph; var keyVertexIds = intersection.vertices.map(function(v) { return v.id; }); diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 8efba00cb..5ce901041 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -63,13 +63,34 @@ export function uiFieldRestrictions(field, context) { function restrictions(selection) { + // try to reuse the intersection, but always rebuild it if the graph has changed + if (_vertexID && (context.graph() !== _graph || !_intersection)) { + _graph = context.graph(); + _intersection = osmIntersection(_graph, _vertexID); + } + + // It's possible for there to be no actual intersection here. + // for example, a vertex of two `highway=path` + // In this case, hide the field. + var isOK = (_intersection && _intersection.vertices.length && _intersection.ways.length); + d3_select(selection.node().parentNode).classed('hide', !isOK) + // if form field is hidden or has detached from dom, clean up. - if (!d3_select('.inspector-wrap.inspector-hidden').empty() || - !selection.node().parentNode || !selection.node().parentNode.parentNode) { + if (!isOK || + !d3_select('.inspector-wrap.inspector-hidden').empty() || + !selection.node().parentNode || + !selection.node().parentNode.parentNode) { selection.call(restrictions.off); return; } + + + + var isComplex = (isOK && _intersection.vertices.length > 1); + + + var wrap = selection.selectAll('.preset-input-wrap') .data([0]); @@ -78,18 +99,22 @@ export function uiFieldRestrictions(field, context) { .attr('class', 'preset-input-wrap') .merge(wrap); - var detailEnter = wrap.selectAll('.restriction-detail') - .data([0]) - .enter() + var detailControl = wrap.selectAll('.restriction-detail') + .data(isComplex ? [0]: []); + + detailControl.exit() + .remove(); + + var detailControlEnter = detailControl.enter() .append('div') .attr('class', 'restriction-detail'); - detailEnter + detailControlEnter .append('span') .attr('class', 'restriction-detail-label') .text('Max Detail: '); - detailEnter + detailControlEnter .append('input') .attr('class', 'restriction-detail-input') .attr('type', 'range') @@ -99,13 +124,12 @@ export function uiFieldRestrictions(field, context) { .on('input', function() { var val = d3_select(this).property('value'); _detail = +val; - _intersection = null; - _container.selectAll('.layer-osm *').remove(); + _container.selectAll('.layer-osm .layer-turns *').remove(); context.storage('turn-restriction-detail', _detail); selection.call(restrictions); }); - detailEnter + detailControlEnter .append('span') .attr('class', 'restriction-detail-text'); @@ -132,14 +156,6 @@ export function uiFieldRestrictions(field, context) { _container = containerEnter .merge(container); - // try to reuse the intersection, but always rebuild it if the graph has changed - if (context.graph() !== _graph || !_intersection) { - _graph = context.graph(); - _intersection = osmIntersection(_graph, _vertexID, _detail); - } - - var ok = (_intersection.vertices.length && _intersection.ways.length); - _container .call(renderViewer); } @@ -177,7 +193,7 @@ export function uiFieldRestrictions(field, context) { projection.scale(geoZoomToScale(z)); } - var padTop = 30; // reserve top space for hints + var padTop = 30; // reserve top space for hint text var extentCenter = projection(extent.center()); extentCenter[1] = extentCenter[1] - padTop; @@ -222,7 +238,7 @@ export function uiFieldRestrictions(field, context) { .call(utilSetDimensions, d) .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z) .call(drawLines, vgraph, _intersection.ways, filter) - .call(drawTurns, vgraph, _intersection.turns(_fromWayID)); + .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _detail)); surface .on('click.restrictions', click) From ca9aac501b4af6584b52a7d5a288dc7282db8efc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 9 Feb 2018 23:12:02 -0500 Subject: [PATCH 14/55] Adjust text hint colors, change "Continue" to "Straight on" --- css/80_app.css | 7 ++++--- modules/ui/fields/restrictions.js | 12 ++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 7af6387bb..234a4c7f3 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1841,6 +1841,7 @@ input[type=number] { } .restriction-detail input { + width: 60px; margin: 0px 10px; vertical-align: middle; } @@ -1876,13 +1877,13 @@ input[type=number] { font-weight: bold; } .restriction-help span.qualifier.allow { - color: #8cd05f; + color: #8b5; } .restriction-help span.qualifier.restrict { - color: #e06d5f; + color: #d76; } .restriction-help span.qualifier.only { - color: #7092ff; + color: #78f; } /* Changeset editor while comment text is empty */ diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 5ce901041..c4b21f654 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -73,7 +73,7 @@ export function uiFieldRestrictions(field, context) { // for example, a vertex of two `highway=path` // In this case, hide the field. var isOK = (_intersection && _intersection.vertices.length && _intersection.ways.length); - d3_select(selection.node().parentNode).classed('hide', !isOK) + d3_select(selection.node().parentNode).classed('hide', !isOK); // if form field is hidden or has detached from dom, clean up. if (!isOK || @@ -85,12 +85,6 @@ export function uiFieldRestrictions(field, context) { } - - - var isComplex = (isOK && _intersection.vertices.length > 1); - - - var wrap = selection.selectAll('.preset-input-wrap') .data([0]); @@ -99,6 +93,8 @@ export function uiFieldRestrictions(field, context) { .attr('class', 'preset-input-wrap') .merge(wrap); + var isComplex = (isOK && _intersection.vertices.length > 1); + var detailControl = wrap.selectAll('.restriction-detail') .data(isComplex ? [0]: []); @@ -333,7 +329,7 @@ export function uiFieldRestrictions(field, context) { 'no_left_turn': 'Left Turn', 'no_right_turn': 'Right Turn', 'no_u_turn': 'U-Turn', - 'no_straight_on': 'Continuing' + 'no_straight_on': 'Straight On' }[osmInferRestriction(vgraph, datum.from, datum.to, projection)]; var restrictType = ''; From 777585317a2b05b35f22bec5d370ce7ddc37e65e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 12 Feb 2018 14:42:39 -0500 Subject: [PATCH 15/55] Better inference of u-turns via way --- modules/osm/intersection.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 409471add..4f91320e9 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -604,7 +604,9 @@ export function osmInferRestriction(graph, from, to, projection) { if (fromNode === toNode) return 'no_u_turn'; if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) - return 'no_u_turn'; + return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway + if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && from.vertex !== to.vertex) + return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to) if (angle < 158) return 'no_right_turn'; if (angle > 202) From c9dac2221813810b4c7d614e7c9594f901fc123e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 12 Feb 2018 14:43:14 -0500 Subject: [PATCH 16/55] Render turn indicators slightly closer to turning vertex --- modules/svg/turns.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 62c43aa03..313731d15 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -69,7 +69,7 @@ export function svgTurns(projection) { var p = projection(v.loc); var q = projection(t.loc); var mid = geoVecLength(p, q) / 2; - var r = turn.u ? 0 : Math.min(mid, 60); + var r = turn.u ? 0 : Math.min(mid, 40); return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; From 1174424f50601ddf470b31d8e0c0206b3ebd582b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 12 Feb 2018 15:35:45 -0500 Subject: [PATCH 17/55] Adjust padding and sizing constants, return to col4 sidebar I really want the sidebar back to col4, so the user sees more main map. This makes it very tricky to fit all of the intersection in the turn restriction editor. --- modules/svg/turns.js | 2 +- modules/ui/fields/restrictions.js | 2 +- modules/ui/init.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 313731d15..1746a8639 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -69,7 +69,7 @@ export function svgTurns(projection) { var p = projection(v.loc); var q = projection(t.loc); var mid = geoVecLength(p, q) / 2; - var r = turn.u ? 0 : Math.min(mid, 40); + var r = turn.u ? 0 : Math.min(mid, 50); return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index c4b21f654..2317c2f5b 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -178,7 +178,7 @@ export function uiFieldRestrictions(field, context) { // If this is a large intersection, adjust zoom to fit extent if (_intersection.vertices.length > 1) { - var padding = 220; + var padding = 150; // in z22 pixels var tl = projection([extent[0][0], extent[1][1]]); var br = projection([extent[1][0], extent[0][1]]); var hFactor = (br[0] - tl[0]) / (d[0] - padding); diff --git a/modules/ui/init.js b/modules/ui/init.js index 3ceebb45c..adeb376fb 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -68,7 +68,7 @@ export function uiInit(context) { container .append('div') .attr('id', 'sidebar') - .attr('class', 'col5') + .attr('class', 'col4') .call(ui.sidebar); var content = container @@ -94,7 +94,7 @@ export function uiInit(context) { bar .append('div') - .attr('class', 'spacer col5'); + .attr('class', 'spacer col4'); var limiter = bar.append('div') .attr('class', 'limiter'); From 1612326ffab460ffc3ffcadaa244a8e8b11e83d6 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 13 Feb 2018 17:25:49 -0500 Subject: [PATCH 18/55] Move dist/via sliders to bottom, add imperial/metric conversion --- css/80_app.css | 35 +++++- modules/osm/intersection.js | 29 ++--- modules/ui/fields/restrictions.js | 182 +++++++++++++++++++++--------- 3 files changed, 170 insertions(+), 76 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 234a4c7f3..0a9ddb54d 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1834,21 +1834,44 @@ input[type=number] { /* Restrictions editor */ -.form-field-restrictions .restriction-detail { - padding: 5px 10px; +.form-field-restrictions .restriction-controls-container { background-color: #fff; - height: 30px; + border-top: 1px solid #ccc; + width: 100%; + padding: 5px; } -.restriction-detail input { +.restriction-controls-container .restriction-controls { + display: table; +} + +.restriction-controls .restriction-control { + display: table-row; + padding: 5px 10px; + height: 25px; +} + +.restriction-control input, +.restriction-control span { + display: table-cell; + text-align: start; + padding: 0px 5px; +} + +.restriction-control span.restriction-control-label { + text-align: end; +} + +.restriction-control input { width: 60px; - margin: 0px 10px; + padding: 0; + margin: 0px 5px; vertical-align: middle; } .form-field-restrictions .restriction-container { position: relative; - height: 400px; + height: 370px; } .form-field-restrictions svg.surface { diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 4f91320e9..c728e500f 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -29,8 +29,9 @@ export function osmTurn(turn) { } -export function osmIntersection(graph, startVertexId) { - var vgraph = coreGraph(); // virtual graph +export function osmIntersection(graph, startVertexId, maxDistance) { + maxDistance = maxDistance || 30; // in meters + var vgraph = coreGraph(); // virtual graph var i, j, k; @@ -63,7 +64,6 @@ export function osmIntersection(graph, startVertexId) { } - var distCutoff = 30; // meters var startNode = graph.entity(startVertexId); var checkVertices = [startNode]; var checkWays; @@ -109,7 +109,7 @@ export function osmIntersection(graph, startVertexId) { if (node === vertex) continue; // same thing if (vertices.indexOf(node) !== -1) continue; // seen it already if (node.loc && startNode.loc && - geoSphericalDistance(node.loc, startNode.loc) > distCutoff) continue; // too far from start + geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start // a key vertex will have parents that are also roads var hasParents = false; @@ -355,7 +355,6 @@ export function osmIntersection(graph, startVertexId) { }); - // OK! Here is our intersection.. var intersection = { graph: vgraph, @@ -374,13 +373,9 @@ export function osmIntersection(graph, startVertexId) { // // For each path found, generate and return a `osmTurn` datastructure. // - // detail = 0 - via node only - // detail = 1 - via node / 1 via way - // detail = 2 - via node / up to 2 via ways - // - intersection.turns = function(fromWayId, detail) { + intersection.turns = function(fromWayId, maxViaWay) { if (!fromWayId) return []; - if (!detail) detail = 0; + if (!maxViaWay) maxViaWay = 0; var vgraph = intersection.graph; var keyVertexIds = intersection.vertices.map(function(v) { return v.id; }); @@ -389,11 +384,11 @@ export function osmIntersection(graph, startVertexId) { var start = vgraph.entity(fromWayId); if (!start || !(start.__from || start.__via)) return []; - // detail=0 from-*-to (0 vias) - // detail=1 from-*-via-*-to (1 via max) - // detail=2 from-*-via-*-via-*-to (2 vias max) - var maxPathLength = (detail * 2) + 3; - var maxStepDist = 30; // meters + // maxViaWay=0 from-*-to (0 vias) + // maxViaWay=1 from-*-via-*-to (1 via max) + // maxViaWay=2 from-*-via-*-via-*-to (2 vias max) + var maxPathLength = (maxViaWay * 2) + 3; + var maxDistance = 30; // meters var turns = []; step(start); @@ -499,7 +494,7 @@ export function osmIntersection(graph, startVertexId) { nextNodes = []; if (currPath.length > 1) { - if (dist > maxStepDist) return; // the next node is too far + if (dist > maxDistance) return; // the next node is too far if (!entity.__via) return; // this way is a leaf / can't be a via } diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 2317c2f5b..acb2c5295 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -41,6 +41,8 @@ import { utilRebind } from '../../util'; +import { utilDetect } from '../../util/detect'; + import { utilGetDimensions, utilSetDimensions @@ -51,11 +53,15 @@ export function uiFieldRestrictions(field, context) { var dispatch = d3_dispatch('change'); var breathe = behaviorBreathe(context); var hover = behaviorHover(context); - var storedDetail = context.storage('turn-restriction-detail'); + var storedViaWay = context.storage('turn-restriction-via-way'); + var storedDistance = context.storage('turn-restriction-distance'); + var isImperial = (utilDetect().locale.toLowerCase() === 'en-us'); - var _detail = storedDetail !== null ? (+storedDetail) : 0; + var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1; + var _maxDistance = storedDistance ? (+storedDistance) : 30; var _initialized = false; - var _container = d3_select(null); + var _parent = d3_select(null); // the entire field + var _container = d3_select(null); // just the map var _graph; var _vertexID; var _intersection; @@ -63,10 +69,12 @@ export function uiFieldRestrictions(field, context) { function restrictions(selection) { + _parent = selection; + // try to reuse the intersection, but always rebuild it if the graph has changed if (_vertexID && (context.graph() !== _graph || !_intersection)) { _graph = context.graph(); - _intersection = osmIntersection(_graph, _vertexID); + _intersection = osmIntersection(_graph, _vertexID, _maxDistance); } // It's possible for there to be no actual intersection here. @@ -95,52 +103,10 @@ export function uiFieldRestrictions(field, context) { var isComplex = (isOK && _intersection.vertices.length > 1); - var detailControl = wrap.selectAll('.restriction-detail') - .data(isComplex ? [0]: []); - - detailControl.exit() - .remove(); - - var detailControlEnter = detailControl.enter() - .append('div') - .attr('class', 'restriction-detail'); - - detailControlEnter - .append('span') - .attr('class', 'restriction-detail-label') - .text('Max Detail: '); - - detailControlEnter - .append('input') - .attr('class', 'restriction-detail-input') - .attr('type', 'range') - .attr('min', '0') - .attr('max', '2') - .attr('step', '1') - .on('input', function() { - var val = d3_select(this).property('value'); - _detail = +val; - _container.selectAll('.layer-osm .layer-turns *').remove(); - context.storage('turn-restriction-detail', _detail); - selection.call(restrictions); - }); - - detailControlEnter - .append('span') - .attr('class', 'restriction-detail-text'); - - // update - wrap.selectAll('.restriction-detail-input') - .property('value', _detail); - - var t = ['via node only', 'via 1 way', 'via 2 ways']; - wrap.selectAll('.restriction-detail-text') - .text(t[_detail]); - - var container = wrap.selectAll('.restriction-container') .data([0]); + // enter var containerEnter = container.enter() .append('div') .attr('class', 'restriction-container'); @@ -149,11 +115,121 @@ export function uiFieldRestrictions(field, context) { .append('div') .attr('class', 'restriction-help'); + // update _container = containerEnter - .merge(container); - - _container + .merge(container) .call(renderViewer); + + + var controls = wrap.selectAll('.restriction-controls') + .data([0]); + + // enter/update + controls.enter() + .append('div') + .attr('class', 'restriction-controls-container') + .append('div') + .attr('class', 'restriction-controls') + .merge(controls) + .call(renderControls); + } + + + function renderControls(selection) { + var distControl = selection.selectAll('.restriction-distance') + .data([0]); + + distControl.exit() + .remove(); + + var distControlEnter = distControl.enter() + .append('div') + .attr('class', 'restriction-control restriction-distance'); + + distControlEnter + .append('span') + .attr('class', 'restriction-control-label restriction-distance-label') + .text('Distance:'); + + distControlEnter + .append('input') + .attr('class', 'restriction-distance-input') + .attr('type', 'range') + .attr('min', '20') + .attr('max', '50') + .attr('step', '5') + .on('input', function() { + var val = d3_select(this).property('value'); + _maxDistance = +val; + _intersection = null; + _container.selectAll('.layer-osm .layer-turns *').remove(); + context.storage('turn-restriction-distance', _maxDistance); + _parent.call(restrictions); + }); + + distControlEnter + .append('span') + .attr('class', 'restriction-distance-text'); + + // update + selection.selectAll('.restriction-distance-input') + .property('value', _maxDistance); + + var distDisplay; + if (isImperial) { // imprecise conversion for prettier display + var distToFeet = { + 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160 + }[_maxDistance]; + distDisplay = 'Up to ' + distToFeet + ' feet'; + } else { + distDisplay = 'Up to ' + _maxDistance + ' meters'; + } + + selection.selectAll('.restriction-distance-text') + .text(distDisplay); + + + var viaControl = selection.selectAll('.restriction-via-way') + .data([0]); + + viaControl.exit() + .remove(); + + var viaControlEnter = viaControl.enter() + .append('div') + .attr('class', 'restriction-control restriction-via-way'); + + viaControlEnter + .append('span') + .attr('class', 'restriction-control-label restriction-via-way-label') + .text('Via:'); + + viaControlEnter + .append('input') + .attr('class', 'restriction-via-way-input') + .attr('type', 'range') + .attr('min', '0') + .attr('max', '2') + .attr('step', '1') + .on('input', function() { + var val = d3_select(this).property('value'); + _maxViaWay = +val; + _container.selectAll('.layer-osm .layer-turns *').remove(); + context.storage('turn-restriction-via-way', _maxViaWay); + _parent.call(restrictions); + }); + + viaControlEnter + .append('span') + .attr('class', 'restriction-via-way-text'); + + // update + selection.selectAll('.restriction-via-way-input') + .property('value', _maxViaWay); + + var t = ['Node only', 'Up to 1 way', 'Up to 2 ways']; + selection.selectAll('.restriction-via-way-text') + .text(t[_maxViaWay]); } @@ -234,7 +310,7 @@ export function uiFieldRestrictions(field, context) { .call(utilSetDimensions, d) .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z) .call(drawLines, vgraph, _intersection.ways, filter) - .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _detail)); + .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay)); surface .on('click.restrictions', click) @@ -455,11 +531,11 @@ export function uiFieldRestrictions(field, context) { restrictions.entity = function(_) { - if (!_vertexID || _vertexID !== _.id) { + // if (!_vertexID || _vertexID !== _.id) { _intersection = null; _fromWayID = null; _vertexID = _.id; - } + // } }; From 0381bad22d987b27bb6b8315b6dac9560a052c76 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 13 Feb 2018 17:45:45 -0500 Subject: [PATCH 19/55] Adjust constants, trying to avoid crunched turn indicator on leaf way --- modules/svg/turns.js | 8 ++++++-- modules/ui/fields/restrictions.js | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 1746a8639..257d16a94 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -63,13 +63,17 @@ export function svgTurns(projection) { groups .attr('transform', function (turn) { + var pxOffset = 50; + var way = graph.entity(turn.to.way); var t = graph.entity(turn.to.node); var v = graph.entity(turn.to.vertex); var a = geoAngle(v, t, projection); var p = projection(v.loc); var q = projection(t.loc); - var mid = geoVecLength(p, q) / 2; - var r = turn.u ? 0 : Math.min(mid, 50); + var mid = geoVecLength(p, q) / 2; // midpoint of destination way + var r = turn.u ? 0 + : !way.__via ? pxOffset // leaf way: put marker at pxOffset + : Math.min(mid, pxOffset); // via way: prefer pxOffset, fallback to midpoint return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index acb2c5295..2e6905bcc 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -254,7 +254,7 @@ export function uiFieldRestrictions(field, context) { // If this is a large intersection, adjust zoom to fit extent if (_intersection.vertices.length > 1) { - var padding = 150; // in z22 pixels + var padding = 160; // in z22 pixels var tl = projection([extent[0][0], extent[1][1]]); var br = projection([extent[1][0], extent[0][1]]); var hFactor = (br[0] - tl[0]) / (d[0] - padding); From dbdbad29c2d0d4c6faa9cc5100987fb97f1d0281 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 14 Feb 2018 21:53:56 -0500 Subject: [PATCH 20/55] Make sure container has dimensions the first time --- css/80_app.css | 4 ++++ modules/ui/fields/restrictions.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/css/80_app.css b/css/80_app.css index 0a9ddb54d..0124cdb5e 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1873,6 +1873,10 @@ input[type=number] { position: relative; height: 370px; } +/* zero width space, so container takes up space */ +.form-field-restrictions .restriction-container:after { + content: '\200b'; +} .form-field-restrictions svg.surface { width: 100%; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 2e6905bcc..9581d42dd 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -240,7 +240,7 @@ export function uiFieldRestrictions(field, context) { var filter = utilFunctor(true); var projection = geoRawMercator(); - var d = utilGetDimensions(_container); + var d = utilGetDimensions(selection); var c = geoVecScale(d, 0.5); var z = 22; From 050907e2525ed0dd037f380b4dd84e6d0cebea3e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 15 Feb 2018 08:27:39 -0500 Subject: [PATCH 21/55] Move event bindings to update selection, so callbacks use correct vars When they are on the enter selection, they can stay "sticky" which has the effect where you might move a slider and it puts the intersection back to how it previously was (or returns to a previous intersection) --- modules/ui/fields/restrictions.js | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 9581d42dd..bebbff44b 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -157,7 +157,15 @@ export function uiFieldRestrictions(field, context) { .attr('type', 'range') .attr('min', '20') .attr('max', '50') - .attr('step', '5') + .attr('step', '5'); + + distControlEnter + .append('span') + .attr('class', 'restriction-distance-text'); + + // update + selection.selectAll('.restriction-distance-input') + .property('value', _maxDistance) .on('input', function() { var val = d3_select(this).property('value'); _maxDistance = +val; @@ -167,14 +175,6 @@ export function uiFieldRestrictions(field, context) { _parent.call(restrictions); }); - distControlEnter - .append('span') - .attr('class', 'restriction-distance-text'); - - // update - selection.selectAll('.restriction-distance-input') - .property('value', _maxDistance); - var distDisplay; if (isImperial) { // imprecise conversion for prettier display var distToFeet = { @@ -210,14 +210,7 @@ export function uiFieldRestrictions(field, context) { .attr('type', 'range') .attr('min', '0') .attr('max', '2') - .attr('step', '1') - .on('input', function() { - var val = d3_select(this).property('value'); - _maxViaWay = +val; - _container.selectAll('.layer-osm .layer-turns *').remove(); - context.storage('turn-restriction-via-way', _maxViaWay); - _parent.call(restrictions); - }); + .attr('step', '1'); viaControlEnter .append('span') @@ -225,7 +218,14 @@ export function uiFieldRestrictions(field, context) { // update selection.selectAll('.restriction-via-way-input') - .property('value', _maxViaWay); + .property('value', _maxViaWay) + .on('input', function() { + var val = d3_select(this).property('value'); + _maxViaWay = +val; + _container.selectAll('.layer-osm .layer-turns *').remove(); + context.storage('turn-restriction-via-way', _maxViaWay); + _parent.call(restrictions); + }); var t = ['Node only', 'Up to 1 way', 'Up to 2 ways']; selection.selectAll('.restriction-via-way-text') From d030251fbb15a1174ecdd3a012065d97c3edffda Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 15 Feb 2018 13:39:39 -0500 Subject: [PATCH 22/55] Ignore pointer events on restriction help This prevents flickering when hovering over a turn restriction that is up underneath where the help is drawn --- css/80_app.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/80_app.css b/css/80_app.css index 0124cdb5e..42c33da6f 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1893,6 +1893,7 @@ input[type=number] { background-color: rgba(255, 255, 255, .8); color: #888; text-align: center; + pointer-events: none; } .restriction-help span { From 9cb3e7d03ad0aed5d999e601396ad51fd668496b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 15 Feb 2018 13:40:32 -0500 Subject: [PATCH 23/55] Adjust calculation for turn indicator placement This helps move the indicator a bit further away in cases where turn.to.node is right up very close to the turning vertex --- modules/svg/turns.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 257d16a94..baae52635 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -1,4 +1,4 @@ -import { geoAngle, geoVecLength } from '../geo'; +import { geoAngle, geoPathLength } from '../geo'; export function svgTurns(projection) { @@ -63,19 +63,23 @@ export function svgTurns(projection) { groups .attr('transform', function (turn) { - var pxOffset = 50; - var way = graph.entity(turn.to.way); - var t = graph.entity(turn.to.node); - var v = graph.entity(turn.to.vertex); - var a = geoAngle(v, t, projection); - var p = projection(v.loc); - var q = projection(t.loc); - var mid = geoVecLength(p, q) / 2; // midpoint of destination way - var r = turn.u ? 0 - : !way.__via ? pxOffset // leaf way: put marker at pxOffset - : Math.min(mid, pxOffset); // via way: prefer pxOffset, fallback to midpoint + var pxRadius = 50; + var toWay = graph.entity(turn.to.way); + var toPoints = graph.childNodes(toWay) + .map(function (n) { return n.loc; }) + .map(projection); + var toLength = geoPathLength(toPoints); + var mid = toLength / 2; // midpoint of destination way - return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' + + var toNode = graph.entity(turn.to.node); + var toVertex = graph.entity(turn.to.vertex); + var a = geoAngle(toVertex, toNode, projection); + var o = projection(toVertex.loc); + var r = turn.u ? 0 // u-turn: no radius + : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius + : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways + + return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' + 'rotate(' + a * 180 / Math.PI + ')'; }); From f7e6eae065fd81a98d1150937825624c3873a022 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 15 Feb 2018 17:27:45 -0500 Subject: [PATCH 24/55] Support Only Via paths, render indirect turn restriction with opacity --- modules/osm/intersection.js | 60 +++++++++++++++++++------------ modules/svg/turns.js | 5 ++- modules/ui/fields/restrictions.js | 10 +++--- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index c728e500f..0e17947c3 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -433,31 +433,42 @@ export function osmIntersection(graph, startVertexId, maxDistance) { isLocalVia = _every(v, function(via) { return keyWayIds.indexOf(via.id) !== -1; }); } - // Does this path match the turn restriction? - var isMatch = false; - if ( // match via node, to way - v.length === 1 && - v[0].type === 'node' && - v[0].id === entity.id && - t.id === way.id - ) { - isMatch = true; - } else if ( // match via ways, to way - _every(v, function(via) { return currPath.indexOf(via.id) !== -1; }) && - t.id === way.id - ) { - isMatch = true; + // Does the current path match this turn restriction? + var isDirectMatch = false; + var isAlongOnlyPath = false; + + if (t.id === way.id) { // match TO + if (v.length === 1 && v[0].type === 'node' && v[0].id === entity.id) { + isDirectMatch = true; // match VIA node + } else if (_every(v, function(via) { return currPath.indexOf(via.id) !== -1; })) { + isDirectMatch = true; // match all VIA ways + } + + } else if (isOnly) { + for (k = 0; k < v.length; k++) { + // way doesn't match TO, but is one of the via ways along the path of an "only" + if (v[k].type === 'way' && v[k].id === way.id) { + isAlongOnlyPath = true; + break; + } + } } - if (isMatch && isOnly) { - restrict = { id: restriction.id, only: true }; + if (isDirectMatch) { + if (isOnly) { + restrict = { id: restriction.id, direct: true, only: true }; + } else { + restrict = { id: restriction.id, direct: true, no: true }; + } break; - } else if (isMatch && !isOnly) { - restrict = { id: restriction.id, direct: true }; - break; - } else if (!isMatch && isOnly && isLocalVia) { - restrict = { id: restriction.id, indirect: true }; - // no break - keep looking for a "better" direct or only + + } else { // indirect match, caused by presence of an "only" + if (isAlongOnlyPath) { + restrict = { id: restriction.id, indirect: true, only: true }; + } else if (isOnly && isLocalVia) { + restrict = { id: restriction.id, indirect: true, no: true }; + } + // no break - keep looking for a "better" direct match } } @@ -475,6 +486,7 @@ export function osmIntersection(graph, startVertexId, maxDistance) { if (turn) { if (matchedRestriction) { turn.restrictionID = matchedRestriction.id; + turn.no = matchedRestriction.no; turn.only = matchedRestriction.only; turn.direct = matchedRestriction.direct; turn.indirect = matchedRestriction.indirect; @@ -485,7 +497,9 @@ export function osmIntersection(graph, startVertexId, maxDistance) { if (currPath[0] === currPath[2]) return; // we made a u-turn - stop here } - if (matchedRestriction) return; // don't advance any further + if (matchedRestriction && + (matchedRestriction.direct || matchedRestriction.no) + ) return; // don't advance any further // which nodes can we step into? var n1 = vgraph.entity(entity.first()), diff --git a/modules/svg/turns.js b/modules/svg/turns.js index baae52635..0022ef4a6 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -7,7 +7,7 @@ export function svgTurns(projection) { function icon(turn) { var u = turn.u ? '-u' : ''; - if (turn.direct || turn.indirect) return '#turn-no' + u; + if (turn.no) return '#turn-no' + u; if (turn.only) return '#turn-only' + u; return '#turn-yes' + u; } @@ -62,6 +62,9 @@ export function svgTurns(projection) { .merge(enter); groups + .attr('opacity', function (turn) { + return turn.indirect ? '0.7' : null; + }) .attr('transform', function (turn) { var pxRadius = 50; var toWay = graph.entity(turn.to.way); diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index bebbff44b..3589cc6ae 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -349,7 +349,9 @@ export function uiFieldRestrictions(field, context) { var actions; datum.restriction = osmInferRestriction(vgraph, datum.from, datum.to, projection); - if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state + if (datum.restrictionID && datum.indirect) { + return; + } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state var datumOnly = _cloneDeep(datum); datumOnly.only = true; datumOnly.restriction = datumOnly.restriction.replace(/^no\_/, 'only_'); @@ -411,12 +413,12 @@ export function uiFieldRestrictions(field, context) { var restrictType = ''; var klass = 'allow'; if (datum.restrictionID) { - if (datum.direct) { restrictType = 'NO'; klass = 'restrict'; } - if (datum.indirect) { restrictType = 'NO'; klass = 'restrict'; } - if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } + if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } + if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } } var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); + if (datum.indirect) { s += ' (indirect)'; } div = help.append('div'); div.append('span') From a2b6a3b09b45da3d2a30b8141e2c1c01ee0c8e59 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 15 Feb 2018 22:18:01 -0500 Subject: [PATCH 25/55] Flag restriction as indirect if from doesn't match --- modules/osm/intersection.js | 44 +++++++++++++++---------------- modules/svg/turns.js | 2 +- modules/ui/fields/restrictions.js | 4 +-- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 0e17947c3..c4785a599 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -420,6 +420,7 @@ export function osmIntersection(graph, startVertexId, maxDistance) { var restrict = undefined; for (var j = 0; j < currRestrictions.length; j++) { var restriction = currRestrictions[j]; + var f = restriction.memberByRole('from'); var v = restriction.membersByRole('via'); var t = restriction.memberByRole('to'); var isOnly = /^only_/.test(restriction.tags.restriction); @@ -434,14 +435,15 @@ export function osmIntersection(graph, startVertexId, maxDistance) { } // Does the current path match this turn restriction? - var isDirectMatch = false; + var matchesFrom = (f.id === fromWayId); + var matchesViaTo = false; var isAlongOnlyPath = false; - if (t.id === way.id) { // match TO + if (t.id === way.id) { // match VIA, TO if (v.length === 1 && v[0].type === 'node' && v[0].id === entity.id) { - isDirectMatch = true; // match VIA node + matchesViaTo = true; // match VIA node } else if (_every(v, function(via) { return currPath.indexOf(via.id) !== -1; })) { - isDirectMatch = true; // match all VIA ways + matchesViaTo = true; // match all VIA ways } } else if (isOnly) { @@ -454,22 +456,23 @@ export function osmIntersection(graph, startVertexId, maxDistance) { } } - if (isDirectMatch) { + if (matchesViaTo) { if (isOnly) { - restrict = { id: restriction.id, direct: true, only: true }; + restrict = { id: restriction.id, direct: matchesFrom, only: true, end: true }; } else { - restrict = { id: restriction.id, direct: true, no: true }; + restrict = { id: restriction.id, direct: matchesFrom, no: true, end: true }; } - break; - - } else { // indirect match, caused by presence of an "only" + } else { // indirect - caused by a different nearby restriction if (isAlongOnlyPath) { - restrict = { id: restriction.id, indirect: true, only: true }; + restrict = { id: restriction.id, direct: false, only: true, end: false }; } else if (isOnly && isLocalVia) { - restrict = { id: restriction.id, indirect: true, no: true }; + restrict = { id: restriction.id, direct: false, no: true, end: true }; } - // no break - keep looking for a "better" direct match } + + // stop looking if we find a "direct" restriction (matching FROM, VIA, TO) + if (restrict && restrict.direct) + break; } nextWays.push({ way: way, restrict: restrict }); @@ -489,23 +492,20 @@ export function osmIntersection(graph, startVertexId, maxDistance) { turn.no = matchedRestriction.no; turn.only = matchedRestriction.only; turn.direct = matchedRestriction.direct; - turn.indirect = matchedRestriction.indirect; } turns.push(osmTurn(turn)); } - if (currPath[0] === currPath[2]) return; // we made a u-turn - stop here + if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here } - if (matchedRestriction && - (matchedRestriction.direct || matchedRestriction.no) - ) return; // don't advance any further + if (matchedRestriction && matchedRestriction.end) return; // don't advance any further // which nodes can we step into? - var n1 = vgraph.entity(entity.first()), - n2 = vgraph.entity(entity.last()), - dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc), - nextNodes = []; + var n1 = vgraph.entity(entity.first()); + var n2 = vgraph.entity(entity.last()); + var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc); + var nextNodes = []; if (currPath.length > 1) { if (dist > maxDistance) return; // the next node is too far diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 0022ef4a6..1ed10706b 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -63,7 +63,7 @@ export function svgTurns(projection) { groups .attr('opacity', function (turn) { - return turn.indirect ? '0.7' : null; + return turn.direct === false ? '0.7' : null; }) .attr('transform', function (turn) { var pxRadius = 50; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 3589cc6ae..4757ab419 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -349,7 +349,7 @@ export function uiFieldRestrictions(field, context) { var actions; datum.restriction = osmInferRestriction(vgraph, datum.from, datum.to, projection); - if (datum.restrictionID && datum.indirect) { + if (datum.restrictionID && !datum.direct) { return; } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state var datumOnly = _cloneDeep(datum); @@ -418,7 +418,7 @@ export function uiFieldRestrictions(field, context) { } var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); - if (datum.indirect) { s += ' (indirect)'; } + if (datum.direct === false) { s += ' (indirect)'; } div = help.append('div'); div.append('span') From 5e9db0d409d2504bed7f36e826e50f3f5eda5332 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 16 Feb 2018 00:03:04 -0500 Subject: [PATCH 26/55] Move help display code, fix display of indirect only restrictions "indirect only" means an only restriction elsewhere in the intersection that affects the selected from way. | | ---+--F--+--- A | ---v--T--+--- B | In the above example - 'only_straight_on' restriction "FROM way A VIA node V TO way B" - way F is selected This would indirectly prevent a u-turn "FROM way F VIA way A TO way T" We want to display the straight on restriction in the UI as "only_straight_on FROM way A VIA node V TO way B" not "only_left_turn FROM way F VIA way A TO way B" --- modules/ui/fields/restrictions.js | 198 +++++++++++++----------------- 1 file changed, 85 insertions(+), 113 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 4757ab419..c4be98774 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -381,115 +381,8 @@ export function uiFieldRestrictions(field, context) { function mouseover() { - var help = _container.selectAll('.restriction-help').html(''); - var div, d; - var datum = d3_event.target.__data__; - var entity = datum && datum.properties && datum.properties.entity; - if (entity) { - datum = entity; - } - - surface.selectAll('.related') - .classed('related', false); - - if (datum instanceof osmWay) { - d = display(vgraph.entity(datum.id), vgraph); - div = help.append('div'); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); - - } else if (datum instanceof osmTurn) { - surface.selectAll(utilEntitySelector(datum.key.split(','))) - .classed('related', true); - - var turnType = { - 'no_left_turn': 'Left Turn', - 'no_right_turn': 'Right Turn', - 'no_u_turn': 'U-Turn', - 'no_straight_on': 'Straight On' - }[osmInferRestriction(vgraph, datum.from, datum.to, projection)]; - - var restrictType = ''; - var klass = 'allow'; - if (datum.restrictionID) { - if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } - if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } - } - - var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); - if (datum.direct === false) { s += ' (indirect)'; } - - div = help.append('div'); - div.append('span') - .attr('class', 'qualifier ' + klass) - .text(s); - - div = help.append('div'); - d = display(vgraph.entity(datum.from.way), vgraph); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); - - d = display(vgraph.entity(datum.to.way), vgraph); - div.append('span').attr('class', 'qualifier').text('TO'); - div.append('span').text(d.name || d.type); - - if (datum.via.ways) { - div = help.append('div'); - div.append('span').attr('class', 'qualifier').text('VIA'); - - var curr, prev; - for (var i = 0; i < datum.via.ways.length; i++) { - d = display(vgraph.entity(datum.via.ways[i]), vgraph); - curr = d.name || d.type; - if (curr === prev) continue; // collapse identical names - - if (prev) div.append('span').text(','); - div.append('span').text(curr); - prev = curr; - } - } - - - //DEBUG - // var str = ''; - // if (datum.restriction) { - // if (datum.only) { str += 'ONLY_ '; } - // if (datum.direct) { str += 'NO_ '; } - // if (datum.indirect) { str += 'indirect '; } - // str += datum.restriction; - // } - - // str += ' FROM ' + datum.from.way + - // ' VIA ' + (datum.via.node || datum.via.ways.join(',')) + - // ' TO ' + datum.to.way; - - // _container.selectAll('.restriction-help') - // .text(str); - -// return; - // var presets = context.presets(), - // preset; - - // if (datum.restriction) { - // preset = presets.match(vgraph.entity(datum.restriction), vgraph); - // } else { - // preset = presets.item('type/restriction/' + - // osmInferRestriction( - // vgraph, - // datum.from, - // datum.to, - // projection - // ) - // ); - // } - - // _container.selectAll('.restriction-help') - // .text(t('operations.restriction.help.' + - // (datum.restriction ? 'toggle_off' : 'toggle_on'), - // { restriction: preset.name() }) - // ); - } + updateHelp(datum); } @@ -508,11 +401,6 @@ export function uiFieldRestrictions(field, context) { div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text('way'); } - - // _container.selectAll('.restriction-help') - // .text(t('operations.restriction.help.' + - // (_fromWayID ? 'toggle' : 'select')) - // ); } @@ -521,6 +409,90 @@ export function uiFieldRestrictions(field, context) { _container.call(renderViewer); } } + + + function updateHelp(datum) { + var help = _container.selectAll('.restriction-help').html(''); + var div, d; + + var entity = datum && datum.properties && datum.properties.entity; + if (entity) { + datum = entity; + } + + surface.selectAll('.related') + .classed('related', false); + + if (datum instanceof osmWay) { + d = display(vgraph.entity(datum.id), vgraph); + div = help.append('div'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); + + } else if (datum instanceof osmTurn) { + surface.selectAll(utilEntitySelector(datum.key.split(','))) + .classed('related', true); + + var fromWayID = datum.from.way; + var viaWayIDs = datum.via.ways; + var toWayID = datum.to.way; + var restrictionType = osmInferRestriction(vgraph, datum.from, datum.to, projection); + + if (datum.restrictionID && datum.only && datum.direct === false) { + var r = vgraph.entity(datum.restrictionID); + fromWayID = r.memberByRole('from').id; + viaWayIDs = r.membersByRole('via').map(function (m) { return m.id; }); + toWayID = r.memberByRole('to').id; + restrictionType = r.tags.restriction.replace(/^only/, 'no'); + } + + var turnType = { + 'no_left_turn': 'Left Turn', + 'no_right_turn': 'Right Turn', + 'no_u_turn': 'U-Turn', + 'no_straight_on': 'Straight On' + }[restrictionType]; + + var restrictType = ''; + var klass = 'allow'; + if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } + if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } + + var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); + if (datum.direct === false) { s += ' (indirect)'; } + + div = help.append('div'); + div.append('span') + .attr('class', 'qualifier ' + klass) + .text(s); + + div = help.append('div'); + d = display(vgraph.entity(fromWayID), vgraph); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); + + d = display(vgraph.entity(toWayID), vgraph); + div.append('span').attr('class', 'qualifier').text('TO'); + div.append('span').text(d.name || d.type); + + if (viaWayIDs) { + div = help.append('div'); + div.append('span').attr('class', 'qualifier').text('VIA'); + + var curr, prev; + for (var i = 0; i < viaWayIDs.length; i++) { + d = display(vgraph.entity(viaWayIDs[i]), vgraph); + curr = d.name || d.type; + if (curr === prev) continue; // collapse identical names + + if (prev) div.append('span').text(','); + div.append('span').text(curr); + prev = curr; + } + } + } + + } } From aff9258deeea371b02220b72ebe507e3be144fe9 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 16 Feb 2018 11:42:44 -0500 Subject: [PATCH 27/55] Indirect restrictions now include only the partial path This lets us properly infer the actual turn taken through the indirect restriction using osmInferRestriction (an improvement over 5e9db0d) --- modules/osm/intersection.js | 34 ++++++++++++++++++++----------- modules/ui/fields/restrictions.js | 20 ++++++------------ 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index c4785a599..1673bbb45 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -401,13 +401,14 @@ export function osmIntersection(graph, startVertexId, maxDistance) { if (currPath.length >= maxPathLength) return; currPath.push(entity.id); currRestrictions = _clone(currRestrictions || []); + var i, j; if (entity.type === 'node') { var parents = vgraph.parentWays(entity); var nextWays = []; // which ways can we step into? - for (var i = 0; i < parents.length; i++) { + for (i = 0; i < parents.length; i++) { var way = parents[i]; // if next way is a oneway incoming to this vertex, skip @@ -418,7 +419,7 @@ export function osmIntersection(graph, startVertexId, maxDistance) { // Check all "current" restrictions (where we've already walked the `from`) var restrict = undefined; - for (var j = 0; j < currRestrictions.length; j++) { + for (j = 0; j < currRestrictions.length; j++) { var restriction = currRestrictions[j]; var f = restriction.memberByRole('from'); var v = restriction.membersByRole('via'); @@ -458,15 +459,15 @@ export function osmIntersection(graph, startVertexId, maxDistance) { if (matchesViaTo) { if (isOnly) { - restrict = { id: restriction.id, direct: matchesFrom, only: true, end: true }; + restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true }; } else { - restrict = { id: restriction.id, direct: matchesFrom, no: true, end: true }; + restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true }; } } else { // indirect - caused by a different nearby restriction if (isAlongOnlyPath) { - restrict = { id: restriction.id, direct: false, only: true, end: false }; + restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false }; } else if (isOnly && isLocalVia) { - restrict = { id: restriction.id, direct: false, no: true, end: true }; + restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true }; } } @@ -485,7 +486,19 @@ export function osmIntersection(graph, startVertexId, maxDistance) { } else { // entity.type === 'way' if (currPath.length >= 3) { // this is a "complete" path.. - var turn = pathToTurn(currPath); + var turnPath = _clone(currPath); + + // an indirect restriction - only include the partial path (starting at FROM) + if (matchedRestriction && matchedRestriction.direct === false) { + for (i = 0; i < turnPath.length; i++) { + if (i > 0 && turnPath[i] === matchedRestriction.from) { + turnPath = turnPath.slice(i); + break; + } + } + } + + var turn = pathToTurn(turnPath); if (turn) { if (matchedRestriction) { turn.restrictionID = matchedRestriction.id; @@ -583,7 +596,6 @@ export function osmIntersection(graph, startVertexId, maxDistance) { var nodes = vgraph.entity(wayId).nodes; return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2]; } - } }; @@ -602,10 +614,8 @@ export function osmInferRestriction(graph, from, to, projection) { var fromOneWay = (fromWay.tags.oneway === 'yes'); var toOneWay = (toWay.tags.oneway === 'yes'); - var angle = geoAngle(fromVertex, fromNode, projection) - - geoAngle(toVertex, toNode, projection); - - angle = angle * 180 / Math.PI; + var angle = (geoAngle(fromVertex, fromNode, projection) - + geoAngle(toVertex, toNode, projection)) * 180 / Math.PI; while (angle < 0) angle += 360; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index c4be98774..0550cff63 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -254,7 +254,7 @@ export function uiFieldRestrictions(field, context) { // If this is a large intersection, adjust zoom to fit extent if (_intersection.vertices.length > 1) { - var padding = 160; // in z22 pixels + var padding = 180; // in z22 pixels var tl = projection([extent[0][0], extent[1][1]]); var br = projection([extent[1][0], extent[0][1]]); var hFactor = (br[0] - tl[0]) / (d[0] - padding); @@ -265,7 +265,7 @@ export function uiFieldRestrictions(field, context) { projection.scale(geoZoomToScale(z)); } - var padTop = 30; // reserve top space for hint text + var padTop = 35; // reserve top space for hint text var extentCenter = projection(extent.center()); extentCenter[1] = extentCenter[1] - padTop; @@ -351,10 +351,10 @@ export function uiFieldRestrictions(field, context) { if (datum.restrictionID && !datum.direct) { return; - } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state + } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state var datumOnly = _cloneDeep(datum); datumOnly.only = true; - datumOnly.restriction = datumOnly.restriction.replace(/^no\_/, 'only_'); + datumOnly.restriction = datumOnly.restriction.replace(/^no/, 'only'); actions = _intersection.actions.concat([ actionUnrestrictTurn(datum, projection), actionRestrictTurn(datumOnly, projection), @@ -438,20 +438,12 @@ export function uiFieldRestrictions(field, context) { var toWayID = datum.to.way; var restrictionType = osmInferRestriction(vgraph, datum.from, datum.to, projection); - if (datum.restrictionID && datum.only && datum.direct === false) { - var r = vgraph.entity(datum.restrictionID); - fromWayID = r.memberByRole('from').id; - viaWayIDs = r.membersByRole('via').map(function (m) { return m.id; }); - toWayID = r.memberByRole('to').id; - restrictionType = r.tags.restriction.replace(/^only/, 'no'); - } - var turnType = { 'no_left_turn': 'Left Turn', 'no_right_turn': 'Right Turn', 'no_u_turn': 'U-Turn', 'no_straight_on': 'Straight On' - }[restrictionType]; + }[restrictionType.replace(/^only/, 'no')]; var restrictType = ''; var klass = 'allow'; @@ -475,7 +467,7 @@ export function uiFieldRestrictions(field, context) { div.append('span').attr('class', 'qualifier').text('TO'); div.append('span').text(d.name || d.type); - if (viaWayIDs) { + if (viaWayIDs && viaWayIDs.length) { div = help.append('div'); div.append('span').attr('class', 'qualifier').text('VIA'); From b84b64c79c72b8209d496dd01c8d61435dc06f31 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 16 Feb 2018 13:26:41 -0500 Subject: [PATCH 28/55] Avoid user-select as a byproduct of using the control and clicking --- css/80_app.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/css/80_app.css b/css/80_app.css index 42c33da6f..ee4a32e3d 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1894,6 +1894,11 @@ input[type=number] { color: #888; text-align: center; pointer-events: none; + + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } .restriction-help span { From d940200ef0e1c5cdad1630ca6cdfa5b27218a79e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 16 Feb 2018 13:27:23 -0500 Subject: [PATCH 29/55] osmInferRestriction can just take a turn, instead of from/to This is better because it makes explicit that osmInferRestriction needs an actual turn now (from/to with vertex, etc) --- modules/actions/restrict_turn.js | 2 +- modules/osm/intersection.js | 16 ++++++++-------- modules/ui/fields/restrictions.js | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/actions/restrict_turn.js b/modules/actions/restrict_turn.js index 60284c381..50490012d 100644 --- a/modules/actions/restrict_turn.js +++ b/modules/actions/restrict_turn.js @@ -52,7 +52,7 @@ export function actionRestrictTurn(turn, projection, restrictionID) { id: restrictionID, tags: { type: 'restriction', - restriction: turn.restriction || osmInferRestriction(graph, turn.from, turn.to, projection) + restriction: turn.restriction || osmInferRestriction(graph, turn, projection) }, members: members })); diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 1673bbb45..170552a70 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -604,13 +604,13 @@ export function osmIntersection(graph, startVertexId, maxDistance) { } -export function osmInferRestriction(graph, from, to, projection) { - var fromWay = graph.entity(from.way); - var fromNode = graph.entity(from.node); - var fromVertex = graph.entity(from.vertex); - var toWay = graph.entity(to.way); - var toNode = graph.entity(to.node); - var toVertex = graph.entity(to.vertex); +export function osmInferRestriction(graph, turn, projection) { + var fromWay = graph.entity(turn.from.way); + var fromNode = graph.entity(turn.from.node); + var fromVertex = graph.entity(turn.from.vertex); + var toWay = graph.entity(turn.to.way); + var toNode = graph.entity(turn.to.node); + var toVertex = graph.entity(turn.to.vertex); var fromOneWay = (fromWay.tags.oneway === 'yes'); var toOneWay = (toWay.tags.oneway === 'yes'); @@ -624,7 +624,7 @@ export function osmInferRestriction(graph, from, to, projection) { return 'no_u_turn'; if ((angle < 23 || angle > 336) && fromOneWay && toOneWay) return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway - if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && from.vertex !== to.vertex) + if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to) if (angle < 158) return 'no_right_turn'; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 0550cff63..f29caccbb 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -347,7 +347,7 @@ export function uiFieldRestrictions(field, context) { } else if (datum instanceof osmTurn) { var actions; - datum.restriction = osmInferRestriction(vgraph, datum.from, datum.to, projection); + datum.restriction = osmInferRestriction(vgraph, datum, projection); if (datum.restrictionID && !datum.direct) { return; @@ -436,7 +436,7 @@ export function uiFieldRestrictions(field, context) { var fromWayID = datum.from.way; var viaWayIDs = datum.via.ways; var toWayID = datum.to.way; - var restrictionType = osmInferRestriction(vgraph, datum.from, datum.to, projection); + var restrictionType = osmInferRestriction(vgraph, datum, projection); var turnType = { 'no_left_turn': 'Left Turn', From 200098dff9b1f8778639ac84dccd069502af1bbf Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 19 Feb 2018 21:30:47 -0500 Subject: [PATCH 30/55] Render restriction paths with red/green/blue shadow --- css/20_map.css | 32 +++++++- css/80_app.css | 4 +- modules/osm/intersection.js | 18 ++++- modules/svg/turns.js | 20 ++--- modules/ui/fields/restrictions.js | 124 ++++++++++++++++++++++-------- 5 files changed, 146 insertions(+), 52 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index 5cd5771ac..e4531ed65 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -26,6 +26,11 @@ pointer-events: none; } +.lasso #map { + pointer-events: visibleStroke; +} + + /* `.target` objects are interactive */ /* They can be picked up, clicked, hovered, or things can connect to them */ .node.target { @@ -242,7 +247,7 @@ text.point { } -/* Turns */ +/* Turn Restrictions */ g.turn rect, g.turn circle { @@ -255,9 +260,30 @@ g.turn circle { pointer-events: none; } -.lasso #map { - pointer-events: visibleStroke; +/* Turn restriction paths and vertices */ +.surface.tr path.shadow.selected, +.surface.tr path.shadow.related, +.surface.tr g.vertex.selected .shadow, +.surface.tr g.vertex.related .shadow { + stroke-opacity: 0.7; + stroke: #777; } +.surface.tr path.shadow.related.allow, +.surface.tr g.vertex.related.allow .shadow { + stroke: #7a4; + /*stroke: #8cd05f;*/ +} +.surface.tr path.shadow.related.restrict, +.surface.tr g.vertex.related.restrict .shadow { + stroke: #d75; + /*stroke: #e06d5f;*/ +} +.surface.tr path.shadow.related.only, +.surface.tr g.vertex.related.only .shadow { + stroke: #78f; + /*stroke: #7092ff;*/ +} + /* GPX Paths */ diff --git a/css/80_app.css b/css/80_app.css index ee4a32e3d..0a43ff642 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1910,10 +1910,10 @@ input[type=number] { font-weight: bold; } .restriction-help span.qualifier.allow { - color: #8b5; + color: #7a4; } .restriction-help span.qualifier.restrict { - color: #d76; + color: #d75; } .restriction-help span.qualifier.only { color: #78f; diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 170552a70..2c337f7ed 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -210,7 +210,6 @@ export function osmIntersection(graph, startVertexId, maxDistance) { vertexIds.forEach(function(id) { var vertex = vgraph.entity(id); var parents = vgraph.parentWays(vertex); - vertices.push(vertex); ways = ways.concat(parents); }); @@ -243,8 +242,21 @@ export function osmIntersection(graph, startVertexId, maxDistance) { __from: __from, __via: __via, __to: __to, - __oneWay: __oneWay + __oneWay: __oneWay, + __fromOnly: fromOnly(way) }); + + function fromOnly(way) { + var parents = vgraph.parentRelations(way); + for (var i = 0; i < parents.length; i++) { + var r = parents[i]; + var f = r.memberByRole('from'); + if (r.isRestriction() && /^only_/.test(r.tags.restriction) && f.id === way.id) { + return r.id; + } + } + return null; + } } ways = []; @@ -583,7 +595,7 @@ export function osmIntersection(graph, startVertexId, maxDistance) { } return { - key: path.join(','), + key: path.join('_'), path: path, from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId }, via: { node: viaNodeId, ways: viaWayIds }, diff --git a/modules/svg/turns.js b/modules/svg/turns.js index 1ed10706b..007733afc 100644 --- a/modules/svg/turns.js +++ b/modules/svg/turns.js @@ -30,10 +30,10 @@ export function svgTurns(projection) { var enter = groups.enter() .append('g') - .attr('class', 'turn'); + .attr('class', function(d) { return 'turn ' + d.key; }); var nEnter = enter - .filter(function (turn) { return !turn.u; }); + .filter(function(d) { return !d.u; }); nEnter.append('rect') .attr('transform', 'translate(-22, -12)') @@ -47,7 +47,7 @@ export function svgTurns(projection) { var uEnter = enter - .filter(function (turn) { return turn.u; }); + .filter(function(d) { return d.u; }); uEnter.append('circle') .attr('r', '16'); @@ -62,23 +62,23 @@ export function svgTurns(projection) { .merge(enter); groups - .attr('opacity', function (turn) { - return turn.direct === false ? '0.7' : null; + .attr('opacity', function(d) { + return d.direct === false ? '0.7' : null; }) - .attr('transform', function (turn) { + .attr('transform', function(d) { var pxRadius = 50; - var toWay = graph.entity(turn.to.way); + var toWay = graph.entity(d.to.way); var toPoints = graph.childNodes(toWay) .map(function (n) { return n.loc; }) .map(projection); var toLength = geoPathLength(toPoints); var mid = toLength / 2; // midpoint of destination way - var toNode = graph.entity(turn.to.node); - var toVertex = graph.entity(turn.to.vertex); + var toNode = graph.entity(d.to.node); + var toVertex = graph.entity(d.to.vertex); var a = geoAngle(toVertex, toNode, projection); var o = projection(toVertex.loc); - var r = turn.u ? 0 // u-turn: no radius + var r = d.u ? 0 // u-turn: no radius : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index f29caccbb..1044b72a7 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -283,7 +283,8 @@ export function uiFieldRestrictions(field, context) { selection .call(drawLayers); - var surface = selection.selectAll('.surface'); + var surface = selection.selectAll('.surface') + .classed('tr', true); if (firstTime) { _initialized = true; @@ -314,20 +315,26 @@ export function uiFieldRestrictions(field, context) { surface .on('click.restrictions', click) - .on('mouseover.restrictions', mouseover) - .on('mouseout.restrictions', mouseout); + .on('mouseover.restrictions', mouseover); surface .selectAll('.selected') .classed('selected', false); + surface + .selectAll('.related') + .classed('related', false); + if (_fromWayID) { + var way = vgraph.entity(_fromWayID); surface .selectAll('.' + _fromWayID) - .classed('selected', true); + .classed('selected', true) + .classed('related', true) + .classed('only', !!way.__fromOnly); } - mouseout(); + updateHelp(null); function click() { @@ -351,6 +358,7 @@ export function uiFieldRestrictions(field, context) { if (datum.restrictionID && !datum.direct) { return; + } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state var datumOnly = _cloneDeep(datum); datumOnly.only = true; @@ -371,8 +379,15 @@ export function uiFieldRestrictions(field, context) { t('operations.restriction.annotation.create') ]); } + context.perform.apply(context, actions); + // At this point the datum will be changed, but will have same key.. + // Refresh it and update the help.. + var s = surface.selectAll('.' + datum.key); + datum = s.empty() ? null : s.datum(); + updateHelp(datum); + } else { _fromWayID = null; redraw(); @@ -386,24 +401,6 @@ export function uiFieldRestrictions(field, context) { } - function mouseout() { - var help = _container.selectAll('.restriction-help').html(''); - var div = help.append('div'); - var d; - - if (_fromWayID) { - d = display(vgraph.entity(_fromWayID), vgraph); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); - - } else { - div.append('span').text('Click to select the'); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text('way'); - } - } - - function redraw() { if (context.hasEntity(_vertexID)) { _container.call(renderViewer); @@ -413,7 +410,7 @@ export function uiFieldRestrictions(field, context) { function updateHelp(datum) { var help = _container.selectAll('.restriction-help').html(''); - var div, d; + var div, d, turnType, r; var entity = datum && datum.properties && datum.properties.entity; if (entity) { @@ -421,24 +418,44 @@ export function uiFieldRestrictions(field, context) { } surface.selectAll('.related') - .classed('related', false); + .classed('related', false) + .classed('allow', false) + .classed('restrict', false) + .classed('only', false); + if (datum instanceof osmWay) { + surface.selectAll('.' + datum.id) + .classed('related', true) + .classed('only', !!datum.__fromOnly); + + if (datum.__fromOnly) { + r = vgraph.entity(datum.__fromOnly); + + turnType = { + 'only_left_turn': 'Left Turn', + 'only_right_turn': 'Right Turn', + 'only_u_turn': 'U-Turn', + 'only_straight_on': 'Straight On' + }[r.tags.restriction]; + + div = help.append('div'); + div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); + } + d = display(vgraph.entity(datum.id), vgraph); div = help.append('div'); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); - } else if (datum instanceof osmTurn) { - surface.selectAll(utilEntitySelector(datum.key.split(','))) - .classed('related', true); + } else if (datum instanceof osmTurn) { var fromWayID = datum.from.way; var viaWayIDs = datum.via.ways; var toWayID = datum.to.way; var restrictionType = osmInferRestriction(vgraph, datum, projection); - var turnType = { + turnType = { 'no_left_turn': 'Left Turn', 'no_right_turn': 'Right Turn', 'no_u_turn': 'U-Turn', @@ -450,13 +467,19 @@ export function uiFieldRestrictions(field, context) { if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } + var alongIDs = datum.path.slice(); + surface.selectAll(utilEntitySelector(alongIDs)) + .classed('related', true) + .classed('allow', (klass === 'allow')) + .classed('restrict', (klass === 'restrict')) + .classed('only', (klass === 'only')); + + var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); if (datum.direct === false) { s += ' (indirect)'; } div = help.append('div'); - div.append('span') - .attr('class', 'qualifier ' + klass) - .text(s); + div.append('span').attr('class', 'qualifier ' + klass).text(s); div = help.append('div'); d = display(vgraph.entity(fromWayID), vgraph); @@ -482,6 +505,40 @@ export function uiFieldRestrictions(field, context) { prev = curr; } } + + } else { // datum is empty surface + if (_fromWayID) { + var way = vgraph.entity(_fromWayID); + surface + .selectAll('.' + _fromWayID) + .classed('selected', true) + .classed('related', true) + .classed('only', !!way.__fromOnly); + + if (way.__fromOnly) { + r = vgraph.entity(way.__fromOnly); + + turnType = { + 'only_left_turn': 'Left Turn', + 'only_right_turn': 'Right Turn', + 'only_u_turn': 'U-Turn', + 'only_straight_on': 'Straight On' + }[r.tags.restriction]; + + div = help.append('div'); + div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); + } + + d = display(vgraph.entity(_fromWayID), vgraph); + div = help.append('div'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(d.name || d.type); + } else { + div = help.append('div'); + div.append('span').text('Click to select the'); + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text('way'); + } } } @@ -516,8 +573,7 @@ export function uiFieldRestrictions(field, context) { .call(hover.off) .call(breathe.off) .on('click.restrictions', null) - .on('mouseover.restrictions', null) - .on('mouseout.restrictions', null); + .on('mouseover.restrictions', null); d3_select(window) .on('resize.restrictions', null); From eb3c1f07ec72428eed8b0d01ebf61c99a1355ead Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 09:10:17 -0500 Subject: [PATCH 31/55] Always restyle a selected from way (don't reset it to grey) --- modules/ui/fields/restrictions.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 1044b72a7..bfe00e777 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -410,7 +410,7 @@ export function uiFieldRestrictions(field, context) { function updateHelp(datum) { var help = _container.selectAll('.restriction-help').html(''); - var div, d, turnType, r; + var div, d, turnType, way, r; var entity = datum && datum.properties && datum.properties.entity; if (entity) { @@ -423,6 +423,16 @@ export function uiFieldRestrictions(field, context) { .classed('restrict', false) .classed('only', false); + if (_fromWayID) { + way = vgraph.entity(_fromWayID); + surface + .selectAll('.' + _fromWayID) + .classed('selected', true) + .classed('related', true) + .classed('only', !!way.__fromOnly); + } + + if (datum instanceof osmWay) { surface.selectAll('.' + datum.id) @@ -508,13 +518,6 @@ export function uiFieldRestrictions(field, context) { } else { // datum is empty surface if (_fromWayID) { - var way = vgraph.entity(_fromWayID); - surface - .selectAll('.' + _fromWayID) - .classed('selected', true) - .classed('related', true) - .classed('only', !!way.__fromOnly); - if (way.__fromOnly) { r = vgraph.entity(way.__fromOnly); @@ -533,6 +536,7 @@ export function uiFieldRestrictions(field, context) { div = help.append('div'); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); + } else { div = help.append('div'); div.append('span').text('Click to select the'); From 4ce0b62d051547d3772ef37952af47b9bbac2d5c Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 10:38:50 -0500 Subject: [PATCH 32/55] Remove unneeded hover behavior, don't hover a way that can't be a FROM --- modules/ui/fields/restrictions.js | 45 ++++++++++--------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index bfe00e777..a3a9e7bd7 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -9,7 +9,7 @@ import { import { t } from '../../util/locale'; import { actionRestrictTurn, actionUnrestrictTurn } from '../../actions'; -import { behaviorBreathe, behaviorHover } from '../../behavior'; +import { behaviorBreathe } from '../../behavior'; import { geoExtent, @@ -52,7 +52,6 @@ import { export function uiFieldRestrictions(field, context) { var dispatch = d3_dispatch('change'); var breathe = behaviorBreathe(context); - var hover = behaviorHover(context); var storedViaWay = context.storage('turn-restriction-via-way'); var storedDistance = context.storage('turn-restriction-distance'); var isImperial = (utilDetect().locale.toLowerCase() === 'en-us'); @@ -290,8 +289,7 @@ export function uiFieldRestrictions(field, context) { _initialized = true; surface - .call(breathe) - .call(hover); + .call(breathe); d3_select(window) .on('resize.restrictions', function() { @@ -409,6 +407,13 @@ export function uiFieldRestrictions(field, context) { function updateHelp(datum) { + var turns = { + 'no_left_turn': 'Left Turn', + 'no_right_turn': 'Right Turn', + 'no_u_turn': 'U-Turn', + 'no_straight_on': 'Straight On' + }; + var help = _container.selectAll('.restriction-help').html(''); var div, d, turnType, way, r; @@ -433,22 +438,14 @@ export function uiFieldRestrictions(field, context) { } - - if (datum instanceof osmWay) { + if (datum instanceof osmWay && datum.__from) { surface.selectAll('.' + datum.id) .classed('related', true) .classed('only', !!datum.__fromOnly); if (datum.__fromOnly) { r = vgraph.entity(datum.__fromOnly); - - turnType = { - 'only_left_turn': 'Left Turn', - 'only_right_turn': 'Right Turn', - 'only_u_turn': 'U-Turn', - 'only_straight_on': 'Straight On' - }[r.tags.restriction]; - + turnType = turns[r.tags.restriction.replace(/^only/, 'no')]; div = help.append('div'); div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); } @@ -464,13 +461,7 @@ export function uiFieldRestrictions(field, context) { var viaWayIDs = datum.via.ways; var toWayID = datum.to.way; var restrictionType = osmInferRestriction(vgraph, datum, projection); - - turnType = { - 'no_left_turn': 'Left Turn', - 'no_right_turn': 'Right Turn', - 'no_u_turn': 'U-Turn', - 'no_straight_on': 'Straight On' - }[restrictionType.replace(/^only/, 'no')]; + turnType = turns[restrictionType.replace(/^only/, 'no')]; var restrictType = ''; var klass = 'allow'; @@ -520,14 +511,7 @@ export function uiFieldRestrictions(field, context) { if (_fromWayID) { if (way.__fromOnly) { r = vgraph.entity(way.__fromOnly); - - turnType = { - 'only_left_turn': 'Left Turn', - 'only_right_turn': 'Right Turn', - 'only_u_turn': 'U-Turn', - 'only_straight_on': 'Straight On' - }[r.tags.restriction]; - + turnType = turns[r.tags.restriction.replace(/^only/, 'no')]; div = help.append('div'); div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); } @@ -539,7 +523,7 @@ export function uiFieldRestrictions(field, context) { } else { div = help.append('div'); - div.append('span').text('Click to select the'); + div.append('span').text('Click to select a'); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text('way'); } @@ -574,7 +558,6 @@ export function uiFieldRestrictions(field, context) { if (!_initialized) return; selection.selectAll('.surface') - .call(hover.off) .call(breathe.off) .on('click.restrictions', null) .on('mouseover.restrictions', null); From bbeb34626b221bcccad9b9e4f7265161f7f01992 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 10:47:03 -0500 Subject: [PATCH 33/55] Show really thick path shadows in the turn restriction editor --- css/20_map.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/css/20_map.css b/css/20_map.css index e4531ed65..ac7e1efac 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -261,6 +261,11 @@ g.turn circle { } /* Turn restriction paths and vertices */ +.surface.tr path.shadow.selected, +.surface.tr path.shadow.related { + stroke-width: 30px; +} + .surface.tr path.shadow.selected, .surface.tr path.shadow.related, .surface.tr g.vertex.selected .shadow, From bd46d0cc4a8a106fa462dcf7ee36660aae51ebf6 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 13:57:51 -0500 Subject: [PATCH 34/55] Highlight restriction when hovering on from --- modules/ui/fields/restrictions.js | 45 ++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index a3a9e7bd7..0dfbead6c 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -415,7 +415,7 @@ export function uiFieldRestrictions(field, context) { }; var help = _container.selectAll('.restriction-help').html(''); - var div, d, turnType, way, r; + var div, d, turnType, way, r, i; var entity = datum && datum.properties && datum.properties.entity; if (entity) { @@ -439,22 +439,53 @@ export function uiFieldRestrictions(field, context) { if (datum instanceof osmWay && datum.__from) { - surface.selectAll('.' + datum.id) + way = datum; + surface.selectAll('.' + way.id) .classed('related', true) - .classed('only', !!datum.__fromOnly); + .classed('only', !!way.__fromOnly); - if (datum.__fromOnly) { - r = vgraph.entity(datum.__fromOnly); + if (way.__fromOnly) { + r = vgraph.entity(way.__fromOnly); turnType = turns[r.tags.restriction.replace(/^only/, 'no')]; div = help.append('div'); div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); } - d = display(vgraph.entity(datum.id), vgraph); + d = display(vgraph.entity(way.id), vgraph); div = help.append('div'); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); + // highlight all TOs and ONLY VIAs? + var parents = vgraph.parentRelations(way); + for (i = 0; i < parents.length; i++) { + r = parents[i]; + var f = r.memberByRole('from'); + + if (r.isRestriction() && f.id === way.id) { + var kl = 'allow'; + if (/^no_/.test(r.tags.restriction)) { kl = 'restrict'; } + if (/^only_/.test(r.tags.restriction)) { kl = 'only'; } + + var t = r.memberByRole('to'); + surface.selectAll('.' + t.id) + .classed('related', true) + .classed('allow', (kl === 'allow')) + .classed('restrict', (kl === 'restrict')) + .classed('only', (kl === 'only')); + + var v = r.membersByRole('via'); + if (kl === 'only' && v.length) { + var vIDs = v.map(function (m) { return m.id; }); + surface.selectAll(utilEntitySelector(vIDs)) + .classed('related', true) + .classed('allow', (kl === 'allow')) + .classed('restrict', (kl === 'restrict')) + .classed('only', (kl === 'only')); + } + } + } + } else if (datum instanceof osmTurn) { var fromWayID = datum.from.way; @@ -496,7 +527,7 @@ export function uiFieldRestrictions(field, context) { div.append('span').attr('class', 'qualifier').text('VIA'); var curr, prev; - for (var i = 0; i < viaWayIDs.length; i++) { + for (i = 0; i < viaWayIDs.length; i++) { d = display(vgraph.entity(viaWayIDs[i]), vgraph); curr = d.name || d.type; if (curr === prev) continue; // collapse identical names From 7559ff68df738cf8f8aebcc967a9c9d111868538 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 15:45:44 -0500 Subject: [PATCH 35/55] Highlight all the paths when hoving on the from --- css/20_map.css | 3 +- modules/ui/fields/restrictions.js | 52 ++++++++++++++----------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index ac7e1efac..00e615c22 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -261,9 +261,10 @@ g.turn circle { } /* Turn restriction paths and vertices */ +.surface.tr .way.target, .surface.tr path.shadow.selected, .surface.tr path.shadow.related { - stroke-width: 30px; + stroke-width: 25px; } .surface.tr path.shadow.selected, diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 0dfbead6c..2646a3f5c 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -407,7 +407,7 @@ export function uiFieldRestrictions(field, context) { function updateHelp(datum) { - var turns = { + var turnTypes = { 'no_left_turn': 'Left Turn', 'no_right_turn': 'Right Turn', 'no_u_turn': 'U-Turn', @@ -440,13 +440,14 @@ export function uiFieldRestrictions(field, context) { if (datum instanceof osmWay && datum.__from) { way = datum; + surface.selectAll('.' + way.id) .classed('related', true) .classed('only', !!way.__fromOnly); if (way.__fromOnly) { r = vgraph.entity(way.__fromOnly); - turnType = turns[r.tags.restriction.replace(/^only/, 'no')]; + turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; div = help.append('div'); div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); } @@ -456,34 +457,29 @@ export function uiFieldRestrictions(field, context) { div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); - // highlight all TOs and ONLY VIAs? - var parents = vgraph.parentRelations(way); - for (i = 0; i < parents.length; i++) { - r = parents[i]; - var f = r.memberByRole('from'); + // highlight all paths on hover? + var turns = _intersection.turns(way.id, _maxViaWay); - if (r.isRestriction() && f.id === way.id) { - var kl = 'allow'; - if (/^no_/.test(r.tags.restriction)) { kl = 'restrict'; } - if (/^only_/.test(r.tags.restriction)) { kl = 'only'; } + for (i = 0; i < turns.length; i++) { + var turn = turns[i]; + var ids = [turn.to.way]; + var kl = 'allow'; + if (turn.no) { kl = 'restrict'; } + if (turn.only) { kl = 'only'; } - var t = r.memberByRole('to'); - surface.selectAll('.' + t.id) - .classed('related', true) - .classed('allow', (kl === 'allow')) - .classed('restrict', (kl === 'restrict')) - .classed('only', (kl === 'only')); + if (turn.only || turns.length === 1) { + var v = turn.via.node ? [turn.via.node] + : turn.via.ways ? turn.via.ways + : []; - var v = r.membersByRole('via'); - if (kl === 'only' && v.length) { - var vIDs = v.map(function (m) { return m.id; }); - surface.selectAll(utilEntitySelector(vIDs)) - .classed('related', true) - .classed('allow', (kl === 'allow')) - .classed('restrict', (kl === 'restrict')) - .classed('only', (kl === 'only')); - } + ids = ids.concat(v); } + + surface.selectAll(utilEntitySelector(ids)) + .classed('related', true) + .classed('allow', (kl === 'allow')) + .classed('restrict', (kl === 'restrict')) + .classed('only', (kl === 'only')); } @@ -492,7 +488,7 @@ export function uiFieldRestrictions(field, context) { var viaWayIDs = datum.via.ways; var toWayID = datum.to.way; var restrictionType = osmInferRestriction(vgraph, datum, projection); - turnType = turns[restrictionType.replace(/^only/, 'no')]; + turnType = turnTypes[restrictionType.replace(/^only/, 'no')]; var restrictType = ''; var klass = 'allow'; @@ -542,7 +538,7 @@ export function uiFieldRestrictions(field, context) { if (_fromWayID) { if (way.__fromOnly) { r = vgraph.entity(way.__fromOnly); - turnType = turns[r.tags.restriction.replace(/^only/, 'no')]; + turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; div = help.append('div'); div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); } From 104e8cea5cdcf295b8a948500eab8066440ebcd3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 16:16:10 -0500 Subject: [PATCH 36/55] Adjust color for better visibility --- css/20_map.css | 9 +++------ css/80_app.css | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index 00e615c22..44c4f50ae 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -276,18 +276,15 @@ g.turn circle { } .surface.tr path.shadow.related.allow, .surface.tr g.vertex.related.allow .shadow { - stroke: #7a4; - /*stroke: #8cd05f;*/ + stroke: #5b3; } .surface.tr path.shadow.related.restrict, .surface.tr g.vertex.related.restrict .shadow { - stroke: #d75; - /*stroke: #e06d5f;*/ + stroke: #d53; } .surface.tr path.shadow.related.only, .surface.tr g.vertex.related.only .shadow { - stroke: #78f; - /*stroke: #7092ff;*/ + stroke: #68f; } diff --git a/css/80_app.css b/css/80_app.css index 0a43ff642..34f9c3273 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1910,10 +1910,10 @@ input[type=number] { font-weight: bold; } .restriction-help span.qualifier.allow { - color: #7a4; + color: #8b5; } .restriction-help span.qualifier.restrict { - color: #d75; + color: #d53; } .restriction-help span.qualifier.only { color: #78f; From 419d1e124b94f13e97a841d790bd20ff64ba59aa Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 20 Feb 2018 17:01:11 -0500 Subject: [PATCH 37/55] Remove fromOnly highlighting (was confusing), try to simplify --- modules/ui/fields/restrictions.js | 79 +++++++++++++++++-------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 2646a3f5c..e35d4c36f 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -328,8 +328,8 @@ export function uiFieldRestrictions(field, context) { surface .selectAll('.' + _fromWayID) .classed('selected', true) - .classed('related', true) - .classed('only', !!way.__fromOnly); + .classed('related', true); + // .classed('only', !!way.__fromOnly); } updateHelp(null); @@ -433,8 +433,8 @@ export function uiFieldRestrictions(field, context) { surface .selectAll('.' + _fromWayID) .classed('selected', true) - .classed('related', true) - .classed('only', !!way.__fromOnly); + .classed('related', true); + // .classed('only', !!way.__fromOnly); } @@ -442,45 +442,52 @@ export function uiFieldRestrictions(field, context) { way = datum; surface.selectAll('.' + way.id) - .classed('related', true) - .classed('only', !!way.__fromOnly); + .classed('related', true); + // .classed('only', !!way.__fromOnly); - if (way.__fromOnly) { - r = vgraph.entity(way.__fromOnly); - turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; + // if (way.__fromOnly) { + // r = vgraph.entity(way.__fromOnly); + // turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; + // div = help.append('div'); + // div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); + // } + + if (!_fromWayID || _fromWayID !== way.id) { div = help.append('div'); - div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); + div.append('span').text('Click to select'); } - d = display(vgraph.entity(way.id), vgraph); div = help.append('div'); + d = display(vgraph.entity(way.id), vgraph); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); // highlight all paths on hover? - var turns = _intersection.turns(way.id, _maxViaWay); + if (!_fromWayID) { + var turns = _intersection.turns(way.id, _maxViaWay); - for (i = 0; i < turns.length; i++) { - var turn = turns[i]; - var ids = [turn.to.way]; - var kl = 'allow'; - if (turn.no) { kl = 'restrict'; } - if (turn.only) { kl = 'only'; } + for (i = 0; i < turns.length; i++) { + var turn = turns[i]; + var ids = [turn.to.way]; + var kl = 'allow'; + if (turn.no) { kl = 'restrict'; } + if (turn.only) { kl = 'only'; } - if (turn.only || turns.length === 1) { - var v = turn.via.node ? [turn.via.node] - : turn.via.ways ? turn.via.ways - : []; + if (turn.only || turns.length === 1) { + var v = turn.via.node ? [turn.via.node] + : turn.via.ways ? turn.via.ways + : []; - ids = ids.concat(v); - } + ids = ids.concat(v); + } - surface.selectAll(utilEntitySelector(ids)) - .classed('related', true) - .classed('allow', (kl === 'allow')) - .classed('restrict', (kl === 'restrict')) - .classed('only', (kl === 'only')); + surface.selectAll(utilEntitySelector(ids)) + .classed('related', true) + .classed('allow', (kl === 'allow')) + .classed('restrict', (kl === 'restrict')) + .classed('only', (kl === 'only')); } + } } else if (datum instanceof osmTurn) { @@ -536,15 +543,15 @@ export function uiFieldRestrictions(field, context) { } else { // datum is empty surface if (_fromWayID) { - if (way.__fromOnly) { - r = vgraph.entity(way.__fromOnly); - turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; - div = help.append('div'); - div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); - } + // if (way.__fromOnly) { + // r = vgraph.entity(way.__fromOnly); + // turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; + // div = help.append('div'); + // div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); + // } - d = display(vgraph.entity(_fromWayID), vgraph); div = help.append('div'); + d = display(vgraph.entity(_fromWayID), vgraph); div.append('span').attr('class', 'qualifier').text('FROM'); div.append('span').text(d.name || d.type); From 156d0fd681806b9a97c7c66ce606d5608aac284d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 21 Feb 2018 00:33:41 -0500 Subject: [PATCH 38/55] Drop confusing fromOnly code, consolidate path highlighting code --- modules/osm/intersection.js | 15 +--- modules/ui/fields/restrictions.js | 128 +++++++++++++----------------- 2 files changed, 56 insertions(+), 87 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 2c337f7ed..9e4784985 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -242,21 +242,8 @@ export function osmIntersection(graph, startVertexId, maxDistance) { __from: __from, __via: __via, __to: __to, - __oneWay: __oneWay, - __fromOnly: fromOnly(way) + __oneWay: __oneWay }); - - function fromOnly(way) { - var parents = vgraph.parentRelations(way); - for (var i = 0; i < parents.length; i++) { - var r = parents[i]; - var f = r.memberByRole('from'); - if (r.isRestriction() && /^only_/.test(r.tags.restriction) && f.id === way.id) { - return r.id; - } - } - return null; - } } ways = []; diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index e35d4c36f..2f6b8564b 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -329,10 +329,9 @@ export function uiFieldRestrictions(field, context) { .selectAll('.' + _fromWayID) .classed('selected', true) .classed('related', true); - // .classed('only', !!way.__fromOnly); } - updateHelp(null); + updateHints(null); function click() { @@ -384,7 +383,7 @@ export function uiFieldRestrictions(field, context) { // Refresh it and update the help.. var s = surface.selectAll('.' + datum.key); datum = s.empty() ? null : s.datum(); - updateHelp(datum); + updateHints(datum); } else { _fromWayID = null; @@ -395,7 +394,7 @@ export function uiFieldRestrictions(field, context) { function mouseover() { var datum = d3_event.target.__data__; - updateHelp(datum); + updateHints(datum); } @@ -406,7 +405,42 @@ export function uiFieldRestrictions(field, context) { } - function updateHelp(datum) { + function highlightPathsFrom(wayID) { + surface.selectAll('.related') + .classed('related', false) + .classed('allow', false) + .classed('restrict', false) + .classed('only', false); + + surface.selectAll('.' + wayID) + .classed('related', true); + + if (wayID) { + var turns = _intersection.turns(wayID, _maxViaWay); + for (var i = 0; i < turns.length; i++) { + var turn = turns[i]; + var ids = [turn.to.way]; + var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow')); + + if (turn.only || turns.length === 1) { + if (turn.via.ways) { + ids = ids.concat(turn.via.ways); + } + } else if (turn.to.way === wayID) { + continue; + } + + surface.selectAll(utilEntitySelector(ids)) + .classed('related', true) + .classed('allow', (klass === 'allow')) + .classed('restrict', (klass === 'restrict')) + .classed('only', (klass === 'only')); + } + } + } + + + function updateHints(datum) { var turnTypes = { 'no_left_turn': 'Left Turn', 'no_right_turn': 'Right Turn', @@ -415,79 +449,35 @@ export function uiFieldRestrictions(field, context) { }; var help = _container.selectAll('.restriction-help').html(''); - var div, d, turnType, way, r, i; + var div, turnType; var entity = datum && datum.properties && datum.properties.entity; if (entity) { datum = entity; } - surface.selectAll('.related') - .classed('related', false) - .classed('allow', false) - .classed('restrict', false) - .classed('only', false); - if (_fromWayID) { way = vgraph.entity(_fromWayID); surface .selectAll('.' + _fromWayID) .classed('selected', true) .classed('related', true); - // .classed('only', !!way.__fromOnly); } if (datum instanceof osmWay && datum.__from) { way = datum; + highlightPathsFrom(_fromWayID ? null : way.id); surface.selectAll('.' + way.id) .classed('related', true); - // .classed('only', !!way.__fromOnly); - - // if (way.__fromOnly) { - // r = vgraph.entity(way.__fromOnly); - // turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; - // div = help.append('div'); - // div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); - // } - - if (!_fromWayID || _fromWayID !== way.id) { - div = help.append('div'); - div.append('span').text('Click to select'); - } div = help.append('div'); - d = display(vgraph.entity(way.id), vgraph); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); - - // highlight all paths on hover? - if (!_fromWayID) { - var turns = _intersection.turns(way.id, _maxViaWay); - - for (i = 0; i < turns.length; i++) { - var turn = turns[i]; - var ids = [turn.to.way]; - var kl = 'allow'; - if (turn.no) { kl = 'restrict'; } - if (turn.only) { kl = 'only'; } - - if (turn.only || turns.length === 1) { - var v = turn.via.node ? [turn.via.node] - : turn.via.ways ? turn.via.ways - : []; - - ids = ids.concat(v); - } - - surface.selectAll(utilEntitySelector(ids)) - .classed('related', true) - .classed('allow', (kl === 'allow')) - .classed('restrict', (kl === 'restrict')) - .classed('only', (kl === 'only')); + if (!_fromWayID || _fromWayID !== way.id) { + div.append('span').text('Click to select'); } - } + div.append('span').attr('class', 'qualifier').text('FROM'); + div.append('span').text(displayName(vgraph.entity(way.id), vgraph)); } else if (datum instanceof osmTurn) { @@ -502,6 +492,8 @@ export function uiFieldRestrictions(field, context) { if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } + + highlightPathsFrom(null); var alongIDs = datum.path.slice(); surface.selectAll(utilEntitySelector(alongIDs)) .classed('related', true) @@ -517,22 +509,19 @@ export function uiFieldRestrictions(field, context) { div.append('span').attr('class', 'qualifier ' + klass).text(s); div = help.append('div'); - d = display(vgraph.entity(fromWayID), vgraph); div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); + div.append('span').text(displayName(vgraph.entity(fromWayID), vgraph)); - d = display(vgraph.entity(toWayID), vgraph); div.append('span').attr('class', 'qualifier').text('TO'); - div.append('span').text(d.name || d.type); + div.append('span').text(displayName(vgraph.entity(toWayID), vgraph)); if (viaWayIDs && viaWayIDs.length) { div = help.append('div'); div.append('span').attr('class', 'qualifier').text('VIA'); var curr, prev; - for (i = 0; i < viaWayIDs.length; i++) { - d = display(vgraph.entity(viaWayIDs[i]), vgraph); - curr = d.name || d.type; + for (var i = 0; i < viaWayIDs.length; i++) { + curr = displayName(vgraph.entity(viaWayIDs[i]), vgraph); if (curr === prev) continue; // collapse identical names if (prev) div.append('span').text(','); @@ -542,18 +531,11 @@ export function uiFieldRestrictions(field, context) { } } else { // datum is empty surface + highlightPathsFrom(null); if (_fromWayID) { - // if (way.__fromOnly) { - // r = vgraph.entity(way.__fromOnly); - // turnType = turnTypes[r.tags.restriction.replace(/^only/, 'no')]; - // div = help.append('div'); - // div.append('span').attr('class', 'qualifier only').text('ONLY ' + turnType); - // } - div = help.append('div'); - d = display(vgraph.entity(_fromWayID), vgraph); div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(d.name || d.type); + div.append('span').text(displayName(vgraph.entity(_fromWayID), vgraph)); } else { div = help.append('div'); @@ -567,11 +549,11 @@ export function uiFieldRestrictions(field, context) { } - function display(entity, graph) { + function displayName(entity, graph) { var name = utilDisplayName(entity) || ''; var matched = context.presets().match(entity, graph); var type = (matched && matched.name()) || utilDisplayType(entity.id); - return { name: name, type: type }; + return name || type; } From aaed678468b78372d066dc1d30419bc46999c612 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 22 Feb 2018 22:26:45 -0500 Subject: [PATCH 39/55] Localize all the strings --- css/80_app.css | 8 +- data/core.yaml | 37 +++++- dist/locales/en.json | 42 ++++++- modules/ui/fields/restrictions.js | 190 ++++++++++++++++++------------ 4 files changed, 184 insertions(+), 93 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 34f9c3273..ece0e1834 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1905,17 +1905,17 @@ input[type=number] { margin: 2px; } -.restriction-help span.qualifier { +.restriction-help .qualifier { color: #666; font-weight: bold; } -.restriction-help span.qualifier.allow { +.restriction-help .qualifier.allow { color: #8b5; } -.restriction-help span.qualifier.restrict { +.restriction-help .qualifier.restrict { color: #d53; } -.restriction-help span.qualifier.only { +.restriction-help .qualifier.only { color: #78f; } diff --git a/data/core.yaml b/data/core.yaml index cc9511458..94f603eb8 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -219,14 +219,41 @@ en: multiple_ways: There are too many lines here to split. connected_to_hidden: This can't be split because it is connected to a hidden feature. restriction: - help: - select: Click to select a road segment. - toggle: Click to toggle turn restrictions. - toggle_on: 'Click to add a "{restriction}" restriction.' - toggle_off: 'Click to remove the "{restriction}" restriction.' annotation: create: Added a turn restriction delete: Deleted a turn restriction + restriction: + controls: + distance: Distance + distance_up_to: "Up to {distance}" + via: Via + via_node_only: "Node only" + via_up_to_one: "Up to 1 way" + via_up_to_multiple: "Up to {num} ways" + help: + no: NO + only: ONLY + allowed: Allowed + indirect: "(indirect)" + turn: + left_turn: Left Turn + right_turn: Right Turn + u_turn: U-Turn + straight_on: Straight On + no_turn_string: "{no} {turn} {indirect}" + only_turn_string: "{only} {turn} {indirect}" + allowed_turn_string: "{turn} {allowed} {indirect}" + from: FROM + via: VIA + to: TO + from_name: "{from} {fromName}" + from_name_to_name: "{from} {fromName} {to} {toName}" + via_names: "{via} {viaNames}" + select_from: "Click to select a {from} segment" + select_from_name: "Click to select {from} {fromName}" + toggle: Click to toggle turn restrictions. + toggle_on: 'Click to add a "{restriction}" restriction.' + toggle_off: 'Click to remove the "{restriction}" restriction.' undo: tooltip: "Undo: {action}" nothing: Nothing to undo. diff --git a/dist/locales/en.json b/dist/locales/en.json index 7b2314259..7ae8fdecb 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -285,18 +285,48 @@ "connected_to_hidden": "This can't be split because it is connected to a hidden feature." }, "restriction": { - "help": { - "select": "Click to select a road segment.", - "toggle": "Click to toggle turn restrictions.", - "toggle_on": "Click to add a \"{restriction}\" restriction.", - "toggle_off": "Click to remove the \"{restriction}\" restriction." - }, "annotation": { "create": "Added a turn restriction", "delete": "Deleted a turn restriction" } } }, + "restriction": { + "controls": { + "distance": "Distance", + "distance_up_to": "Up to {distance}", + "via": "Via", + "via_node_only": "Node only", + "via_up_to_one": "Up to 1 way", + "via_up_to_multiple": "Up to {num} ways" + }, + "help": { + "no": "NO", + "only": "ONLY", + "allowed": "Allowed", + "indirect": "(indirect)", + "turn": { + "left_turn": "Left Turn", + "right_turn": "Right Turn", + "u_turn": "U-Turn", + "straight_on": "Straight On" + }, + "no_turn_string": "{no} {turn} {indirect}", + "only_turn_string": "{only} {turn} {indirect}", + "allowed_turn_string": "{turn} {allowed} {indirect}", + "from": "FROM", + "via": "VIA", + "to": "TO", + "from_name": "{from} {fromName}", + "from_name_to_name": "{from} {fromName} {to} {toName}", + "via_names": "{via} {viaNames}", + "select_from": "Click to select a {from} segment", + "select_from_name": "Click to select {from} {fromName}", + "toggle": "Click to toggle turn restrictions.", + "toggle_on": "Click to add a \"{restriction}\" restriction.", + "toggle_off": "Click to remove the \"{restriction}\" restriction." + } + }, "undo": { "tooltip": "Undo: {action}", "nothing": "Nothing to undo." diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 2f6b8564b..af8a2413c 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -54,7 +54,6 @@ export function uiFieldRestrictions(field, context) { var breathe = behaviorBreathe(context); var storedViaWay = context.storage('turn-restriction-via-way'); var storedDistance = context.storage('turn-restriction-distance'); - var isImperial = (utilDetect().locale.toLowerCase() === 'en-us'); var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1; var _maxDistance = storedDistance ? (+storedDistance) : 30; @@ -119,7 +118,6 @@ export function uiFieldRestrictions(field, context) { .merge(container) .call(renderViewer); - var controls = wrap.selectAll('.restriction-controls') .data([0]); @@ -148,7 +146,7 @@ export function uiFieldRestrictions(field, context) { distControlEnter .append('span') .attr('class', 'restriction-control-label restriction-distance-label') - .text('Distance:'); + .text(t('restriction.controls.distance') + ':'); distControlEnter .append('input') @@ -174,18 +172,8 @@ export function uiFieldRestrictions(field, context) { _parent.call(restrictions); }); - var distDisplay; - if (isImperial) { // imprecise conversion for prettier display - var distToFeet = { - 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160 - }[_maxDistance]; - distDisplay = 'Up to ' + distToFeet + ' feet'; - } else { - distDisplay = 'Up to ' + _maxDistance + ' meters'; - } - selection.selectAll('.restriction-distance-text') - .text(distDisplay); + .text(displayMaxDistance(_maxDistance)); var viaControl = selection.selectAll('.restriction-via-way') @@ -201,7 +189,7 @@ export function uiFieldRestrictions(field, context) { viaControlEnter .append('span') .attr('class', 'restriction-control-label restriction-via-way-label') - .text('Via:'); + .text(t('restriction.controls.via') + ':'); viaControlEnter .append('input') @@ -226,9 +214,8 @@ export function uiFieldRestrictions(field, context) { _parent.call(restrictions); }); - var t = ['Node only', 'Up to 1 way', 'Up to 2 ways']; selection.selectAll('.restriction-via-way-text') - .text(t[_maxViaWay]); + .text(displayMaxVia(_maxViaWay)); } @@ -441,15 +428,12 @@ export function uiFieldRestrictions(field, context) { function updateHints(datum) { - var turnTypes = { - 'no_left_turn': 'Left Turn', - 'no_right_turn': 'Right Turn', - 'no_u_turn': 'U-Turn', - 'no_straight_on': 'Straight On' - }; - var help = _container.selectAll('.restriction-help').html(''); - var div, turnType; + + var placeholders = {}; + ['from', 'via', 'to'].forEach(function(k) { + placeholders[k] = '' + t('restriction.help.' + k) + ''; + }); var entity = datum && datum.properties && datum.properties.entity; if (entity) { @@ -464,7 +448,7 @@ export function uiFieldRestrictions(field, context) { .classed('related', true); } - + // Hovering a way if (datum instanceof osmWay && datum.__from) { way = datum; @@ -472,26 +456,75 @@ export function uiFieldRestrictions(field, context) { surface.selectAll('.' + way.id) .classed('related', true); - div = help.append('div'); - if (!_fromWayID || _fromWayID !== way.id) { - div.append('span').text('Click to select'); - } - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(displayName(vgraph.entity(way.id), vgraph)); + var clickSelect = (!_fromWayID || _fromWayID !== way.id); + help + .append('div') // "Click to select FROM {fromName}." / "FROM {fromName}" + .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), { + from: placeholders.from, + fromName: displayName(way.id, vgraph) + })); + // Hovering a turn arrow } else if (datum instanceof osmTurn) { - var fromWayID = datum.from.way; - var viaWayIDs = datum.via.ways; - var toWayID = datum.to.way; var restrictionType = osmInferRestriction(vgraph, datum, projection); - turnType = turnTypes[restrictionType.replace(/^only/, 'no')]; + var turnType = restrictionType.replace(/^(only|no)\_/, ''); + var indirect = (datum.direct === false ? t('restriction.help.indirect') : ''); + var klass, turnHtml; - var restrictType = ''; - var klass = 'allow'; - if (datum.no) { restrictType = 'NO'; klass = 'restrict'; } - if (datum.only) { restrictType = 'ONLY'; klass = 'only'; } + if (datum.no) { + klass = 'restrict'; + turnHtml = t('restriction.help.no_turn_string', { + no: t('restriction.help.no'), + turn: t('restriction.help.turn.' + turnType), + indirect: indirect + }); + } else if (datum.only) { + klass = 'only'; + turnHtml = t('restriction.help.only_turn_string', { + only: t('restriction.help.only'), + turn: t('restriction.help.turn.' + turnType), + indirect: indirect + }); + } else { + klass = 'allow'; + turnHtml = t('restriction.help.allowed_turn_string', { + allowed: t('restriction.help.allowed'), + turn: t('restriction.help.turn.' + turnType), + indirect: indirect + }); + } + help + .append('div') // Turn Description + .attr('class', 'qualifier ' + klass) + .html(turnHtml); + + help + .append('div') // "FROM {fromName} TO {toName}" + .html(t('restriction.help.from_name_to_name', { + from: placeholders.from, + fromName: displayName(datum.from.way, vgraph), + to: placeholders.to, + toName: displayName(datum.to.way, vgraph) + })); + + if (datum.via.ways && datum.via.ways.length) { + var names = []; + for (var i = 0; i < datum.via.ways.length; i++) { + var prev = names[names.length - 1]; + var curr = displayName(datum.via.ways[i], vgraph); + if (!prev || curr !== prev) // collapse identical names + names.push(curr); + } + + help + .append('div') // "VIA {viaNames}" + .html(t('restriction.help.via_names', { + via: placeholders.via, + viaNames: names.join(', ') + })); + } highlightPathsFrom(null); var alongIDs = datum.path.slice(); @@ -502,54 +535,55 @@ export function uiFieldRestrictions(field, context) { .classed('only', (klass === 'only')); - var s = (klass === 'allow' ? turnType + ' Allowed' : restrictType + ' ' + turnType); - if (datum.direct === false) { s += ' (indirect)'; } - - div = help.append('div'); - div.append('span').attr('class', 'qualifier ' + klass).text(s); - - div = help.append('div'); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(displayName(vgraph.entity(fromWayID), vgraph)); - - div.append('span').attr('class', 'qualifier').text('TO'); - div.append('span').text(displayName(vgraph.entity(toWayID), vgraph)); - - if (viaWayIDs && viaWayIDs.length) { - div = help.append('div'); - div.append('span').attr('class', 'qualifier').text('VIA'); - - var curr, prev; - for (var i = 0; i < viaWayIDs.length; i++) { - curr = displayName(vgraph.entity(viaWayIDs[i]), vgraph); - if (curr === prev) continue; // collapse identical names - - if (prev) div.append('span').text(','); - div.append('span').text(curr); - prev = curr; - } - } - - } else { // datum is empty surface + // Hovering empty surface + } else { highlightPathsFrom(null); if (_fromWayID) { - div = help.append('div'); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text(displayName(vgraph.entity(_fromWayID), vgraph)); + help + .append('div') // "FROM {fromName}" + .html(t('restriction.help.from_name', { + from: placeholders.from, + fromName: displayName(_fromWayID, vgraph) + })); } else { - div = help.append('div'); - div.append('span').text('Click to select a'); - div.append('span').attr('class', 'qualifier').text('FROM'); - div.append('span').text('way'); + help + .append('div') // "Click to select a FROM segment." + .html(t('restriction.help.select_from', { + from: placeholders.from + })); } } - } } - function displayName(entity, graph) { + function displayMaxDistance(maxDist) { + var isImperial = (utilDetect().locale.toLowerCase() === 'en-us'); + var opts; + + if (isImperial) { + var distToFeet = { // imprecise conversion for prettier display + 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160 + }[maxDist]; + opts = { distance: t('units.feet', { quantity: distToFeet }) }; + } else { + opts = { distance: t('units.meters', { quantity: maxDist }) }; + } + + return t('restriction.controls.distance_up_to', opts); + } + + + function displayMaxVia(maxVia) { + return maxVia === 0 ? t('restriction.controls.via_node_only') + : maxVia === 1 ? t('restriction.controls.via_up_to_one') + : t('restriction.controls.via_up_to_multiple', { num: maxVia }); + } + + + function displayName(entityID, graph) { + var entity = graph.entity(entityID); var name = utilDisplayName(entity) || ''; var matched = context.presets().match(entity, graph); var type = (matched && matched.name()) || utilDisplayType(entity.id); From c63f79a75332ab9b2c3779131e136922398a17e3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 22 Feb 2018 22:36:04 -0500 Subject: [PATCH 40/55] Remove isComplex, not used This was used to decide whether to show the "Max Via" control. (It's not really needed for a simple intersection) However since we added the "Max Distance" control, it just makes sense to show both sliders, since the distance can affect the complexity. --- modules/ui/fields/restrictions.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index af8a2413c..27541876e 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -99,8 +99,6 @@ export function uiFieldRestrictions(field, context) { .attr('class', 'preset-input-wrap') .merge(wrap); - var isComplex = (isOK && _intersection.vertices.length > 1); - var container = wrap.selectAll('.restriction-container') .data([0]); From 46cc6cc262cf29dfe0aa350621adbab0e0d1fcd0 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 23 Feb 2018 11:30:54 -0500 Subject: [PATCH 41/55] Update tests to use '_' id separators instead of ',' (using ',' with css selectors was problematic) --- test/spec/osm/intersection.js | 74 +++++++++++++++++------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index e27772754..ec2651859 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -81,11 +81,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; }); @@ -103,11 +103,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; }); @@ -130,15 +130,15 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(3); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('-,*,='); + expect(turns[0].key).to.eql('-_*_='); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('-,*,-'); + expect(turns[1].key).to.eql('-_*_-'); expect(turns[1].u).to.be.true; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[2].key).to.match(/^-,\*,w-\d+$/); // new way + expect(turns[2].key).to.match(/^-\_\*\_w-\d+$/); // new way expect(turns[2].u).to.be.not.ok; }); @@ -161,15 +161,15 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(3); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[2].key).to.match(/^=,\*,w-\d+$/); // new way + expect(turns[2].key).to.match(/^=\_\*\_w-\d+$/); // new way expect(turns[2].u).to.be.not.ok; }); @@ -187,7 +187,7 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(1); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].key).to.eql('=_*_-'); expect(turns[0].u).to.be.not.ok; }); @@ -205,7 +205,7 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(1); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].key).to.eql('=_*_-'); expect(turns[0].u).to.be.not.ok; }); @@ -247,11 +247,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; }); @@ -269,11 +269,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; }); @@ -291,7 +291,7 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(1); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; }); @@ -309,7 +309,7 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(1); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; }); @@ -332,11 +332,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,-'); + expect(turns[1].key).to.eql('=_*_-'); expect(turns[1].u).to.be.not.ok; expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].direct).to.be.true; @@ -367,11 +367,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(3); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,='); + expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,~'); + expect(turns[1].key).to.eql('=_*_~'); expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].u).to.be.not.ok; expect(turns[1].direct).to.be.not.ok; @@ -379,7 +379,7 @@ describe('iD.osmIntersection', function() { expect(turns[1].only).to.be.not.ok; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[2].key).to.eql('=,*,-'); + expect(turns[2].key).to.eql('=_*_-'); expect(turns[2].restrictionID).to.eql('r'); expect(turns[2].u).to.be.not.ok; expect(turns[2].direct).to.be.not.ok; @@ -407,15 +407,15 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(3); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].key).to.eql('=_*_-'); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].key).to.eql('=_*_='); expect(turns[1].u).to.be.true; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[2].key).to.match(/^=,\*,w-\d+$/); // new way + expect(turns[2].key).to.match(/^=\_\*\_w-\d+$/); // new way expect(turns[2].u).to.be.not.ok; }); @@ -439,15 +439,15 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(3); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('-,*,-'); + expect(turns[0].key).to.eql('-_*_-'); expect(turns[0].u).to.be.true; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('-,*,='); + expect(turns[1].key).to.eql('-_*_='); expect(turns[1].u).to.be.not.ok; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[2].key).to.match(/^-,\*,w-\d+$/); // new way + expect(turns[2].key).to.match(/^-\_\*\_w-\d+$/); // new way expect(turns[2].u).to.be.not.ok; }); @@ -471,11 +471,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].key).to.eql('=_*_-'); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].key).to.eql('=_*_='); expect(turns[1].u).to.be.true; }); @@ -499,11 +499,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql('=,*,-'); + expect(turns[0].key).to.eql('=_*_-'); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql('=,*,='); + expect(turns[1].key).to.eql('=_*_='); expect(turns[1].u).to.be.true; }); @@ -529,11 +529,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql(newWay.id + ',*,-'); + expect(turns[0].key).to.eql(newWay.id + '_*_-'); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql(newWay.id + ',*,='); + expect(turns[1].key).to.eql(newWay.id + '_*_='); expect(turns[1].u).to.be.not.ok; }); @@ -559,11 +559,11 @@ describe('iD.osmIntersection', function() { expect(turns.length).to.eql(2); expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[0].key).to.eql(newWay.id + ',*,-'); + expect(turns[0].key).to.eql(newWay.id + '_*_-'); expect(turns[0].u).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); - expect(turns[1].key).to.eql(newWay.id + ',*,='); + expect(turns[1].key).to.eql(newWay.id + '_*_='); expect(turns[1].u).to.be.not.ok; }); From 7fa27217b6f9c5d9df1412f39e90dad0b6571db7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 23 Feb 2018 11:59:44 -0500 Subject: [PATCH 42/55] Return an indirect u-turn restriction for an only restriction --- modules/osm/intersection.js | 2 +- test/spec/osm/intersection.js | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/osm/intersection.js b/modules/osm/intersection.js index 9e4784985..17c42beb2 100644 --- a/modules/osm/intersection.js +++ b/modules/osm/intersection.js @@ -490,7 +490,7 @@ export function osmIntersection(graph, startVertexId, maxDistance) { // an indirect restriction - only include the partial path (starting at FROM) if (matchedRestriction && matchedRestriction.direct === false) { for (i = 0; i < turnPath.length; i++) { - if (i > 0 && turnPath[i] === matchedRestriction.from) { + if (turnPath[i] === matchedRestriction.from) { turnPath = turnPath.slice(i); break; } diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index ec2651859..9f287e328 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -340,7 +340,6 @@ describe('iD.osmIntersection', function() { expect(turns[1].u).to.be.not.ok; expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].direct).to.be.true; - expect(turns[1].indirect).to.be.not.ok; expect(turns[1].only).to.be.not.ok; }); @@ -369,21 +368,21 @@ describe('iD.osmIntersection', function() { expect(turns[0]).to.be.an.instanceOf(iD.osmTurn); expect(turns[0].key).to.eql('=_*_='); expect(turns[0].u).to.be.true; + expect(turns[1].direct).to.be.false; + expect(turns[1].only).to.be.not.ok; expect(turns[1]).to.be.an.instanceOf(iD.osmTurn); expect(turns[1].key).to.eql('=_*_~'); expect(turns[1].restrictionID).to.eql('r'); expect(turns[1].u).to.be.not.ok; - expect(turns[1].direct).to.be.not.ok; - expect(turns[1].indirect).to.be.true; + expect(turns[1].direct).to.be.false; expect(turns[1].only).to.be.not.ok; expect(turns[2]).to.be.an.instanceOf(iD.osmTurn); expect(turns[2].key).to.eql('=_*_-'); expect(turns[2].restrictionID).to.eql('r'); expect(turns[2].u).to.be.not.ok; - expect(turns[2].direct).to.be.not.ok; - expect(turns[2].indirect).to.be.not.ok; + expect(turns[2].direct).to.be.true; expect(turns[2].only).to.be.true; }); From 57d2aee6c800cc3f9085659670f922aae263be45 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 23 Feb 2018 15:09:05 -0500 Subject: [PATCH 43/55] Add uiFieldHelp component, currently just for turn restrictions field --- css/80_app.css | 17 +++++- modules/ui/field.js | 61 +++++++++++++++------- modules/ui/field_help.js | 101 ++++++++++++++++++++++++++++++++++++ modules/ui/index.js | 1 + modules/ui/tag_reference.js | 73 +++++++++++++------------- 5 files changed, 195 insertions(+), 58 deletions(-) create mode 100644 modules/ui/field_help.js diff --git a/css/80_app.css b/css/80_app.css index ece0e1834..fb49f255c 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1266,6 +1266,7 @@ a.hide-toggle { border-top: 0; border-radius: 0 0 4px 4px; overflow: hidden; + position: relative; } .form-field textarea { @@ -1988,7 +1989,7 @@ div.combobox { } .combobox-caret::after { - content:""; + content: ""; height: 0; width: 0; position: absolute; left: 0; right: 0; bottom: 0; top: 0; @@ -1998,6 +1999,20 @@ div.combobox { border-right: 5px solid transparent; } +/* Field Help */ + +.field-help-body { + display: block; + position: absolute; + overflow: hidden; + top: 0; + width: 100%; + height: 100%; + z-index: 2; + padding: 10px; + background: rgba(255,255,255,0.95); +} + /* Raw Tag Editor */ .tag-list { diff --git a/modules/ui/field.js b/modules/ui/field.js index bffaf4a9d..eee682068 100644 --- a/modules/ui/field.js +++ b/modules/ui/field.js @@ -11,6 +11,7 @@ import { import { textDirection } from '../util/locale'; import { svgIcon } from '../svg'; +import { uiFieldHelp } from './field_help'; import { uiFields } from './fields'; import { uiTagReference } from './tag_reference'; import { utilRebind } from '../util'; @@ -25,11 +26,11 @@ export function uiField(context, presetField, entity, options) { info: true }, options); - var dispatch = d3_dispatch('change'), - field = _clone(presetField), - show = options.show, - state = '', - tags = {}; + var dispatch = d3_dispatch('change'); + var field = _clone(presetField); + var _show = options.show; + var _state = ''; + var _tags = {}; field.impl = uiFields[field.type](field, context) @@ -48,14 +49,14 @@ export function uiField(context, presetField, entity, options) { if (!entity) return false; var original = context.graph().base().entities[entity.id]; return _some(field.keys, function(key) { - return original ? tags[key] !== original.tags[key] : tags[key]; + return original ? _tags[key] !== original.tags[key] : _tags[key]; }); } function isPresent() { return _some(field.keys, function(key) { - return tags[key]; + return _tags[key]; }); } @@ -65,8 +66,8 @@ export function uiField(context, presetField, entity, options) { d3_event.preventDefault(); if (!entity) return false; - var original = context.graph().base().entities[entity.id], - t = {}; + var original = context.graph().base().entities[entity.id]; + var t = {}; d.keys.forEach(function(key) { t[key] = original ? original.tags[key] : undefined; }); @@ -143,14 +144,25 @@ export function uiField(context, presetField, entity, options) { .classed('modified', isModified()) .classed('present', isPresent()) .each(function(d) { + var reference, help; + + // instantiate field help + if (options.wrap && field.type === 'restrictions') { + help = uiFieldHelp('restrictions'); + if (_state === 'hover') { + help.showing(false); + } + } + + // instantiate tag reference if (options.wrap && options.info) { var referenceKey = d.key; if (d.type === 'multiCombo') { // lookup key without the trailing ':' referenceKey = referenceKey.replace(/:$/, ''); } - var reference = uiTagReference(d.reference || { key: referenceKey }, context); - if (state === 'hover') { + reference = uiTagReference(d.reference || { key: referenceKey }, context); + if (_state === 'hover') { reference.showing(false); } } @@ -158,35 +170,44 @@ export function uiField(context, presetField, entity, options) { d3_select(this) .call(d.impl); - if (options.wrap && options.info) { + // add field help components + if (help) { + d3_select(this) + .call(help.body) + .select('.form-label-button-wrap') + .call(help.button); + } + + // add tag reference components + if (reference) { d3_select(this) .call(reference.body) .select('.form-label-button-wrap') .call(reference.button); } - d.impl.tags(tags); + d.impl.tags(_tags); }); }; field.state = function(_) { - if (!arguments.length) return state; - state = _; + if (!arguments.length) return _state; + _state = _; return field; }; field.tags = function(_) { - if (!arguments.length) return tags; - tags = _; + if (!arguments.length) return _tags; + _tags = _; return field; }; field.show = function() { - show = true; - if (field.default && field.key && tags[field.key] !== field.default) { + _show = true; + if (field.default && field.key && _tags[field.key] !== field.default) { var t = {}; t[field.key] = field.default; dispatch.call('change', this, t); @@ -195,7 +216,7 @@ export function uiField(context, presetField, entity, options) { field.isShown = function() { - return show || _some(field.keys, function(key) { return !!tags[key]; }); + return _show || _some(field.keys, function(key) { return !!_tags[key]; }); }; diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js new file mode 100644 index 000000000..71aebf076 --- /dev/null +++ b/modules/ui/field_help.js @@ -0,0 +1,101 @@ +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { t } from '../util/locale'; +import { svgIcon } from '../svg'; + + +export function uiFieldHelp(fieldName) { + var fieldHelp = {}; + var _body = d3_select(null); + var _showing; + + + function show() { + _body + .classed('hide', false) + .transition() + .duration(200) + .style('height', '100%'); + + _showing = true; + } + + + function hide() { + _body + .transition() + .duration(200) + .style('height', '0px') + .on('end', function () { + _body.classed('hide', true); + }); + + _showing = false; + } + + + fieldHelp.button = function(selection) { + var button = selection.selectAll('.field-help-button') + .data([0]); + + // enter/update + button.enter() + .append('button') + .attr('class', 'field-help-button') + .attr('tabindex', -1) + .call(svgIcon('#icon-help')) + .merge(button) + .on('click', function () { + d3_event.stopPropagation(); + d3_event.preventDefault(); + if (_showing) { + hide(); + } else { + show(); + } + }); + }; + + + fieldHelp.body = function(selection) { + // this control expects the field to have a preset-input-wrap div + var wrap = selection.selectAll('.preset-input-wrap'); + if (wrap.empty()) return; + + _body = wrap.selectAll('.field-help-body') + .data([0]); + + var enter = _body.enter() + .append('div') + .attr('class', 'field-help-body cf hide') + .style('height', '0px'); + +//debug +for (var i = 0; i < 15; i++) { + enter + .append('p') + .attr('class', 'field-help-description') + .text('lorem ipsum'); +} + + _body = _body + .merge(enter); + + if (_showing === false) { + hide(); + } + }; + + + fieldHelp.showing = function(_) { + if (!arguments.length) return _showing; + _showing = _; + return fieldHelp; + }; + + + return fieldHelp; +} diff --git a/modules/ui/index.js b/modules/ui/index.js index 8a3dd80c6..d908b7078 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -19,6 +19,7 @@ export { uiEntityEditor } from './entity_editor'; export { uiFeatureInfo } from './feature_info'; export { uiFeatureList } from './feature_list'; export { uiField } from './field'; +export { uiFieldHelp } from './field_help'; export { uiFlash } from './flash'; export { uiFormFields } from './form_fields'; export { uiFullScreen } from './full_screen'; diff --git a/modules/ui/tag_reference.js b/modules/ui/tag_reference.js index 4c5b39dcd..81cf4659b 100644 --- a/modules/ui/tag_reference.js +++ b/modules/ui/tag_reference.js @@ -13,17 +13,18 @@ import { svgIcon } from '../svg'; export function uiTagReference(tag) { - var taginfo = services.taginfo, - tagReference = {}, - button = d3_select(null), - body = d3_select(null), - loaded, - showing; + var taginfo = services.taginfo; + var tagReference = {}; + + var _button = d3_select(null); + var _body = d3_select(null); + var _loaded; + var _showing; function findLocal(data) { - var locale = utilDetect().locale.toLowerCase(), - localized; + var locale = utilDetect().locale.toLowerCase(); + var localized; if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br' localized = _find(data, function(d) { @@ -52,7 +53,7 @@ export function uiTagReference(tag) { function load(param) { if (!taginfo) return; - button + _button .classed('tag-reference-loading', true); taginfo.docs(param, function show(err, data) { @@ -61,13 +62,13 @@ export function uiTagReference(tag) { docs = findLocal(data); } - body.html(''); + _body.html(''); if (!docs || !docs.title) { if (param.hasOwnProperty('value')) { load(_omit(param, 'value')); // retry with key only } else { - body + _body .append('p') .attr('class', 'tag-reference-description') .text(t('inspector.no_documentation_key')); @@ -77,7 +78,7 @@ export function uiTagReference(tag) { } if (docs.image && docs.image.thumb_url_prefix) { - body + _body .append('img') .attr('class', 'tag-reference-wiki-image') .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix) @@ -87,12 +88,12 @@ export function uiTagReference(tag) { done(); } - body + _body .append('p') .attr('class', 'tag-reference-description') .text(docs.description || t('inspector.documentation_redirect')); - body + _body .append('a') .attr('class', 'tag-reference-link') .attr('target', '_blank') @@ -104,7 +105,7 @@ export function uiTagReference(tag) { // Add link to info about "good changeset comments" - #2923 if (param.key === 'comment') { - body + _body .append('a') .attr('class', 'tag-reference-comment-link') .attr('target', '_blank') @@ -119,54 +120,54 @@ export function uiTagReference(tag) { function done() { - loaded = true; + _loaded = true; - button + _button .classed('tag-reference-loading', false); - body + _body .classed('expanded', true) .transition() .duration(200) .style('max-height', '200px') .style('opacity', '1'); - showing = true; + _showing = true; } function hide() { - body + _body .transition() .duration(200) .style('max-height', '0px') .style('opacity', '0') .on('end', function () { - body.classed('expanded', false); + _body.classed('expanded', false); }); - showing = false; + _showing = false; } tagReference.button = function(selection) { - button = selection.selectAll('.tag-reference-button') + _button = selection.selectAll('.tag-reference-button') .data([0]); - button = button.enter() + _button = _button.enter() .append('button') .attr('class', 'tag-reference-button') .attr('tabindex', -1) .call(svgIcon('#icon-inspect')) - .merge(button); + .merge(_button); - button + _button .on('click', function () { d3_event.stopPropagation(); d3_event.preventDefault(); - if (showing) { + if (_showing) { hide(); - } else if (loaded) { + } else if (_loaded) { done(); } else { load(tag); @@ -176,31 +177,29 @@ export function uiTagReference(tag) { tagReference.body = function(selection) { - var tagid = tag.rtype || (tag.key + '-' + tag.value); - - body = selection.selectAll('.tag-reference-body') + _body = selection.selectAll('.tag-reference-body') .data([tagid], function(d) { return d; }); - body.exit() + _body.exit() .remove(); - body = body.enter() + _body = _body.enter() .append('div') .attr('class', 'tag-reference-body cf') .style('max-height', '0') .style('opacity', '0') - .merge(body); + .merge(_body); - if (showing === false) { + if (_showing === false) { hide(); } }; tagReference.showing = function(_) { - if (!arguments.length) return showing; - showing = _; + if (!arguments.length) return _showing; + _showing = _; return tagReference; }; From b3b2be95b11e4e6dcd65a504c770b5dd3edc5a8e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 24 Feb 2018 12:14:18 -0500 Subject: [PATCH 44/55] WIP: Add content for turn restriction field help --- data/core.yaml | 26 ++++++++ dist/locales/en.json | 31 ++++++++++ modules/ui/field_help.js | 126 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 176 insertions(+), 7 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 94f603eb8..dc0d97aa9 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -742,6 +742,32 @@ en: using: "To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data." tracing: "The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add." upload: "You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use." + field: + restrictions: + title: Editing Turn Restrictions + inspecting: + title: Inspecting + about: "To inspect turn restrictions, hover over a starting segment." + shadow: "All paths starting from that segment will be drawn with a line shadow." + from: "{from} Starting segment" + allow: "{allowed} Allowed" + restrict: "{restricted} Restricted" + only: "{only} Only" + modifying: + title: Modifying + about: "To modify turn restrictions, click on a starting segment." + indicators: "All of the possible TO destinations from that segment will appear as turn indicators." + indicators2: "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." + allow: "{allowed} Allowed" + restrict: "{restricted} Restricted" + only: "{only} Only" + tips: + title: Tips + tip1: "* Prefer simple restrictions over complex ones." + tip2: For example, avoid using a via-way restriction if a simpler turn restriction will do. + tip3: "* Some restrictions are \"(indirect)\". These restrictions exist because of another nearby restriction." + tip4: "For example, a route with an \"Only Straight On\" turn restriction will indirectly create \"No Turn\" restrictions." + tip5: "* You may not edit an indirect restriction. Instead, edit the nearby direct restriction." intro: done: done ok: OK diff --git a/dist/locales/en.json b/dist/locales/en.json index 7ae8fdecb..b367ceeca 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -882,6 +882,37 @@ "using": "To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.", "tracing": "The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.", "upload": "You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use." + }, + "field": { + "restrictions": { + "title": "Editing Turn Restrictions", + "inspecting": { + "title": "Inspecting", + "about": "To inspect turn restrictions, hover over a starting segment.", + "shadow": "All paths starting from that segment will be drawn with a line shadow.", + "from": "{from} Starting segment", + "allow": "{allowed} Allowed", + "restrict": "{restricted} Restricted", + "only": "{only} Only" + }, + "modifying": { + "title": "Modifying", + "about": "To modify turn restrictions, click on a starting segment.", + "indicators": "All of the possible TO destinations from that segment will appear as turn indicators.", + "indicators2": "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", + "allow": "{allowed} Allowed", + "restrict": "{restricted} Restricted", + "only": "{only} Only" + }, + "tips": { + "title": "Tips", + "tip1": "* Prefer simple restrictions over complex ones.", + "tip2": "For example, avoid using a via-way restriction if a simpler turn restriction will do.", + "tip3": "* Some restrictions are \"(indirect)\". These restrictions exist because of another nearby restriction.", + "tip4": "For example, a route with an \"Only Straight On\" turn restriction will indirectly create \"No Turn\" restrictions.", + "tip5": "* You may not edit an indirect restriction. Instead, edit the nearby direct restriction." + } + } } }, "intro": { diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index 71aebf076..0530f7571 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -3,16 +3,75 @@ import { select as d3_select } from 'd3-selection'; -import { t } from '../util/locale'; +import marked from 'marked'; +import { t, textDirection } from '../util/locale'; import { svgIcon } from '../svg'; +// This currently only works with the 'restrictions' field +var fieldHelpKeys = { + restrictions: [ + ['inspecting',[ + 'title', + 'about', + 'shadow', + 'from', + 'allow', + 'restrict', + 'only' + ]], + ['modifying',[ + 'title', + 'about', + 'indicators', + 'indicators2', + 'allow', + 'restrict', + 'only' + ]], + ['tips',[ + 'title', + 'tip1', + 'tip2', + 'tip3', + 'tip4', + 'tip5' + ]] + ] +}; + +var fieldHelpHeadings = { + 'help.field.restrictions.inspecting.title': 3, + 'help.field.restrictions.modifying.title': 3, + 'help.field.restrictions.tips.title': 3 +}; + +var replacements = {}; + + export function uiFieldHelp(fieldName) { var fieldHelp = {}; var _body = d3_select(null); var _showing; + // For each section, squash all the texts into a single markdown document + var docs = fieldHelpKeys[fieldName].map(function(key) { + var helpkey = 'help.field.' + fieldName + '.' + key[0]; + var text = key[1].reduce(function(all, part) { + var subkey = helpkey + '.' + part; + var depth = fieldHelpHeadings[subkey]; // is this subkey a heading? + var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s + return all + hhh + t(subkey, replacements) + '\n\n'; + }, ''); + + return { + title: t(helpkey + '.title'), + html: marked(text.trim()) + }; + }); + + function show() { _body .classed('hide', false) @@ -37,6 +96,53 @@ export function uiFieldHelp(fieldName) { } + function clickHelp(d, i) { + var rtl = (textDirection === 'rtl'); + + _body.selectAll('.field-help-content').html(d.html); + var nav = _body.selectAll('.field-help-nav').html(''); + + if (rtl) { + nav.call(drawNext).call(drawPrevious); + } else { + nav.call(drawPrevious).call(drawNext); + } + + function drawNext(selection) { + if (i < docs.length - 1) { + var nextLink = selection + .append('a') + .attr('class', 'next') + .on('click', function() { + clickHelp(docs[i + 1], i + 1); + }); + + nextLink + .append('span') + .text(docs[i + 1].title) + .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline')); + } + } + + + function drawPrevious(selection) { + if (i > 0) { + var prevLink = selection + .append('a') + .attr('class', 'previous') + .on('click', function() { + clickHelp(docs[i - 1], i - 1); + }); + + prevLink + .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline')) + .append('span') + .text(docs[i - 1].title); + } + } + } + + fieldHelp.button = function(selection) { var button = selection.selectAll('.field-help-button') .data([0]); @@ -73,17 +179,23 @@ export function uiFieldHelp(fieldName) { .attr('class', 'field-help-body cf hide') .style('height', '0px'); -//debug -for (var i = 0; i < 15; i++) { enter - .append('p') - .attr('class', 'field-help-description') - .text('lorem ipsum'); -} + .append('h2') + .text(t('help.field.' + fieldName + '.title')); + + enter + .append('div') + .attr('class', 'field-help-content'); + + enter + .append('div') + .attr('class', 'field-help-nav'); _body = _body .merge(enter); + clickHelp(docs[0], 0); + if (_showing === false) { hide(); } From 97cbfc5c67f8f37748827cb26cb053f3f4ac4353 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 25 Feb 2018 22:38:13 -0500 Subject: [PATCH 45/55] Add icons and improve css styles for restriction field help --- css/80_app.css | 36 ++++++++++++++++++++++++++++++++++++ data/core.yaml | 14 +++++++------- dist/locales/en.json | 14 +++++++------- modules/ui/field_help.js | 11 ++++++++++- svg/iD-sprite.json | 3 +++ svg/iD-sprite.src.idraw | Bin 363536 -> 365240 bytes svg/iD-sprite.src.svg | 9 +++++++++ 7 files changed, 72 insertions(+), 15 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index fb49f255c..6be83c1a5 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1920,6 +1920,42 @@ input[type=number] { color: #78f; } +.field-help-body h2 { + font-size: 16px; + margin-bottom: 10px; +} +.field-help-body h3 { + font-size: 12px; + margin-bottom: 5px; +} +.field-help-body p { + margin-bottom: 5px; +} +.field-help-body ul li { + list-style: inside; + margin-bottom: 5px; +} +.field-help-content svg.turn { + width: 40px; + height: 20px; +} +.field-help-content svg.shadow { + width: 60px; + height: 20px; +} +.field-help-content svg.from { + color: #777; +} +.field-help-content svg.allow { + color: #5b3; +} +.field-help-content svg.restrict { + color: #d53; +} +.field-help-content svg.only { + color: #68f; +} + /* Changeset editor while comment text is empty */ .form-field-comment:not(.present) #preset-input-comment { diff --git a/data/core.yaml b/data/core.yaml index dc0d97aa9..cb9b071d3 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -749,18 +749,18 @@ en: title: Inspecting about: "To inspect turn restrictions, hover over a starting segment." shadow: "All paths starting from that segment will be drawn with a line shadow." - from: "{from} Starting segment" - allow: "{allowed} Allowed" - restrict: "{restricted} Restricted" - only: "{only} Only" + from: "{fromShadow} **Starting segment**" + allow: "{allowShadow} **Allowed**" + restrict: "{restrictShadow} **Restricted**" + only: "{onlyShadow} **Only**" modifying: title: Modifying about: "To modify turn restrictions, click on a starting segment." indicators: "All of the possible TO destinations from that segment will appear as turn indicators." indicators2: "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." - allow: "{allowed} Allowed" - restrict: "{restricted} Restricted" - only: "{only} Only" + allow: "{allowTurn} **Allowed**" + restrict: "{restrictTurn} **Restricted**" + only: "{onlyTurn} **Only**" tips: title: Tips tip1: "* Prefer simple restrictions over complex ones." diff --git a/dist/locales/en.json b/dist/locales/en.json index b367ceeca..1b3fc1716 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -890,19 +890,19 @@ "title": "Inspecting", "about": "To inspect turn restrictions, hover over a starting segment.", "shadow": "All paths starting from that segment will be drawn with a line shadow.", - "from": "{from} Starting segment", - "allow": "{allowed} Allowed", - "restrict": "{restricted} Restricted", - "only": "{only} Only" + "from": "{fromShadow} **Starting segment**", + "allow": "{allowShadow} **Allowed**", + "restrict": "{restrictShadow} **Restricted**", + "only": "{onlyShadow} **Only**" }, "modifying": { "title": "Modifying", "about": "To modify turn restrictions, click on a starting segment.", "indicators": "All of the possible TO destinations from that segment will appear as turn indicators.", "indicators2": "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", - "allow": "{allowed} Allowed", - "restrict": "{restricted} Restricted", - "only": "{only} Only" + "allow": "{allowTurn} **Allowed**", + "restrict": "{restrictTurn} **Restricted**", + "only": "{onlyTurn} **Only**" }, "tips": { "title": "Tips", diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index 0530f7571..a304a576e 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -6,6 +6,7 @@ import { import marked from 'marked'; import { t, textDirection } from '../util/locale'; import { svgIcon } from '../svg'; +import { icon } from 'intro/helper'; // This currently only works with the 'restrictions' field @@ -46,7 +47,15 @@ var fieldHelpHeadings = { 'help.field.restrictions.tips.title': 3 }; -var replacements = {}; +var replacements = { + fromShadow: icon('#turn-shadow', 'pre-text shadow from'), + allowShadow: icon('#turn-shadow', 'pre-text shadow allow'), + restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'), + onlyShadow: icon('#turn-shadow', 'pre-text shadow only'), + allowTurn: icon('#turn-yes', 'pre-text turn'), + restrictTurn: icon('#turn-no', 'pre-text turn'), + onlyTurn: icon('#turn-only', 'pre-text turn') +}; export function uiFieldHelp(fieldName) { diff --git a/svg/iD-sprite.json b/svg/iD-sprite.json index 601522a96..58bc82e0a 100644 --- a/svg/iD-sprite.json +++ b/svg/iD-sprite.json @@ -375,6 +375,9 @@ "turn-yes-u": { "viewBox": "200 344 32 32" }, "turn-no-u": { "viewBox": "232 344 32 32" }, "turn-only-u": { "viewBox": "264 344 32 32" }, + "turn-shadow": { "viewBox": "296 344 37 11" }, + + "turn-shadow-shape": { "fill": "currentColor" }, "preset-icon-frame": { "viewBox": "340 320 45 45" }, diff --git a/svg/iD-sprite.src.idraw b/svg/iD-sprite.src.idraw index fbd4f988d43494347e35980361d87a862e216b4e..bb831b58e9b22640cf20bbf6cd26716396799044 100644 GIT binary patch delta 237064 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

bAx@4by^|J10{rc`Zw4{sx7 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 z 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ℜfarqfp#h|V@ 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 AwEzGB delta 235283 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അMg(5HNfj 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 Q00IDd0001hiv<7x04S-fF#rGn diff --git a/svg/iD-sprite.src.svg b/svg/iD-sprite.src.svg index c71269ebe..dc4bfe7af 100644 --- a/svg/iD-sprite.src.svg +++ b/svg/iD-sprite.src.svg @@ -280,6 +280,15 @@ + + + + + + + + + From de1fdaa21fe6198f15000c0b0e6cb4de1e1be83f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 26 Feb 2018 13:58:50 -0500 Subject: [PATCH 46/55] Add close button, remove _showing state variable --- css/80_app.css | 92 ++++++++++++++++++++++++---------------- modules/ui/field.js | 3 -- modules/ui/field_help.js | 41 +++++++++--------- 3 files changed, 75 insertions(+), 61 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 6be83c1a5..1c0ee2dea 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -681,12 +681,14 @@ button.save.has-count .count::before { height: 100%; } +.field-help-title button.close, .entity-editor-pane .header button.preset-close, .preset-list-pane .header button.preset-choose { position: absolute; right: 0; top: 0; } +[dir='rtl'] .field-help-title button.close, [dir='rtl'] .entity-editor-pane .header button.preset-close, [dir='rtl'] .preset-list-pane .header button.preset-choose { left: 0; @@ -1920,42 +1922,6 @@ input[type=number] { color: #78f; } -.field-help-body h2 { - font-size: 16px; - margin-bottom: 10px; -} -.field-help-body h3 { - font-size: 12px; - margin-bottom: 5px; -} -.field-help-body p { - margin-bottom: 5px; -} -.field-help-body ul li { - list-style: inside; - margin-bottom: 5px; -} -.field-help-content svg.turn { - width: 40px; - height: 20px; -} -.field-help-content svg.shadow { - width: 60px; - height: 20px; -} -.field-help-content svg.from { - color: #777; -} -.field-help-content svg.allow { - color: #5b3; -} -.field-help-content svg.restrict { - color: #d53; -} -.field-help-content svg.only { - color: #68f; -} - /* Changeset editor while comment text is empty */ .form-field-comment:not(.present) #preset-input-comment { @@ -2045,10 +2011,62 @@ div.combobox { width: 100%; height: 100%; z-index: 2; - padding: 10px; + padding: 0px; background: rgba(255,255,255,0.95); } +.field-help-title h2 { + padding: 10px; + margin-bottom: 0px; + font-size: 16px; +} + +.field-help-title button { + width: 32px; + height: 40px; + border-radius: 0; +} + +.field-help-content { + padding: 10px; +} + +.field-help-content h3 { + font-size: 12px; + margin-bottom: 5px; +} + +.field-help-content p { + margin-bottom: 5px; +} + +.field-help-content ul li { + list-style: inside; + margin-bottom: 5px; +} + +.field-help-content svg.turn { + width: 40px; + height: 20px; +} +.field-help-content svg.shadow { + width: 60px; + height: 20px; +} +.field-help-content svg.from { + color: #777; +} +.field-help-content svg.allow { + color: #5b3; +} +.field-help-content svg.restrict { + color: #d53; +} +.field-help-content svg.only { + color: #68f; +} + + /* Raw Tag Editor */ .tag-list { diff --git a/modules/ui/field.js b/modules/ui/field.js index eee682068..ef998340c 100644 --- a/modules/ui/field.js +++ b/modules/ui/field.js @@ -149,9 +149,6 @@ export function uiField(context, presetField, entity, options) { // instantiate field help if (options.wrap && field.type === 'restrictions') { help = uiFieldHelp('restrictions'); - if (_state === 'hover') { - help.showing(false); - } } // instantiate tag reference diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index a304a576e..2f88a3629 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -61,7 +61,6 @@ var replacements = { export function uiFieldHelp(fieldName) { var fieldHelp = {}; var _body = d3_select(null); - var _showing; // For each section, squash all the texts into a single markdown document @@ -87,8 +86,6 @@ export function uiFieldHelp(fieldName) { .transition() .duration(200) .style('height', '100%'); - - _showing = true; } @@ -100,8 +97,6 @@ export function uiFieldHelp(fieldName) { .on('end', function () { _body.classed('hide', true); }); - - _showing = false; } @@ -166,10 +161,10 @@ export function uiFieldHelp(fieldName) { .on('click', function () { d3_event.stopPropagation(); d3_event.preventDefault(); - if (_showing) { - hide(); - } else { + if (_body.classed('hide')) { show(); + } else { + hide(); } }); }; @@ -185,13 +180,28 @@ export function uiFieldHelp(fieldName) { var enter = _body.enter() .append('div') - .attr('class', 'field-help-body cf hide') + .attr('class', 'field-help-body cf hide') // initially hidden .style('height', '0px'); - enter + var titleEnter = enter + .append('div') + .attr('class', 'field-help-title cf'); + + titleEnter .append('h2') + .attr('class', 'fl') .text(t('help.field.' + fieldName + '.title')); + titleEnter + .append('button') + .attr('class', 'fr close') + .on('click', function() { + d3_event.stopPropagation(); + d3_event.preventDefault(); + hide(); + }) + .call(svgIcon('#icon-close')); + enter .append('div') .attr('class', 'field-help-content'); @@ -204,17 +214,6 @@ export function uiFieldHelp(fieldName) { .merge(enter); clickHelp(docs[0], 0); - - if (_showing === false) { - hide(); - } - }; - - - fieldHelp.showing = function(_) { - if (!arguments.length) return _showing; - _showing = _; - return fieldHelp; }; From 6c6b1378b2d451cb63e8a4f7583e8cf376a9be75 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 26 Feb 2018 16:31:00 -0500 Subject: [PATCH 47/55] Add some restriction help images, adjust styles --- css/80_app.css | 27 +++++++++-- data/core.yaml | 10 ++-- dist/img/tr_inspect.gif | Bin 0 -> 78535 bytes dist/img/tr_modify.gif | Bin 0 -> 64096 bytes dist/locales/en.json | 10 ++-- modules/ui/field.js | 2 +- modules/ui/field_help.js | 99 +++++++++++++++++++-------------------- 7 files changed, 79 insertions(+), 69 deletions(-) create mode 100644 dist/img/tr_inspect.gif create mode 100644 dist/img/tr_modify.gif diff --git a/css/80_app.css b/css/80_app.css index 1c0ee2dea..7cb24d993 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2006,13 +2006,16 @@ div.combobox { .field-help-body { display: block; position: absolute; + border: 1px solid #ccc; + border-top: 0; + border-radius: 0 0 4px 4px; + margin-left: 5px; + margin-right: 5px; overflow: hidden; top: 0; - width: 100%; - height: 100%; z-index: 2; - padding: 0px; background: rgba(255,255,255,0.95); + box-shadow: 0 0 10px 0 rgba(0,0,0,.1); } .field-help-title h2 { @@ -2029,6 +2032,8 @@ div.combobox { .field-help-content { padding: 10px; + overflow-y: auto; + overflow-x: hidden; } .field-help-content h3 { @@ -2050,6 +2055,7 @@ div.combobox { height: 20px; } .field-help-content svg.shadow { + opacity: 0.7; width: 60px; height: 20px; } @@ -2066,6 +2072,19 @@ div.combobox { color: #68f; } +.field-help-nav { + position: relative; +} +.field-help-nav a { + float: left; + width: 50%; + text-align: center; +} +.field-help-nav-item { + display: inline-block; + list-style: none; +} + /* Raw Tag Editor */ @@ -2757,7 +2776,7 @@ div.full-screen > button:hover { } .help-wrap .toc li a:hover, -.help-wrap .nav a:hover { +.help-wrap .nav a:hover { background: #ececec; } diff --git a/data/core.yaml b/data/core.yaml index cb9b071d3..ed2dafbc1 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -747,17 +747,15 @@ en: title: Editing Turn Restrictions inspecting: title: Inspecting - about: "To inspect turn restrictions, hover over a starting segment." - shadow: "All paths starting from that segment will be drawn with a line shadow." - from: "{fromShadow} **Starting segment**" + about: "Hover over any starting segment. All possible **TO** destinations will be drawn with a shadow." + from: "{fromShadow} **FROM**" allow: "{allowShadow} **Allowed**" restrict: "{restrictShadow} **Restricted**" only: "{onlyShadow} **Only**" modifying: title: Modifying - about: "To modify turn restrictions, click on a starting segment." - indicators: "All of the possible TO destinations from that segment will appear as turn indicators." - indicators2: "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." + about: "Click on any starting segment to select it. All possible **TO** destinations will appear as turn indicators." + indicators: "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." allow: "{allowTurn} **Allowed**" restrict: "{restrictTurn} **Restricted**" only: "{onlyTurn} **Only**" diff --git a/dist/img/tr_inspect.gif b/dist/img/tr_inspect.gif new file mode 100644 index 0000000000000000000000000000000000000000..57c889c120b91bd1702494e980b765b7f2e55bea GIT binary patch literal 78535 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�eI{K-4xR)Ka-uL3odEaS%f;){u%x5dq4@YuT09L5QBc2v*(X z>Y~6%G}B5p(w~u}M20!m#DuUC=tbx{D))O(qUQu5ga`e?C|>YFy#MZYa_c7Q!%c`v zlU*f?YjO6V{V>#wn$Sx@#|Wp!`f;x@@gDORGG-7QBXoRW{}9gXuPNKkxOZ+SnGu|YH-<&gfqFk6$L`FFTl z)-kAOx5SJPipqfr5eq{j3RU!ytGWuSc+cD#h3ljUtk82m2%}n=656by>=lz;aN5i_ zq$8DROGaGS%)6?`;3%dag`f44JsXjWB~gpgKq{w2EIG@H=HJtEzN1hU;$GB}uHuqs zT_rngo9G4em-S?EEK z`+U8VR)#>Q9eh_nODPU}$L!ZlKAIx-iWA1Q9F)R?bDV%m!ZkaIP)7o)kx-0K&Uinb z&81tMA5k14f>gLv5xcJ*b5WZ}f6bYWTi8?r$$RO6{Tm?7K%igEden4F>5l!Y&$}}0o z6Nx8vz6m}h;i}Fi>?NIEOawPwZ5U%E#BL%&sa$uA;oVoSD(gbTQji8ap;{9S`!)+gr8;HcHD-lqHE$A4NYg!6^h6UWP}%?F>4dGa<%dO-NeSt0y{#X z@!7)ho&*A#S8SY5h)`}~kNd9NU_pbK5JR>_pr9XhOC$!&8evN~?8r{{ecGflpV&w) zF4(oK5crWHWX@-WcCS43^nQm&Jh#)V}xYX8QE~2duYATaSkZh6Y zR4RP`ty;a3!ay`nT%lr04Bq5Nb3FUD6a~4b7Yn&nT*Yd$J6A-dS2~o$i*l-xh$z6# zCDwiG@TFSzWV^sxb)6CR*ClZ3a!P#DQA$;!Iu8batC96`X>`q~A@K#Fk;CIDX(7qP6DcIiL zDqLS;BX0@8t)w%e@Sdyj>CLpYO~Ho;`VWy}kzoG^r2a<~o}ZfoZ-}fHn9d{T;Hj*k z_jQ%^Oz`EY*ayY6S_X{JCMq=;%zq2LNf7+p6d>_ z?p#elhO3~O*tbMjEM?)8G*(&lkFu!}bj+sH`d38E1h>oJ;Oy?=scP`htjdsD`Pj1q zth{sGMZL%}#vP0KZdpR@Kq``Wl_|yO!`)4=1*ukYkY_miwdh=b?Tk9vz^9 z3FIKGw`t%zU0{dRZ!z8b9Nmbpxuc?68{yiSvBN5ug!z#w-vmMVd(qD26FzGc9e(H! zS3J#r=#^VDJiQ6!kGW_wjr*yr2RZS5DC@#YE_(8W9k|y-4BGC-C)6}B&lEQ8;|};a z1z&9WfNWK(kIf^i$(XC;R6x&xu2)gHowD&idNEITmwcy)BVFZV{^IQMyKSl^RdUaU z#=a|(?NxNhaDiNb$4vt}HnNAB2EJ}e=B!WY{TK^cgN3Y(G$S!0L`W7)k|-~xPi3}& zFwTZErqqxALzVn_+w?8N5Wtk@$hID3!V{a3e|-Xr#i zJ!D5lFF3_K{(iPiCkVtc>h*VbmiRT(=i2lpoyFXIG&LyeDS>I+;P*bzAICBmrwMY! z^y~hj>NhMxBp!}RFDU<#@Fydbrfg92QwK{xR|_=5l(_aPeRXZ-i%_yY8k_{L5|7d@C~Nl*wKAL z^1GKZHF)P~HRlj65(~a*r$KHH#OX&@`a-cihZIS}c9weHb=H`i0cg z#ECm+Z?Nm6qmuD6F9HMZ#_xU;NRghJO@l`I#0p0*#!K>???;Cb1`y57DKYnSHoTr0 z^uI88XOQ-m-22uh7u2ZE$$XL~WNkImz3 z+Y$oSc%<<+o+|`3&-tj}#;QG-?j04j>jXot`v(%(Ds4Yh7RBwQ+SNC3(y z377fq-nD)K$xUoI!#cZb*81f%@AKIM&#`+68k0P3OyQ`q+n)nO)kv#Cf8ia!lTr;| zOC3PEO!K&Ae!yP8Cf+P8v-=$DJANqS=G*)<3^fE&G)HSmmgch{R#sfx`(u`(DT%F8_M(OZMQZ z&)TZ>i;d6Rb%&m-;0PjpCp)zJ`JIlm>HUR|a3skIpv$+u*fwnGGT+O-pjDM8mk>mo zB%vqTQ0``HvzSex>&*ug;N==0OxD(XX1wU4>rw~Su@CT?g<2KTFG~XUSzjQyY_6M# zZD6H3)V=jZD)2CZ6kvGds}P>RYGcT}e(-Ns&~xo%o}0gfE$Xb}#ZwN(jzt9jMK(r}?&>y&F>glQeJYQOix zA|azm`BC|?`rT7ZBzI8-OHJ(r1*DR3kh#r zF3*)ce|8`+>kcZ!MPup5_m|rjcs=drjkH!*U%zNn-zrXcq^%lx`Ux}VYl_fZ}Tx$dVZ#NDecstVINdBHb2&CaE! z^mz81vr-r0<*k^vcqa?V=wgAJ)n`qR1}O@&H8BTAAcF=vvoN)4cP6_ADzAMhb4Y(J z>YnVGp`}sa4c>TLCebPI!6j+~;dzDT}ichUT8avXQgDm@R+fzCOohm^k2Pt*6~ z(4jkhp1no>vd68=r9TGbBAgBqF%Ca<*_Dc?zbO4z?dddE%5tH|MSo2d4A3>Fl!R!0?YBU zk@f(^d$1mfS4>PyPEHOGm_V=SkUaiZR!f1`Q3dO&%59;dWUQ^_yB~4xfZA>lCc+YO zNnbupUv<~B+t}Cu@G{iWDD1E~kb(g^FuUsVtQR%H$NSQ`kllz85ZVITMfrB(S3IHh z?!w)^0zl~nNEQLHqNLvfGbi*cK)iso%fl$xv)?%vAXD_aQG^B(EYUHH3Hbh|9Kyu7@orlzO50%#QN_FI5C#%y!?uOUW9+pC@= zU`(-fHy)T&0B#+Kx&R33|3PN?uM~Lq-vM}e2n0eZA5cao>FNs{O3z3Kxl?5zh$J+{ zXs;$C150&xce6sl&_+huYNhGYGL8j29m$46 z7TDq1hen3{R`)pU-I;odLM$NyFNq{(o?*Uc-bm5JWy{6M?!*ZjF$NCAWhC_ey)1k4 zHl+U{C-0v>`vgfRL46M5k=x(TOVF7KrT!xYh<6CE#Ni%lYBz>5XAqx){H=&w2)-5KZT z@vVmdFZ}(af%3;nDjT2&|0N#>f1mwVn+SN)Ktb-8A5Ko%tr7w19q@j;*)8Bb1CgzP zfq~ts*7Wo=P}SN^#(nzq>3=Im1UySE=NKUsXAlS~;pUN+9(X!4>$HGVj1Dm&$X}67 z+%?_9FFQ-tD#ih4jqnc&I_-wSx}n9di=xv4I^6~Hob@>EA*cKL zKxsam9`Y8>4%$d0%&jpoQLN*!nT8|h!UBA$B7Hd9!+p42_k=k&!ah?Vt;VkPhB*iZAFJP3k)ZCn91yVV!F_fbvxlWS8WVyOL zH1Vqu-QN>D>Q0>mqHrfisA?OC2~3BxSos=1)$371`XMu$l)ecxWUoUWY`zA;(V?7G zGZ)q(u1glV5t^1&(a*fUm$Tn+(WoJZxHWM_L(FUwL#`d}G8Y~)n~O8<(BRHOBLtS{Qp+PA-k#=AjQLBY~%l( z6i;1Z14!|I+yrQ)tL~EGe_aN+aYLi6O|z>@`L`{u_+PQbzz@+~Rs87xtcsuh&#L(A8NzseUraC0AOAk_7k=y4 zieBs^$EYONJ1VA{#@rHN3I3k=lmEmzg-kzIzI4mHOb(QF%iFzSnv#S3aLT%;jO7mrt72|cT^mrWRF&Op%@Wlo#h%FeUzt6xU&rjcIUGgtbeXvWA*R=u9`EgV{nmo$w8zGnR^16%2-WZ56=! zYymUMiRw$u;)jDdPTsIFm5%ZhJzGjWU*;te?QL!=y{3{Po|M>P%w?v_>=RthJ?|Q> zepTJ>;Jyb14rfa!ZBK!~;Efl)Q_cD>3lW=~=qxa9n;r!$08n!cg@FZtGe;gLWe5P4 z7o~6U%1ZJS&w7diHMAO?Bvn}>_G|iHl^5a~o9p1*aKuHK5~)Q;O0k9G@b!E}IZ9MV zYY_CRKvH#tQ6Hm#+uVlwRWxF=T?$^O${y2H-S(6-xPfs4#x&Zr zu`}c0)l$U}PK0+fTEo%HEkW|eoS+hoVGu8YnX*!aGRmFsu?{KL;uwnGX%JkKuFwCW zbZj+Aw(-eQit@cKA@9;CDM!`)28R6zaRzHe>s~V{j>l7>)k1ORhVMX|{S(_{QCFe9 z(|62sgFomuN_Bf?3r$$KHrO|+9}non-Z+e(eA4+;Yemg)m@6vOBaL*n3%L4kVf7xy zpIQ(+URbTkkQwtH>yLwi@osfRI~}!~QS$7}UsO)nqmXr+P_#o8IR?7Sun z+aA+I($WLP7P4*P6PQ?WNzWidaMK;DeJWn9|2@`64T@M9u@dI9A=>ps$$d>s(C)Iq zR?7y^;&hys?%Bsf&E8&=mK`K;;px{al7iDvj%*8bcy!BMj+5p3_b;AHr?G(rlGlc~ zcBI%cm`|34BR>`kIa%L&CJEubsfti+KdNg;n{=g8g&w7UQQ@(|2*`lAQDSFsFr3sL z0yERJ-x{0g{7&-6spp!_`iQwOy3e7QBH2erbzLIgoM(5Wz~bo!mYy|+`cr+^q@ZkP zX8aW|mXDgdzwb_Yv%KeLsJKlpZ}0ouy^xq^(Tn(NCU!@#PB$4aF(wn%#C@7q6`$v+ zYoAWJ5Cc>FVW>U;1X*;uKml!hbC9`M%|K^aD5pdyedLa3-3slyA_k0Usyg zV;p}^Sx7iG`9RhKu+q0{)snj9u(Jr*z9()O2Lq|T(xOmNg|F$CFrdOQp$S6v_6}TY zo^T=jbCFO-y1CA9eGG^pg*#cO%!0262`{i;g=gknp==hTR%pT{?gt zl&Ki!YFJy%sMt?y!m3GrN6Zyqy9dm6Y@z(tUFCGOlh%_TTs;NcYYxKGzu~|19&P^6 zF{TwlF%hwdfeShcEKaZzohUqhyissYoND^({bxbedasm~v#E7GP{cjP6;C-ssI!@< z@Rw8YeFhKUyc7!ZI36ng%}*}1r$SZQEmlPL$73)HI`ASC4*b@@MGkZhh|ig72A4xg zTPtk*1y98wHq_9>DuGMnJ)8o?2)mqCDZUo=fJ3b*I0oO2SnciCI=$f8;GQax!|^J| z?=evh_8=#osX?VfmYEkv#D$;YV}&UEaeH-bntGXux*9)-K}qeUJB)a>H%K~-b$2xU zZE`%e-{6!Rh1bS<*z8STI{)LSB+Ymylb7`58X3&JKXSbER&_y_SXwhKK~b_HZcQ*g zeV!x)(yHL=ij|9zpi@oK`cv8I@Sf#+f5^bE?Y#G+9`zD%lYv3gY4q$_NOjSu>%rdg zw4^u758w5ERNiE*easO#Z$9+FqemGfH#2* z>Oc`tPeKh1*lU>tTy$)xBj=vSu9|m?Ig>%(4S3mi$mb=wV@!m?+`xM>(?A<0@CTWw;4Aow%o+cbq86Wuq$0txt2d z7Fb26Z3t>-DB>iWa(vOiQgl(DpW*1T;7BF^Fk5ob6dPcHc`V%NQOKV0K~)_ii~@kN9g_x2XZ zz8$s%68u~a<~@f$LB2pV<0f)(zq-bkYNOx78*S8r6Eed=VEU%jWHI5gH12KndKC=hCkjqr|>{aS{codjy0;lDi%lyH^=-e$Mlhr zhgje!GLG{U!S1}Yl}wzrK8KJaaqlC}**?q=3*}f2rjfCmWJfCRgiR7;gMT zIf?0|@E|^b4^u#e3A5nOK;ghmI?zrczN0xf5<&Dmhc_xe&`S%CF-wdsz%()Al*oux z3iW3>4xNa%V1#C`a(?y3l1;gs{D%WGILNwi49j zh&n8t%I^j%z+?U#$+)|P9@&Cs+Ta{`*c_x37FhxaS5C=FU=E0iUQ)hB21FXGH;c%AcSk9GPkY{7+CY}p{p zm~}c6gd~zc#4QAg0=_IJbAUhR1iw%O4f}?YY_f)5^}DIuSQb5d zA{3)83zDQ+?@u}bCFi}MLbCz&v;~Q3#-1(6su{Ci;boN7da4;UV#7w-Nc+~Pd3PE7M^qA`h6E_QjlWUPf6k&}W zQpxkPP+|9yeN!1uiAYBV8^QV)b9Ix6b-os1^Mv~g2^Y-*+xkGUud><7p-+|b7O7C~ zx%kr1L;)uFA{Dz%&Op@Q{Lgci@d`XGhexWEcySfffwASZ@`+QJCJNG_9IUhjpQGg= zo}@&+MxS6{lcPAaS*lZ0O84+`*)TP2YYgdWhL}?U#}<2ZGxjY#PBJe-1Te7-{@e-y z3P?_h2Hn4m+4HoDJ1M`myNEVb)KnX`MvD~dzgW14(Hb-4B0?R@k$v~Jg#o{g2PY2|``o;$w<8DU1VJ(w$U7u3 z1O!nvPuZ9&eaBz+5$QG0%gwsR|85GS%~VYafr~DoEt$B&Pq+mVg4PVST|@OXV}8_N z?pS9ZlLhr?gYQgbAe|~jrpni+YGb`3r`f@HRE^MY6MLsdT;Kuj86I)E94OEuo9Owk z3XnZx*EvBLJ-JE=-^xqn*iCxgk?EMwF4z~i;H9b1o1Iy@Bes0i3-L?uD=(Vt zzS8JZeI)Z@2LZfZ$McP0vT-BfdLC}p8ZN|ObKD_kmV9mbp_x54T5``E5n3m*&1!v| zAJzN-KAVWIp_SEZ;ws4Sb)nqgy`#}(=(T2<0D3o?R&bPi**~p&Kevl+QxyHYZ|@-d^)$1O%g6gGE_KNueZE{HzT!Z9O&2-pJ6 z-E8=CwJ^6Bsb|ql32!!X>LMt^jT7-ve1i6lf*hbOhfIz)H0(u2(|3!MVrsWWZKuOc zjOg_%F-*&w^7y{vPO)ggk07vpEZ^9U8wd9W{CsswJ_>WEu5Hrnn)CNI{SD5K<-j)? zb^|VWdg@mHr#q zu-dIR*c?g7)Nd_E#xZxu;P41cq0FjGk7D2SxkG@ z2S*`8ZXxfo8aNrfCEHcS-{DWnEAh%c!l&>SQ})fG{!T%$AJlE(p|xz@-PBAIM;W|6!<+LN_2E9S5E z1@D=%u3~ZFG^wz+=7l~j;fez6crD;GH!dLMZV zuTq+bT{q^*h@&Ng>)psqru6G_;UX!ydt1m^0^bs-1>siwJaM>w68v0E(xPsB?h6X+F8Df!_U8+euk8q8w!vJh6q zd0)uA9Y0Xb%?F_0gF)5a3k-r?@XW&*? zi#ogow(0PQOB5T)DYuVyLJA~OITatHAIlCfRhmI6zAjwv2n8gxIK{iK9NPK`s|-T_ z7{kN_VHLYTrj!FWfD7p^92o&uhrw>NDF_FP&4JAK0R+Bnjk34)jg^4?c>IJI#gX@b znnPdebo<6gLJ`3C*&&$IQNfu|lXVT10d>$6AK@RzM$ z_<(ttyB({95tNDGyj>3NR8lh@uW;UX#uTU@dQp}5fzU;+6+E8AGM}Zx@@n%ywlysAsR`rdR@U53H6f24x z@yadb39hx-z%+!t1!W_=guaN!u}G*;ygtye1~ z@f!5#q(L=(U)0Yf4uiOMO6c8O&dRiBpFq#p-;?B<&;+hAi(FHWKn5iOmlS`d9Z?xpP*_*o z?|Wo=RUHf)#J*&+k^Iwo?LF7Hw`*{SZQ0Npa8df15U~pL7B&sn#o!Z?5AVJHf_dro zmV|QA$6aO}brpX}nikr(!reRBVslCQJxr%zjpM^5^_KRW6S60Z>s1TBs=L2t2XmF4 zkQ6_3F;(x|Mids4&M6o54F_4%3Vhc1j&vHtEg`~cyCd{Wuj_irccu5AL|T@6_Xs+? zBY4m@?w0Y#92!1Y`lDHTu_ko;-d?^LAADLlXh!VtLyq$qfj*#2A7aFvKV$mBUN0Qu z68owB5WJy!Zcos=RSxs#3Blj0&{r8R-<9z!Dd`$e!M%(dUpVkT*>DoS>p)+{-pHNl zqtHP{kv`q=Q-CVwR}Xyo2 z@P&cqYW_zwew{Qm+;`@vE{%rt_15wZ(={HgRjpiKc6tKVCq>vPXHYP1BX!H zmw#$tWVL7fF|Q(H_iWp+=tJR2wvqXc)Ou6D>qp&hnEAHYU92^~Q0;Q&rc3yBx5#!+ zk3Qpoe%qkIqv3;|XD??4rnQE*W`va224)Tevy0y_kuClgOw@^YluLIY1D8+#fr;7w z9VTA&`s>u`zrw_dzhPpMm0`4vMci?RU6`2oH%u(_JpsVPINy^=!KYKh&H*a1Fxda{ zZP$7;*S-jCeQD`C*vXZ-!V07{ugc)PFl>n)zP_@#@uI2C=gf2N=Ze za?;-n@d6|2Qhbvmy}>Q2>KwiMWOPSRL%w5W^aWrR5j`4^G=7$G{~|Dyc>0e}tQQ{b z6r8#v@NY=*S+xIBOaO4hbbOdNJN#QEKKd_}xc2uAQ$QuAmd0l#C1hRBC@d_DkLgOR zqNmq&*CxjU*GubjGP_fv0hQQRn0Fl|5IhfJ3FpNmBquWYj#)xcU{K zhdKA63Lhkv&19B8%(yz6-|)Di{b_B_d|SuB3_udclhXi(_}d^hjQ(Q~uNJ(zaeb26 z+yDILAnP{Z4u9QE9{J@CpFDna@6p!y;^2ejiMdy^&sm$VXCJ&=c@7Nvx3{-}`5SQ9 z^iCXF`mJzJ#P)}k<;P9`pu-pOj_oSG)y6f42Qx^9$wKC>5~JacYI(=XgHlzp$&y7y z=511wcGqqMEq~q=?23ZD6Se2FtK6d|s6Li#-Cq0fnzj4~9h_&j;_W{pra!Sd!U(p{8@l_UAkW!=5~D`xQK z`bVEjbE09GJJd_4%me>BX$C z4(7RrDWHNaWX{>9bJWE&J^Ld~JX;MAt3`Z>O1`<`D?n?{s|j&O(0>2^!b z4yumA#9!{c^Crtusjk~6*{8M2Y6E<)YpNlRCG@lXpHlg=^~o9j^r0QO>t&s9RQ$?~MG9YL zWoja?_3FnQyZ1=yR zv88q6jkhjOQxKx37=Y=-`_rOPAun5oZ-2|PS}*ytF&@XC{k6mCF5Q(guwPADp^uIH zeKe(YP3&3YHSK1|QH46HzX`99>2{Dvc&h)0ho>!4>O7wGADIKTLVd{nFt)aFrLOs4 z%SVyE(Si51`7DEi`mI#v{Nkxr?9=#ChJldSGxQ$|Kh1Xz2G}*+<|+2Q12Q~Uc84t1 zw@7z4@DEz&`SS5vU{64pZOg#r_d~*$gjyd)CMeCP{m2?{9-q2$L!S+QiXO*vf-cG~ z$RPWe%Qp&jqcdC5$3x3bnnuzQVpjKVNaRZ&wp8%OxTp!3N^iEHtYVbHS7q!%7Tnis zP3#iOLPy;26zVC_I8GCMR7~oa5_@INe5t3>t!-P)iQ8M4uUmsnF7;=}iYNFL=%73{ z@|obO<7{u@JM~sK!y`W)*Tc2*!IW23-huaU4)L;myqp1D^LxJG{-yV+p25YN;?tNZ zu5Mqx!ve~H8ufI8vEfh z1&=&(Mofz(+z#y3ELNsa%gE&HC z^JdqLXYn%GseM>SukH((;>SB9*_2cYsxWwqQU(Evrmy;!NpJQFiIK{O}8{ zjb+K6o(c$Sj!WBBdxrSvP*lrZ)hD!6Hef8H00eH%wI-DJ6w8=*!1KI}c(R!>!t2y% zy-(65hX}(I=7a3ZG^n)ba}3e!W*Jd&2%{9brkklR=l&+@s;nj$dW!Y1*8$3gc;cp@ zK)b7tSH$MESK0X}BYORfcxJf<)OFx00YAN={60`^uqWmmYFTG=F~MLfh$FPeuzqpX zeBZg~Y`ae_NI$O)yb4R8Yo`VR4bFX?`bm<0@l!_=h`Dxv8XCUgLuLB1g`)EwR^Q#lFu zSrko|*6c$bJQYo#t~p$9A@$xH%O_)~FEmHFnxq|19EdVU93kyXV;K2@<;jzShYT(a zyFb{{z7lhv{n{;F_KAJHkeH|LxX$k90lheD>?Kfno0v>>o<0d8J{-akK4K_j+kEq4 zmRpyP!Yge4zC_iWik;y@Y2YHMF9t-T#PFHWBUu~K8BK_a+va@`&eE+|NeNNp2L+SS zSTIEXfMf2Jq!6EK{TJSw`#AoLqtn3tTCY%{;`LKyXbwuu&#+|nwwjYen&%+ej3xfH z=B-k5ch_PgP@kZF45pVe{b7#O!7C~t5C#b`&o_aCrlNE)NcBG#RLj1HJl`9$HX>-) zj?EA}o0oP}flU5bdy3DHR}CMfx$VaPdg^1nF(*z+r#oA48?{en$uG1l1l`$bIBd$16%G~r<9?-n=qZ+JDZe=Tqxe&s-$m1#LQbj(;%yEdT8y~= z_~`aPM$*pv!x=w*HWLrFs|{ftu0Mz|i^A)dPp*`^Cg);JZc$IVxt)3jQMnJH~|5$Y)MkdyJlmntjc!LbIS%fS;Zx z@;Y)Ydk0%*!~L33*R8?(Ji+`eU^558M>_643m(LbDKUxQb@WqfVaqo~d*aznR9rG2 z;f5ASSvej(O)#-DL%VG8O4@L&ZDFb@aLzs-0wl z-l4%}J^2r{aO^9HG2h0WAh3OC;WLrpNiY+!JcS9Nv)64UBIxGL?~|NG<5dYL$vm!; z^mtb=N1dZ|UUa#%OL9jXw%F`^bY)PJ5}3LIfutY2jw^5$jK(8f!S&jrec9;$EVqj|HXh+rVh? zu(zZPsrM-w4?K?qaUTJn*T_u$)+Jz`&)%9(IJLzI)8d?6<-T;4F!zMl3?GcG6)=4- zaGI7Wo|%4?evChe9ld2$SMFyuoXOD7czY#K#+<-n1&-UXyL);-juF}BvgkXRA?7U% zn+nX=g4he}nJy%BaHt_)AB=mATPz{_d}gL06mFxBq&9;i@z~ZI-Zk`yE1`z>We~T# ziHpn}dK6ChwUELwF2f}hqZ~$~pw1Np`901sBcR=K7_HXXYNF@e!+1My@SSSLSihI< zokF=cgG073-p3R_9wp`-A#Ba?g~nhbi1$fsX<-ipoxU7j}QEm-B&r^K2+NYcpi)J5eVivjg$;DFd85#t( z8i8WGFY4M>+Ldt5(>GIsi?YsIROKpFZ*>~&w(9LSMAKa8IJ-DlL0Xfb&}Ng_Q?&A+&2bjEYWM zB#aDR`ih1mHzsDI{kp*t;kh@Rh=etv=QTNBv^hUf8fXt-tL5Tr6qKq{)xM`Xxva8% z*<>QKzR04WM4;hMRwl_uU6};4CB?fPYZ2RNX_#Lo)Y@`9*s5dD(QV0^T}*Wt2`uwW z`m*fR_0Nr}iy4MzAolnU>t?o6D(V@vO{@ZAbPAS!Ha{W{cXqu=<~v%g?aIPZ{dySA z%a=&laMi_k*ha9KTBF}g;jSllVEe=c7C{J>V~?iacN#9Y4(v~9>|`QxY3&P@jYKi1 zxj9jg?k5n%E)VLo5rmnNQ8${qZ#3iH;5p7mG|}kN8Z(_jqDjV&>mu>s6Zq@#A9e1O zH#;?h$#^zPGEAQ3*+xQ!PTi8i!}2U)HY{Yx@t)#axJ}SaM@xO3!Q6Ot&4=(CLFM(L z-*tLfD7ZFo2s@~a4lni!ezVgKWuiN+tV|{GSPkZ7DvBt*;!Bf$Q0>Qq_mEaCIX0kXH4@J4Sk0JU9^ez z4nF-8-DyMZg$nf-A7?(5O?NU)ANNRq_@w1DrK*8;hpy6^BrlOm0;|%@svQ(YTNTu) z-IJt#igS;|M9y1=;O8g22g1^IH`*xj@?BGiMHO)B6qu|0fD@bYP~`#O&p_&=-eLRz z)w!qidXLa3Fo<=|9%o?9uLXg?p>sc*8l#g&sxd<&w>T1d0?oZm zb&r)yTi!NMfp$bHOmyDmwky6Y%kH=}ehEKu7c&H0I5mEqV_t!>maVXy^G`4`V%wZOsEuH&6D@Pm1XdY+TKX8XAiz#Mm>T>dlb0*zv9&g<_iKV?iX95*WM% zk4n8yslUI#T_)hhey_ZGnbntY6q^i(^jqt;89{F|YK!XfB74A>gdT9}F+CzDYTXJ! zA1{C2spZJK1$Dx>2`gfd0n^0_5+!d&nF?cyo73^mB4Nt>0?lQbN!Wd9F6|N+MG|`+ z={oQiY8S)?owCtAZ^jK>W|S`XkSDn_{VFUhaD6Ece_WReZAKBAA<9=__5rgiAIgO3 zU7d6?0xi>GiF{H&Igfd?dVIpeg=;U0H=gqFX)VVbzQ@KIDzD_t@jX^-R=tx?heZ z?9tXU=4}L>1V2^|K0&=gn~;VaztKe@qn}R^wx$#&pBngg+O%-&E#~s1RXjDvweJY` zNU_cpgh7}t3scPQL>l4}3BCbkcW}CWA*+flW!AF|E%RJi{=)qkmyt&SPckeJ%5oK- z8CbT94-fjzC0j2r^~MHM5cDnh>8XVr7E09e#ePMJ?x|6yt|gC;S+N=DyWLE~&+|jo@nV+k-=d*3d)Iiqb4t@u+{*i^xwF+_ej`a?t42h8)jh8N!tzQVr8z<2I(S=@Xj z<66(J&#tqz^a#If?1D}JA?$GABTrGcKu=-fPlYK@Icdn}ALa#`!P5s2o@Piq_^znM7*(H`c{K&y$G4Q zN029Nyd)8RG{1W@^-k4w*^#y!;{TNXOb2~J0|84#mX7^_KW#66NS32~o76kBP z(gw+GVsmP9!S!{M0(*w_2Qsm}lh&HJjH=OF)&Bu6PSheWS?{e&KEB;D4SAPZ`cAxs zs&zj}5+kN^Iv z;2xs${mm1X)(U&qUI#W;xu|kd%Gxy58p2Wdf!r%u9JYDb$Was7(pm|-K#$K@YTT*wLiR; z=Tx65E40VrxRVEq?w4xiDxK}#>#7rlymIKs$W%pMB5_~ftfpbnC}Su!Q%yFFolgO; zLH2s~Nbz{Jp7?;6HrHf&*W8=iD>@HlZ`Iht#Opg~_l{`fwFeJ&SsK7Is2o;OezvAf z)H~A-=tcQE?sYKL2V-n}o)3Pye1hV#^9 zt+EGaM|1DA=O4A@)H4UOH)a9&$T9Oc_$h$mfAi${i?-M;+M zHHB=Sn_JhfC-EfI*J?g^#om-|L32%p=&sS)=NpynWoN)KX_<3LAZ zRoGxNa?XKe8xXX0a~wjA!FiOLgsFyxOjQ8$36_@u;Y@pNcNb^Wp&C>VA1Zo{F-_Qi ztz7$k2bXXqSTD1#qD4SJrf$_t!Ka8Lx?+q*l~Lgwy?#gG`uFhx$t&wIeZEGTbanw8 zzM{)kN$%sJ{Ps~a%+NxduH=LOD=P(WRc~qUJf7CA$rHSHeMmvmXM6nt57m6j!m#Zn zq1I@G&o@ebtSg!a(KssqP>66Ohh!uG!)ba1K4FSJV^Y+|d+HZ$x%cvr=%61rtvx4> zXV{+|bvRq_N!%x-+#^p3)B+=%nUei%rnju^maBI0&yG~e(UI#@ek~F<=9`ctQCop^ zsWf z9oRT%4`D9bX+6mt;)qwWB8sFqu_9_{N&C3+C+i+iA%|2N? z>hRW}+JRNr?szCgUcDpb!qDnX_oVW-FV7`!@F^8(tlRh6TpnJ(c~kQmZT7>M6y#W? zs>gvA{`*|%Z5swv9OF73&#qz2j~fS8ufFZE^7<4P(eUu=SmCwTMUTqO%AEF|DNQoJ zD<=Hx#nV=wKULnk4DVBTG@r3}VB9jUaN`?!^`)`>tIeKc8LqXD+t%8B#E^GN4bBHQ zp;O-Fk8uZ8-o$6$`5>zcww`=;KWU?MJ2f58J(PQ(mr^5bk^AR!iHIaV!-tSpw?R_U z!b{>7kbo?CtQywi%^7O22IvmE15N7F^61X!TV9PahGk6Yd*~na)E2^+M1;=P3+qo( zWbrG_s%wZ6Yo2C0Zj>x#m4f3fH_;dVuo7+Xl^Ykc&51kdkys5b{+Yg=w?EZ{d%=lG z{GNIHva#vusWvgYd*I7~f1 z*wv|c(5b=ue@KM1TgMG94Grop#R?p#G-li^&|_i;Ayrv82r(@C!i=emtJ88MsdE&D z@d^&@sXn+$Zj)_PX6Pba6!6rR2coSxYTeJQg_?)n4C2gkst4aFXpI-zPwo%<@m%Uo zb+RKHMAL=r8>AQMBrxej@x6$4b~Qz?OMceN5#z7 zRf8nFwNZstbMWgDb0LQZle$t5F8YLCgRx-!rHPDE^0D}J&TfO*_u2Vywbzsr(K?Zw zs!ESWTm3q)ovceW9wH%eAz=vW}tzi!@Dm3SKeH!JjQtgWGoeAHVuoPA|)k+iV*fT=( zJyrDO!1ULFki9D|vS&s|-ak;1b%I@$F4h?HYUM6+O}i(@enh*wXjbc#q=nXO!OLiSx z^i%13YC%PM3cg-^w#$SoNs4D0a4jRYPX6y}I&v#~lRl^wf6$22;kFPpkmXXF4{Gbj zvaD+pKxKpO&{og4KMS5_o1q3F+qItd*99rVv+ps(R|Z`ozdiqq?FgGvJm?sq;_zwg zUAt%k^83 zVzF2r92}Tr69@!8K0aWW4e(LGj{YN=0WxZ)qvfdw3Dr|PqoaCJUp|DQ1)ybfV`D2z zONWD209|%=b`G;NzTjX3SkSOjo&X00xN@uwU_oK&2c;6tWeSgo)tuN<UHL9hK zxTCdCLrzvkfS;2?Ok84Y6s2nn(o*B&UU|jM#UnJoL}Y34=^Oy!+&X-3w2&ZfE$%-) z>auNZRh`)HwF6?8;VcJ^A%M<;_#CH9IYe|qnk_XCn}UQt$zk}-RS=9l`+>sD8o?9j zDVU!lMaNL+B8IVS%3-1>Ckok;@g#%xQ}8mf_mT{~s>Y^T!VeU*&Si$J5pOv6WbEv9 z`+BN5`@bww1cJPPC%F3v0ml5#3)B(e(b^-l`wqoKMS*t+l#Tbx$?Up%LkS|lnDxm@ zhU#j-oAlJicxiE3Q}iM&A-j;?&J0+a_+^#Dot<`N@}-dA-PagnESqgDS?VZO>B3WW z{MT!2@DK(bWFpP~KfOcP?mLW%iUK$>@CdWAvdVI@b}eyj?XPflcX#*jo!ml#|9^aq!0|e@Ur}QfwZx?46p)#r2t?vt)wiMW?@VWZ>@s7F!F}DgtVOEUS-u3?NO|r8E79#fRlhhv%@&>+)|_3>U@*h zLb?VoSM(2P@yu(ZK>XVLD=VU4QG<6I^Y1?xfX%>PKCCTwLMgZDkj2qw1gdE_M)w?I zUOE=oC@@js&UzZ&Idc_kHGcz-Qh+kS-0yaJVU;3c_g7ZppfSSi}3koZ%?K8JJ zn3;9ZI2Yt`Vh^&y;i*vnReJw66r=)$rK!<19Sls0J z_SbC_aW!ROK{+Ebh}xG7cWhsc5d{tLpt8ke_1!&8Vq|SfHCuuunS9`55=N<^eJSR9 zT?#-5kby;XX0}CXEGKAe6it>K{bca))nrMgMLYt;1a81c>alBv5mB~#MNzR--w)Az z%GBP_MccUKhZvJugHc*X{V`?N^vErSD3l$;OH}gI48GCmqU^>D?H=!JdT}#q_pUt# z_>rXW&x#rFAOEV{jpY8SW&@jLyK7~En##Mq?2uoncXkU4b~`(E2M2_+GyM2*gqa!1 z-vGM1Wp+wm_Z&qj!a(7Ig~B;~)nC^A?{@Y-)*X1%z{Z(_!x12v4Xm5_9zPmsZW#Kz zlpXr}kp2G(Xy085i!qXoIw%h~_T;}Ed#s&2K-rU>Wp~%a{!O!IdrSYy%KJ;@_{tQV z{&mql?~Ghgh!jwn|Hrrgvq82S%f21RebbNcpBwl8tdjkA({A(2w7WW{dij*nw3tAZ=e*_*WXcI$FFgMXd4fg|e1hQb!S~ ztCaK~*UBoR{sU$I>%e`z@L-G3NQdCWt-qGYSn-(MH1>Kr?6+e_>>~EvH1==A4g>1g zPg=tI`*GvrzxKpb`_s5g#OI zUvq3})Qk(^A?X~un>^cf8d2Zq@+sBD(#|Qrv6+wMVcFSuK#zX&>Id?}#uF*;BS+SY zV9!oOU*LFVpI^P9Kw9Cl)Tnu7_gLRw;@$UQn#w^nj?8b}cKc4a-)C!bNeYcZDjaRp z7}4ozTDWuR`=P1@%}GgH2h4{DE9HGr3EVzU2KuVt+3kLFy@i(W!=<+)e+)eJqiHI0VTo z5W>5DaY#7q4H)3g{&x4Y)|rMGKEmC~X7Wm_Ostkf^4&C?_Qa9L`!|0;nc=|yy$}R1 zhj5#n^q;%7oUZ#hv`qQ#k1Wee6=s}NF$eqiu>>Q$w@~ny@@t`xX&Y~s{c}P#cU2|M z&8?_v&9u3vfO+8}8D%T+S7 z0-9rrE7r6678 zcFx=tE^vmXYk&59JyYdn5-xRxXJv-l+MnNDu4I4<5(S!g3YkzI9t%swEY)b!_buQ- zen~29OQyWXNQ*I0`Q}Wx+FSuNgQoue>GeWo$aRL+G0l^+#ScDfnzK!Oe)bMZcscGt zPR{C*1GDw4U%{34NQ}!}20?~+EZ82-*q-6{P ztNd-Fz!_1+j+xfh^t@_c#bng*(?k!m+gW3zi=mmuocqZveS!9;$=4g%lXO2cNeag1 zyGEvYVN~|LGsB4DLpH@FCqs`xz!JV2UaBWSn>UP_OAOSymQ<|YcCYovWZZ%l?1ViF zkaKXsd!*}Y@E~yH<~|M+HLx+ar_9obcvh?dO6k@QU}0{5mfYubtztbUQu>osrAlf~ z!#9N*+WTpFyroskAlj3)1p4r4@}SOS=)-#p(SmGFN2^+95AXjxvV2H;B{KV<`ZTo? zE^@9pa|k7(Sq_F9@x3?Vc90MYTd8vXIZi(QTHXp*nH{LDrR8|z|ETTE-=S>(20Z(| z++&HXV@viSTjFU5jgU#!w2YJ`(pW>%jD2tHgp5L#mJwwwBeGQ*rLvWg%2quip3>?& z&-;D3$Uc?D1S>P`r$sB1<)zPUptW{-QI zTG|xt9bN|KpCI82Ct?7Wk~Uwm6mm&-)2lgSI?x)s3U}t*HFt_lsCi=Cbo3l?}_fsyw<%A@w>6zN)sGqV&n|deS&fBw9n-1B+ z2c^4QS50p^XGe?~f_X5n5DzU{E9KqZ>$dJISueDe&EFvIm;IvA8UI?48QoeFOT|0y zB9A|~vdy$(INx?MjZk<%&meD)!U(fZ;tMY)Xt5Ws!{j4ayktF=3Q);NnKrE!Bb&da zuTxXBk5*?o3*MTxir(W7RByuJFcxwxtGsP-i(Q0s*b%2@DQ&eYT7jk~m1j!XM(u39 z(CvPRlPtJDE|C~h2$dHMLFGO8AZ7JA%n?x^*)?p7ZDT~#x%d>PW4@018_k^C!v5bM zhM;cUt5MB9H4hayh@7y;e&oJ%9>+#E%@nTuh{<-F6{LGm-$~!@O}82c=LR$05>A1v zp^4;ut_iBr*xL8H$1geVmy$SmSg4{1Wr47Vsle{2Y(cueag7$f?2hX;`$c$x{ScUN zhHh<^zdT+TqIsib0%GEJn;2U&FaM@>k6gdQ{)j6(j3qLboGx?}VApxXe{g$r&*ys% z{#wum!f$yz*$DL^{sD&13L=ypkcZtPwdN-4P;eXHO062@{8_be~ewkkgL{ONom zvUOeKi21PZMzcH9%}=~2+H3wOc62|>w70QvMPW4n%-SZanzP;OK_n$KVW^M#C2O4%!L8(p zC-~AKdy9{~{wW`?LJ7qv*{_rnn-E!I2t6#o2Y2Xi$RX8}BK6X}ZQ8an7|fxVVQs`J zTvy!}N?;@@)gK_lqGE?)MM+1gqF~d%ul8%+-y=sAz1!ZhK7NucRqCtZ@2R5(wu+J0 zwOG~D$j%BH+eqCNz9NVq_Zrfudut6{CnF-)$^$k)-nX~`(0R&>qZWlmxRak?B8Fs{ z{uyluI8_%^4JI@DlyLL(1oIl53$)4314aQ6wr0fBUcKf;LT?#mBh_rdWFzVQvVsB# zY`J-TrFhmncy~y3vz{**_0n=RXTneMy-2%$j}WR(^{%~CYJDFq%n2wRmDfX2X^{;l zsb(IERHl=J>cNP;V|x^5xrodl?lKtQ+twW%kdk69mnfWtH!NbvBKkj_LN(;ERQ4-k zZGAvH>*>jhLt)i(@b-At%;~3?o&K!3jlZrU6oCbYhm>^p`0hJ{DQQF=DwqGfR&ghN zpu{0kRi@Pj{h>Y0;x-$-ODy-L4kgM!*k=`{%A>gMQvk3=Y zNmKd9vSmZg)WaiM(cXa>I=w_CegZHDKTeZ;&LjNh`7Ur^*O?crYA`JxD>?Ey>aMg6UvJml#pOFZS+QkORP?J6|auw$?Xk+Lix16wi zY_0%C<|2jE^M#4gyGX$RIR4KN>AgVqhaK_rqSgQfbAk^JCgYa{IZ?f56EyQBhXJL! zMBH9Zl?`rKge?N#%1q=Wh4>jvT-{_#InrY_%SdO*Ax`4SOGFYeCgW(Y^zw(EIIvF3tI=QIY@>OL11+NeV4C0@IX!E1(z2f#u*nA4Dn}3 z#uv^O$&95O34>4ZBsu`iK?*vVZ}8g&1&`&BImlT?cF1Z%ZXSG^S|a0%wD)I)@+5+I zV0Qr12WYAb4b&N$@(zgI+?*vwzOkVL%@9?vREllJAJQV-qLgU+62%u7nGVaOVk)kx zJyI=Bp`i7@YxR)PMnT94YR-N(UeH#Q-f&6bA&651cl4DM2fj}Wz;qVsK2x(mxDyhA ztL38Xg@x}ofg%%MqP!>uXol+yS0M8am-rT$<%uKTNF6@dgN*6?C96v`VkEjgt{y0&M>_vcoNU-_Q!C^!p2dP7aWw6TYY;fOW zHP!h$d$kHe1;tv;ZU%Xnp7g5?VO-`KxF$$aTviVifL%nWE}>SQSUf;S-C^SHkU^@P znn4y;=v^x0Rcs-pr_2|7>?1B{DgTa9T414zg5afFHSYmvbrA^Erz^#;wAjoq7RSs5 zqN**;#M}vK2Kl&$1#pUY)!LSH*_SxY62D$~8>M8Pq_R}8c-v(6H3XpyL#ERV)g zpc(`hHvQPE^_@;w9|oTwV+I(?cc`d5K_f)6f-VC8?jX>g1Iy-E1~a)s8{i>HmaR7= z=duG;i4#mDK>#C-m{hIRg=HesVr8g1u{ZdraG+V2yzSfamNVvl=jn;)R^k#Fe@eVj zPezw@h zU8hHVpyIExjAM`5Yx|Izs zRU5R8dn(xY?4@aq84)B?0E;d_PLLZsJCOHRF~2OZ*Qja5-~RR0zn@YIj)Ro9*;l$* zlvx^VCu(U_E+kaQ|PcD;hg^ z?SmX_J{4ih2`&}k2fn8f($X%INxl<_zXZ+7^0(D~LPRT36b_}_kw6h@oxz~pMNone zA)pf?wNo-SBpz#|>}*0>mZJ>lF~PQ=9X##w6}$nUr?-r9<%5-&$mdLg;km>GP6llb zx_K_?hy_yBtY@vo>DW;*%< zBahHmbRpegbu-FBj|$HxSDX1^B`v^-v5gx|J-@Jo-7{W=7PmZkm;Ks_4As*WCD3pY zn!rdP&|w~AbO*0JJh5Jtb@Q&s==5??y9gyy(JMdGTfAOSqEeVWL69+VwnQNDJFwOq z0&b2l%|)IPfbBV`YAzP>sN^oA{^GO&iBWjj0h0^B6+jTvc*6a|M$!(u@ti)NcA^pp z!xf>+inkoNN|@jv#ams@9MlzlC)2fVGaNgZ-=8IdIcFnZaS7ZkIpdLdAP*iJlo7+v z0yo?($|t;HA?0M?nG}rLBen9_x}YhO9x}$i0@2+y@Wu6nY5t{b6e0DO#9u_pQ&_RPJIY-w+_41p)mt0!t@NcpfDOalndga{=O)LkS# zDc$F;tLew~eDCTB;UO?m48U=;}>KPAwmOL&`zDN703WS=;zGS%dW+L@(b%WU7u-IKHGZ_IL*5% zG1pKWgZGjng@sKy=Mk5v_?`E_bY{8oJ+%Tdh)5}}t~3}Tk6%z23Nn2IuYQB;pUO5T z;z8ctk+P;a&&ho7E@w*>Kzd=TYJ(aB@zyTr*y)9-=8^vWqpzd}~yJ$DPE0P3P76m^lME z$QQsvPr9DLg+P{*gIf7#&fY%=Ou!@5LfaX93SGZ(!5b=S4L zTZC!U8M3=R9r;l=<;1jf6H7?2yYemmwKEqrby~BZ+xYldS#2UNAq1vK7K%W4AAygA z-GSby12a^if;%QhpH(`)_}FH+fb}6df9~f`Xej8|%VcK@;mXPf zaLk4TLo_e{Rd^Pdll)U2GFo5dhcn>r2yb&JIcG7#Ojp(=HPCa}ZExK_ffYC}eDvmv zS@y>?2|L`jkFp5s{P$}C1j}C%yBRm`1iXvRdBx$qGn==0`3&ci9ry--y0Cf&vXU2R z508ji&18wQl*y9`lY`H&00lzo)>dE8*ttm_7!+dt(vhKxq)NsZO?EOdcX~WzQFjMA zjU4`tr~Q->`O+V4VU#)xJeN3dKbyAvGUs)@{`yyIQ-4Vj)P?YbigxZv`7W9QdeJ_q z@TU4KQRSEp=VN`sY_*@>=lkovJt?7#6ZHVdc^5VbcqJK2G_(4={^WTbB~Z7b<7OSS zm;TLlXoBPmc4E4pesFn138@4??arA7B?XR`mj?$DN3|r*$xiDA*7m*7sD(nq&qA8> z(YsvJEHI?Y0O*Z0>OuC^pB!lNTl_p2xtRvrJ53;Y9U12;K5SGgLBl6KBb5%01+t_d@StN zA1c8VfbO6`jYJ48Ai)L!p}+oj#0)L1FK%b6>+5x%geS+tu4`*p%x~WGcQn{J}*Gk#6lF z_d0p1ojc^V-;1VaR!7{9I+cy|-50mBwI3JT1@H5cdo_wL(;u2Hq>hfgFMoLydgV+3 zYsIHsWjC=w6gTEK(d=rPB>GYIV zYjQ&mHoGM6&YdTC&Ao^!{7Co{hab4G>GrxS2J~dxi6}GRtIqsI%D!~=19An)4+mi6d{Fu+2RCi}Ov%w_wxi-MoUk@P~h?e{NYU(>6x7tlrR}G^+KL~zU^=^`3 zqH&+SY6wW3Td}X2DE~-M!as7-Pzt}KK`Y}9yXZV~+7o^=!p#v4hK0vTY=e64NxY`> zYHBda-9NVWigs5#8ivW(G3s>Z3q7%UNnWDh7r zant(72)M?4c7`9+*l+2O(LyhIps#@~rM;*g zckARLi{iZ&+__)E$P_&(eo^&IbU6xKbeHqtRn-hiUBd-Jjjnb+=vvEicKxBA6L9X7 zqsFloyFhsjx7#caLo?2xPpPa^kYptBK^k~1uJWX$+s*d6*CkT|;8;?j^qLC{GI0Vh z-N0)Z7vZ*TH+F~Qu1ObvJTRda=kFMF{DO8u?M29tlS4)b<#S+;i~fKYe)z%SMq(jo ziGCujK5zfKMOW9d87bdrnv%%&&;D9UJ3WX}skpCCtJE{lMQ0>4lqT2A7&tM!dF4`M zTy>Ri=mE!wn@0m}N`DTM3@C5bqx2OTF3_34uW*#5bn6xX-yW5sKqWHmhU&5n{HxmZURizwvB)qK(o)3>r zDjHbHGO1pWvF-L)rG~GJy|(D?@7h~Z)f_;AvH5(y+pp*~fzxBi&_0bbU+V`Sg4id_DuWm;+zV#e6MBtmgkqsY^;q#N!inX^Bm_8N9;$I~AohH8tW< ziq5Ot`;B$2t*v6IK|k;2Q2X5{_q)Z^=*g2O&j$KmKKVB=Fg^ZkYHCV2H6Mf_ zI@Qi$YMO3lRsphdoa`yLvbJ`Zg}BW3IM}^)pf1tB^-P#}tLC~&ux`Rk93*Ox-O*^g zp5bxWTgh!CMeiTU{rymt_Vtg#6y!}t?0r6i3`*wtcB{GVUqZp{R^ow-UH<{Xsb9?i literal 0 HcmV?d00001 diff --git a/dist/img/tr_modify.gif b/dist/img/tr_modify.gif new file mode 100644 index 0000000000000000000000000000000000000000..5931416f7b0b168e45f2e0bdc07811f1c810a7d4 GIT binary patch literal 64096 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 literal 0 HcmV?d00001 diff --git a/dist/locales/en.json b/dist/locales/en.json index 1b3fc1716..2a24b2caa 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -888,18 +888,16 @@ "title": "Editing Turn Restrictions", "inspecting": { "title": "Inspecting", - "about": "To inspect turn restrictions, hover over a starting segment.", - "shadow": "All paths starting from that segment will be drawn with a line shadow.", - "from": "{fromShadow} **Starting segment**", + "about": "Hover over any starting segment. All possible **TO** destinations will be drawn with a shadow.", + "from": "{fromShadow} **FROM**", "allow": "{allowShadow} **Allowed**", "restrict": "{restrictShadow} **Restricted**", "only": "{onlyShadow} **Only**" }, "modifying": { "title": "Modifying", - "about": "To modify turn restrictions, click on a starting segment.", - "indicators": "All of the possible TO destinations from that segment will appear as turn indicators.", - "indicators2": "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", + "about": "Click on any starting segment to select it. All possible **TO** destinations will appear as turn indicators.", + "indicators": "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", "allow": "{allowTurn} **Allowed**", "restrict": "{restrictTurn} **Restricted**", "only": "{onlyTurn} **Only**" diff --git a/modules/ui/field.js b/modules/ui/field.js index ef998340c..4936dd51a 100644 --- a/modules/ui/field.js +++ b/modules/ui/field.js @@ -148,7 +148,7 @@ export function uiField(context, presetField, entity, options) { // instantiate field help if (options.wrap && field.type === 'restrictions') { - help = uiFieldHelp('restrictions'); + help = uiFieldHelp(context, 'restrictions'); } // instantiate tag reference diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index 2f88a3629..333756d54 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -4,7 +4,7 @@ import { } from 'd3-selection'; import marked from 'marked'; -import { t, textDirection } from '../util/locale'; +import { t } from '../util/locale'; import { svgIcon } from '../svg'; import { icon } from 'intro/helper'; @@ -15,7 +15,6 @@ var fieldHelpKeys = { ['inspecting',[ 'title', 'about', - 'shadow', 'from', 'allow', 'restrict', @@ -25,7 +24,6 @@ var fieldHelpKeys = { 'title', 'about', 'indicators', - 'indicators2', 'allow', 'restrict', 'only' @@ -58,11 +56,11 @@ var replacements = { }; -export function uiFieldHelp(fieldName) { +export function uiFieldHelp(context, fieldName) { var fieldHelp = {}; + var _wrap = d3_select(null); var _body = d3_select(null); - // For each section, squash all the texts into a single markdown document var docs = fieldHelpKeys[fieldName].map(function(key) { var helpkey = 'help.field.' + fieldName + '.' + key[0]; @@ -74,6 +72,7 @@ export function uiFieldHelp(fieldName) { }, ''); return { + key: helpkey, title: t(helpkey + '.title'), html: marked(text.trim()) }; @@ -81,11 +80,14 @@ export function uiFieldHelp(fieldName) { function show() { + _wrap // allow help to spill outside the wrap + .style('overflow', 'visible'); + _body .classed('hide', false) .transition() .duration(200) - .style('height', '100%'); + .style('height', '600px'); } @@ -95,54 +97,32 @@ export function uiFieldHelp(fieldName) { .duration(200) .style('height', '0px') .on('end', function () { + _wrap.style('overflow', null); _body.classed('hide', true); }); } function clickHelp(d, i) { - var rtl = (textDirection === 'rtl'); + var content = _body.selectAll('.field-help-content') + .html(d.html); - _body.selectAll('.field-help-content').html(d.html); - var nav = _body.selectAll('.field-help-nav').html(''); - - if (rtl) { - nav.call(drawNext).call(drawPrevious); - } else { - nav.call(drawPrevious).call(drawNext); + // add an image for some help sections + var img; + switch (d.key) { + case 'help.field.restrictions.inspecting': + img = 'tr_inspect.gif'; + break; + case 'help.field.restrictions.modifying': + img = 'tr_modify.gif'; + break; } - function drawNext(selection) { - if (i < docs.length - 1) { - var nextLink = selection - .append('a') - .attr('class', 'next') - .on('click', function() { - clickHelp(docs[i + 1], i + 1); - }); - - nextLink - .append('span') - .text(docs[i + 1].title) - .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline')); - } - } - - - function drawPrevious(selection) { - if (i > 0) { - var prevLink = selection - .append('a') - .attr('class', 'previous') - .on('click', function() { - clickHelp(docs[i - 1], i - 1); - }); - - prevLink - .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline')) - .append('span') - .text(docs[i - 1].title); - } + if (img) { + content + .append('img') + .attr('class', 'field-help-image') + .attr('src', context.imagePath(img)); } } @@ -172,10 +152,10 @@ export function uiFieldHelp(fieldName) { fieldHelp.body = function(selection) { // this control expects the field to have a preset-input-wrap div - var wrap = selection.selectAll('.preset-input-wrap'); - if (wrap.empty()) return; + _wrap = selection.selectAll('.preset-input-wrap'); + if (_wrap.empty()) return; - _body = wrap.selectAll('.field-help-body') + _body = _wrap.selectAll('.field-help-body') .data([0]); var enter = _body.enter() @@ -202,13 +182,28 @@ export function uiFieldHelp(fieldName) { }) .call(svgIcon('#icon-close')); - enter - .append('div') - .attr('class', 'field-help-content'); + var navEnter = enter + .append('ul') + .attr('class', 'field-help-nav'); + + var titles = docs.map(function(d) { return d.title; }); + navEnter.selectAll('.field-help-nav-item') + .data(titles) + .enter() + .append('li') + .attr('class', 'field-help-nav-item') + .append('a') + .attr('class', 'next') + .text(function(d) { return d; }) + .on('click', function(d, i) { + d3_event.stopPropagation(); + d3_event.preventDefault(); + clickHelp(docs[i], i); + }); enter .append('div') - .attr('class', 'field-help-nav'); + .attr('class', 'field-help-content'); _body = _body .merge(enter); From a700d42e7df374bb6012548072d46d14b2a00ffd Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 26 Feb 2018 21:42:45 -0500 Subject: [PATCH 48/55] Much improved field help - absolutely positioned attach to inspector, - float slightly above field - looks much better --- css/80_app.css | 6 +++--- modules/ui/field_help.js | 35 ++++++++++++++++++++++++-------- modules/ui/inspector.js | 43 ++++++++++++++++++++++------------------ 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 7cb24d993..4cabf6b14 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2011,11 +2011,11 @@ div.combobox { border-radius: 0 0 4px 4px; margin-left: 5px; margin-right: 5px; - overflow: hidden; top: 0; - z-index: 2; + z-index: 20; + max-height: 550px; background: rgba(255,255,255,0.95); - box-shadow: 0 0 10px 0 rgba(0,0,0,.1); + box-shadow: 0 0 10px 0 rgba(0,0,0,.3); } .field-help-title h2 { diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index 333756d54..df334a5fe 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -58,6 +58,7 @@ var replacements = { export function uiFieldHelp(context, fieldName) { var fieldHelp = {}; + var _inspector = d3_select(null); var _wrap = d3_select(null); var _body = d3_select(null); @@ -80,24 +81,24 @@ export function uiFieldHelp(context, fieldName) { function show() { - _wrap // allow help to spill outside the wrap - .style('overflow', 'visible'); + updatePosition(); _body .classed('hide', false) + .style('opacity', '0') .transition() .duration(200) - .style('height', '600px'); + .style('opacity', '1'); } function hide() { _body + .classed('hide', true) .transition() .duration(200) - .style('height', '0px') + .style('opacity', '0') .on('end', function () { - _wrap.style('overflow', null); _body.classed('hide', true); }); } @@ -128,6 +129,8 @@ export function uiFieldHelp(context, fieldName) { fieldHelp.button = function(selection) { + if (_body.empty()) return; + var button = selection.selectAll('.field-help-button') .data([0]); @@ -150,18 +153,34 @@ export function uiFieldHelp(context, fieldName) { }; + function updatePosition() { + var wrap = _wrap.node(); + var inspector = _inspector.node(); + var wRect = wrap.getBoundingClientRect(); + var iRect = inspector.getBoundingClientRect(); + + _body + .style('left', wRect.left + 'px') + .style('width', wRect.width - 10 + 'px') + .style('top', wRect.top + inspector.scrollTop - iRect.top + 5 + 'px'); + } + + fieldHelp.body = function(selection) { // this control expects the field to have a preset-input-wrap div _wrap = selection.selectAll('.preset-input-wrap'); if (_wrap.empty()) return; - _body = _wrap.selectAll('.field-help-body') + _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body'); + if (_inspector.empty()) return; + + _body = _inspector.selectAll('.field-help-body') .data([0]); var enter = _body.enter() .append('div') - .attr('class', 'field-help-body cf hide') // initially hidden - .style('height', '0px'); + .attr('class', 'field-help-body hide'); // initially hidden + // .style('height', '0px'); var titleEnter = enter .append('div') diff --git a/modules/ui/inspector.js b/modules/ui/inspector.js index b2a398db2..89d1f28ed 100644 --- a/modules/ui/inspector.js +++ b/modules/ui/inspector.js @@ -1,4 +1,5 @@ import { interpolate as d3_interpolate } from 'd3-interpolate'; +import { selectAll as d3_selectAll } from 'd3-selection'; import { uiEntityEditor } from './entity_editor'; import { uiPresetList } from './preset_list'; @@ -6,22 +7,22 @@ import { uiViewOnOSM } from './view_on_osm'; export function uiInspector(context) { - var presetList = uiPresetList(context), - entityEditor = uiEntityEditor(context), - state = 'select', - entityID, - newFeature = false; + var presetList = uiPresetList(context); + var entityEditor = uiEntityEditor(context); + var _state = 'select'; + var _entityID; + var _newFeature = false; function inspector(selection) { presetList - .entityID(entityID) - .autofocus(newFeature) + .entityID(_entityID) + .autofocus(_newFeature) .on('choose', setPreset); entityEditor - .state(state) - .entityID(entityID) + .state(_state) + .entityID(_entityID) .on('choose', showList); var wrap = selection.selectAll('.panewrap') @@ -44,8 +45,8 @@ export function uiInspector(context) { var editorPane = wrap.selectAll('.entity-editor-pane'); var graph = context.graph(), - entity = context.entity(entityID), - showEditor = state === 'hover' || + entity = context.entity(_entityID), + showEditor = _state === 'hover' || entity.isUsed(graph) || entity.isHighwayIntersection(graph); @@ -66,7 +67,7 @@ export function uiInspector(context) { .merge(footer); footer - .call(uiViewOnOSM(context).entityID(entityID)); + .call(uiViewOnOSM(context).entityID(_entityID)); function showList(preset) { @@ -89,23 +90,27 @@ export function uiInspector(context) { inspector.state = function(_) { - if (!arguments.length) return state; - state = _; - entityEditor.state(state); + if (!arguments.length) return _state; + _state = _; + entityEditor.state(_state); + + // remove any old field help overlay that might have gotten attached to the inspector + d3_selectAll('.field-help-body').remove(); + return inspector; }; inspector.entityID = function(_) { - if (!arguments.length) return entityID; - entityID = _; + if (!arguments.length) return _entityID; + _entityID = _; return inspector; }; inspector.newFeature = function(_) { - if (!arguments.length) return newFeature; - newFeature = _; + if (!arguments.length) return _newFeature; + _newFeature = _; return inspector; }; From d87a43d33a1bd8c94ae38e6585fb8cf5edc5068f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 27 Feb 2018 09:11:39 -0500 Subject: [PATCH 49/55] Increase box shadow slightly so help popup stands out more --- css/80_app.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/80_app.css b/css/80_app.css index 4cabf6b14..310adf82d 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2015,7 +2015,7 @@ div.combobox { z-index: 20; max-height: 550px; background: rgba(255,255,255,0.95); - box-shadow: 0 0 10px 0 rgba(0,0,0,.3); + box-shadow: 0 0 30px 5px rgba(0,0,0,.4); } .field-help-title h2 { From e9750140ecc2e4333ec7c0ae036dd4e61f2b395a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 27 Feb 2018 15:34:22 -0500 Subject: [PATCH 50/55] Finish help, improve text and styling --- css/80_app.css | 64 ++++++++++------- data/core.yaml | 40 ++++++----- dist/locales/en.json | 41 ++++++----- modules/ui/field_help.js | 151 ++++++++++++++++++++------------------- 4 files changed, 168 insertions(+), 128 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 310adf82d..593da509e 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2006,14 +2006,15 @@ div.combobox { .field-help-body { display: block; position: absolute; + top: 0; + left: 20px; + right: 20px; + margin: 5px; + padding: 8px; border: 1px solid #ccc; border-top: 0; border-radius: 0 0 4px 4px; - margin-left: 5px; - margin-right: 5px; - top: 0; z-index: 20; - max-height: 550px; background: rgba(255,255,255,0.95); box-shadow: 0 0 30px 5px rgba(0,0,0,.4); } @@ -2021,13 +2022,31 @@ div.combobox { .field-help-title h2 { padding: 10px; margin-bottom: 0px; - font-size: 16px; + font-size: 17px; +} +.field-help-title button { + width: 45px; + height: 55px; + border-radius: 0; } -.field-help-title button { - width: 32px; - height: 40px; - border-radius: 0; +.field-help-nav { + font-size: 13px; + font-weight: bold; + margin-bottom: 10px; +} +.field-help-nav-item { + display: inline-block; + padding: 5px 10px; + cursor: pointer; + color: #666; +} +.field-help-nav-item.active { + color: #7092ff; +} +.field-help-nav-item:hover { + color: #597be7; + background-color: #efefef; } .field-help-content { @@ -2035,21 +2054,23 @@ div.combobox { overflow-y: auto; overflow-x: hidden; } - .field-help-content h3 { font-size: 12px; margin-bottom: 5px; } - .field-help-content p { - margin-bottom: 5px; + margin-bottom: 15px; } - .field-help-content ul li { list-style: inside; margin-bottom: 5px; } +.field-help-content .field-help-image { + width: 100%; + margin-bottom: 15px; +} + .field-help-content svg.turn { width: 40px; height: 20px; @@ -2072,17 +2093,12 @@ div.combobox { color: #68f; } -.field-help-nav { - position: relative; -} -.field-help-nav a { - float: left; - width: 50%; - text-align: center; -} -.field-help-nav-item { - display: inline-block; - list-style: none; +.field-help-content p.from_shadow, +.field-help-content p.allow_shadow, +.field-help-content p.restrict_shadow, +.field-help-content p.allow_turn, +.field-help-content p.restrict_turn { + margin-bottom: 5px; } diff --git a/data/core.yaml b/data/core.yaml index ed2dafbc1..3cd073fd5 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -744,28 +744,36 @@ en: upload: "You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use." field: restrictions: - title: Editing Turn Restrictions + title: Turn Restrictions Help + about: + title: About + about: "This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads." + from_via_to: "A turn restriction always contains: one **FROM way**, one **TO way**, and one **VIA node** or one or more **VIA ways**." + maxdist: "The \"{distField}\" slider controls how far to search for additional connected roads." + maxvia: "The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)" inspecting: title: Inspecting - about: "Hover over any starting segment. All possible **TO** destinations will be drawn with a shadow." - from: "{fromShadow} **FROM**" - allow: "{allowShadow} **Allowed**" - restrict: "{restrictShadow} **Restricted**" - only: "{onlyShadow} **Only**" + about: "Hover over any **FROM** segment. Possible **TO** destinations will be drawn with a shadow." + from_shadow: "{fromShadow} **FROM segment**" + allow_shadow: "{allowShadow} **TO Allowed**" + restrict_shadow: "{restrictShadow} **TO Restricted**" + only_shadow: "{onlyShadow} **TO Only**" + restricted: "\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\"." + only: "\"Only\" means that a vehicle may only make that choice, for example \"Only Straight On\"." modifying: title: Modifying - about: "Click on any starting segment to select it. All possible **TO** destinations will appear as turn indicators." - indicators: "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." - allow: "{allowTurn} **Allowed**" - restrict: "{restrictTurn} **Restricted**" - only: "{onlyTurn} **Only**" + about: "Click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols." + indicators: "Click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." + allow_turn: "{allowTurn} **TO Allowed**" + restrict_turn: "{restrictTurn} **TO Restricted**" + only_turn: "{onlyTurn} **TO Only**" tips: title: Tips - tip1: "* Prefer simple restrictions over complex ones." - tip2: For example, avoid using a via-way restriction if a simpler turn restriction will do. - tip3: "* Some restrictions are \"(indirect)\". These restrictions exist because of another nearby restriction." - tip4: "For example, a route with an \"Only Straight On\" turn restriction will indirectly create \"No Turn\" restrictions." - tip5: "* You may not edit an indirect restriction. Instead, edit the nearby direct restriction." + simple: "**Prefer simple restrictions over complex ones.**" + simple_example: "For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do." + indirect: "**Some restrictions display the text \"(indirect)\" and are drawn lighter.**" + indirect_example: "These restrictions exist because of another nearby restriction. For example, a route with an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection." + indirect_noedit: "You may not edit indirect restrictions. Instead, edit the nearby direct restriction." intro: done: done ok: OK diff --git a/dist/locales/en.json b/dist/locales/en.json index 2a24b2caa..434e0704f 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -885,30 +885,39 @@ }, "field": { "restrictions": { - "title": "Editing Turn Restrictions", + "title": "Turn Restrictions Help", + "about": { + "title": "About", + "about": "This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.", + "from_via_to": "A turn restriction always contains: one **FROM way**, one **TO way**, and one **VIA node** or one or more **VIA ways**.", + "maxdist": "The \"{distField}\" slider controls how far to search for additional connected roads.", + "maxvia": "The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)" + }, "inspecting": { "title": "Inspecting", - "about": "Hover over any starting segment. All possible **TO** destinations will be drawn with a shadow.", - "from": "{fromShadow} **FROM**", - "allow": "{allowShadow} **Allowed**", - "restrict": "{restrictShadow} **Restricted**", - "only": "{onlyShadow} **Only**" + "about": "Hover over any **FROM** segment. Possible **TO** destinations will be drawn with a shadow.", + "from_shadow": "{fromShadow} **FROM segment**", + "allow_shadow": "{allowShadow} **TO Allowed**", + "restrict_shadow": "{restrictShadow} **TO Restricted**", + "only_shadow": "{onlyShadow} **TO Only**", + "restricted": "\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".", + "only": "\"Only\" means that a vehicle may only make that choice, for example \"Only Straight On\"." }, "modifying": { "title": "Modifying", - "about": "Click on any starting segment to select it. All possible **TO** destinations will appear as turn indicators.", - "indicators": "Click on a turn indicator to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", - "allow": "{allowTurn} **Allowed**", - "restrict": "{restrictTurn} **Restricted**", - "only": "{onlyTurn} **Only**" + "about": "Click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.", + "indicators": "Click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", + "allow_turn": "{allowTurn} **TO Allowed**", + "restrict_turn": "{restrictTurn} **TO Restricted**", + "only_turn": "{onlyTurn} **TO Only**" }, "tips": { "title": "Tips", - "tip1": "* Prefer simple restrictions over complex ones.", - "tip2": "For example, avoid using a via-way restriction if a simpler turn restriction will do.", - "tip3": "* Some restrictions are \"(indirect)\". These restrictions exist because of another nearby restriction.", - "tip4": "For example, a route with an \"Only Straight On\" turn restriction will indirectly create \"No Turn\" restrictions.", - "tip5": "* You may not edit an indirect restriction. Instead, edit the nearby direct restriction." + "simple": "**Prefer simple restrictions over complex ones.**", + "simple_example": "For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.", + "indirect": "**Some restrictions display the text \"(indirect)\" and are drawn lighter.**", + "indirect_example": "These restrictions exist because of another nearby restriction. For example, a route with an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.", + "indirect_noedit": "You may not edit indirect restrictions. Instead, edit the nearby direct restriction." } } } diff --git a/modules/ui/field_help.js b/modules/ui/field_help.js index df334a5fe..803e40c67 100644 --- a/modules/ui/field_help.js +++ b/modules/ui/field_help.js @@ -10,51 +10,7 @@ import { icon } from 'intro/helper'; // This currently only works with the 'restrictions' field -var fieldHelpKeys = { - restrictions: [ - ['inspecting',[ - 'title', - 'about', - 'from', - 'allow', - 'restrict', - 'only' - ]], - ['modifying',[ - 'title', - 'about', - 'indicators', - 'allow', - 'restrict', - 'only' - ]], - ['tips',[ - 'title', - 'tip1', - 'tip2', - 'tip3', - 'tip4', - 'tip5' - ]] - ] -}; - -var fieldHelpHeadings = { - 'help.field.restrictions.inspecting.title': 3, - 'help.field.restrictions.modifying.title': 3, - 'help.field.restrictions.tips.title': 3 -}; - -var replacements = { - fromShadow: icon('#turn-shadow', 'pre-text shadow from'), - allowShadow: icon('#turn-shadow', 'pre-text shadow allow'), - restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'), - onlyShadow: icon('#turn-shadow', 'pre-text shadow only'), - allowTurn: icon('#turn-yes', 'pre-text turn'), - restrictTurn: icon('#turn-no', 'pre-text turn'), - onlyTurn: icon('#turn-only', 'pre-text turn') -}; - +// It borrows some code from uiHelp export function uiFieldHelp(context, fieldName) { var fieldHelp = {}; @@ -62,6 +18,55 @@ export function uiFieldHelp(context, fieldName) { var _wrap = d3_select(null); var _body = d3_select(null); + var fieldHelpKeys = { + restrictions: [ + ['about',[ + 'about', + 'from_via_to', + 'maxdist', + 'maxvia' + ]], + ['inspecting',[ + 'about', + 'from_shadow', + 'allow_shadow', + 'restrict_shadow', + 'only_shadow', + 'restricted', + 'only' + ]], + ['modifying',[ + 'about', + 'indicators', + 'allow_turn', + 'restrict_turn', + 'only_turn' + ]], + ['tips',[ + 'simple', + 'simple_example', + 'indirect', + 'indirect_example', + 'indirect_noedit' + ]] + ] + }; + + var fieldHelpHeadings = {}; + + var replacements = { + distField: t('restriction.controls.distance'), + viaField: t('restriction.controls.via'), + fromShadow: icon('#turn-shadow', 'pre-text shadow from'), + allowShadow: icon('#turn-shadow', 'pre-text shadow allow'), + restrictShadow: icon('#turn-shadow', 'pre-text shadow restrict'), + onlyShadow: icon('#turn-shadow', 'pre-text shadow only'), + allowTurn: icon('#turn-yes', 'pre-text turn'), + restrictTurn: icon('#turn-no', 'pre-text turn'), + onlyTurn: icon('#turn-only', 'pre-text turn') + }; + + // For each section, squash all the texts into a single markdown document var docs = fieldHelpKeys[fieldName].map(function(key) { var helpkey = 'help.field.' + fieldName + '.' + key[0]; @@ -104,26 +109,32 @@ export function uiFieldHelp(context, fieldName) { } - function clickHelp(d, i) { + function clickHelp(index) { + var d = docs[index]; + var tkeys = fieldHelpKeys[fieldName][index][1]; + + _body.selectAll('.field-help-nav-item') + .classed('active', function(d, i) { return i === index; }); + var content = _body.selectAll('.field-help-content') .html(d.html); - // add an image for some help sections - var img; - switch (d.key) { - case 'help.field.restrictions.inspecting': - img = 'tr_inspect.gif'; - break; - case 'help.field.restrictions.modifying': - img = 'tr_modify.gif'; - break; - } + // class the paragraphs so we can find and style them + content.selectAll('p') + .attr('class', function(d, i) { return tkeys[i]; }); - if (img) { + // insert special content for certain help sections + if (d.key === 'help.field.restrictions.inspecting') { content - .append('img') - .attr('class', 'field-help-image') - .attr('src', context.imagePath(img)); + .insert('img', 'p.from_shadow') + .attr('class', 'field-help-image cf') + .attr('src', context.imagePath('tr_inspect.gif')); + + } else if (d.key === 'help.field.restrictions.modifying') { + content + .insert('img', 'p.allow_turn') + .attr('class', 'field-help-image cf') + .attr('src', context.imagePath('tr_modify.gif')); } } @@ -160,17 +171,16 @@ export function uiFieldHelp(context, fieldName) { var iRect = inspector.getBoundingClientRect(); _body - .style('left', wRect.left + 'px') - .style('width', wRect.width - 10 + 'px') - .style('top', wRect.top + inspector.scrollTop - iRect.top + 5 + 'px'); + .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px'); } fieldHelp.body = function(selection) { - // this control expects the field to have a preset-input-wrap div + // This control expects the field to have a preset-input-wrap div _wrap = selection.selectAll('.preset-input-wrap'); if (_wrap.empty()) return; + // absolute position relative to the inspector, so it "floats" above the fields _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body'); if (_inspector.empty()) return; @@ -180,7 +190,6 @@ export function uiFieldHelp(context, fieldName) { var enter = _body.enter() .append('div') .attr('class', 'field-help-body hide'); // initially hidden - // .style('height', '0px'); var titleEnter = enter .append('div') @@ -202,22 +211,20 @@ export function uiFieldHelp(context, fieldName) { .call(svgIcon('#icon-close')); var navEnter = enter - .append('ul') - .attr('class', 'field-help-nav'); + .append('div') + .attr('class', 'field-help-nav cf'); var titles = docs.map(function(d) { return d.title; }); navEnter.selectAll('.field-help-nav-item') .data(titles) .enter() - .append('li') + .append('div') .attr('class', 'field-help-nav-item') - .append('a') - .attr('class', 'next') .text(function(d) { return d; }) .on('click', function(d, i) { d3_event.stopPropagation(); d3_event.preventDefault(); - clickHelp(docs[i], i); + clickHelp(i); }); enter @@ -227,7 +234,7 @@ export function uiFieldHelp(context, fieldName) { _body = _body .merge(enter); - clickHelp(docs[0], 0); + clickHelp(0); }; From fb4098754caa3a4a71eec5983fa33e0d68eccc24 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 27 Feb 2018 21:14:09 -0500 Subject: [PATCH 51/55] Adjust wording of some of the restriction help sections --- data/core.yaml | 12 ++++++------ dist/locales/en.json | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 3cd073fd5..be8cb7a76 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -748,22 +748,22 @@ en: about: title: About about: "This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads." - from_via_to: "A turn restriction always contains: one **FROM way**, one **TO way**, and one **VIA node** or one or more **VIA ways**." + from_via_to: "A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**." maxdist: "The \"{distField}\" slider controls how far to search for additional connected roads." maxvia: "The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)" inspecting: title: Inspecting - about: "Hover over any **FROM** segment. Possible **TO** destinations will be drawn with a shadow." + about: "Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists." from_shadow: "{fromShadow} **FROM segment**" allow_shadow: "{allowShadow} **TO Allowed**" restrict_shadow: "{restrictShadow} **TO Restricted**" only_shadow: "{onlyShadow} **TO Only**" restricted: "\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\"." - only: "\"Only\" means that a vehicle may only make that choice, for example \"Only Straight On\"." + only: "\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"." modifying: title: Modifying - about: "Click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols." - indicators: "Click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." + about: "To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols." + indicators: "Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\"." allow_turn: "{allowTurn} **TO Allowed**" restrict_turn: "{restrictTurn} **TO Restricted**" only_turn: "{onlyTurn} **TO Only**" @@ -772,7 +772,7 @@ en: simple: "**Prefer simple restrictions over complex ones.**" simple_example: "For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do." indirect: "**Some restrictions display the text \"(indirect)\" and are drawn lighter.**" - indirect_example: "These restrictions exist because of another nearby restriction. For example, a route with an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection." + indirect_example: "These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection." indirect_noedit: "You may not edit indirect restrictions. Instead, edit the nearby direct restriction." intro: done: done diff --git a/dist/locales/en.json b/dist/locales/en.json index 434e0704f..14d209991 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -889,24 +889,24 @@ "about": { "title": "About", "about": "This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.", - "from_via_to": "A turn restriction always contains: one **FROM way**, one **TO way**, and one **VIA node** or one or more **VIA ways**.", + "from_via_to": "A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.", "maxdist": "The \"{distField}\" slider controls how far to search for additional connected roads.", "maxvia": "The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)" }, "inspecting": { "title": "Inspecting", - "about": "Hover over any **FROM** segment. Possible **TO** destinations will be drawn with a shadow.", + "about": "Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.", "from_shadow": "{fromShadow} **FROM segment**", "allow_shadow": "{allowShadow} **TO Allowed**", "restrict_shadow": "{restrictShadow} **TO Restricted**", "only_shadow": "{onlyShadow} **TO Only**", "restricted": "\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".", - "only": "\"Only\" means that a vehicle may only make that choice, for example \"Only Straight On\"." + "only": "\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"." }, "modifying": { "title": "Modifying", - "about": "Click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.", - "indicators": "Click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", + "about": "To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.", + "indicators": "Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".", "allow_turn": "{allowTurn} **TO Allowed**", "restrict_turn": "{restrictTurn} **TO Restricted**", "only_turn": "{onlyTurn} **TO Only**" @@ -916,7 +916,7 @@ "simple": "**Prefer simple restrictions over complex ones.**", "simple_example": "For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.", "indirect": "**Some restrictions display the text \"(indirect)\" and are drawn lighter.**", - "indirect_example": "These restrictions exist because of another nearby restriction. For example, a route with an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.", + "indirect_example": "These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.", "indirect_noedit": "You may not edit indirect restrictions. Instead, edit the nearby direct restriction." } } From f9d000a8a5a6f5d3ae9a3bd882ecbfb7dc3e5133 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 27 Feb 2018 22:53:46 -0500 Subject: [PATCH 52/55] When switching to ONLY restriction remove all other restrictions But we keep them around in `_oldTurns` and will put them back if the user clicks again to unrestrict the ONLY. --- modules/ui/fields/restrictions.js | 53 ++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 27541876e..a60bd547a 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -60,6 +60,7 @@ export function uiFieldRestrictions(field, context) { var _initialized = false; var _parent = d3_select(null); // the entire field var _container = d3_select(null); // just the map + var _oldTurns; var _graph; var _vertexID; var _intersection; @@ -288,6 +289,7 @@ export function uiFieldRestrictions(field, context) { // is selected, and that way is no longer part of the intersection. if (_fromWayID && !vgraph.hasEntity(_fromWayID)) { _fromWayID = null; + _oldTurns = null; } surface @@ -332,30 +334,57 @@ export function uiFieldRestrictions(field, context) { if (datum instanceof osmWay && (datum.__from || datum.__via)) { _fromWayID = datum.id; + _oldTurns = null; redraw(); } else if (datum instanceof osmTurn) { - var actions; + var actions, extraActions, turns, i; datum.restriction = osmInferRestriction(vgraph, datum, projection); if (datum.restrictionID && !datum.direct) { return; - } else if (datum.restrictionID && !datum.only) { // cycle thru the `only_` state + } else if (datum.restrictionID && !datum.only) { // cycle NO -> ONLY var datumOnly = _cloneDeep(datum); datumOnly.only = true; datumOnly.restriction = datumOnly.restriction.replace(/^no/, 'only'); - actions = _intersection.actions.concat([ - actionUnrestrictTurn(datum, projection), + + // Adding an ONLY restriction should destroy all other direct restrictions from the FROM. + // We will remember them in _oldTurns, and restore them if the user clicks again. + turns = _intersection.turns(_fromWayID, 2); + extraActions = []; + _oldTurns = []; + for (i = 0; i < turns.length; i++) { + if (turns[i].direct) { + _oldTurns.push(turns[i]); + extraActions.push(actionUnrestrictTurn(turns[i], projection)); + } + } + + actions = _intersection.actions.concat(extraActions, [ actionRestrictTurn(datumOnly, projection), t('operations.restriction.annotation.create') ]); - } else if (datum.restrictionID) { - actions = _intersection.actions.concat([ + + } else if (datum.restrictionID) { // cycle ONLY -> Allowed + // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state. + // This relies on the assumption that the intersection was already split up when we + // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed. + turns = _oldTurns || []; + extraActions = []; + for (i = 0; i < turns.length; i++) { + if (turns[i].key !== datum.key) { + extraActions.push(actionRestrictTurn(turns[i], projection)); + } + } + _oldTurns = null; + + actions = _intersection.actions.concat(extraActions, [ actionUnrestrictTurn(datum, projection), t('operations.restriction.annotation.delete') ]); - } else { + + } else { // cycle Allowed -> NO actions = _intersection.actions.concat([ actionRestrictTurn(datum, projection), t('operations.restriction.annotation.create') @@ -372,6 +401,7 @@ export function uiFieldRestrictions(field, context) { } else { _fromWayID = null; + _oldTurns = null; redraw(); } } @@ -590,11 +620,10 @@ export function uiFieldRestrictions(field, context) { restrictions.entity = function(_) { - // if (!_vertexID || _vertexID !== _.id) { - _intersection = null; - _fromWayID = null; - _vertexID = _.id; - // } + _intersection = null; + _fromWayID = null; + _oldTurns = null; + _vertexID = _.id; }; From e1cf49eaffd6e7d58f898c997a3c1ed5a312bcad Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 28 Feb 2018 13:42:26 -0500 Subject: [PATCH 53/55] Remove the "excludes coincident highways" check These should not be a thing, and if they are, I'm ok with them being treated as 2 separate ways. We can add code back in later if it turns out to be a widespread issue in OSM. --- test/spec/osm/intersection.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index 9f287e328..880b281a5 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -22,17 +22,6 @@ describe('iD.osmIntersection', function() { expect(result.map(function(i) { return i.id; })).to.eql(['=']); }); -//TODO? - // it('excludes coincident highways', function() { - // var graph = iD.coreGraph([ - // iD.osmNode({id: 'u'}), - // iD.osmNode({id: '*'}), - // iD.osmWay({id: '=', nodes: ['u', '*'], tags: {highway: 'residential'}}), - // iD.osmWay({id: '-', nodes: ['u', '*'], tags: {highway: 'residential'}}) - // ]); - // expect(iD.osmIntersection(graph, '*').ways).to.eql([]); - // }); - it('includes line highways', function() { var graph = iD.coreGraph([ iD.osmNode({id: 'u'}), From 241159b547f85060ec07dae4bf33f7d08771c091 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 28 Feb 2018 23:55:59 -0500 Subject: [PATCH 54/55] Cleanup docs and tests for actionRestrictTurn / actionUnrestrictTurn - actionRestrictTurn will no longer "infer" the turn type - restrictionType *must* be passed in - this is ok because the only code we use this action (restrictions.js) already has inferred the type - this simplifies what the action actually does - moved the tests from restrict_turn.js that were really just testing the restriction type inferrence over to intersection.js (and added a few more tests for iD.osmInferRestriction) --- modules/actions/restrict_turn.js | 30 +-- modules/actions/unrestrict_turn.js | 19 +- modules/ui/fields/restrictions.js | 21 +- test/spec/actions/restrict_turn.js | 332 +++++---------------------- test/spec/actions/unrestrict_turn.js | 4 +- test/spec/osm/intersection.js | 150 ++++++++++++ 6 files changed, 239 insertions(+), 317 deletions(-) diff --git a/modules/actions/restrict_turn.js b/modules/actions/restrict_turn.js index 50490012d..c21ace82c 100644 --- a/modules/actions/restrict_turn.js +++ b/modules/actions/restrict_turn.js @@ -1,33 +1,23 @@ -import { - osmInferRestriction, - osmRelation -} from '../osm'; +import { osmRelation } from '../osm'; -// Create a restriction relation for `turn`, which must have the following structure: +// `actionRestrictTurn` creates a turn restriction relation. // -// { -// from: { node: , way: }, -// via: { node: , ways: [,,...] }, -// to: { node: , way: }, -// restriction: <'no_right_turn', 'no_left_turn', etc.> -// } +// `turn` must be an `osmTurn` object +// see osm/intersection.js, pathToTurn() // // This specifies a restriction of type `restriction` when traveling from -// `from.node` in `from.way` toward `to.node` in `to.way` via `via.node` OR `via.ways`. +// `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`. // (The action does not check that these entities form a valid intersection.) // -// If `restriction` is not provided, it is automatically determined by -// osmInferRestriction. -// // From, to, and via ways should be split before calling this action. // (old versions of the code would split the ways here, but we no longer do it) // -// For testing convenience, accepts an ID to assign to the new relation. -// Normally, this will be undefined and the relation will automatically -// be assigned a new ID. +// For testing convenience, accepts a restrictionID to assign to the new +// relation. Normally, this will be undefined and the relation will +// automatically be assigned a new ID. // -export function actionRestrictTurn(turn, projection, restrictionID) { +export function actionRestrictTurn(turn, restrictionType, restrictionID) { return function(graph) { var fromWay = graph.entity(turn.from.way); @@ -52,7 +42,7 @@ export function actionRestrictTurn(turn, projection, restrictionID) { id: restrictionID, tags: { type: 'restriction', - restriction: turn.restriction || osmInferRestriction(graph, turn, projection) + restriction: restrictionType }, members: members })); diff --git a/modules/actions/unrestrict_turn.js b/modules/actions/unrestrict_turn.js index 4210b3a7b..8d980f459 100644 --- a/modules/actions/unrestrict_turn.js +++ b/modules/actions/unrestrict_turn.js @@ -1,23 +1,10 @@ import { actionDeleteRelation } from './delete_relation'; -// Remove the effects of `turn.restriction` on `turn`, which must have the -// following structure: +// `actionUnrestrictTurn` deletes a turn restriction relation. // -// { -// from: { node: , way: }, -// via: { node: }, -// to: { node: , way: }, -// restrictionID: -// } -// -// In the simple case, `restrictionID` is a reference to a `no_*` restriction -// on the turn itself. In this case, it is simply deleted. -// -// The more complex case is where `restrictionID` references an `only_*` -// restriction on a different turn in the same intersection. In that case, -// that restriction is also deleted, but at the same time restrictions on -// the turns other than the first two are created. +// `turn` must be an `osmTurn` object with a `restrictionID` property. +// see osm/intersection.js, pathToTurn() // export function actionUnrestrictTurn(turn) { return function(graph) { diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index a60bd547a..97b10a03c 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -339,15 +339,15 @@ export function uiFieldRestrictions(field, context) { } else if (datum instanceof osmTurn) { var actions, extraActions, turns, i; - datum.restriction = osmInferRestriction(vgraph, datum, projection); + var restrictionType = osmInferRestriction(vgraph, datum, projection); if (datum.restrictionID && !datum.direct) { return; - } else if (datum.restrictionID && !datum.only) { // cycle NO -> ONLY + } else if (datum.restrictionID && !datum.only) { // NO -> ONLY var datumOnly = _cloneDeep(datum); datumOnly.only = true; - datumOnly.restriction = datumOnly.restriction.replace(/^no/, 'only'); + restrictionType = restrictionType.replace(/^no/, 'only'); // Adding an ONLY restriction should destroy all other direct restrictions from the FROM. // We will remember them in _oldTurns, and restore them if the user clicks again. @@ -356,17 +356,18 @@ export function uiFieldRestrictions(field, context) { _oldTurns = []; for (i = 0; i < turns.length; i++) { if (turns[i].direct) { + turns[i].restrictionType = osmInferRestriction(vgraph, turns[i], projection); _oldTurns.push(turns[i]); - extraActions.push(actionUnrestrictTurn(turns[i], projection)); + extraActions.push(actionUnrestrictTurn(turns[i])); } } actions = _intersection.actions.concat(extraActions, [ - actionRestrictTurn(datumOnly, projection), + actionRestrictTurn(datumOnly, restrictionType), t('operations.restriction.annotation.create') ]); - } else if (datum.restrictionID) { // cycle ONLY -> Allowed + } else if (datum.restrictionID) { // ONLY -> Allowed // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state. // This relies on the assumption that the intersection was already split up when we // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed. @@ -374,19 +375,19 @@ export function uiFieldRestrictions(field, context) { extraActions = []; for (i = 0; i < turns.length; i++) { if (turns[i].key !== datum.key) { - extraActions.push(actionRestrictTurn(turns[i], projection)); + extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType)); } } _oldTurns = null; actions = _intersection.actions.concat(extraActions, [ - actionUnrestrictTurn(datum, projection), + actionUnrestrictTurn(datum), t('operations.restriction.annotation.delete') ]); - } else { // cycle Allowed -> NO + } else { // Allowed -> NO actions = _intersection.actions.concat([ - actionRestrictTurn(datum, projection), + actionRestrictTurn(datum, restrictionType), t('operations.restriction.annotation.create') ]); } diff --git a/test/spec/actions/restrict_turn.js b/test/spec/actions/restrict_turn.js index 96de8be59..46f273be7 100644 --- a/test/spec/actions/restrict_turn.js +++ b/test/spec/actions/restrict_turn.js @@ -1,288 +1,80 @@ describe('iD.actionRestrictTurn', function() { - var projection = d3.geoMercator().scale(250 / Math.PI); + it('adds a via node restriction to an unrestricted turn', function() { + // + // u === * --- w + // + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: '*'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', '*']}), + iD.osmWay({id: '-', nodes: ['*', 'w']}) + ]); - describe('via node', function() { + var turn = { + from: { node: 'u', way: '=' }, + via: { node: '*'}, + to: { node: 'w', way: '-' } + }; - it('adds a via node restriction to an unrestricted turn', function() { - // u====*--->w - var graph = iD.coreGraph([ - iD.osmNode({id: 'u'}), - iD.osmNode({id: '*'}), - iD.osmNode({id: 'w'}), - iD.osmWay({id: '=', nodes: ['u', '*']}), - iD.osmWay({id: '-', nodes: ['*', 'w']}) - ]); - var action = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '-'}, - restriction: 'no_right_turn' - }, projection, 'r'); + var action = iD.actionRestrictTurn(turn, 'no_straight_on', 'r'); + graph = action(graph); - graph = action(graph); + var r = graph.entity('r'); + expect(r.tags).to.eql({type: 'restriction', restriction: 'no_straight_on'}); - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_right_turn'}); + var f = r.memberByRole('from'); + expect(f.id).to.eql('='); + expect(f.type).to.eql('way'); - var f = r.memberByRole('from'); - expect(f.id).to.eql('='); - expect(f.type).to.eql('way'); + var v = r.memberByRole('via'); + expect(v.id).to.eql('*'); + expect(v.type).to.eql('node'); - var v = r.memberByRole('via'); - expect(v.id).to.eql('*'); - expect(v.type).to.eql('node'); - - var t = r.memberByRole('to'); - expect(t.id).to.eql('-'); - expect(t.type).to.eql('way'); - }); - -//TODO? - it.skip('infers the restriction type based on the turn angle', function() { - // u====*~~~~w - // | - // x - var graph = iD.coreGraph([ - iD.osmNode({id: 'u', loc: [-1, 0]}), - iD.osmNode({id: '*', loc: [ 0, 0]}), - iD.osmNode({id: 'w', loc: [ 1, 0]}), - iD.osmNode({id: 'x', loc: [ 0, -1]}), - iD.osmWay({id: '=', nodes: ['u', '*']}), - iD.osmWay({id: '-', nodes: ['*', 'x']}), - iD.osmWay({id: '~', nodes: ['*', 'w']}) - ]); - - var r1 = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }, projection, 'r')(graph); - expect(r1.entity('r').tags.restriction).to.equal('no_right_turn'); - - var r2 = iD.actionRestrictTurn({ - from: {node: 'x', way: '-'}, - via: {node: '*'}, - to: {node: 'w', way: '~'} - }, projection, 'r')(graph); - expect(r2.entity('r').tags.restriction).to.equal('no_right_turn'); - - var l1 = iD.actionRestrictTurn({ - from: {node: 'x', way: '-'}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }, projection, 'r')(graph); - expect(l1.entity('r').tags.restriction).to.equal('no_left_turn'); - - var l2 = iD.actionRestrictTurn({ - from: {node: 'w', way: '~'}, - via: {node: '*'}, - to: {node: 'x', way: '-'} - }, projection, 'r')(graph); - expect(l2.entity('r').tags.restriction).to.equal('no_left_turn'); - - var s = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'w', way: '~'} - }, projection, 'r')(graph); - expect(s.entity('r').tags.restriction).to.equal('no_straight_on'); - - var u = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {node: '*'}, - to: {node: 'u', way: '='} - }, projection, 'r')(graph); - expect(u.entity('r').tags.restriction).to.equal('no_u_turn'); - }); - -//TODO? - it.skip('infers no_u_turn from acute angle made by forward oneways', function() { - // * - // / \ - // w2/ \w1 - // / \ - // u x - var graph = iD.coreGraph([ - iD.osmNode({id: 'u', loc: [-1, -20]}), - iD.osmNode({id: '*', loc: [ 0, 0]}), - iD.osmNode({id: 'x', loc: [ 1, -20]}), - iD.osmWay({id: 'w1', nodes: ['x', '*'], tags: {oneway: 'yes'}}), - iD.osmWay({id: 'w2', nodes: ['*', 'u'], tags: {oneway: 'yes'}}) - ]); - - var r = iD.actionRestrictTurn({ - from: {node: 'x', way: 'w1'}, - via: {node: '*'}, - to: {node: 'u', way: 'w2'} - }, projection, 'r')(graph); - expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - }); - -//TODO? - it.skip('infers no_u_turn from acute angle made by reverse oneways', function() { - // * - // / \ - // w2/ \w1 - // / \ - // u x - var graph = iD.coreGraph([ - iD.osmNode({id: 'u', loc: [-1, -20]}), - iD.osmNode({id: '*', loc: [ 0, 0]}), - iD.osmNode({id: 'x', loc: [ 1, -20]}), - iD.osmWay({id: 'w1', nodes: ['*', 'x'], tags: {oneway: '-1'}}), - iD.osmWay({id: 'w2', nodes: ['u', '*'], tags: {oneway: '-1'}}) - ]); - - var r = iD.actionRestrictTurn({ - from: {node: 'x', way: 'w1'}, - via: {node: '*'}, - to: {node: 'u', way: 'w2'} - }, projection, 'r')(graph); - expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - }); + var t = r.memberByRole('to'); + expect(t.id).to.eql('-'); + expect(t.type).to.eql('way'); }); - describe('via way', function() { + it('adds a via way restriction to an unrestricted turn', function() { + // + // u === v1 + // | + // w --- v2 + // + var graph = iD.coreGraph([ + iD.osmNode({id: 'u'}), + iD.osmNode({id: 'v1'}), + iD.osmNode({id: 'v2'}), + iD.osmNode({id: 'w'}), + iD.osmWay({id: '=', nodes: ['u', 'v1']}), + iD.osmWay({id: '|', nodes: ['v1', 'v2']}), + iD.osmWay({id: '-', nodes: ['v2', 'w']}) + ]); - it('adds a via way restriction to an unrestricted turn', function() { - // u ==== VIA ---> w - var graph = iD.coreGraph([ - iD.osmNode({id: 'u'}), - iD.osmNode({id: 'V1'}), - iD.osmNode({id: 'V2'}), - iD.osmNode({id: 'w'}), - iD.osmWay({id: '=', nodes: ['u', 'V1']}), - iD.osmWay({id: 'VIA', nodes: ['V1', 'V2']}), - iD.osmWay({id: '-', nodes: ['V2', 'w']}) - ]); - var action = iD.actionRestrictTurn({ - from: {node: 'u', way: '='}, - via: {ways: ['VIA']}, - to: {node: 'w', way: '-'}, - restriction: 'no_u_turn' - }, projection, 'r'); + var turn = { + from: { node: 'u', way: '=' }, + via: { ways: ['|'] }, + to: { node: 'w', way: '-' } + }; - graph = action(graph); + var action = iD.actionRestrictTurn(turn, 'no_u_turn', 'r'); + graph = action(graph); - var r = graph.entity('r'); - expect(r.tags).to.eql({type: 'restriction', restriction: 'no_u_turn'}); + var r = graph.entity('r'); + expect(r.tags).to.eql({type: 'restriction', restriction: 'no_u_turn'}); - var f = r.memberByRole('from'); - expect(f.id).to.eql('='); - expect(f.type).to.eql('way'); + var f = r.memberByRole('from'); + expect(f.id).to.eql('='); + expect(f.type).to.eql('way'); - var v = r.memberByRole('via'); - expect(v.id).to.eql('VIA'); - expect(v.type).to.eql('way'); + var v = r.memberByRole('via'); + expect(v.id).to.eql('|'); + expect(v.type).to.eql('way'); - var t = r.memberByRole('to'); - expect(t.id).to.eql('-'); - expect(t.type).to.eql('way'); - }); - - -// TODO? - - // it('infers the restriction type based on the turn angle', function() { - // // u====*~~~~w - // // | - // // x - // var graph = iD.coreGraph([ - // iD.osmNode({id: 'u', loc: [-1, 0]}), - // iD.osmNode({id: '*', loc: [ 0, 0]}), - // iD.osmNode({id: 'w', loc: [ 1, 0]}), - // iD.osmNode({id: 'x', loc: [ 0, -1]}), - // iD.osmWay({id: '=', nodes: ['u', '*']}), - // iD.osmWay({id: '-', nodes: ['*', 'x']}), - // iD.osmWay({id: '~', nodes: ['*', 'w']}) - // ]); - - // var r1 = iD.actionRestrictTurn({ - // from: {node: 'u', way: '='}, - // via: {node: '*'}, - // to: {node: 'x', way: '-'} - // }, projection, 'r')(graph); - // expect(r1.entity('r').tags.restriction).to.equal('no_right_turn'); - - // var r2 = iD.actionRestrictTurn({ - // from: {node: 'x', way: '-'}, - // via: {node: '*'}, - // to: {node: 'w', way: '~'} - // }, projection, 'r')(graph); - // expect(r2.entity('r').tags.restriction).to.equal('no_right_turn'); - - // var l1 = iD.actionRestrictTurn({ - // from: {node: 'x', way: '-'}, - // via: {node: '*'}, - // to: {node: 'u', way: '='} - // }, projection, 'r')(graph); - // expect(l1.entity('r').tags.restriction).to.equal('no_left_turn'); - - // var l2 = iD.actionRestrictTurn({ - // from: {node: 'w', way: '~'}, - // via: {node: '*'}, - // to: {node: 'x', way: '-'} - // }, projection, 'r')(graph); - // expect(l2.entity('r').tags.restriction).to.equal('no_left_turn'); - - // var s = iD.actionRestrictTurn({ - // from: {node: 'u', way: '='}, - // via: {node: '*'}, - // to: {node: 'w', way: '~'} - // }, projection, 'r')(graph); - // expect(s.entity('r').tags.restriction).to.equal('no_straight_on'); - - // var u = iD.actionRestrictTurn({ - // from: {node: 'u', way: '='}, - // via: {node: '*'}, - // to: {node: 'u', way: '='} - // }, projection, 'r')(graph); - // expect(u.entity('r').tags.restriction).to.equal('no_u_turn'); - // }); - - // it('infers no_u_turn from acute angle made by forward oneways', function() { - // // * - // // / \ - // // w2/ \w1 - // // / \ - // // u x - // var graph = iD.coreGraph([ - // iD.osmNode({id: 'u', loc: [-1, -20]}), - // iD.osmNode({id: '*', loc: [ 0, 0]}), - // iD.osmNode({id: 'x', loc: [ 1, -20]}), - // iD.osmWay({id: 'w1', nodes: ['x', '*'], tags: {oneway: 'yes'}}), - // iD.osmWay({id: 'w2', nodes: ['*', 'u'], tags: {oneway: 'yes'}}) - // ]); - - // var r = iD.actionRestrictTurn({ - // from: {node: 'x', way: 'w1'}, - // via: {node: '*'}, - // to: {node: 'u', way: 'w2'} - // }, projection, 'r')(graph); - // expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - // }); - - // it('infers no_u_turn from acute angle made by reverse oneways', function() { - // // * - // // / \ - // // w2/ \w1 - // // / \ - // // u x - // var graph = iD.coreGraph([ - // iD.osmNode({id: 'u', loc: [-1, -20]}), - // iD.osmNode({id: '*', loc: [ 0, 0]}), - // iD.osmNode({id: 'x', loc: [ 1, -20]}), - // iD.osmWay({id: 'w1', nodes: ['*', 'x'], tags: {oneway: '-1'}}), - // iD.osmWay({id: 'w2', nodes: ['u', '*'], tags: {oneway: '-1'}}) - // ]); - - // var r = iD.actionRestrictTurn({ - // from: {node: 'x', way: 'w1'}, - // via: {node: '*'}, - // to: {node: 'u', way: 'w2'} - // }, projection, 'r')(graph); - // expect(r.entity('r').tags.restriction).to.equal('no_u_turn'); - // }); + var t = r.memberByRole('to'); + expect(t.id).to.eql('-'); + expect(t.type).to.eql('way'); }); }); diff --git a/test/spec/actions/unrestrict_turn.js b/test/spec/actions/unrestrict_turn.js index 9ab094c6e..3c617618d 100644 --- a/test/spec/actions/unrestrict_turn.js +++ b/test/spec/actions/unrestrict_turn.js @@ -1,6 +1,8 @@ describe('iD.actionUnrestrictTurn', function() { it('removes a restriction from a restricted turn', function() { - // u====*--->w + // + // u === * --- w + // var graph = iD.coreGraph([ iD.osmNode({ id: 'u' }), iD.osmNode({ id: '*' }), diff --git a/test/spec/osm/intersection.js b/test/spec/osm/intersection.js index 880b281a5..ba4785a49 100644 --- a/test/spec/osm/intersection.js +++ b/test/spec/osm/intersection.js @@ -557,3 +557,153 @@ describe('iD.osmIntersection', function() { }); }); + + +describe('iD.osmInferRestriction', function() { + var projection = d3.geoMercator().scale(250 / Math.PI); + + it('infers the restriction type based on the turn angle', function() { + // + // u === * ~~~ w + // | + // x + // + var graph = iD.coreGraph([ + iD.osmNode({id: 'u', loc: [-1, 0]}), + iD.osmNode({id: '*', loc: [ 0, 0]}), + iD.osmNode({id: 'w', loc: [ 1, 0]}), + iD.osmNode({id: 'x', loc: [ 0, -1]}), + iD.osmWay({id: '=', nodes: ['u', '*']}), + iD.osmWay({id: '-', nodes: ['*', 'x']}), + iD.osmWay({id: '~', nodes: ['*', 'w']}) + ]); + + var r1 = iD.osmInferRestriction(graph, { + from: { node: 'u', way: '=', vertex: '*' }, + to: { node: 'x', way: '-', vertex: '*' } + }, projection); + expect(r1).to.equal('no_right_turn'); + + var r2 = iD.osmInferRestriction(graph, { + from: { node: 'x', way: '-', vertex: '*' }, + to: { node: 'w', way: '~', vertex: '*' } + }, projection); + expect(r2).to.equal('no_right_turn'); + + var l1 = iD.osmInferRestriction(graph, { + from: { node: 'x', way: '-', vertex: '*' }, + to: { node: 'u', way: '=', vertex: '*' } + }, projection); + expect(l1).to.equal('no_left_turn'); + + var l2 = iD.osmInferRestriction(graph, { + from: { node: 'w', way: '~', vertex: '*' }, + to: { node: 'x', way: '-', vertex: '*' } + }, projection); + expect(l2).to.equal('no_left_turn'); + + var s = iD.osmInferRestriction(graph, { + from: { node: 'u', way: '=', vertex: '*' }, + to: { node: 'w', way: '~', vertex: '*' } + }, projection); + expect(s).to.equal('no_straight_on'); + + var u = iD.osmInferRestriction(graph, { + from: { node: 'u', way: '=', vertex: '*' }, + to: { node: 'u', way: '=', vertex: '*' } + }, projection); + expect(u).to.equal('no_u_turn'); + }); + + + it('infers no_u_turn from sharply acute angle made by forward oneways', function() { + // * + // / \ + // w2/ \w1 angle ≈22.6° + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({ id: 'u', loc: [0, -5] }), + iD.osmNode({ id: '*', loc: [1, 0] }), + iD.osmNode({ id: 'x', loc: [2, -5] }), + iD.osmWay({ id: 'w1', nodes: ['x', '*'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: 'w2', nodes: ['*', 'u'], tags: { oneway: 'yes' } }) + ]); + + var r = iD.osmInferRestriction(graph, { + from: { node: 'x', way: 'w1', vertex: '*' }, + to: { node: 'u', way: 'w2', vertex: '*' } + }, projection); + expect(r).to.equal('no_u_turn'); + }); + + + it('does not infer no_u_turn from widely acute angle made by forward oneways', function() { + // * + // / \ + // w2/ \w1 angle ≈36.9° + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({ id: 'u', loc: [0, -3] }), + iD.osmNode({ id: '*', loc: [1, 0] }), + iD.osmNode({ id: 'x', loc: [2, -3] }), + iD.osmWay({ id: 'w1', nodes: ['x', '*'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: 'w2', nodes: ['*', 'u'], tags: { oneway: 'yes' } }) + ]); + + var r = iD.osmInferRestriction(graph, { + from: { node: 'x', way: 'w1', vertex: '*' }, + to: { node: 'u', way: 'w2', vertex: '*' } + }, projection); + expect(r).to.equal('no_left_turn'); + }); + + + it('infers no_u_turn from sharply acute angle made by forward oneways with a via way', function() { + // * -- + + // / \ + // w2/ \w1 angle ≈22.6° + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({ id: 'u', loc: [0, -5] }), + iD.osmNode({ id: '*', loc: [1, 0] }), + iD.osmNode({ id: '+', loc: [2, 0] }), + iD.osmNode({ id: 'x', loc: [3, -5] }), + iD.osmWay({ id: 'w1', nodes: ['x', '+'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: 'w2', nodes: ['*', 'u'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: '-', nodes: ['*', '+'] }) + ]); + + var r = iD.osmInferRestriction(graph, { + from: { node: 'x', way: 'w1', vertex: '+' }, + to: { node: 'u', way: 'w2', vertex: '*' } + }, projection); + expect(r).to.equal('no_u_turn'); + }); + + + it('infers no_u_turn from widely acute angle made by forward oneways with a via way', function() { + // * -- + + // / \ + // w2/ \w1 angle ≈36.9° + // / \ + // u x + var graph = iD.coreGraph([ + iD.osmNode({ id: 'u', loc: [0, -3] }), + iD.osmNode({ id: '*', loc: [1, 0] }), + iD.osmNode({ id: '+', loc: [2, 0] }), + iD.osmNode({ id: 'x', loc: [3, -3] }), + iD.osmWay({ id: 'w1', nodes: ['x', '+'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: 'w2', nodes: ['*', 'u'], tags: { oneway: 'yes' } }), + iD.osmWay({ id: '-', nodes: ['*', '+'] }) + ]); + + var r = iD.osmInferRestriction(graph, { + from: { node: 'x', way: 'w1', vertex: '+' }, + to: { node: 'u', way: 'w2', vertex: '*' } + }, projection); + expect(r).to.equal('no_u_turn'); + }); +}); From 78170f8fe9a518da04ca7d3252a22f0b0b07f8a3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 1 Mar 2018 00:58:53 -0500 Subject: [PATCH 55/55] Improve hint text to aid in localization - change the "Up to {num} ways" to "Up to 2 ways" (we don't plan to go above 2 for now) - enumerate all the turn types No/Only/Allowed x Left/Right/Straight/U - Add a line for "Click for" to let user know they can click to toggle see https://github.com/openstreetmap/iD/pull/4768#pullrequestreview-100256196 --- data/core.yaml | 28 ++++++++++++------------- dist/locales/en.json | 28 ++++++++++++------------- modules/ui/fields/restrictions.js | 35 ++++++++++++++----------------- 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index be8cb7a76..4d487fa0d 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -229,20 +229,22 @@ en: via: Via via_node_only: "Node only" via_up_to_one: "Up to 1 way" - via_up_to_multiple: "Up to {num} ways" + via_up_to_two: "Up to 2 ways" help: - no: NO - only: ONLY - allowed: Allowed indirect: "(indirect)" turn: - left_turn: Left Turn - right_turn: Right Turn - u_turn: U-Turn - straight_on: Straight On - no_turn_string: "{no} {turn} {indirect}" - only_turn_string: "{only} {turn} {indirect}" - allowed_turn_string: "{turn} {allowed} {indirect}" + no_left_turn: "NO Left Turn {indirect}" + no_right_turn: "NO Right Turn {indirect}" + no_u_turn: "NO U-Turn {indirect}" + no_straight_on: "NO Straight On {indirect}" + only_left_turn: "ONLY Left Turn {indirect}" + only_right_turn: "ONLY Right Turn {indirect}" + only_u_turn: "ONLY U-Turn {indirect}" + only_straight_on: "ONLY Straight On {indirect}" + allowed_left_turn: "Left Turn Allowed {indirect}" + allowed_right_turn: "Right Turn Allowed {indirect}" + allowed_u_turn: "U-Turn Allowed {indirect}" + allowed_straight_on: "Straight On Allowed {indirect}" from: FROM via: VIA to: TO @@ -251,9 +253,7 @@ en: via_names: "{via} {viaNames}" select_from: "Click to select a {from} segment" select_from_name: "Click to select {from} {fromName}" - toggle: Click to toggle turn restrictions. - toggle_on: 'Click to add a "{restriction}" restriction.' - toggle_off: 'Click to remove the "{restriction}" restriction.' + toggle: "Click for \"{turn}\"" undo: tooltip: "Undo: {action}" nothing: Nothing to undo. diff --git a/dist/locales/en.json b/dist/locales/en.json index 14d209991..bf5fe30d0 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -298,22 +298,24 @@ "via": "Via", "via_node_only": "Node only", "via_up_to_one": "Up to 1 way", - "via_up_to_multiple": "Up to {num} ways" + "via_up_to_two": "Up to 2 ways" }, "help": { - "no": "NO", - "only": "ONLY", - "allowed": "Allowed", "indirect": "(indirect)", "turn": { - "left_turn": "Left Turn", - "right_turn": "Right Turn", - "u_turn": "U-Turn", - "straight_on": "Straight On" + "no_left_turn": "NO Left Turn {indirect}", + "no_right_turn": "NO Right Turn {indirect}", + "no_u_turn": "NO U-Turn {indirect}", + "no_straight_on": "NO Straight On {indirect}", + "only_left_turn": "ONLY Left Turn {indirect}", + "only_right_turn": "ONLY Right Turn {indirect}", + "only_u_turn": "ONLY U-Turn {indirect}", + "only_straight_on": "ONLY Straight On {indirect}", + "allowed_left_turn": "Left Turn Allowed {indirect}", + "allowed_right_turn": "Right Turn Allowed {indirect}", + "allowed_u_turn": "U-Turn Allowed {indirect}", + "allowed_straight_on": "Straight On Allowed {indirect}" }, - "no_turn_string": "{no} {turn} {indirect}", - "only_turn_string": "{only} {turn} {indirect}", - "allowed_turn_string": "{turn} {allowed} {indirect}", "from": "FROM", "via": "VIA", "to": "TO", @@ -322,9 +324,7 @@ "via_names": "{via} {viaNames}", "select_from": "Click to select a {from} segment", "select_from_name": "Click to select {from} {fromName}", - "toggle": "Click to toggle turn restrictions.", - "toggle_on": "Click to add a \"{restriction}\" restriction.", - "toggle_off": "Click to remove the \"{restriction}\" restriction." + "toggle": "Click for \"{turn}\"" } }, "undo": { diff --git a/modules/ui/fields/restrictions.js b/modules/ui/fields/restrictions.js index 97b10a03c..0905d5b1e 100644 --- a/modules/ui/fields/restrictions.js +++ b/modules/ui/fields/restrictions.js @@ -499,35 +499,26 @@ export function uiFieldRestrictions(field, context) { var restrictionType = osmInferRestriction(vgraph, datum, projection); var turnType = restrictionType.replace(/^(only|no)\_/, ''); var indirect = (datum.direct === false ? t('restriction.help.indirect') : ''); - var klass, turnHtml; + var klass, turnText, nextText; if (datum.no) { klass = 'restrict'; - turnHtml = t('restriction.help.no_turn_string', { - no: t('restriction.help.no'), - turn: t('restriction.help.turn.' + turnType), - indirect: indirect - }); + turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect }); + nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' }); } else if (datum.only) { klass = 'only'; - turnHtml = t('restriction.help.only_turn_string', { - only: t('restriction.help.only'), - turn: t('restriction.help.turn.' + turnType), - indirect: indirect - }); + turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect }); + nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' }); } else { klass = 'allow'; - turnHtml = t('restriction.help.allowed_turn_string', { - allowed: t('restriction.help.allowed'), - turn: t('restriction.help.turn.' + turnType), - indirect: indirect - }); + turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect }); + nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' }); } help - .append('div') // Turn Description + .append('div') // "NO Right Turn (indirect)" .attr('class', 'qualifier ' + klass) - .html(turnHtml); + .text(turnText); help .append('div') // "FROM {fromName} TO {toName}" @@ -555,6 +546,12 @@ export function uiFieldRestrictions(field, context) { })); } + if (!indirect) { + help + .append('div') // Click for "No Right Turn" + .text(t('restriction.help.toggle', { turn: nextText.trim() })); + } + highlightPathsFrom(null); var alongIDs = datum.path.slice(); surface.selectAll(utilEntitySelector(alongIDs)) @@ -607,7 +604,7 @@ export function uiFieldRestrictions(field, context) { function displayMaxVia(maxVia) { return maxVia === 0 ? t('restriction.controls.via_node_only') : maxVia === 1 ? t('restriction.controls.via_up_to_one') - : t('restriction.controls.via_up_to_multiple', { num: maxVia }); + : t('restriction.controls.via_up_to_two'); }