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 /// 3 /// Command调用——全图显示为例 4 /// 5 /// 6 /// 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 /// 14 /// Tool调用——以漫游为例 15 /// 16 /// 17 /// 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 /// 26 /// Command调用自定义拓展(如何自己写Command,一加载数据为例) 27 /// 28 /// 29 /// 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 /// 38 /// Tool调用自定义拓展(如何自己写Tool——以绘制面元素为例) 39 /// 40 /// 41 /// 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 /// 50 /// Control的拓展(以比例尺Control为例) 51 /// 52 /// 53 /// 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 /// 74 /// 构造函数 75 /// 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 /// 87 /// 创建插件对象 88 /// 89 /// 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 /// 101 /// 点击事件102 /// 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.Oper129 {130 class DrawElementTool : PIE.Controls.BaseTool131 {132 #region 成员变量133 134 /// 135 /// 面元素136 /// 137 /// 138 IPolygonElement m_PolygonEle = null;139 140 /// 141 /// MapControl对象142 /// 143 IMapControl m_MapControl = null;144 145 #endregion146 /// 147 ///构造函数 148 /// 149 /// 150 public DrawElementTool(IMapControl mapControl)151 {152 // this.Cursor = "";//鼠标样式 153 m_MapControl = mapControl; 154 }155 156 /// 157 /// 鼠标点击事件158 /// 159 /// 160 /// 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.Oper184 {185 class MapScaleCommandControl : PIE.Controls.BaseCommandControl186 {187 #region 成员变量188 189 /// 190 /// ToolStripComboBox191 /// 192 private System.Windows.Forms.ToolStripComboBox m_ToolStripComboxItem = null;193 #endregion194 195 /// 196 /// 构造函数197 /// 198 public MapScaleCommandControl()199 {200 this.Caption = "";201 this.Name = "";202 this.Checked = false;203 this.Enabled = false;204 }205 206 /// 207 /// Control208 /// 209 public override object Control210 {211 get212 {213 return m_ToolStripComboxItem;214 }215 set216 {217 m_ToolStripComboxItem = value as System.Windows.Forms.ToolStripComboBox;218 }219 }220 221 /// 222 /// 是否可用223 /// 224 public override bool Enabled225 {226 get227 {228 if (m_Hook == null || m_HookHelper.ActiveView.FocusMap.LayerCount < 1) return false;229 return true;230 }231 protected set232 {233 base.Enabled = value;234 }235 }236 237 /// 238 /// 创建插件对象239 /// 240 /// 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 /// 265 /// 比例尺文本变化事件266 /// 267 /// 268 /// 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 < 3) return;275 string str = strScale.Substring(2,count-2); 276 double scale = Convert.ToDouble(str);277 if (scale < 1) return;278 279 //改变地图的比例尺并更新280 m_HookHelper.ActiveView.DisplayTransformation.MapScale = scale;281 m_HookHelper.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);282 }283 284 /// 285 /// 点击事件286 /// 287 public override void OnClick()288 {289 base.OnClick();290 }291 }292 } View Code |
2.4. 示例截图
注:上图显示了Command拓展(以加载数据为例),Tool拓展(以绘制面元素为例),Control拓展(以比例尺为例)的应用