我已经出离的愤怒了,对于这个问题一年半以前曾经研究过,上过学期又回过头来弄过,但是到现在我仍然没有像样的把这个问题解决掉!所以下定决心抽一点时间把这个问题解决一下。不求做出来的东西功能多么全面,但求弄够实现基本功能!
参考了一些代码,但是还是没有完全得到要领!目前开发ArcGIS编辑模块有两种方式:一种是用IEngineEditor接口。
先来实践混合用的,http://www.gisall.com/html/52/25952-2752.html 文中提出:
EditTool用ControlsEditingEditToolClass |
分析ArcGIS编辑工具条的功能,发现Edit Tool单击时当前的任务为Create New Feature,双击时为Modify Feature。仔细观察:
起始:开始编辑高亮,其他按钮全灰。默认任务状态“Create New Feature新建要素”。 开始编辑:停止编辑,保存编辑高亮,Edit和Sketch按钮高亮。Edit按钮选中,当前图层和当前任务选择框高亮,当前图层为第一个图层。 创建要素状态:选择Sketch创建要素;选择Edit按钮,单击选择要素,双击进入“Modify Feature”。 修改要素状态:Edit按钮默认选中。点击要素,Sketch按钮高亮,可以移动节点。选择Sketch可以接着最后节点绘制。 |
在帮助文档中知道EngineEditor是singleton object,这个很重要啊!
在How to listen to edit events帮助可以看到下面一句话:
In .NET, event interfaces are automatically suffixed with _Event by the type library importer. |
IEngineEditEvents_Event事件接口,通过Iengineditor接口跳转访问。这里思考一下“事件”,“事件”起作用关建还是他订阅的方法不是吗?那么我如果将事件订阅自己定义的方法不是可以实现很多东西吗?“事件”可不是单单用户点击鼠标键盘这样的才叫事件啊,类也可以定义“事件”,可以定义“事件”订阅的方法。EngineEditor的事件应该包装了AxMapControl的MouseDown、MouseMove、DoubleClick等事件(个人理解)。EngineEditor实际应该是和界面分离的,如何实现编辑功能与编辑工具条的状态的联动是很关键的,所以一个思路就是将IEngineEditor的事件订阅自己定义的方法来实现界面状态的联动。(计划重新学习委托和事件):
IEngineEditEvents内部接口,实现了事件订阅的方法(个人理解!)
通过EngineEditor完全可以实现编辑的所有功能。IEngineEditor可能对IWorkspaceEdit接口进行了调用(个人理解,以后如果有新的想法在说。)开发工作正在进行,参考引文撤销和重做功能按钮就是通过IWorkspaceEdit来实现的,这样只能在绘制新要素完成和编辑完成之后进行重做和撤销,而ArcGIS中可以实现在编辑中的撤销操作。所以有用ToolBar的OperateStack来实现撤销和重做的,目前撤销和重做采用IWorkspaceEdit实现,所以是混合了IEngineEditor和IWorkspaceEdit。而且按照自己的思路开发是可行的。(2012-02-26——11:30:12)
另外一种是用IWorkspaceEdit接口http://www.cnblogs.com/aplsc/archive/2008/08/31/1280594.html,决定尝试一下。