循序渐进 SuperMap iDesktop 8C 插件开发

2024-02-25 11:18

本文主要是介绍循序渐进 SuperMap iDesktop 8C 插件开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: 小卒

发现很多用户在使用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文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<plugin xmlns="http://www.supermap.com.cn/desktop" name="DesktopPlugin1" author="DesktopPlugin1" url="www.supermap.com.cn"description="DesktopPlugin1 Plugin" helpLocalRoot="" helpOnlineRoot="">
<runtime assemblyName="./Plugins/DesktopPlugin1/DesktopPlugin1.dll" className="DesktopPlugin1.DesktopPlugin" loadOrder="2000" enabled="True" />
<!--Ribbon上自定义各种控件-->
<toolbox>
<ribbon>
<tabs>
<tab index="3" id="DataProcess" label="数据" formClass="" visible="true">
<group index="5" id="RibbonGroup" label="数据集" image="" visible="true">
<button index="0" label="数据集范围" visible="true" checkState="false" assemblyName="Plugins\DesktopPlugin1\DesktopPlugin1.dll"onAction="DesktopPlugin1.MyCtrlAction" size="Small" image="" style="ImageAndText" shortcutKey="" screenTip="" screenTipImage="" helpURL="" />
</group>
</tab>
</plugin>

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.UIForm

这里写图片描述
D.在插件开发的过程中,如何获取Ribbon上文本框的内容?
可以通过RibbonManager属性获取到Ribbon控件管理器,然后通过文本框控件索引或者文本框绑定的执行类的类型来获取文本框控件,然后获取到文本框中的内容。
E.SuperMap iDesktop 8C 插件开发时,如何获取Ribbon标签页上的按钮?
通过Application.ActiveApplication.MainForm.RibbonManager.Item的两个重载可以获得所需要的按钮。
F.自定义启动程序
用户不同,可以设置对不同的用户进行插件使用权限的控制。如viewer用户登录成功,则仅加载基础插件,不加载各种高级插件; admin用户登录成功,则加载所有插件。 可以查看联机帮助“自定义启动程序”。范例路径为:SuperMap iDesktop 8C的安装目录\SampleCode\CustomStartUp。

希望这篇博文对大家插件开发的学习有所帮助!

这篇关于循序渐进 SuperMap iDesktop 8C 插件开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745304

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安