<h1>
<span style="font-size: 24px;">ArcEngine编辑功能的实现(二)</span></h1>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using System.Collections;
using ESRI.ArcGIS.SystemUI;
using MapDataViewAndControlLib;
namespace GEditor
{
public partial class EditFrm : Form
{
public EditFrm()
{
InitializeComponent();
}
private IEngineEditor m_EngineEditor = new EngineEditorClass();
private IEngineEditEvents_Event m_EngineEditEvent_Event;
private void Form1_Load(object sender, EventArgs e)
{
axTOCControl1.SetBuddyControl(axMapControl1);
axToolbarControl1.SetBuddyControl(axMapControl1);
//添加与数据相关的工具条,包括打开文档、保存文档、添加数据、放大、缩小、漫游、全显、上一视图
axToolbarControl1.AddItem("esriControls.ControlsOpenDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsSaveAsDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsAddDataCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapZoomOutTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapPanTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapFullExtentCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentBackCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentForwardCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
m_Map = axMapControl1.Map;
InitializeEditorState();
}
private void InitializeEditorState()
{
tspCurrentTask.Items.Add("新建要素");
tspCurrentTask.Items.Add("修改要素");
tspCopy.Enabled = false;
tspDelete.Enabled = false;
tspPaste.Enabled = false;
tspRedo.Enabled = false;
tspUndo.Enabled = false;
tspSketch.Enabled = false;
tspEdit.Enabled = false;
tspSaveEdit.Enabled = false;
tspStopEdit.Enabled = false;
tspSketch.Enabled = false;
tspEdit.Enabled = false;
tspCurrentLayer.Enabled = false;
tspCurrentTask.Enabled = false;
}
IMap m_Map = null;
private void tspStartEdit_Click(object sender, EventArgs e)
{
#region 开始编辑状态
if (m_Map.LayerCount==0)
{
MessageBox.Show("没有图层!");
return;
}
for (int i = 0; i < m_Map.LayerCount ; i++)
{
ILayer pLayer = m_Map.get_Layer(i);
if (pLayer is IFeatureLayer)
{
tspCurrentLayer.Items.Add(pLayer.Name);
}
}
tspStartEdit.Enabled = false;
tspSaveEdit.Enabled = true;
tspStopEdit.Enabled = true;
tspSketch.Enabled = false;
tspEdit.Enabled = false;
tspCurrentLayer.Enabled = true;
tspCurrentTask.Enabled = true;
tspCurrentLayer.SelectedIndex = 0;
tspCurrentTask.SelectedIndex = 0;
if (m_EngineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing)
{
//Start editing the workspace of the first feature layer found.
//设置编辑的WorkSpace和编辑对象图层
ILayer currentLayer = m_Map.get_Layer(0);
if (currentLayer is IFeatureLayer)
{
IFeatureLayer featureLayer = currentLayer as IFeatureLayer;
IDataset dataset = featureLayer.FeatureClass as IDataset;
IWorkspace workspace = dataset.Workspace;
m_EngineEditor.StartEditing(workspace, m_Map);
m_EngineEditEvent_Event = m_EngineEditor as IEngineEditEvents_Event;
m_EngineEditEvent_Event.OnCurrentTaskChanged += new IEngineEditEvents_OnCurrentTaskChangedEventHandler(m_EngineEditEvent_Event_OnCurrentTaskChanged);
m_EngineEditEvent_Event.OnSelectionChanged += new IEngineEditEvents_OnSelectionChangedEventHandler(m_EngineEditEvent_Event_OnSelectionChanged);
m_EngineEditEvent_Event.OnSketchModified += new IEngineEditEvents_OnSketchModifiedEventHandler(m_EngineEditEvent_Event_OnSketchModified);
}
}
#endregion
}
private void tspSaveEdit_Click(object sender, EventArgs e)
{
pCmd = new ESRI.ArcGIS.Controls.ControlsEditingSaveCommandClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
private void tspStopEdit_Click(object sender, EventArgs e)
{
if (m_EngineEditor.HasEdits() == false)
m_EngineEditor.StopEditing(false);
else
{
if (MessageBox.Show("保存编辑?", "保存选项", MessageBoxButtons.YesNo)
== DialogResult.Yes)
{
m_EngineEditor.StopEditing(true);
}
else
{
m_EngineEditor.StopEditing(false);
}
}
tspStartEdit.Enabled = true;
tspCopy.Enabled = false;
tspDelete.Enabled = false;
tspPaste.Enabled = false;
tspRedo.Enabled = false;
tspUndo.Enabled = false;
tspSketch.Enabled = false;
tspEdit.Enabled = false;
tspSaveEdit.Enabled = false;
tspStopEdit.Enabled = false;
tspSketch.Enabled = false;
tspEdit.Enabled = false;
tspCurrentLayer.SelectedIndex = -1;
tspCurrentTask.SelectedIndex = -1;
tspCurrentLayer.Enabled = false;
tspCurrentTask.Enabled = false;
}
private void tspEdit_Click(object sender, EventArgs e)
{
pCmd = new ControlsEditingEditToolClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
void m_EngineEditEvent_Event_OnSketchModified()
{
IEngineEditProperties ep = new EngineEditorClass();
ILayer m_pCurrentLayer = ep.TargetLayer;
if (m_pCurrentLayer == null) return;
IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;
IDataset pDataset = (IDataset)pFeatureLayer.FeatureClass;
if (pDataset == null) return;
pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;
bool bHasUndos = false;
pWorkspaceEdit.HasUndos(ref bHasUndos);
if (bHasUndos)
tspUndo.Enabled = true;
else
tspUndo.Enabled = false;
bool bHasRedos = false;
pWorkspaceEdit.HasRedos(ref bHasRedos);
if (bHasRedos)
tspRedo.Enabled = true;
else
tspRedo.Enabled = false;
}
void m_EngineEditEvent_Event_OnSelectionChanged()
{
if (m_EngineEditor.SelectionCount==0)
{
tspCopy.Enabled = false;
tspDelete.Enabled = false;
tspPaste.Enabled = false;
if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
tspSketch.Enabled = false;
}
else
{
tspCopy.Enabled = true;
tspDelete.Enabled = true;
tspPaste.Enabled = true;
if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
tspSketch.Enabled = true;
else if (m_EngineEditor.CurrentTask.Name == "Create New Feature")
tspSketch.Enabled = true;
}
}
void m_EngineEditEvent_Event_OnCurrentTaskChanged()
{
if (m_EngineEditor.CurrentTask.Name == "Create New Feature")
{
tspCurrentTask.SelectedIndex = 0;
}
else if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
{
tspCurrentTask.SelectedIndex = 1;
}
MessageBox.Show(m_EngineEditor.CurrentTask.Name+m_EngineEditor.TaskCount.ToString());
}
private void tspSketch_Click(object sender, EventArgs e)
{
pCmd = new ControlsEditingSketchToolClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
private void tspRedo_Click(object sender, EventArgs e)
{
MapRedoEdit(m_Map);
bool bHasUndos = false;
pWorkspaceEdit.HasUndos(ref bHasUndos);
if (bHasUndos)
tspUndo.Enabled = true;
else
tspUndo.Enabled = false;
}
private void tspUndo_Click(object sender, EventArgs e)
{
MapUndoEdit(m_Map);
bool bHasRedos = false;
pWorkspaceEdit.HasRedos(ref bHasRedos);
if (bHasRedos)
tspRedo.Enabled = true;
else
tspRedo.Enabled = false;
}
private void tspCurrentTask_SelectedIndexChanged(object sender, EventArgs e)
{
switch (tspCurrentTask.Text)
{
case "新建要素":
SetCurrentTask(ref m_EngineEditor, "新建要素");
tspSketch.Enabled = true;
tspEdit.Enabled = true;
break;
case "修改要素":
SetCurrentTask(ref m_EngineEditor, "修改要素");
if (m_EngineEditor.SelectionCount==0)
{
tspSketch.Enabled = false;
tspEdit.Enabled = true;
}
else
{
tspSketch.Enabled = true;
tspEdit.Enabled = true;
}
break;
}
}
private void tspCurrentLayer_SelectedIndexChanged(object sender, EventArgs e)
{
if (tspCurrentLayer.SelectedIndex!=-1)
{
IFeatureLayer pCurrentLyr = m_Map.get_Layer(tspCurrentLayer.SelectedIndex) as IFeatureLayer;
((IEngineEditLayers)m_EngineEditor).SetTargetLayer(pCurrentLyr, 0);
}
}
/// <summary>
/// 设置编辑的任务类型
/// </summary>
/// <param name="pEngineEditor"></param>
/// <param name="taskName"></param>自己命名的任务名称
public static void SetCurrentTask(ref IEngineEditor pEngineEditor, string taskName)
{
IEngineEditTask edittask;
if (pEngineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
{
switch (taskName)
{
case "新建要素":
edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
if (edittask != null)
{
pEngineEditor.CurrentTask = edittask;
}
break;
case "修改图形":
edittask = pEngineEditor.GetTaskByUniqueName("ReshapePolylineEditTask_Reshape Polyline_CSharp");
if (edittask != null)
{
pEngineEditor.CurrentTask = edittask;
}
break;
case "修改要素":
edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
if (edittask != null)
{
pEngineEditor.CurrentTask = edittask;
}
break;
}
}
}
/// <summary>
/// 撒消编辑
/// </summary>
/// <param name="m_pMap">IMap 地图对象</param>
public void MapUndoEdit(IMap m_pMap)
{
bool bHasUndos = false;
pWorkspaceEdit.HasUndos(ref bHasUndos);
if (bHasUndos)
pWorkspaceEdit.UndoEditOperation();
IActiveView pActiveView = (IActiveView)m_pMap;
pActiveView.Refresh();
}
IWorkspaceEdit pWorkspaceEdit = null;
/// <summary>
/// 重做
/// </summary>
/// <param name="m_pMap">IMap 地图对象</param>
public void MapRedoEdit(IMap m_pMap)
{
bool bHasRedos = false;
pWorkspaceEdit.HasRedos(ref bHasRedos);
if (bHasRedos)
pWorkspaceEdit.RedoEditOperation();
IActiveView pActiveView = (IActiveView)m_pMap;
pActiveView.Refresh();
}
ICommand pCmd = null;
private void tspDelete_Click(object sender, EventArgs e)
{
pCmd = new ESRI.ArcGIS.Controls.ControlsEditingClearCommandClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
private void tspCopy_Click(object sender, EventArgs e)
{
pCmd = new ControlsEditingCopyCommandClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
private void tspPaste_Click(object sender, EventArgs e)
{
pCmd = new ControlsEditingPasteCommandClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
private void tspEditAttribute_Click(object sender, EventArgs e)
{
pCmd = new ControlsEditingAttributeCommandClass();
pCmd.OnCreate(axMapControl1.Object);
axMapControl1.CurrentTool = pCmd as ITool;
pCmd.OnClick();
}
}
}
转自 http://www.cnblogs.com/yhlx125/archive/2012/02/27/2369572.html