循序渐进 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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3