ArcEngine編輯功能的實現(二)

<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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章