• PIE SDK Command、Tool、Control的调用和拓展


     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 }
    View Code

    2.4. 示例截图

     

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

  • 相关阅读:
    剩下的树
    守形数
    小白鼠排队(map容器插入数据的四种方法)
    字母统计
    与7无关的数
    ZOJ
    基于js的CURD插件
    API验证插件
    Django之权限管理插件
    Django之信号和序列化
  • 原文地址:https://www.cnblogs.com/PIESat/p/10272779.html
Copyright © 2020-2023  润新知