Клуб API Карт

Корректный способ вернуть Edge на место

BrightGenie
20 октября 2015, 17:41

Пытаюсь запретить некоторые перетаскивания вершин полигона.

И если с вершинами (Vertex) все просто:

                        polygon.editor.events.add('beforevertexdragstart', function(e) {

                           var vertexModel = e.get('vertexModel');

                           vertexModel.saveCoords = vertexModel.geometry.getCoordinates();

                        });

                        polygon.editor.events.add('vertexdragend', function(e) {

                           var vertexModel = e.get('vertexModel');
                           var ok = testVertex(vertexModel);
                           if(!ok) {
                              vertexModel.geometry.setCoordinates(vertexModel.saveCoords);
                           }
                        });
То с промежуточной вершиной (Edge) не пойму. Если использовать edgedragend, то координаты в случае необходимости отката ей не присвоить. Завязываться на beforeedgedrag? Но это слишком частая проверка, да и preventDefault почему-то не откатывает перетаскивание.
Поскольку в результате перетаскивания Edge появляется новый Vertex, попробовал завязаться на beforevertexadd, все бы хорошо. Помешать появлению vertex удается, но тогда в воздухе подвисает ни к чему не привязанный Edge, в том месте где закончили Drag. Придумал только вызывать stopEditing() и тут же startEditing(), но тогда полигон мелькает, а это не красиво.
5 комментариев
Подписаться на комментарии к посту

А какое поведение нужно?

Можно попробовать слушать vertexadd и удалять вершину, если она не ОК.

Тогда не нужны отдельные костыли для EdgeVertex

http://jsfiddle.net/pand1h6y/

пытаюсь не дать юзеру создать полигон с пересекающимися ребрами (чтобы расчет площади полигона корректно работал, жалко что в API нет расчет площади).

соответственно при добавлении Vertex я все нормально блокирую если не удовлетворяет.

а при перетаскивании Edge (и таким образом создании нового Vertex) не получается сделать красиво, на этапе Edge.

Я как раз сделал через beforevertexadd и новая Vertex не появляется, но Edge перетащенный остается висеть в конечной точке, т.е. совсем не на полигоне.

Да, это баг, я завел тикет.

я сделал пример через "vertexadd"

работает и с Edge и с Vertex

http://jsfiddle.net/pand1h6y/

спасибо =)

спасибо. ваш вариант работает отлично и без морганий