2011年5月25日星期三

  ArcEngine9.3编辑工具条的实现

Technorati 标签: 转载

        相对与9.2版本,Engine9.3主要在地图编辑(Editing)、网络分析(NetworkAnalyst)和追踪分析(Tracking Analyst)方面做了一些改进。此外,9.3还比之前的版本提供了3-4倍的演示实例,在DevlopKit下的例子大概有150多个,看来ESRI还是在Engine上下了些功夫。详细可参见开发帮助的What's new for ArcGIS Engine developers at 9.3?
       9.3之前的版本要写一个理想的自定义编辑工具是比较有难度的。包括一个有效率的节点捕捉工具。一般都是用IworkSpaceEdit接口来实现。最近手头上正好有个9.1版本的编辑工具要修改,代码大概在1万行左右。考虑到9.3在编辑方面的提高,所以先熟悉了一下9.3的新编辑类EngineEditor。再结合以前采用ToolBarControl共享命令池ICommandPool和操作栈IoperationStack的方式。制作了一个简单可行的编辑工具条,包括自定义的节点编辑工具在内,代码在1千行左右。

具体要点为:
1. 每一个自定义编辑工具封装为一个icommand 或者itoolbar类,功能类似的两个工具如添加节点和删除节点可封装在一个继承IcomandSubType的类中。
2. 初始化编辑类EngineEditor。

//engineEditor是singleton类,只能有一个实例

m_engineEditor = new EngineEditorClass();

m_engineEditor.EnableUndoRedo(true);

m_engineEditor.StartEditing(pWS, m_mapControl.Map);

3. 构建一个ToolbarControl,设置其操作栈和命令池。最后将操作栈连接到EngineEditor。

m_toolbarControl = new ToolbarControlClass();

m_toolbarControl.SetBuddyControl(m_mapControl.Object);

//必须初始化命令池和操作栈, 否则出错。

//这个过程类似于在窗体中拖一个AxToolBarControl;

m_pool = new CommandPoolClass();

m_toolbarControl.CommandPool = m_pool;

if (m_operationStack == null)

{

m_operationStack = new ControlsOperationStack();

}

m_operationStack.Reset();

m_toolbarControl.OperationStack = m_operationStack;

IExtension engineEditorExt = m_engineEditor as IExtension;

object obj = (object)m_toolbarControl.Object;

engineEditorExt.Startup(ref obj);

4. 将自定义的编辑工具或者Out-Of-Box工具添加到Toolbarcontrol中,在自定义按钮事件中获取ToolBarControl中的命令。        ICommand cmd = m_toolbarControl.GetItem(3).Command;
            m_mapControl.CurrentTool = (ITool)cmd;

5. 为了实时更新工具栏中按钮的Enabled属性与ToolBarControl中的同步,必须声明一个MapControl.AfterDraw委托,在地图刷新的时候更新一次。这么做主要起到保持编辑逻辑防止误操作,以及实时更新”撤消Undo”和”重做Redo”按钮的可用性。

private IMapControlEvents2_OnAfterDrawEventHandler m_onAfterDraw;

m_onAfterDraw = new IMapControlEvents2_OnAfterDrawEventHandler(OnMapAfterDraw);

((IMapControlEvents2_Event)m_mapControl).OnAfterDraw += new IMapControlEvents2_OnAfterDrawEventHandler(m_onAfterDraw);

当然,在结束编辑时要注销掉这个事件:

((IMapControlEvents2_Event)m_mapControl).OnAfterDraw -= new IMapControlEvents2_OnAfterDrawEventHandler(m_onAfterDraw);

5. m_onAfterDraw中要做的事便是:
       m_barManager.Items["XX"].Enabled = m_toolbarControl.GetItem(i).Command.Enabled;

来自: http://hi.baidu.com/murphy1314/blog/item/f59e85116f0e5b18b9127ba8.html

没有评论:

发表评论