PIE-SDK 二次开发
PIE-SDK是一套PIE的可重用的通用的二次开发组件集,基于PIE-SDK我们可以进行组件式和插件式的二次开发,下面我将分别介绍如何使用PIE-SDK进行组件式和插件式的二次开发
注:需要安装好vs2015以及PIE-SDK
插件式二次开发
PIE-SDK 支持我们进行Command、Tool以及Control三种类型的插件的二次开发,同时为我们提供了可直接使用的PIE桌面应用程序的界面,其中:
Command,命令,功能不需要鼠标和地图进行交互,例如全图显示,点击按钮地图接收到命令会自动全图显示;
Tool(工具)则相反,需要鼠标和地图进行交互,例如地图的漫游功能,拉框放大功能等,需要鼠标在地图上操作才会做出反应。
Control是包含了控件的Command,比如比例尺控制按钮、图像透明度控制按钮,通过操作Control中的控件即可实现地图的操作。
- Command 命令插件开发步骤
1、新建一个Command的类,继承PIE.Control.BaseCommand
2、重写OnCreate(),OnClick()方法- Tool 工具插件开发步骤
1、新建Tool的类,继承PIE.Controls.BaseTool
2、根据需求可以重写MouseDown,MouseMove,MoudeUp等鼠标事件- Control 插件开发步骤
1、新建一个Control的类,并继承PIE.Controls.BaseCommandControl
2、根据需求重写Control对象,绑定地图控件对象OnCreate,Enabled属性等
前面我们介绍了一些PIE-SDK插件式二次开发的基础知识,下面我将具体介绍一下PIE-SDK插件式二次开发的具体步骤:
1、打开vs新建项目,选择Visual C# ——>类库(注意:目标框架选择.NET Framework 4)
2、设置坏境,根据你安装的PIE-SDK版本,设置Debug和Release环境,新建选择x86平台或x64平台
3、添加引用,点击应用——>添加引用,将PIE-SDK的全部引用选中,确定
4、添加类、并确定继承关系
5、重新类相关函数
6、点击生成(到这一步,你的插件便已经生成了)
7、将生成的dll文件复制到PIE-SDK的bin目录下
8、配置文件设置,在配置文件中新增Item项,设置控件类型(Type)为button,library为插件类名,如:PIE.ControlsTest.dll(带后缀的全称),caption为控件在界面显示的名称,identity为唯一标识,格式为类库名称+命令对象名称,如:PIE.ControlsTest.VectorCommand,代码中通过identity找到对应命令控件
注意:
1、为了便于找到生成的dll文件,在这里建议大家自己设置输出文件路径,具体操作为点击项目-属性-生成-输出-输出路径
2、如果想在开发过程中调试代码,需要设置外部程序,具体操作为项目-属性-调试-选择启动外面程序,然后选择PIE-SDK中的bin文件夹下的PIEApplication.exe,同时要将输出路径设置成bin文件夹的路径
代码展示:
// VectorCommand.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PIE.Controls;
using System.Windows.Forms;
namespace cml.ControlsTest
{
public class VectorCommand : BaseCommand
{
public VectorCommand()
{
}
public override void OnCreate(object hook)
{
if (hook == null) return;
if (!(hook is PIE.Carto.IPmdContents)) return;
this.Enabled = true;
m_Hook = hook;
m_HookHelper.Hook = hook;
}
public override void OnClick()
{
if (!this.Enabled) return;
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Title = "请选择要打开的数据:";
openFileDialog.Filter = "Shape Files|*.shp;*.000";
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
PIE.Carto.IActiveView activeVeiw = m_HookHelper.ActiveView;
PIE.Carto.IMap map = m_HookHelper.FocusMap;
PIE.Carto.ILayer layer = null;
string[] files = openFileDialog.FileNames;
for (int i = 0; i < files.Length; i++)
{
layer = PIE.Carto.LayerFactory.CreateDefaultLayer(files[i]);
map.AddLayer(layer);
}
activeVeiw.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);
}
}
}
// DrawElementTool .cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PIE.Controls;
using PIE.AxControls;
using PIE.Carto;
using PIE.Display;
using PIE.Geometry;
using System.Windows.Forms;
namespace cml.ControlsTest
{
public class DrawElementTool : BaseTool
{
#region 成员变量
/// <summary>
/// 面元素
/// </summary>
///
IPolygonElement m_PolygonEle = null;
/// <summary>
/// MapControl对象
/// </summary>
IMapControl m_MapControl = null;
#endregion
/// <summary>
///构造函数
/// </summary>
/// <param name="mapControl"></param>
public DrawElementTool(IMapControl mapControl)
{
// this.Cursor = "";//鼠标样式
m_MapControl = mapControl;
}
/// <summary>
/// 鼠标点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public override void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) //左键
{
if (m_MapControl == null) return;
m_PolygonEle = new PolygonElement();
IPolygon polygon = m_MapControl.TrackPolygon();
m_PolygonEle.Symbol = SystemSymbolSetting.Instance.DefaultFillSymbol;
m_PolygonEle.Geometry = polygon as IGeometry;
m_HookHelper.ActiveView.GraphicsContainer.AddElement(m_PolygonEle);
m_HookHelper.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
}
}
}