Невозможно добавить правильную операцию отмены/повтора для перемещения/масштабирования/поворота с помощью arcgis

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

//Obtaining the graphic before it is moved
moveToolbar.on("graphic-move-start", function (evt) {
oldGraphicMove = evt.graphic;
});

//Updating the graphic on move end
moveToolbar.on("graphic-move-stop", function (evt) {

  //Creating the operation to add to the undomanager
  var operation = new Update({
  featureLayer: evt.graphic._graphicsLayer, //The layer that will contain the modified graphic
  preUpdatedGraphics: [oldGraphicMove], //The graphic before the changes are created
  postUpdatedGraphics: [evt.graphic] //The graphic after the changes are made
});

//Adding the undo/redo operation
undoManager.add(operation);
//Updating the graphic
evt.graphic._graphicsLayer.applyEdits(null, [evt.graphic], null);

});

По какой-то причине старая графика до всегда остается равной новой графике после, поэтому при добавлении операции нечего отменять/повторять, поскольку графика помечается как равная до и после.

Я понятия не имею, что я могу делать неправильно, какие-либо подсказки по этому поводу?


person Maeglin77    schedule 26.01.2017    source источник
comment
Не могли бы вы поделиться образцом на JSBIN? Помочь было бы проще. Я предполагаю, что moveToolbar - это графический слой, но было бы неплохо получить больше информации. Кстати, вы используете evt не по назначению, не так ли? Кстати: я думаю, вы знаете этот пример, правильно ?   -  person hhkaos    schedule 26.01.2017
comment
JSBIN? moveToolbar — это панель инструментов от esri, она влияет на слой на карте в зависимости от операций, назначенных панели инструментов, и назначенного слоя: .Edit.ROTATE, tempMoveLayer.graphics[graphicNum]) Также да, я знаю об этом, и для добавления, редактирования и удаления графики у меня нет проблем, а также для отмены и повтора движений вершин. Проблема с перемещением, масштабированием и вращением   -  person Maeglin77    schedule 27.01.2017


Ответы (1)


По-видимому, переменная oldGraphicMove в начале редактирования была перезаписана evt.graphic с конца редактирования. Это было решено путем создания новой графики со спецификациями графики до того, как она была отредактирована, вместо того, чтобы назначать графику непосредственно переменной:

//Obtaining the graphic before it is scaled
moveToolbar.on("scale-first-move", function (evt) {
     oldGraphicScale = new esri.Graphic(evt.graphic.geometry,evt.graphic.symbol,evt.graphic.attributes);
                                                    });

//Updating the graphic on scale end
moveToolbar.on("scale-stop", function (evt) {

    newGraphicScale = new esri.Graphic(evt.graphic.geometry, evt.graphic.symbol, evt.graphic.attributes);

   //Creating the operation to add to the undomanager
   var operation = new Update({
         featureLayer: evt.graphic._graphicsLayer, //The layer that will contain the modified graphic  
         preUpdatedGraphics: [oldGraphicScale], //The graphic before the changes are created
         postUpdatedGraphics: [newGraphicScale] //The graphic after the changes are made
                                                        });

//Adding the undo/redo operation
undoManager.add(operation);

//Updating the graphic
evt.graphic._graphicsLayer.applyEdits(null, [evt.graphic], null);
                                                    });

Есть еще несколько проблем с отменой/восстановлением движения, однако этот метод работает для отмены/восстановления масштаба и поворота.

person Maeglin77    schedule 21.02.2017