zoukankan      html  css  js  c++  java
  • 定制 ArcEngine 要素编辑工具

    来自:http://blog.sina.com.cn/s/blog_4d780fc10101d2d5.html

    先初步了解到大概用到的下面的接口和类:

    IEngineEditor

    IEngineEditTask

    IEngineEditLayers

    IEngineEditEvents

    IEngineEditProperties

    ControlsEditingSketchToolClass

    ControlsEditingEditToolClass

    ControlsEditingCopyCommandClass

    ControlsEditingPasteCommandClass

    ControlsEditingClearCommandClass

    现在使用 IEngineEditor、IEngineEditTask、IEngineEditLayers这三个接口,再加上Command命令和Tool可以是实现新建要素、复制、剪切、黏贴、删除、移动要素。

    下面说明一下我实现新建图形功能的思路:

    1、根据workspace和map开启编辑。

    2、设置目标图层。

    3、设置编辑操作的任务类型。

    4、激活SletchTool,ControlsEditingSketchToolClass。

    5、这时就可以在AxMapControl中画图形了。图形的点线面类型,SletchTool工具会根据目标图层的类型自动识别。

    使用了全局变量IEngineEditor,保证在其他的模块该变量的值

    private IEngineEditor m_EngineEditor = new EngineEditorClass();

      private void btnNewFeature_Click(object sender, EventArgs e)

          {

    if(m_engineEditor.EditState==esriEngineEditState.esriEngineStateNotEditing)     

            {

                    //Start editing the workspace of the first feature layer found. 

                    //设置编辑的WorkSpace和编辑对象图层    

                    ILayer currentLayer = mMap.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, mMap.Map);

                        ((IEngineEditLayers)m_engineEditor).SetTargetLayer(featureLayer, 0);

                        SetCurrentTask(ref   m_engineEditor,  "新建要素");

                    }

    }

         }

             ///

            /// 设置编辑的任务类型

            ///

            ///

            /// 自己命名的任务名称

          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;

                    }

                }

            }

    删除、复制、黏贴的功能,将m_EngineEditor 置于开启编辑的状态后,直接调用下面的命令就好了

    ControlsEditingEditToolClass  //用于选择要素对像

    ControlsEditingCopyCommandClass

    ControlsEditingPasteCommandClass

    ControlsEditingClearCommandClass

     

    撤销和重做的功能

           ///

            /// 撒消编辑

            ///

            /// IMap 地图对象

            public void MapUndoEdit(IMap m_pMap)

            {

                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;

               

                IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;

                bool bHasUndos = false;

                pWorkspaceEdit.HasUndos(ref bHasUndos);

                if (bHasUndos)

                    pWorkspaceEdit.UndoEditOperation();

                IActiveView pActiveView = (IActiveView)m_pMap;

                pActiveView.Refresh();

            }

     

            ///

            /// 重做

            ///

            /// IMap 地图对象

            public void MapRedoEdit(IMap m_pMap)

            {

                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;

                IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;

                bool bHasUndos = false;

                pWorkspaceEdit.HasUndos(ref bHasUndos);

                if (bHasUndos)

                    pWorkspaceEdit.RedoEditOperation();

                IActiveView pActiveView = (IActiveView)m_pMap;

                pActiveView.Refresh();

            }  

  • 相关阅读:
    失败的项目,反思
    没人教的项目管理方法之(明白该干什么) 二、项目章程如何写(下)
    没人教的项目管理方法之(明白该干什么) 二、项目章程如何写(上)
    转载:WireShark 过滤语法
    转载:各个Linux版本的本地root密码破解方法
    w7升级旗舰版
    xmarks hosts
    Server、Workstation、Secondary Logon服务无法自启动
    windows2003,xp,RHEL 5 序列号/SN
    项目管理解决方案
  • 原文地址:https://www.cnblogs.com/gisoracle/p/4732650.html
Copyright © 2011-2022 走看看