zoukankan      html  css  js  c++  java
  • ArcEngine编辑功能的实现(二)

    这里给出采用混合模式开发编辑工具条的完整代码,但是没有给出界面,相信熟悉ArcGIS操作的朋友一定可以设计出类似的界面。功能还有不少不完善的地方,希望感兴趣的朋友可以帮忙改进!

    View Code
      1 using System;
    2 using System.Collections.Generic;
    3 using System.ComponentModel;
    4 using System.Data;
    5 using System.Drawing;
    6 using System.Linq;
    7 using System.Text;
    8 using System.Windows.Forms;
    9 using ESRI.ArcGIS.Controls;
    10 using ESRI.ArcGIS.Carto;
    11 using ESRI.ArcGIS.esriSystem;
    12 using ESRI.ArcGIS.Geodatabase;
    13 using System.Collections;
    14 using ESRI.ArcGIS.SystemUI;
    15 using MapDataViewAndControlLib;
    16
    17 namespace GEditor
    18 {
    19 public partial class EditFrm : Form
    20 {
    21 public EditFrm()
    22 {
    23 InitializeComponent();
    24 }
    25 private IEngineEditor m_EngineEditor = new EngineEditorClass();
    26 private IEngineEditEvents_Event m_EngineEditEvent_Event;
    27 private void Form1_Load(object sender, EventArgs e)
    28 {
    29 axTOCControl1.SetBuddyControl(axMapControl1);
    30 axToolbarControl1.SetBuddyControl(axMapControl1);
    31   
    32 //添加与数据相关的工具条,包括打开文档、保存文档、添加数据、放大、缩小、漫游、全显、上一视图
    33 axToolbarControl1.AddItem("esriControls.ControlsOpenDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    34 axToolbarControl1.AddItem("esriControls.ControlsSaveAsDocCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    35 axToolbarControl1.AddItem("esriControls.ControlsAddDataCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    36 axToolbarControl1.AddItem("esriControls.ControlsMapZoomInTool", 0, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
    37 axToolbarControl1.AddItem("esriControls.ControlsMapZoomOutTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    38 axToolbarControl1.AddItem("esriControls.ControlsMapPanTool", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    39 axToolbarControl1.AddItem("esriControls.ControlsMapFullExtentCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    40 axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentBackCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    41 axToolbarControl1.AddItem("esriControls.ControlsMapZoomToLastExtentForwardCommand", 0, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
    42
    43 m_Map = axMapControl1.Map;
    44 InitializeEditorState();
    45 }
    46 private void InitializeEditorState()
    47 {
    48 tspCurrentTask.Items.Add("新建要素");
    49 tspCurrentTask.Items.Add("修改要素");
    50
    51 tspCopy.Enabled = false;
    52 tspDelete.Enabled = false;
    53 tspPaste.Enabled = false;
    54 tspRedo.Enabled = false;
    55 tspUndo.Enabled = false;
    56 tspSketch.Enabled = false;
    57 tspEdit.Enabled = false;
    58 tspSaveEdit.Enabled = false;
    59 tspStopEdit.Enabled = false;
    60 tspSketch.Enabled = false;
    61 tspEdit.Enabled = false;
    62 tspCurrentLayer.Enabled = false;
    63 tspCurrentTask.Enabled = false;
    64
    65 }
    66 IMap m_Map = null;
    67 private void tspStartEdit_Click(object sender, EventArgs e)
    68 {
    69 #region 开始编辑状态
    70 if (m_Map.LayerCount==0)
    71 {
    72 MessageBox.Show("没有图层!");
    73 return;
    74 }
    75 for (int i = 0; i < m_Map.LayerCount ; i++)
    76 {
    77 ILayer pLayer = m_Map.get_Layer(i);
    78 if (pLayer is IFeatureLayer)
    79 {
    80 tspCurrentLayer.Items.Add(pLayer.Name);
    81
    82 }
    83 }
    84
    85 tspStartEdit.Enabled = false;
    86 tspSaveEdit.Enabled = true;
    87 tspStopEdit.Enabled = true;
    88 tspSketch.Enabled = false;
    89 tspEdit.Enabled = false;
    90 tspCurrentLayer.Enabled = true;
    91 tspCurrentTask.Enabled = true;
    92 tspCurrentLayer.SelectedIndex = 0;
    93 tspCurrentTask.SelectedIndex = 0;
    94 if (m_EngineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing)
    95 {
    96 //Start editing the workspace of the first feature layer found.
    97 //设置编辑的WorkSpace和编辑对象图层
    98 ILayer currentLayer = m_Map.get_Layer(0);
    99 if (currentLayer is IFeatureLayer)
    100 {
    101 IFeatureLayer featureLayer = currentLayer as IFeatureLayer;
    102 IDataset dataset = featureLayer.FeatureClass as IDataset;
    103 IWorkspace workspace = dataset.Workspace;
    104 m_EngineEditor.StartEditing(workspace, m_Map);
    105 m_EngineEditEvent_Event = m_EngineEditor as IEngineEditEvents_Event;
    106 m_EngineEditEvent_Event.OnCurrentTaskChanged += new IEngineEditEvents_OnCurrentTaskChangedEventHandler(m_EngineEditEvent_Event_OnCurrentTaskChanged);
    107 m_EngineEditEvent_Event.OnSelectionChanged += new IEngineEditEvents_OnSelectionChangedEventHandler(m_EngineEditEvent_Event_OnSelectionChanged);
    108 m_EngineEditEvent_Event.OnSketchModified += new IEngineEditEvents_OnSketchModifiedEventHandler(m_EngineEditEvent_Event_OnSketchModified);
    109 }
    110
    111 }
    112
    113 #endregion
    114 }
    115 private void tspSaveEdit_Click(object sender, EventArgs e)
    116 {
    117 pCmd = new ESRI.ArcGIS.Controls.ControlsEditingSaveCommandClass();
    118 pCmd.OnCreate(axMapControl1.Object);
    119 axMapControl1.CurrentTool = pCmd as ITool;
    120 pCmd.OnClick();
    121 }
    122 private void tspStopEdit_Click(object sender, EventArgs e)
    123 {
    124 if (m_EngineEditor.HasEdits() == false)
    125 m_EngineEditor.StopEditing(false);
    126 else
    127 {
    128 if (MessageBox.Show("保存编辑?", "保存选项", MessageBoxButtons.YesNo)
    129 == DialogResult.Yes)
    130 {
    131 m_EngineEditor.StopEditing(true);
    132
    133 }
    134 else
    135 {
    136 m_EngineEditor.StopEditing(false);
    137
    138 }
    139 }
    140 tspStartEdit.Enabled = true;
    141 tspCopy.Enabled = false;
    142 tspDelete.Enabled = false;
    143 tspPaste.Enabled = false;
    144 tspRedo.Enabled = false;
    145 tspUndo.Enabled = false;
    146 tspSketch.Enabled = false;
    147 tspEdit.Enabled = false;
    148 tspSaveEdit.Enabled = false;
    149 tspStopEdit.Enabled = false;
    150 tspSketch.Enabled = false;
    151 tspEdit.Enabled = false;
    152 tspCurrentLayer.SelectedIndex = -1;
    153 tspCurrentTask.SelectedIndex = -1;
    154 tspCurrentLayer.Enabled = false;
    155 tspCurrentTask.Enabled = false;
    156
    157 }
    158 private void tspEdit_Click(object sender, EventArgs e)
    159 {
    160 pCmd = new ControlsEditingEditToolClass();
    161 pCmd.OnCreate(axMapControl1.Object);
    162 axMapControl1.CurrentTool = pCmd as ITool;
    163 pCmd.OnClick();
    164
    165
    166 }
    167
    168 void m_EngineEditEvent_Event_OnSketchModified()
    169 {
    170
    171 IEngineEditProperties ep = new EngineEditorClass();
    172 ILayer m_pCurrentLayer = ep.TargetLayer;
    173 if (m_pCurrentLayer == null) return;
    174 IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;
    175 IDataset pDataset = (IDataset)pFeatureLayer.FeatureClass;
    176 if (pDataset == null) return;
    177 pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;
    178 bool bHasUndos = false;
    179 pWorkspaceEdit.HasUndos(ref bHasUndos);
    180 if (bHasUndos)
    181 tspUndo.Enabled = true;
    182 else
    183 tspUndo.Enabled = false;
    184
    185 bool bHasRedos = false;
    186 pWorkspaceEdit.HasRedos(ref bHasRedos);
    187 if (bHasRedos)
    188 tspRedo.Enabled = true;
    189 else
    190 tspRedo.Enabled = false;
    191 }
    192
    193 void m_EngineEditEvent_Event_OnSelectionChanged()
    194 {
    195 if (m_EngineEditor.SelectionCount==0)
    196 {
    197 tspCopy.Enabled = false;
    198 tspDelete.Enabled = false;
    199 tspPaste.Enabled = false;
    200 if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
    201 tspSketch.Enabled = false;
    202 }
    203 else
    204 {
    205 tspCopy.Enabled = true;
    206 tspDelete.Enabled = true;
    207 tspPaste.Enabled = true;
    208 if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
    209 tspSketch.Enabled = true;
    210 else if (m_EngineEditor.CurrentTask.Name == "Create New Feature")
    211 tspSketch.Enabled = true;
    212 }
    213
    214 }
    215
    216 void m_EngineEditEvent_Event_OnCurrentTaskChanged()
    217 {
    218 if (m_EngineEditor.CurrentTask.Name == "Create New Feature")
    219 {
    220 tspCurrentTask.SelectedIndex = 0;
    221 }
    222 else if (m_EngineEditor.CurrentTask.Name == "Modify Feature")
    223 {
    224 tspCurrentTask.SelectedIndex = 1;
    225 }
    226
    227 MessageBox.Show(m_EngineEditor.CurrentTask.Name+m_EngineEditor.TaskCount.ToString());
    228 }
    229
    230
    231 private void tspSketch_Click(object sender, EventArgs e)
    232 {
    233 pCmd = new ControlsEditingSketchToolClass();
    234 pCmd.OnCreate(axMapControl1.Object);
    235 axMapControl1.CurrentTool = pCmd as ITool;
    236 pCmd.OnClick();
    237 }
    238 private void tspRedo_Click(object sender, EventArgs e)
    239 {
    240 MapRedoEdit(m_Map);
    241 bool bHasUndos = false;
    242 pWorkspaceEdit.HasUndos(ref bHasUndos);
    243 if (bHasUndos)
    244 tspUndo.Enabled = true;
    245 else
    246 tspUndo.Enabled = false;
    247
    248 }
    249 private void tspUndo_Click(object sender, EventArgs e)
    250 {
    251 MapUndoEdit(m_Map);
    252 bool bHasRedos = false;
    253 pWorkspaceEdit.HasRedos(ref bHasRedos);
    254 if (bHasRedos)
    255 tspRedo.Enabled = true;
    256 else
    257 tspRedo.Enabled = false;
    258
    259 }
    260 private void tspCurrentTask_SelectedIndexChanged(object sender, EventArgs e)
    261 {
    262 switch (tspCurrentTask.Text)
    263 {
    264 case "新建要素":
    265 SetCurrentTask(ref m_EngineEditor, "新建要素");
    266 tspSketch.Enabled = true;
    267 tspEdit.Enabled = true;
    268
    269 break;
    270 case "修改要素":
    271 SetCurrentTask(ref m_EngineEditor, "修改要素");
    272 if (m_EngineEditor.SelectionCount==0)
    273 {
    274 tspSketch.Enabled = false;
    275 tspEdit.Enabled = true;
    276 }
    277 else
    278 {
    279 tspSketch.Enabled = true;
    280 tspEdit.Enabled = true;
    281 }
    282
    283 break;
    284
    285 }
    286 }
    287 private void tspCurrentLayer_SelectedIndexChanged(object sender, EventArgs e)
    288 {
    289 if (tspCurrentLayer.SelectedIndex!=-1)
    290 {
    291 IFeatureLayer pCurrentLyr = m_Map.get_Layer(tspCurrentLayer.SelectedIndex) as IFeatureLayer;
    292 ((IEngineEditLayers)m_EngineEditor).SetTargetLayer(pCurrentLyr, 0);
    293 }
    294
    295 }
    296 /// <summary>
    297 /// 设置编辑的任务类型
    298 /// </summary>
    299 /// <param name="pEngineEditor"></param>
    300 /// <param name="taskName"></param>自己命名的任务名称
    301 public static void SetCurrentTask(ref IEngineEditor pEngineEditor, string taskName)
    302 {
    303
    304 IEngineEditTask edittask;
    305 if (pEngineEditor.EditState == esriEngineEditState.esriEngineStateEditing)
    306 {
    307 switch (taskName)
    308 {
    309 case "新建要素":
    310 edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_CreateNewFeatureTask");
    311 if (edittask != null)
    312 {
    313 pEngineEditor.CurrentTask = edittask;
    314 }
    315 break;
    316 case "修改图形":
    317 edittask = pEngineEditor.GetTaskByUniqueName("ReshapePolylineEditTask_Reshape Polyline_CSharp");
    318 if (edittask != null)
    319 {
    320 pEngineEditor.CurrentTask = edittask;
    321 }
    322 break;
    323 case "修改要素":
    324 edittask = pEngineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
    325 if (edittask != null)
    326 {
    327 pEngineEditor.CurrentTask = edittask;
    328 }
    329 break;
    330
    331 }
    332 }
    333 }
    334 /// <summary>
    335 /// 撒消编辑
    336 /// </summary>
    337 /// <param name="m_pMap">IMap 地图对象</param>
    338 public void MapUndoEdit(IMap m_pMap)
    339 {
    340 bool bHasUndos = false;
    341 pWorkspaceEdit.HasUndos(ref bHasUndos);
    342 if (bHasUndos)
    343 pWorkspaceEdit.UndoEditOperation();
    344 IActiveView pActiveView = (IActiveView)m_pMap;
    345 pActiveView.Refresh();
    346
    347 }
    348 IWorkspaceEdit pWorkspaceEdit = null;
    349 /// <summary>
    350 /// 重做
    351 /// </summary>
    352 /// <param name="m_pMap">IMap 地图对象</param>
    353 public void MapRedoEdit(IMap m_pMap)
    354 {
    355 bool bHasRedos = false;
    356 pWorkspaceEdit.HasRedos(ref bHasRedos);
    357 if (bHasRedos)
    358 pWorkspaceEdit.RedoEditOperation();
    359 IActiveView pActiveView = (IActiveView)m_pMap;
    360 pActiveView.Refresh();
    361 }
    362 ICommand pCmd = null;
    363 private void tspDelete_Click(object sender, EventArgs e)
    364 {
    365 pCmd = new ESRI.ArcGIS.Controls.ControlsEditingClearCommandClass();
    366 pCmd.OnCreate(axMapControl1.Object);
    367 axMapControl1.CurrentTool = pCmd as ITool;
    368 pCmd.OnClick();
    369
    370 }
    371
    372 private void tspCopy_Click(object sender, EventArgs e)
    373 {
    374 pCmd = new ControlsEditingCopyCommandClass();
    375 pCmd.OnCreate(axMapControl1.Object);
    376 axMapControl1.CurrentTool = pCmd as ITool;
    377 pCmd.OnClick();
    378
    379 }
    380
    381 private void tspPaste_Click(object sender, EventArgs e)
    382 {
    383 pCmd = new ControlsEditingPasteCommandClass();
    384 pCmd.OnCreate(axMapControl1.Object);
    385 axMapControl1.CurrentTool = pCmd as ITool;
    386 pCmd.OnClick();
    387 }
    388
    389 private void tspEditAttribute_Click(object sender, EventArgs e)
    390 {
    391 pCmd = new ControlsEditingAttributeCommandClass();
    392 pCmd.OnCreate(axMapControl1.Object);
    393 axMapControl1.CurrentTool = pCmd as ITool;
    394 pCmd.OnClick();
    395 }
    396
    397 }
    398 }

    声明:该程序是本人利用周末时间开发的程序,大家可以用作学习之用。

    感谢http://www.gisall.com/html/52/25952-2752.html lifengling353博主,文中很多代码都借鉴了你的博文!

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    [转]狼的故事8:生存就是坚持
    [转]狼的故事7:单枪匹马的代价
    如何在GridView的Footer内显示总计?
    javascript中如何正确将日期(Date)字符串转换为日期(Date)对象?
    无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构
    [转]狼的故事12:王者的风范
    [转]狼的故事2:光线背后的嚎叫
    vs.net2008正式版发布并提供下载(英文版)
    [转]狼的故事11:以牙还牙
    [转]狼的故事3:百分之百的死亡
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2369572.html
Copyright © 2011-2022 走看看