2016-06-01 7 views
1

Ich versuche, den Bearbeitungsscheitelpunkt mit undomanager rückgängig machen/wiederholen.wie arcgis Javascript Vertex undoManager

Grafikobjekte werden getestet. Aber ich weiß nicht, was zu tun ist Edit Vertex Undo/Redo.

Ist es möglich, den Scheitelpunkt rückgängig zu machen?

Ich suchte nach vielen Beispielen haben die Antwort nicht gefunden.

ich bin koreanischer Anfänger Programmierer. Hilf mir ~ T.

Antwort

1

Das Beispiel, das Sie beziehen, gibt Ihnen nur eine Idee, wie Sie den UndoManager verwenden können. Sie müssen eigene Operationen erstellen, wenn Sie für Scheitelpunkte rückgängig machen/wiederholen müssen. Unten habe ich einen für AddVertex angegeben. Sie müssten Ihre eigenen für andere Operationen erstellen.

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; 
}); 

Deaktivieren Sie den UndoManager, wenn Sie die Bearbeitungssymbolleiste deaktivieren. Sonst bleibt der Betrieb erhalten. Kombinieren Sie die Grafikoperationen hinzufügen nicht mit Vertex-Operationen. Es funktioniert nicht, da sie unterschiedliche Symbolleisten verwenden. Der Werkzeugleistenstatus wird verloren gehen, sobald Sie ihn deaktivieren.

Noch eine Sache zu beachten ist, wenn Sie den UndoManager verwenden, der isModified-Status der Grafik wird immer wahr sein, da wir bei Undo/Redo Knoten hinzufügen und löschen, auch wenn Sie alle Änderungen rückgängig machen. Stellen Sie daher sicher, dass Sie Applyedit verwenden müssen, indem Sie überprüfen, ob rückgängig zu machen ist (Geometrie wird wirklich geändert).

Ich hoffe, das war hilfreich.

+0

Vielen Dank für Ihre Antworten ~ !!! – BingBingPa

+0

froh zu helfen, markieren Sie es als beantwortet, wenn es Ihr Problem gelöst hat. –