1.功能简介

在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command、Tool和Control的使用,可以提升集成的效率,PIE SDK包含大量的已经封装好的Command和Tool,调用简单易于实现,调试方便。

什么时候会用到Command?Command,命令,功能不需要鼠标和地图进行交互,例如全图显示,点击按钮地图接收到命令会自动全图显示;而Tool(工具)则相反,需要鼠标和地图进行交互,例如地图的漫游功能,拉框放大功能等,需要鼠标在地图上操作才会做出反应。

Control是包含了控件的Command,比如比例尺控制按钮、图像透明度控制按钮,通过操作Control中的控件即可实现地图的操作。

下面具体介绍组件式开发中如何调用PIE SDK的Command和Tool,以及Control的拓展应用。

2.功能实现说明

2.1. 实现思路及原理说明

Command的调用

第一步

New一个Command对象

第二步

绑定地图,传递地图控件对象(创建插件对象OnCreate)

第三步

调用OnClick方法

Tool的调用

第一步

New一个Tool对象

第二步

绑定地图,传递地图控件对象,(需将Tool对象转化成ICommand,调用OnCreate方法)

第三步

设置地图当前的Tool为new的新的Tool

Command的拓展

第一步

新建一个Command的类,继承PIE.Control.BaseCommand

第二步

重写OnCreate(),OnClick()方法

第三步

调用:根据上面的Command调用方法进行调用

Tool的拓展

第一步

新建Tool的类,继承PIE.Controls.BaseTool

第二步

根据需求可以重写MouseDown,MouseMove,MoudeUp等鼠标事件

第三步

调用:根据表格上面的Tool的调用方式进行调用

Control的拓展

第一步

新建一个Control的类,并继承PIE.Controls.BaseCommandControl

第二步

根据需求重写Control对象,绑定地图控件对象OnCreate,Enabled属性等

第三步

调用:根据Control新建的控件类型A在界面上也设计一个相同的控件B,在调用的时候将B于A进行关联即可

2.2. 核心接口与方法

接口/类

方法/属性

说明

PIE.SystemUI.ICommand

OnClick

点击事件

OnCreate

创建插件对象

PIE. lContros

FullExtentCommand

全图显示命令

PanTool

漫游工具

PIE.Controls. BaseCommand

OnCreate

创建插件对象

OnClick

点击事件

PIE.Controls. BaseTool

OnMouseDown

鼠标按下事件

OnMouseMove

鼠标移动事件

OnMouseUp等

鼠标弹起事件

PIE.Controls. BaseCommandControl

Control

Control对象

2.3. 示例代码

项目路径

百度云盘地址下/PIE示例程序/ 06.Command、Tool、Control的调用和扩展

数据路径

百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif

视频路径

百度云盘地址下/PIE视频教程/06.Command、Tool、Control的调用和扩展.avi

示例代码

  1. FormMain.cs:
  2. /// <summary>
  3. /// Command调用——全图显示为例
  4. /// </summary>
  5. /// <param name="sender"></param>
  6. /// <param name="e"></param>
  7. private void btn_Command_Click(object sender, EventArgs e)
  8. {
  9. PIE.SystemUI.ICommand cmd = new PIE.Controls.FullExtentCommand();
  10. cmd.OnCreate(mapControlMain);
  11. cmd.OnClick();
  12. }
  13. /// <summary>
  14. /// Tool调用——以漫游为例
  15. /// </summary>
  16. /// <param name="sender"></param>
  17. /// <param name="e"></param>
  18. private void btn_Tool_Click(object sender, EventArgs e)
  19. {
  20. PIE.SystemUI.ITool tool = new PIE.Controls.PanTool();
  21. (tool as ICommand).OnCreate(mapControlMain);
  22. mapControlMain.CurrentTool = tool;
  23. }
  24.  
  25. /// <summary>
  26. /// Command调用自定义拓展(如何自己写Command,一加载数据为例)
  27. /// </summary>
  28. /// <param name="sender"></param>
  29. /// <param name="e"></param>
  30. private void btn_CommandEx_Click(object sender, EventArgs e)
  31. {
  32. PIE.SystemUI.ICommand cmd = new Oper.AddDataCommand();
  33. cmd.OnCreate(mapControlMain);
  34. cmd.OnClick();
  35. }
  36.  
  37. /// <summary>
  38. /// Tool调用自定义拓展(如何自己写Tool——以绘制面元素为例)
  39. /// </summary>
  40. /// <param name="sender"></param>
  41. /// <param name="e"></param>
  42. private void btn_ToolEx_Click(object sender, EventArgs e)
  43. {
  44. PIE.SystemUI.ITool tool = new Oper.DrawElementTool(mapControlMain);
  45. (tool as ICommand).OnCreate(mapControlMain);
  46. mapControlMain.CurrentTool = tool;
  47. }
  48.  
  49. /// <summary>
  50. /// Control的拓展(以比例尺Control为例)
  51. /// </summary>
  52. /// <param name="sender"></param>
  53. /// <param name="e"></param>
  54. private void tbn_ControlEx_Click(object sender, EventArgs e)
  55. {
  56. Oper.MapScaleCommandControl mapScaleComtrol= new Oper.MapScaleCommandControl();
  57. mapScaleComtrol.Control = this.combox_MapScale;//将界面的比例尺控件与mapScaleControl绑定
  58. mapScaleComtrol.OnCreate(mapControlMain);
  59. }
  60.  
  61. 拓展类:
  62. using PIE.Carto;
  63. using PIE.Controls;
  64. using System;
  65. using System.Collections.Generic;
  66. using System.Linq;
  67. using System.Text;
  68. using System.Windows.Forms;
  69. namespace CommandAndToolDemo.Oper
  70. {
  71. class AddDataCommand : BaseCommand
  72. {
  73. /// <summary>
  74. /// 构造函数
  75. /// </summary>
  76. public AddDataCommand()
  77. {
  78. this.Caption = "加载数据";
  79. this.ToolTip = "加载数据";
  80. this.Checked = true;
  81. this.Enabled = false;
  82. // this.Image = "";
  83. this.Name = "加载数据";
  84. }
  85.  
  86. /// <summary>
  87. /// 创建插件对象
  88. /// </summary>
  89. /// <param name="hook"></param>
  90. public override void OnCreate(object hook)
  91. {
  92. if (hook == null) return;
  93. if (!(hook is PIE.Carto.IPmdContents)) return;
  94.  
  95. this.Enabled = true;
  96. m_Hook = hook;
  97. m_HookHelper.Hook = hook;
  98. }
  99.  
  100. /// <summary>
  101. /// 点击事件
  102. /// </summary>
  103. public override void OnClick()
  104. {
  105. OpenFileDialog openDialog = new OpenFileDialog();
  106. openDialog.Title = "加载数据";
  107. openDialog.Filter = "Raster File|*.img;*.tif;*.dat;*.tiff|Shape File|*.shp|所有文件|*.*";
  108. if (openDialog.ShowDialog() != DialogResult.OK) return;
  109.  
  110. ILayer layer = LayerFactory.CreateDefaultLayer(openDialog.FileName);
  111. if (layer == null) return;
  112. m_HookHelper.ActiveView.FocusMap.AddLayer(layer);
  113. m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
  114. }
  115. }
  116. }
  117.  
  118. using PIE.AxControls;
  119. using PIE.Carto;
  120. using PIE.Display;
  121. using PIE.Geometry;
  122. using System;
  123. using System.Collections.Generic;
  124. using System.Linq;
  125. using System.Text;
  126. using System.Windows.Forms;
  127.  
  128. namespace CommandAndToolDemo.Oper
  129. {
  130. class DrawElementTool : PIE.Controls.BaseTool
  131. {
  132. #region 成员变量
  133.  
  134. /// <summary>
  135. /// 面元素
  136. /// </summary>
  137. ///
  138. IPolygonElement m_PolygonEle = null;
  139.  
  140. /// <summary>
  141. /// MapControl对象
  142. /// </summary>
  143. IMapControl m_MapControl = null;
  144.  
  145. #endregion
  146. /// <summary>
  147. ///构造函数
  148. /// </summary>
  149. /// <param name="mapControl"></param>
  150. public DrawElementTool(IMapControl mapControl)
  151. {
  152. // this.Cursor = "";//鼠标样式
  153. m_MapControl = mapControl;
  154. }
  155.  
  156. /// <summary>
  157. /// 鼠标点击事件
  158. /// </summary>
  159. /// <param name="sender"></param>
  160. /// <param name="e"></param>
  161. public override void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  162. {
  163. if (e.Button == MouseButtons.Left)//左键
  164. {
  165. if (m_MapControl == null) return;
  166. m_PolygonEle = new PolygonElement();
  167. IPolygon polygon = m_MapControl.TrackPolygon();
  168. m_PolygonEle.Symbol = SystemSymbolSetting.Instance.DefaultFillSymbol;
  169. m_PolygonEle.Geometry = polygon as IGeometry;
  170.  
  171. m_HookHelper.ActiveView.GraphicsContainer.AddElement(m_PolygonEle);
  172. m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
  173. }
  174. }
  175. }
  176. }
  177.  
  178. using System;
  179. using System.Collections.Generic;
  180. using System.Linq;
  181. using System.Text;
  182.  
  183. namespace CommandAndToolDemo.Oper
  184. {
  185. class MapScaleCommandControl : PIE.Controls.BaseCommandControl
  186. {
  187. #region 成员变量
  188.  
  189. /// <summary>
  190. /// ToolStripComboBox
  191. /// </summary>
  192. private System.Windows.Forms.ToolStripComboBox m_ToolStripComboxItem = null;
  193. #endregion
  194.  
  195. /// <summary>
  196. /// 构造函数
  197. /// </summary>
  198. public MapScaleCommandControl()
  199. {
  200. this.Caption = "";
  201. this.Name = "";
  202. this.Checked = false;
  203. this.Enabled = false;
  204. }
  205.  
  206. /// <summary>
  207. /// Control
  208. /// </summary>
  209. public override object Control
  210. {
  211. get
  212. {
  213. return m_ToolStripComboxItem;
  214. }
  215. set
  216. {
  217. m_ToolStripComboxItem = value as System.Windows.Forms.ToolStripComboBox;
  218. }
  219. }
  220.  
  221. /// <summary>
  222. /// 是否可用
  223. /// </summary>
  224. public override bool Enabled
  225. {
  226. get
  227. {
  228. if (m_Hook == null || m_HookHelper.ActiveView.FocusMap.LayerCount < ) return false;
  229. return true;
  230. }
  231. protected set
  232. {
  233. base.Enabled = value;
  234. }
  235. }
  236.  
  237. /// <summary>
  238. /// 创建插件对象
  239. /// </summary>
  240. /// <param name="hook"></param>
  241. public override void OnCreate(object hook)
  242. {
  243. if (hook == null) return;
  244. if (!(hook is PIE.Carto.IPmdContents)) return;
  245. this.Enabled = true;
  246. m_Hook = hook;
  247. m_HookHelper.Hook = hook;
  248. if (m_ToolStripComboxItem == null) return;
  249. System.Windows.Forms.ToolStripComboBox comboxItem=this.m_ToolStripComboxItem as System.Windows.Forms.ToolStripComboBox;
  250. if (comboxItem==null)return;
  251.  
  252. comboxItem.Items.Add("1:500");
  253. comboxItem.Items.Add("1:1000");
  254. comboxItem.Items.Add("1:5000");
  255. comboxItem.Items.Add("1:10000");
  256. comboxItem.Items.Add("1:50000");
  257. comboxItem.Items.Add("1:100000");
  258. comboxItem.Items.Add("1:500000");
  259. comboxItem.Items.Add("1:1000000");
  260. comboxItem.TextChanged-=comboxItem_TextChanged;
  261. comboxItem.TextChanged+=comboxItem_TextChanged;
  262. }
  263.  
  264. /// <summary>
  265. /// 比例尺文本变化事件
  266. /// </summary>
  267. /// <param name="sender"></param>
  268. /// <param name="e"></param>
  269. void comboxItem_TextChanged(object sender, EventArgs e)
  270. {
  271. //获取选中的比例尺
  272. string strScale = m_ToolStripComboxItem.Text.ToString();
  273. int count = strScale.Length;
  274. if (count < ) return;
  275. string str = strScale.Substring(,count-);
  276. double scale = Convert.ToDouble(str);
  277. if (scale < ) return;
  278.  
  279. //改变地图的比例尺并更新
  280. m_HookHelper.ActiveView.DisplayTransformation.MapScale = scale;
  281. m_HookHelper.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);
  282. }
  283.  
  284. /// <summary>
  285. /// 点击事件
  286. /// </summary>
  287. public override void OnClick()
  288. {
  289. base.OnClick();
  290. }
  291. }
  292. }

2.4. 示例截图

:上图显示了Command拓展(以加载数据为例),Tool拓展(以绘制面元素为例),Control拓展(以比例尺为例)的应用

PIE SDK Command、Tool、Control的调用和拓展的更多相关文章

  1. PIE SDK Command&&Tool工具命令一览表

    PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...

  2. PIE SDK 文章目录索引

    1.PIE SDK介绍 1.1.  PIE软件介绍 1.2.  PIE SDK介绍 1.3.  PIE支持项目介绍 1.4.  PIE.NET-SDK插件式二次开发介绍 1.5.  PIE.NET-S ...

  3. PIE SDK组件式开发综合运用示例

    1. 功能概述 关于PIE SDK的功能开发,在我们的博客上已经分门别类的进行了展示,点击PIESat博客就可以访问,为了初学者入门,本章节将对从PIE SDK组件式二次开发如何搭建界面.如何综合开发 ...

  4. PIE SDK算法的同步调用

    1.    算法功能简介 同步调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为. PIE SDK支持算法功能的执行,下面对算法的同步调用功能进行介绍. 2.    算法功能实现说明 2. ...

  5. PIE SDK算法的异步调用

    1.算法功能简介 异步方法一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作.异步方法通常会在另外一个线程中,“真实”地执行着.整个过程,不会阻碍调用者的工作. PIE SDK支持算法功能的执 ...

  6. PIE SDK地图范围设置

    1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...

  7. PIE SDK与OpenCV结合说明文档

    1.功能简介 OpenCV是基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 ...

  8. PIE SDK专题制图打开模板

    1.    功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用时只需要打开该模板,加载相应数据,就可以直接出图了,省去了重复制作图幅的麻烦,方 ...

  9. PIE SDK专题制图保存模板

    1.    功能简介 在PIE SDK中,所有的制图元素.视图范围以及排版等都可以保存成一个模板,以供多次重复使用.使用模板时只需要打开该模板,加载相应数据,就可以直接出图,省去了重复制作图幅的麻烦, ...

随机推荐

  1. hdu 4740 The Donkey of Gui Zhou

    1.扯犊子超多if else 判断的代码,华丽丽的TLE. #include<stdio.h> #include<string.h> #define N 1010 int ma ...

  2. ios7适配--uitableviewcell选中效果

    ios7 UITableViewCell selectionStyle won't go back to blue up vote6down votefavorite 2 Xcode 5.0, iOS ...

  3. Ubuntu 16.04 安装jdk

    Ubuntu 16.04 安装jdk 准备工作 安装版本:jdk-8u91-linux-x64.tar.gz 官方下载 创建目录作为JDK的安装目录,这里选择安装位置为:/usr/java/ sudo ...

  4. c++基础之struct

    就是让用户自己自定义一个要往里面放各种东西的抽屉 // 声明一个结构体类型 Books struct Books { ]; ]; ]; int book_id; }; int main( ) { Bo ...

  5. timer实现Grid自动换行(连续相同的id跳到下一行)

    private { Private declarations } FRow: Integer; procedure SetRow(const Value: Integer); public { Pub ...

  6. perationalError: (2003, "Can't connect to MySQL server on u'192.168.1.6' (timed out)")

    在Ubuntu(192.168.1.20)中部署项目后,mysql还在另外一台windows(192.168.1.6)机子上,ping windows时可以ping通,但是访问项目提示: perati ...

  7. C#中线程的委托

    很多时候写windows程序都需要结合多线程,在C#中用如下得代码来创建并启动一个新的线程. Thread thread = new Thread(new ThreadStart(ThreadProc ...

  8. windows service使用log4net 记录日志

    最近写了个定时邮件推送的服务,当利用lognet4记录日志时,发现日志并没有记录.后来明白windows 服务一般默认是在C:\Windows\System 或是C:\Windows\System32 ...

  9. [译] 关于 SPA,你需要掌握的 4 层 (2)

    此文已由作者张威授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 视图层 现在我们有了一个可执行且不依赖于框架的应用程序,React 已经准备投入使用. 视图层由 presen ...

  10. Hibernate学习第三天(2)(多对多关系映射)

    1.1.1      Hibernate多对多关系的配置 1.1.1.1   创建表 l   用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...