我尝试使用undomanager撤消/重做编辑顶点。

图形对象已测试。但是我不知道该怎么做编辑顶点撤消/重做。

顶点可以撤消/重做吗?

我看了看,发现很多例子都没有找到答案。

我是韩国初学者。帮帮我〜

   function initEditing(evt) {
      console.log("initEditing", evt);
      var currentLayer = null;
      var layers = arrayUtils.map(evt.layers, function(result) {
        return result.layer;
        console.log("result ==== "+result);
      });
      console.log("layers", layers);

       editToolbar = new Edit(map);
      editToolbar.on("deactivate", function(evt) {
          console.log("deactivate !!!! ");
        currentLayer.applyEdits(null, [evt.graphic], null);
      });

      arrayUtils.forEach(layers, function(layer) {
        var editingEnabled = false;
        layer.on("dbl-click", function(evt) {
          event.stop(evt);
          if (editingEnabled === false) {
            editingEnabled = true;
            editToolbar.activate(Edit.EDIT_VERTICES , evt.graphic);
            pre_evt = evt.graphic;
            editToolbar.on("vertex-move-stop", function(evt){
                console.log("vertex-move-stop~");
                g_evt = evt;
                console.log("evt.transform ===== " +evt.transform);
                var operation = new esri.dijit.editing.Update({
                    featureLayer : landusePointLayer,
                     preUpdatedGraphics:pre_evt,
                     postUpdatedGraphics: evt.graphic
                })
                 var operation = new CustomOperation.Add({
                                     graphicsLayer: pre_evt._graphicsLayer,
                                         addedGraphic: evt.graphic
                                       });
                                 undoManager.add(operation);
                console.log("operation ======== ",operation);
            });

            console.log("dbl-click  & eidt  true");
          } else {
            currentLayer = this;
            editToolbar.deactivate();
            editingEnabled = false;
            console.log("dbl-click  & eidt false ");
          }
        });

最佳答案

您所引用的示例仅使您了解如何使用UndoManager。如果需要对顶点进行撤消/重做,则需要创建自己的操作。下面我为AddVertex提供了一个。您将需要创建自己的其他操作。

define(["dojo/_base/declare",
        "esri/OperationBase"],
     function(declare,
              OperationBase) {

    var customOp = {};

    customOp.AddVertex = declare(OperationBase, {
        label: "Add Vertex",
        _editedGraphic: null,
        _vertexInfo: null,
        _vertex: null,
        _editTool: null,

        constructor: function (params) {
            params = params || {};

            if (!params.editTool) {
                console.error("no edit toolbar provided");
                return;
            }
            this._editTool = params.editTool;

            if (!params.editedGraphic) {
                console.error("no graphics provided");
                return;
            }
            this._editedGraphic = params.editedGraphic;

            if (!params.vertexinfo) {
                console.error("no vertexinfo provided");
                return;
            }
            this._vertexInfo = params.vertexinfo;

            var geometry = this._editedGraphic.geometry;
            if(geometry.type === "multipoint") {
                this._vertex = geometry.getPoint(this._vertexInfo.pointIndex);
            } else if(geometry.type === "polyline" || geometry.type === "polygon") {
                this._vertex = geometry.getPoint(this._vertexInfo.segmentIndex, this._vertexInfo.pointIndex);
            } else {
                console.error("Not valid geometry type.");
            }
        },


        performUndo: function () {
            var geometry = this._editedGraphic.geometry;
            if(geometry.type === "multipoint"){
                geometry.removePoint(this._vertexInfo.pointIndex);
            } else if(geometry.type === "polyline" || geometry.type === "polygon") {
                geometry.removePoint(this._vertexInfo.segmentIndex, this._vertexInfo.pointIndex);
            }
            this._editedGraphic.draw();
            this._editTool.refresh();
        },

        performRedo: function () {
            var geometry = this._editedGraphic.geometry;
            if(geometry.type === "multipoint"){
                geometry.removePoint(this._vertexInfo.pointIndex, this._vertex);
            } else if(geometry.type === "polyline" || geometry.type === "polygon") {
                geometry.insertPoint(this._vertexInfo.segmentIndex, this._vertexInfo.pointIndex, this._vertex);
            }
            this._editedGraphic.draw();
            this._editTool.refresh();
        }
    });

    return customOp;
});


确保在停用编辑工具栏时清除UndoManager。否则,操作将保留。不要将“添加图形”操作与“顶点操作”结合使用。由于他们使用不同的工具栏,因此将无法使用,并且一旦您停用它,编辑工具栏的状态就会丢失。

还有一点要注意的是,当您使用UndoManager时,图形的isModified状态将始终为true,因为我们在撤消/重做期间将添加和删除顶点,即使撤消所有更改也是如此。因此,请确保您需要通过检查是否有任何待处理的撤消(几何形状确实被修改)来应用edit。

希望这会有所帮助。

10-01 01:34
查看更多