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 < 1) 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 < 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 /// <summary> 285 /// 点击事件 286 /// </summary> 287 public override void OnClick() 288 { 289 base.OnClick(); 290 } 291 } 292 } |
2.4. 示例截图
注:上图显示了Command拓展(以加载数据为例),Tool拓展(以绘制面元素为例),Control拓展(以比例尺为例)的应用