From 70d5529a587ad5e1dd0f934a46140e58b9216886 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Fri, 21 Dec 2018 17:39:20 -0500 Subject: [PATCH] Added initial implementation of quick fix for connecting crossing features (still has some bugs) --- data/core.yaml | 3 +++ dist/locales/en.json | 4 +++ modules/validations/crossing_ways.js | 35 +++++++++++++++++++++++++ modules/validations/validation_issue.js | 1 + 4 files changed, 43 insertions(+) diff --git a/data/core.yaml b/data/core.yaml index d9a405bd3..f3818418c 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -937,6 +937,9 @@ en: title: Select a feature type ignore_temporarily: title: Ignore for now + add_connection_vertex: + title: Connect the features + undo_redo: Connected crossing features. intro: done: done ok: OK diff --git a/dist/locales/en.json b/dist/locales/en.json index 337180a74..55e049825 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1126,6 +1126,10 @@ }, "ignore_temporarily": { "title": "Ignore for now" + }, + "add_connection_vertex": { + "title": "Connect the features", + "undo_redo": "Connected crossing features." } } }, diff --git a/modules/validations/crossing_ways.js b/modules/validations/crossing_ways.js index bedf71ef3..e83e4ea75 100644 --- a/modules/validations/crossing_ways.js +++ b/modules/validations/crossing_ways.js @@ -8,7 +8,11 @@ import { ValidationIssueType, ValidationIssueSeverity, validationIssue, + validationIssueFix } from './validation_issue'; +import { osmNode } from '../osm'; +import { actionAddMidpoint } from '../actions'; +import { geoChooseEdge } from '../geo'; export function validationHighwayCrossingOtherWays(context) { @@ -220,7 +224,38 @@ export function validationHighwayCrossingOtherWays(context) { message: t('issues.'+crossingTypeID+'.message', messageDict), tooltip: t('issues.'+crossingTypeID+'.tooltip'), entities: entities, + info: {'ways': crossing.ways}, coordinates: crossing.cross_point, + fixes: [ + new validationIssueFix({ + title: t('issues.fix.add_connection_vertex.title'), + action: function() { + var loc = this.issue.coordinates; + var ways = this.issue.info.ways; + + context.perform( + function actionConnectCrossingWays(graph) { + + var node = osmNode(); + graph = graph.replace(node); + + var way0 = ways[0]; + var choice0 = geoChooseEdge(context.childNodes(way0), loc, context.projection); + var edge0 = [way0.nodes[choice0.index - 1], way0.nodes[choice0.index]]; + graph = actionAddMidpoint({loc: choice0.loc, edge: edge0}, node)(graph); + + var way1 = ways[1]; + var choice1 = geoChooseEdge(context.childNodes(way1), loc, context.projection); + var edge1 = [way1.nodes[choice1.index - 1], way1.nodes[choice1.index]]; + graph = actionAddMidpoint({loc: choice1.loc, edge: edge1}, node)(graph); + + return graph; + }, + t('issues.fix.add_connection_vertex.undo_redo') + ); + } + }) + ] })); } } diff --git a/modules/validations/validation_issue.js b/modules/validations/validation_issue.js index c532186db..531a4264e 100644 --- a/modules/validations/validation_issue.js +++ b/modules/validations/validation_issue.js @@ -47,6 +47,7 @@ export function validationIssue(attrs) { this.tooltip = attrs.tooltip; this.entities = attrs.entities; // expect an array of entities this.coordinates = attrs.coordinates; // expect a [lon, lat] array + this.info = attrs.info; // an object containing arbitrary extra information this.fixes = attrs.fixes; // expect an array of functions for possible fixes if (this.fixes) {