基于插件技术的GIS应用框架(C# + ArcEngine9.3)(七)

基于插件技术的GIS应用框架(C# + ArcEngine9.3)(七)

                                --------------------------插件初始化(3)

上一小节,我们介绍了ICommand类型插件和IAxCombobox类型插件的定义及初始化过程,并以编辑任务列表为例详细剖析了列表框插件的定义及初始化,那么如何实现编辑任务列表从而让草图工具发挥作用呢,下面我们就这个问题进行深入探讨。

首先,我们来看框架中关于地图编辑引擎的声明,这个非常重要,这个编辑引擎实际上类似于ArcEngine中接口IEngineEditor的定义,只是其中的功能完全由自己来实现。

IAxMapEngine接口:

namespace AxeMap.AxeMapEngine.Interface
{
    public interface IAxMapEngine
    {

   ///事件代理接口,用以发布工作空间事件
        IAxWorkspaceEvents WorkspaceEvents { get; }
        /// 地图对象
        IMap Map { get; }
        /// 当前编辑的工作空间
        IWorkspace EditWorkspace { get; set; }
        /// 当前编辑的选择集
        IEnumFeature EditSelection { get; }
        /// 选择集的要素数目
        int SelectionCount { get; }
        /// 当前的编辑任务,由实现IAxCombobox接口的编辑任务列表进行控制
        IAxEditTask CurrentEditTask { get; set; }
        /// 当前编辑的图层,由实现IAxCombobox接口的编辑图层列表进行控制
        IFeatureLayer CurrentFeatureLayer { get; set; }

        /// 当前可撤销的操作
        string CurrentUndoName { get; }
        /// 当前可重复的操作
        string CurrentRedoName { get; }
        /// 是否有可用的重复操作
        bool HasRedos { get; }
        /// HasUndos
        bool HasUndos { get; }
        /// 是否允许拷贝操作
        bool CanCopy { get; }
        /// CanCut
        bool CanCut { get; }
        /// CanPaste
        bool CanPaste { get; }
        /// CanDelSelection
        bool CanDeleteSelection { get; }
        /// 编辑引擎是否处于编辑状态
        bool IsBeingEdited { get; }
        /// 是否有未保存的编辑
        bool HasEdits { get; }

   void UndoOperation();

   void RedoOperation();       

   void EnableUndoRedo();

   void DisableUndoRedo();       

   bool StartEditing();

   bool StartOperation();

   bool StopEditing(bool bSave);

   bool StopOperation(string sAction);

   void SaveEdits();

   void AbortOperation();

   void OnCreate(IAxApplication hook);

  ///通过传递编辑任务名称来设置编辑引擎的编辑任务

   void SetEditTask(string TaskName);

   void Copy();

   void Cut();

   void Paste();

   void DeleteSelection()

}
}

上述关于编辑引擎接口的实现类则包含在框架主程序中,而编辑插件对象只需要调用框架主程序中相应的方法即可实现相应的功能,如剪切命令插件的实现:

    public void OnClick()
        {
             _App.MapEngine.Cut();
        }

我们可以看到,剪切命令插件只需要调用编辑引擎的 Cut 方法即可完成剪切操作,而编辑引擎中相应的剪方法如下:

    public void Cut()
        {
            int iFeaCnt, iElmCnt;       
            if (!CanCut)   //根据当前编辑图层中是否设置了编辑器引擎的当前编辑图层以及图层中是否有要素被选中并且编辑引擎处于编辑状态来判断是否可以进行剪切操作,代码就不贴了。
            {
                return;
            }

       iFeaCnt = _App.FocusMap.SelectionCount;
            iElmCnt = (_App.ActiveView as IGraphicsContainerSelect).ElementSelectionCount;
            if (iFeaCnt > 0 )
            {
               CutSelectedFeatures();     //剪切Feature 具体代码就不贴了
            }
            if (iElmCnt > 0)
            {
               CutSelectedElements();     //剪切Element
            }       
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值