mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-27 18:32:25 +02:00
Move intersection tree to iD.Tree
This commit is contained in:
@@ -140,6 +140,7 @@
|
||||
<script src='js/id/core/node.js'></script>
|
||||
<script src='js/id/core/relation.js'></script>
|
||||
<script src='js/id/core/way.js'></script>
|
||||
<script src='js/id/core/tree.js'></script>
|
||||
|
||||
<script src='js/id/connection.js'></script>
|
||||
<script src='js/id/validate.js'></script>
|
||||
|
||||
+9
-58
@@ -1,12 +1,9 @@
|
||||
iD.History = function(context) {
|
||||
var stack, index,
|
||||
var stack, index, tree;
|
||||
imagery_used = 'Bing',
|
||||
dispatch = d3.dispatch('change', 'undone', 'redone'),
|
||||
lock = false;
|
||||
|
||||
var rtree = new RTree(),
|
||||
treeGraph;
|
||||
|
||||
function perform(actions) {
|
||||
actions = Array.prototype.slice.call(actions);
|
||||
|
||||
@@ -38,34 +35,6 @@ iD.History = function(context) {
|
||||
return 'iD_' + window.location.origin + '_' + n;
|
||||
}
|
||||
|
||||
function rebaseTree(entities) {
|
||||
for (var i = 0; i < entities.length; i++) {
|
||||
insert(stack[index].graph.entities[entities[i]]);
|
||||
}
|
||||
}
|
||||
|
||||
function extentRectangle(extent) {
|
||||
var m = 1000 * 1000 * 100,
|
||||
x = m * extent[0][0],
|
||||
y = m * extent[0][1],
|
||||
dx = m * extent[1][0] - x || 2,
|
||||
dy = m * extent[1][1] - y || 2;
|
||||
return new RTree.Rectangle(~~x, ~~y, ~~dx - 1, ~~dy - 1);
|
||||
}
|
||||
|
||||
function insert(entity) {
|
||||
rtree.insert(extentRectangle(entity.extent(stack[index].graph)), entity.id);
|
||||
}
|
||||
|
||||
function remove(entity) {
|
||||
var r= rtree.remove(extentRectangle(entity.extent(treeGraph)), entity.id);
|
||||
}
|
||||
|
||||
function reinsert(entity) {
|
||||
remove(treeGraph.entities[entity.id]);
|
||||
insert(entity);
|
||||
}
|
||||
|
||||
var history = {
|
||||
graph: function() {
|
||||
return stack[index].graph;
|
||||
@@ -73,15 +42,16 @@ iD.History = function(context) {
|
||||
|
||||
merge: function(entities) {
|
||||
|
||||
var base = treeGraph.base(),
|
||||
var base = tree.base(),
|
||||
newentities = Object.keys(entities).filter(function(i) {
|
||||
return !treeGraph.entities.hasOwnProperty(i) && !base.entities[i];
|
||||
});
|
||||
return !base.entities.hasOwnProperty(i) && !base.entities[i];
|
||||
});
|
||||
|
||||
for (var i = 0; i < stack.length; i++) {
|
||||
stack[i].graph.rebase(entities);
|
||||
}
|
||||
rebaseTree(newentities);
|
||||
tree.rebase(newentities);
|
||||
|
||||
dispatch.change();
|
||||
},
|
||||
|
||||
@@ -162,26 +132,7 @@ iD.History = function(context) {
|
||||
},
|
||||
|
||||
intersects: function(extent) {
|
||||
if (treeGraph !== stack[index].graph) {
|
||||
var diff = iD.Difference(treeGraph, stack[index].graph),
|
||||
modified = {};
|
||||
|
||||
diff.modified().forEach(function(d) {
|
||||
var loc = treeGraph.entities[d.id].loc;
|
||||
if (!loc || loc[0] !== d.loc[0] || loc[1] !== d.loc[1]) {
|
||||
modified[d.id] = d;
|
||||
}
|
||||
});
|
||||
|
||||
d3.values(diff.addParents(modified)).map(reinsert);
|
||||
diff.created().forEach(insert);
|
||||
diff.deleted().forEach(remove);
|
||||
|
||||
treeGraph = stack[index].graph;
|
||||
}
|
||||
|
||||
return rtree.search(extentRectangle(extent))
|
||||
.map(function(id) { return treeGraph.entity(id); });
|
||||
return tree.intersects(extent, stack[index].graph);
|
||||
},
|
||||
|
||||
difference: function() {
|
||||
@@ -204,7 +155,7 @@ iD.History = function(context) {
|
||||
}
|
||||
|
||||
return {
|
||||
modified: d3.values(difference.modified()).map(discardTags),
|
||||
modified: difference.modified().map(discardTags),
|
||||
created: difference.created().map(discardTags),
|
||||
deleted: difference.deleted()
|
||||
};
|
||||
@@ -228,7 +179,7 @@ iD.History = function(context) {
|
||||
reset: function() {
|
||||
stack = [{graph: iD.Graph()}];
|
||||
index = 0;
|
||||
treeGraph = stack[0].graph;
|
||||
tree = iD.Tree(stack[0].graph);
|
||||
dispatch.change();
|
||||
},
|
||||
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
iD.Tree = function(graph) {
|
||||
|
||||
var rtree = new RTree(),
|
||||
m = 1000 * 1000 * 100,
|
||||
head = graph;
|
||||
|
||||
function extentRectangle(extent) {
|
||||
x = m * extent[0][0],
|
||||
y = m * extent[0][1],
|
||||
dx = m * extent[1][0] - x || 2,
|
||||
dy = m * extent[1][1] - y || 2;
|
||||
return new RTree.Rectangle(~~x, ~~y, ~~dx - 1, ~~dy - 1);
|
||||
}
|
||||
|
||||
function insert(entity) {
|
||||
rtree.insert(extentRectangle(entity.extent(head)), entity.id);
|
||||
}
|
||||
|
||||
function remove(entity) {
|
||||
rtree.remove(extentRectangle(entity.extent(graph)), entity.id);
|
||||
}
|
||||
|
||||
function reinsert(entity) {
|
||||
remove(graph.entities[entity.id]);
|
||||
insert(entity);
|
||||
}
|
||||
|
||||
var tree = {
|
||||
|
||||
rebase: function(entities) {
|
||||
for (var i = 0; i < entities.length; i++) {
|
||||
insert(graph.entities[entities[i]]);
|
||||
}
|
||||
return tree;
|
||||
},
|
||||
|
||||
intersects: function(extent, g) {
|
||||
|
||||
head = g;
|
||||
|
||||
if (graph !== head) {
|
||||
var diff = iD.Difference(graph, head),
|
||||
modified = {};
|
||||
|
||||
diff.modified().forEach(function(d) {
|
||||
var loc = graph.entities[d.id].loc;
|
||||
if (!loc || loc[0] !== d.loc[0] || loc[1] !== d.loc[1]) {
|
||||
modified[d.id] = d;
|
||||
}
|
||||
});
|
||||
|
||||
d3.values(diff.addParents(modified)).map(reinsert);
|
||||
diff.created().forEach(insert);
|
||||
diff.deleted().forEach(remove);
|
||||
|
||||
graph = head;
|
||||
}
|
||||
|
||||
return rtree.search(extentRectangle(extent))
|
||||
.map(function(id) { return graph.entity(id); });
|
||||
},
|
||||
|
||||
base: function() {
|
||||
return graph;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
return tree;
|
||||
};
|
||||
Reference in New Issue
Block a user