Отмена последней точки в OL3 удаляет последний сегмент
Мне нужна функциональность в моем веб-приложении для отмены последней точки. Были некоторые решения, такие как this для данной проблемы, которая может в некоторой степени справиться с этим:
var undo = false; // set this to true in the Esc key handler
var draw = new ol.interaction.Draw({
// ...
geometryFunction: function(coords, geom) {
if (!geom) {
geom = new ol.geom.LineString(null);
}
if (undo) {
if (coords.length > 1) {
coords.pop();
}
undo = false;
}
geom.setCoordinates(coords);
return geom;
}
});
Но, похоже, есть ошибка или что-то, что я не могу понять.
Используя этот plunker, вы можете попробовать, что я собираюсь объяснить:
Если вы нарисуете линию с некоторыми вершинами и затем отмените (нажмите ESC) до тех пор, пока последняя точка на линии не будет удалена, а затем закончите линию (или достаточно близко к ней), то же самое, что только что отменено, последний сегмент будут удалены, почему?
объясняется цифрами:
1. Рисование функции линии
![введите описание изображения здесь]()
2- уничтожение последней (третьей) точки
![введите описание изображения здесь]()
3- завершение линии в (или закрытии) той же точки.
![введите описание изображения здесь]()
4 - последний сегмент удален.
![введите описание изображения здесь]()
Я пробовал это несколько раз, и это случается. Это не произойдет, если вы добавите точку, не близкую к удаленному, или добавьте несколько точек.
Edit
Кажется, что OL3 проверяет последние две координаты геометрии, и если они одинаковы, то решает закончить сеанс рисования и удаляет последний. Я попробовал код ниже:
function geometryChange(coordinates, geometry){
if (!geometry) {
geometry = new ol.geom.LineString(null);
}
if (undo){
var coords = geometry.getCoordinates();
console.info(coords);
console.info(coordinates);
var diff = coordinates.length - coords.length;
if (diff > 0) {
var lastCoordinates= coordinates[coordinates.length-1];
console.info(coordinates);
coordinates.splice(coordinates.length - (diff+1), diff,lastCoordinates);
console.info(coordinates);
coordinates.pop();
console.info(coordinates);
undo=false;
if (coords.length === 1){
undone=true;
lineStringdraw.finishDrawing();
undone=false;
var emptyFeature = vector2.getSource().getFeatures()[vector2.getSource().getFeatures().length-1];
vector2.getSource().removeFeature(emptyFeature);
featureID-=1;
}
}
}
//console.info(coordinates);
geometry.setCoordinates(coordinates);
//coordinates= geometry.getCoordinates();
return geometry;
}
результаты еще более интересны. Поскольку я отменяю последний пункт, когда я хочу просто добавить точку близко к ней (не заканчивая линию двойным щелчком), OL предполагает, что чертеж закончен и запускает событие рисования (у меня есть это событие для некоторых целей, но удивительно запускается без причины).
Ответы
Ответ 1
попробуйте изменить этот фрагмент кода:
var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
var geom = drawing_feature.getGeometry();
geom.setCoordinates(geom.getCoordinates().slice(0, -1));
}
};
:
var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
var geom = drawing_feature.getGeometry();
var coordsLength = geom.getCoordinates().length;
geom.setCoordinates(geom.getCoordinates().slice(0, coordsLength-1));
}
};
Если вы можете использовать метод removeLastPoint
, попробуйте следующее
var keydown = function(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode === 27 && drawing === true){ //esc key
draw.removeLastPoint();
}
};