本文共 6156 字,大约阅读时间需要 20 分钟。
作者: 小卒
发现很多用户在使用SuperMap iDesktop 8C时,由于行业需求的不同,使得他们不仅仅满足于现有的桌面环境,想进行扩展开发定制更适用自己项目的功能和插件,但是好多都是小白级别的,对于插件开发一头雾水,不知从何下手。接下来我就简单的谈谈如何进行SuperMap iDesktop 8C的插件开发。
1、认识 SuperMap iDesktop 8C 虽然一些SuperMap用户了解SuperMap iDesktop 8C,但是我在这里还是需要简单介绍下SuperMap iDesktop 8C,对于插件开发的学习,了解SuperMap iDesktop 8C是很有必要的。SuperMap iDesktop 8C 是一款企业级插件式桌面GIS应用与开发平台,可以高效的进行各种GIS数据处理、分析、二三维制图及发布等操作。基于它可以快速搭建自己的桌面GIS应用平台。 SuperMap iDesktop 8C 是通过 SuperMap iObjects .NET 8C 、桌面核心库和 .NET Framework 4.0 构建的插件式 GIS 应用,能够满足用户的不同需求。 SuperMap iDesktop 8C 分为 x64(64位)和 x86(32位)两个产品。 对于SuperMap iDesktop 8C来说,可以设置自己的工作环境,工作环境保存的路径为SuperMap iDesktop 8C的安装目录\WorkEnvironment\Default中的config文件中,对于插件开发,搭建好的环境必须要保存在该目录下,在SuperMap桌面中才可以看到,所搭建好的工作环境,比如新添加的按钮、下拉框等等。但是这个只是一个框架,不会实现功能,其要实现功能,还需要一个运行库(.DLL)文件,该文件存放在SuperMap iDesktop 8C的安装目录\Bin\Plugins下对应的文件夹中。综上所述,插件的配置,必须要有两个文件:config文件和运行库(.DLL)文件。 2、配置插件 我们时常拿一些别人做好的插件,来应用在自己的工程中,对于SuperMap iDesktop 8C如何配置插件:一般我们拿到的是dll和config文件,我们只需要将其放在上面所讲的位置即可,有时我们拿到的只是一个dll文件,这时我们需要编写config文件,然后将其放在对象的路径即可。 3、开发基础-关键对象 •Applicaton 是应用程序的定义。是组成桌面的基础。 Application 类对象管理的内容包括:工作空间(Workspace),用于管理应用程序内的插件的插件管理器(PluginManager),代码段编译执行器(IScript),应用程序的主窗口(IFormMain),应用程序的启动界面(ISplashForm)以及应用程序的输出信息方面的管理。 图:Application 类结构图 Application 类中提供了两个全局对象,分别为 Application.ActiveApplication 和 Application.ActiveForm,用于获取应用程序当前活动的 Application 和当前活动的窗口。 •插件相关对象模型 每一个应用程序都包含了一个插件管理器(PluginManager),用于管理应用程序内的插件。 图:插件相关对象模型 •窗体相关对象模型 窗体部分的对象模型主要提供的功能包括:多文档的支持、多种类型窗口的支持、子窗口的管理、各个窗口如何对外提供功能、浮动窗口的支持和管理以及主题外观设计等。在窗体设计上,SuperMap iDesktop 8C提供一个统一的基础接口IForm 图:窗体相关对象模型 •Ribbon 控件相关对象模型 SuperMap iDesktop 8C实现了界面和功能的分离,各类Ribbon 控件的生成由内部实现。 图:Ribbon 控件相关对象模型 4、注册/反注册桌面开发环境 有些客户时常问,为什么我的VS新建项目时没找到“SuperMap Desktop Plugin”。 这主要是因为没有注册桌面开发环境,SuperMap iDesktop 8C 产品提供了一个注册工具,该工具可以在 Visual Studio 中集成一系列桌面开发需要使用的环境。注册工具在产品中的位置为:“安装目录/Tools/SuperMap.Tools.RegisterTemplate.exe”。详细内容查看联机帮助中的注册/反注册桌面开发环境 5、快速入门 开发思路:分析功能需求—确定扩展方式—界面设计—确定使用的模块-对象-接口—生成插件相关文件 现在我们以 Visual Studio 2012 为例进行介绍,首先我们做一个简单的输出数据集范围的程序:在【数据】选项卡-【数据集】组中增加一个功能按钮“输出数据集范围”,把当前选中的数据集范围,输出到输出窗口中: 1.首先启动 Visual Studio 2012新建工程。 执行“文件”->“新建项目”弹出下图窗口,“项目类型”选择“Visual C#”,“模板”选择“SuperMap Desktop Plugin”。设置“名称”,并选择一个工程存放路径,然后单击“确定”按钮新建工程。 2.更改项目属性 用SuperMap Deskpro Plugin模板新建的项目,默认的项目属性均已配置好,包括项目输出路径、调试状态下启用的外部程序和编译时配置文件复制到的位置等,一般情况下不需要修改。但本例中将要介绍用SUperMap iDesktop 8C的“工作环境设计”功能配置界面,这样便不需要使用.config文件配置界面。请按如下步骤取消.config文件的作用。 1)、选择工程的属性,弹出对话框 2)、选择“生成”选项卡,设置输出路径为SuperMap iDesktop 8C的安装目录\Bin\Plugins下对应的文件夹中 3)、选择生成事件选项卡,将“后期生成事件命令行(0):”中已有的字符串清空,单击工具栏上的的保存按钮保存配置信息。(这个里面的内容是生成工程时自动在SuperMap iDesktop 8C的安装目录\WorkEnvironment\Default中生成对应的config文件。) 3.添加引用 本例中需要用到SuperMap iDesktop 8C的组件,因此需要在写代码前先将SuperMap iDesktop 8C组件的引用添加到项目中,添加方法为右击“解决方案资源管理器”窗口中的“引用”项,在弹出的快捷菜单中选择“添加引用”。 4.实现Run函数 Run函数是插件程序启动后的入口程序,即程序的入口点 新建类MyCtrlAction,在该类中重载public override void Run()方法,即当控件事件被触发时,将调用对象的Run() 方法,添加代码如下:namespace DesktopPlugin1{ class MyCtrlAction : CtrlAction { override public void Run() { //获得选择的数据集 Dataset sedataset = SuperMap.Desktop.Application.ActiveDatasets[0]; string datasetname = sedataset.Name; //获得数据集的范围 Rectangle2D dsBounds = sedataset.Bounds; string boundsleft = Math.Round(Convert.ToDecimal(dsBounds.Left), 4).ToString(); string boundsright = Math.Round(Convert.ToDecimal(dsBounds.Right), 4).ToString();; string boundstop = Math.Round(Convert.ToDecimal(dsBounds.Top), 4).ToString(); string boundsbuttom =Math.Round(Convert.ToDecimal( dsBounds.Bottom),4).ToString(); //输出数据集范围 SuperMap.Desktop.Application.ActiveApplication.Output.Output(datasetname +"数据集范围:left=" + boundsleft + "right=" + boundsright + "top=" + boundstop + "bottom=" + boundsbuttom); } }}
5.配置桌面环境
1)首先我们打开SuperMap iDesktop 8C,点击自定义界面设计选项卡中的工作环境设计。 2)右击功能区下的“数据”选项卡,新建控件组,在该控件组下右键“新建按钮”。然后选择插件、动态库、绑定类等等。单击“确定”按钮结束工作环境配置。 配置好的config文件内容如下:6.编译并运行程序,如下图所示
到这一步,恭喜您已经成为SuperMap iDesktop 8C的初级开发者。 6、曲径通幽处 既然通过上面的入门,我们了解了一个简单插件的实现,接下来我们通过一个范例,来展示在地图、场景窗口中添加logo,而当打开属性窗口时该按钮为灰色。 首先要明白当打开窗体不一样时,按钮是否可用也不一样,这就需要重载函数CtrlAction.Enable(实现ICtrlAction 接口的 Enable() 方法,查看 ICtrlAction.Caller 属性获取的控件对象是否可用)方法和FormControlEvents. Activated 方法(响应子窗体激活后的事件实现)。代码如下://控件对象是否可用public override bool Enable() { return isenable; } //响应子窗体激活后的事件实现public override void Activated(object sender, EventArgs e) { formmap = SuperMap.Desktop.Application.ActiveForm as IFormMap; formscene = SuperMap.Desktop.Application.ActiveForm as IFormScene; formtabular = SuperMap.Desktop.Application.ActiveForm as IFormSuperTabular; if (formtabular != null) { isenable = false; } if (formmap != null || formscene != null) { isenable = true; } }
结果如下:
插件小常识: A.右键菜单 有客户时常问,我如何点击地图右键的时候,弹出我自己的菜单,归根结底还是config配置的问题,让我们来看一个范例:功能还是入门程序的功能,有两种方法: 1.可以通过配置桌面环境的方法来实现,首先点击“工作环境设计”,然后找到“右键菜单”下的“地图窗口_地图”,在“地图浏览”右键添加“数据集范围”的按钮,再设置动态库和绑定类,设置完成保存。如图所示: 2.打开工作环境设计窗体,找到“右键菜单”下的“地图窗口_地图”,再点击“地图浏览”节点,可以看到对应的插件是“mapView”。 这时就关闭SuperMap iDesktop 8C,在SuperMap iDesktop 8C的安装目录\WorkEnvironment\Default中找到SuperMap.Desktop.MapView.config文件,打开编辑: 可以看到“地图窗口”的索引是12,我们要将其右键菜单添加到该contextmenu中,所要编写的内容如上图红色框中内容所示,其中assemblyName=“绑定的动态库dll”,onAction=“绑定类”。最后保存配置,运行结果如下图: B.菜单栏的显示 像有些菜单栏在打开或者激活某个类型的窗口时才弹出,比如打开地图窗口时菜单栏多了如图所示的模块, 这就需要在config中设值formclass=“SuperMap.Deskpro.FormMap”。 激活场景窗口时弹出飞行管理菜单: C.在插件开发时如何使新建的窗体和SuperMap iDesktop 8C风格保持一致? 在新建窗体时,需要窗体继承UIForm,即可使新建的窗体和Deskpro.NET风格保持一致。比如添加定位点的窗口,该窗口的风格与主窗口的一致:public partial class FormLocationto : SuperMap.Desktop.UI.UIFormD.在插件开发的过程中,如何获取Ribbon上文本框的内容? 可以通过RibbonManager属性获取到Ribbon控件管理器,然后通过文本框控件索引或者文本框绑定的执行类的类型来获取文本框控件,然后获取到文本框中的内容。 E.SuperMap iDesktop 8C 插件开发时,如何获取Ribbon标签页上的按钮? 通过Application.ActiveApplication.MainForm.RibbonManager.Item的两个重载可以获得所需要的按钮。 F.自定义启动程序 用户不同,可以设置对不同的用户进行插件使用权限的控制。如viewer用户登录成功,则仅加载基础插件,不加载各种高级插件; admin用户登录成功,则加载所有插件。 可以查看联机帮助“自定义启动程序”。范例路径为:SuperMap iDesktop 8C的安装目录\SampleCode\CustomStartUp。
希望这篇博文对大家插件开发的学习有所帮助!