ArcEngine 编辑工具条实现


文章出处

此部分为编辑SDE数据而作的工具条,代码不完全,但是看看一般可以自己解决其余部分。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DataSourcesGDB;

namespace BZZDTQ
{
   public class MapEdit
    {
        private AxToolbarControl m_ToolbarControl;
        private dataBasePartments dbp;
        private IEngineEditor m_engineEditor;
        private IOperationStack m_operationStack;
        private IMapControl3 m_MapControl = null;
        private ICommandPool m_pool;
        private IFeatureLayer m_CurrentLayer;
        private string m_dataSetName;
       private string m_AppPath;

        public MapEdit()
        {

        }
        public MapEdit(AxToolbarControl toolbarControl,IMapControl3 mapControl)
        {
            m_ToolbarControl = toolbarControl;
            m_MapControl = mapControl;
            m_CurrentLayer = new FeatureLayerClass();

            m_ToolbarControl.AddItem("esriControls.ControlsEditingEditorMenu", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsEditingEditTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsEditingSketchTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsUndoCommand", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsRedoCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsEditingTargetToolControl", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsEditingTaskToolControl", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsUndoCommand", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            m_ToolbarControl.AddItem("esriControls.ControlsRedoCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

            m_pool = new CommandPoolClass();
            m_ToolbarControl.CommandPool = m_pool;
            m_operationStack = new ControlsOperationStackClass();
            m_ToolbarControl.OperationStack = m_operationStack;
            m_ToolbarControl.SetBuddyControl(m_MapControl);

            m_engineEditor = new EngineEditorClass();
            m_engineEditor.EnableUndoRedo(true);
            ((IEngineEditProperties2)m_engineEditor).StickyMoveTolerance = 100000;
            object tbr = (object)m_ToolbarControl.Object;
            IExtension engineEditorExt = m_engineEditor as IExtension;
            engineEditorExt.Startup(ref tbr);
        }
        public void SetDataset(string dataset)
        {
            m_dataSetName = dataset;
        }
        public void StartEdit()
        {
            m_CurrentLayer.FeatureClass = FindClassByName(m_CurrentLayer.FeatureClass.AliasName, m_dataSetName);
            m_engineEditor.StartEditing(((IDataset)m_CurrentLayer.FeatureClass).Workspace, m_MapControl.Map);
            IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
            editLayer.SetTargetLayer(m_CurrentLayer, 0);

            //setbut
        }
        public void SaveEdit()
        {
            m_engineEditor.StopEditing(true);
            StartEdit();
        }
        public void StopEdit(bool save)
        {
            m_engineEditor.StopEditing(save);
        }
        public void SetTargetLayer( string layerName)
        {
            string featureclassName = null;
            for (int i = 0; i < m_MapControl.Map.LayerCount; i++)
            {
                if (layerName == m_MapControl.Map.get_Layer(i).Name)
                    featureclassName = ((IFeatureLayer)m_MapControl.Map.get_Layer(i)).FeatureClass.AliasName;
            }
            if (featureclassName == null)
            {
                IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
                editLayer.SetTargetLayer(null, 0);
                return;
            }
            m_CurrentLayer.Name = layerName;
            m_CurrentLayer.FeatureClass = FindClassByName(featureclassName, m_dataSetName);
            if (m_CurrentLayer != null && m_engineEditor.EditState==esriEngineEditState.esriEngineStateEditing)
            {
                IEngineEditLayers editLayer = m_engineEditor as IEngineEditLayers;
                editLayer.SetTargetLayer(null,0);
                editLayer.SetTargetLayer(m_CurrentLayer, 0);
                return;
            }
        }
       public bool IsEditing()
       {
           if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing) return false;
           else return true;
       }
       public IEngineEditor GetEngineEditor()
       {
           return m_engineEditor;
       }
        public ICommandPool GetCommandPool()
        {
            return m_pool;
        }
        public void OnEditTool()
        {
            m_ToolbarControl.CurrentTool = m_ToolbarControl.GetItem(1).Command as ITool;
        }
        public void OnSketchTool()
        {
            m_ToolbarControl.CurrentTool = m_ToolbarControl.GetItem(2).Command as ITool;
        }
        public IOperationStack GetOperationStack()
        {
            return m_operationStack;
        }
        public bool HasEdit()
        {
            return m_engineEditor.HasEdits();
        }
        public void Undo()
        {
            ICommand command = m_ToolbarControl.GetItem(7).Command;
            command.OnClick();
        }
        public void Redo()
        {
            ICommand command = m_ToolbarControl.GetItem(8).Command;
            command.OnClick();
        }
        public void SetCurrentTask(string taskName)
        {
            IEngineEditTask edittask ;
            if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
            {
                switch (taskName)
                {
                    case "Create New Feature":

                       edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
                        if (edittask != null)
                        {
                            m_engineEditor.CurrentTask = edittask;
                        }
                        break;
                    case "Modify Feature":

                        edittask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
                        if (edittask != null)
                        {
                            m_engineEditor.CurrentTask = edittask;
                        }
                        break;
                }

            }
        }
    
        public IFeatureLayer GetCurLayer()
        {
            return m_CurrentLayer;
        }

        private bool IsLayerEditValid(string layerName)
        {

            //put in all business logic here
            //In this example highways are not allowed to intersect the lakes layer
            bool success = true;

            //get the edit sketch
            IEngineEditSketch editsketch = (IEngineEditSketch)m_engineEditor;

            //get the protected areas layer
            IFeatureLayer fLayer = FindFeatureLayer(layerName);
            if (fLayer == null) success = false;
            //do a spatial filter 
            if ((editsketch != null) && (fLayer != null) && (editsketch.Geometry != null))
            {
                IFeatureCursor cursor = FindFeatures(editsketch.Geometry, fLayer.FeatureClass, esriSpatialRelEnum.esriSpatialRelIntersects, m_MapControl.Map);
                IFeature feature = cursor.NextFeature();

                //could put more sophistictated logic in here
                if (feature != null)
                    success = false;
            }

            return success;

        }
        private IFeatureLayer FindFeatureLayer(string name)
        {

            IFeatureLayer foundLayer = null;
            IDataset dataset = null;
            IMap map = m_MapControl.Map;

            for (int i = 0; i < map.LayerCount; i++)
            {
                IFeatureLayer layer = map.get_Layer(i) as IFeatureLayer;
                if (layer != null)
                {
                    dataset = (IDataset)layer.FeatureClass;
                    if (layer.Name == name)
                    {
                        foundLayer = layer;
                        break;
                    }
                }
            }

            return foundLayer;
        }

        private IFeatureCursor FindFeatures(IGeometry geometry, IFeatureClass featureClass, esriSpatialRelEnum spatialRelationship, IMap map)
        {
            //1 = esriSpatialRelIntersects
            //7 = esriSpatialWithin
            //8 = esriSpatialRelContains

            ISpatialFilter spatialFilter = new SpatialFilter();
            spatialFilter.Geometry = geometry;
            spatialFilter.set_OutputSpatialReference(featureClass.ShapeFieldName, map.SpatialReference);
            spatialFilter.GeometryField = featureClass.ShapeFieldName;
            spatialFilter.SpatialRel = spatialRelationship;

            IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false);
            return featureCursor;
        }
        public IWorkspace FindWsByDefault()
        {
            
            dbp = new dataBasePartments();
            IPropertySet propSet = new PropertySetClass();

            propSet.SetProperty("Server", dbp.getSDEserver());

            propSet.SetProperty("Instance", dbp.getSDEport());

            propSet.SetProperty("Database", dbp.getSDEdatabase());

            propSet.SetProperty("User", dbp.getSDEuser());

            propSet.SetProperty("Password", dbp.getSDEpwd());
            propSet.SetProperty("Version", dbp.getSDEversion());

 

            IWorkspaceFactory factory = new SdeWorkspaceFactoryClass();

            IWorkspace workspace = factory.Open(propSet, 0);

            return workspace;

        }

        //查找指定要素
        public IFeatureClass FindClassByName(IWorkspace ws, string className, string dsName)
        {
            IEnumDataset enumDs;
            if (dsName != "")
            {
                enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureDataset);
                IFeatureDataset featureDs = enumDs.Next() as IFeatureDataset;
                while (featureDs != null)
                {
                    if (featureDs.Name == dsName)
                    {
                        return GetFcFromDataset(featureDs, className);
                    }
                    featureDs = enumDs.Next() as IFeatureDataset;
                }
            }
            else
            {
                enumDs = ws.get_Datasets(esriDatasetType.esriDTFeatureClass);
                return GetFcFromEnumDataset(enumDs, className);
            }
            return null;
        }

        //在数据集中查找要素类
        private IFeatureClass GetFcFromDataset(IFeatureDataset featDs, string className)
        {
            IFeatureClass featClass;
            IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
            for (int i = 0; i < fcContainer.ClassCount; i++)
            {
                featClass = fcContainer.get_Class(i);
                if (featClass.AliasName == className)
                {
                    return featClass;
                }
            }
            return null;
        }
        //在要素类集合中查找要素类
        private IFeatureClass GetFcFromEnumDataset(IEnumDataset enumDs, string className)
        {
            IFeatureClass featClass = enumDs.Next() as IFeatureClass;
            while (featClass != null)
            {
                if (featClass.AliasName == className)
                {
                    return featClass;
                }
                featClass = enumDs.Next() as IFeatureClass;
            }
            return null;
        }

        //通过要素类名和数据集名在指定的工作空间中寻找要素类
        public IFeatureClass FindClassByName(string className, string datasetName)
        {
            IWorkspace ws = FindWsByDefault();
            IFeatureClass featClass = FindClassByName(ws, className, datasetName);
            return featClass;
        }

    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM