mirror of
https://github.com/FoggedLens/iD.git
synced 2026-06-03 13:38:04 +02:00
Support merging point + line
This commit is contained in:
@@ -1,34 +1,35 @@
|
||||
iD.actions.Merge = function(ids) {
|
||||
function groupEntitiesByGeometry(graph) {
|
||||
var entities = ids.map(function(id) { return graph.entity(id); });
|
||||
return _.extend({point: [], area: []}, _.groupBy(entities, function(entity) { return entity.geometry(graph); }));
|
||||
return _.extend({point: [], area: [], line: [], relation: []},
|
||||
_.groupBy(entities, function(entity) { return entity.geometry(graph); }));
|
||||
}
|
||||
|
||||
var action = function(graph) {
|
||||
var geometries = groupEntitiesByGeometry(graph),
|
||||
area = geometries.area[0],
|
||||
target = geometries.area[0] || geometries.line[0],
|
||||
points = geometries.point;
|
||||
|
||||
points.forEach(function(point) {
|
||||
area = area.mergeTags(point.tags);
|
||||
target = target.mergeTags(point.tags);
|
||||
|
||||
graph.parentRelations(point).forEach(function(parent) {
|
||||
graph = graph.replace(parent.replaceMember(point, area));
|
||||
graph = graph.replace(parent.replaceMember(point, target));
|
||||
});
|
||||
|
||||
graph = graph.remove(point);
|
||||
});
|
||||
|
||||
graph = graph.replace(area);
|
||||
graph = graph.replace(target);
|
||||
|
||||
return graph;
|
||||
};
|
||||
|
||||
action.enabled = function(graph) {
|
||||
var geometries = groupEntitiesByGeometry(graph);
|
||||
return geometries.area.length === 1 &&
|
||||
geometries.point.length > 0 &&
|
||||
(geometries.area.length + geometries.point.length) === ids.length;
|
||||
return geometries.point.length > 0 &&
|
||||
(geometries.area.length + geometries.line.length) === 1 &&
|
||||
geometries.relation.length === 0;
|
||||
};
|
||||
|
||||
return action;
|
||||
|
||||
@@ -1,4 +1,23 @@
|
||||
describe("iD.actions.Merge", function () {
|
||||
it("merges multiple points to a line", function () {
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', tags: {a: 'a'}}),
|
||||
'b': iD.Node({id: 'b', tags: {b: 'b'}}),
|
||||
'w': iD.Way({id: 'w'}),
|
||||
'r': iD.Relation({id: 'r', members: [{id: 'a', role: 'r', type: 'node'}]})
|
||||
}),
|
||||
action = iD.actions.Merge(['a', 'b', 'w']);
|
||||
|
||||
expect(action.enabled(graph)).to.be.true;
|
||||
|
||||
graph = action(graph);
|
||||
|
||||
expect(graph.entity('a')).to.be.undefined;
|
||||
expect(graph.entity('b')).to.be.undefined;
|
||||
expect(graph.entity('w').tags).to.eql({a: 'a', b: 'b'});
|
||||
expect(graph.entity('r').members).to.eql([{id: 'w', role: 'r', type: 'way'}]);
|
||||
});
|
||||
|
||||
it("merges multiple points to an area", function () {
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', tags: {a: 'a'}}),
|
||||
|
||||
Reference in New Issue
Block a user