SkylineV6二次开发培训教程 - 图文
更新时间:2023-12-03 18:06:01 阅读量: 教育文库 文档下载
- skylinev16推荐度:
- 相关推荐
Skyline二次开发培训教程
2011年04月
目录
1接口简介 ............................................................................................................................ 3 2 COM介绍 ........................................................................................................................... 3 2.1什么是COM ................................................................................................................ 3 2.2 COM组件 .................................................................................................................... 3 2.3 为什么要介绍COM ................................................................................................... 3 3 创建客户端应用程序 ....................................................................................................... 4 3.1 C#编程环境 ................................................................................................................. 4 3.2 JavaScript编程环境 .................................................................................................. 10 4开发接口应用举例 .......................................................................................................... 19 4.1 ISGWorld6 .................................................................................................................. 19 4.2 IAnalysis6 ................................................................................................................... 21 4.3 IApplication6 .............................................................................................................. 23 4.4 ICommand6 ............................................................................................................... 24 4.5 ICoordServices6 ......................................................................................................... 25 4.6 ICreator6 .................................................................................................................... 27 4.7 IDateTime6 ................................................................................................................ 31 4.8 INavigate6 .................................................................................................................. 32 4.9 IProject6 .................................................................................................................... 33 4.10 IProjectTree6 ........................................................................................................... 34 4.11 ITerrain6 .................................................................................................................. 36 4.12 ITEVersion6 .............................................................................................................. 37 4.13 IWindow6 ................................................................................................................ 38
1接口简介
TerraExplorer API提供了一套强大的接口用来集成TerraExplorer、TerraExplorer Pro 和用户自定义应用。它提供了一些访问外部信息扩展的方法,比如:访问数据库或基础地理空间数据。所有这些以COM协议为基础的API接口都可以通过脚本语言操作(例如vbscript、Javascript),也可以通过非脚本语言来控制操作(例如:C++、VB、Delphi或者.net)。
TerraExplorer也提供了一套ActiveX控件,可以将3D窗口、信息树和导航图以控件对象的方式嵌入到用户自定义的可视化界面中。
2 COM介绍 2.1什么是COM
COM是Microsoft组件对象模型(Component Object Model)的简称。
COM是一个说明如何建立可动态交替更新组件的规范。它提供了客户和组件为保证能够互操作应该遵循的标准。该标准对于组件架构的重要性同其他任何一个具有可交替更新部分的系统是一样的。举个例子,如果没有国家标准(GB),那么各个厂家所生产的零件及产品将不能实现互换性。各个厂家各自为政,若电机上的螺栓坏了,就要买原来厂家生产的螺栓,相当不方便。
2.2 COM组件
COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。遵循COM规范编写出来的组件将能够满足对组件架构的所有要求。
那么,COM组件有什么好处呢?它到底是什么东西呢?
2.3 为什么要介绍COM
作为传统软件的应用程序在发行之后,使用者要想省略掉其中的某些内容,或者感觉应用程序的某些部分还不够完善,希望得到更好的版本,只有等到软件发行商将新版本重新全部编译并推出后,使用者的这一梦想才能实现。这是传统软件的典型发行方式。
但是,这却严重妨碍了软件使用人员的工作效率,使得使用者想做某件事,而软件却没有相应的实现部分。这使得软件的使用范围大幅度缩小,同时也使得商家频于软件升级方面的应酬,而实际上应用程序的开发进度却丝毫得不到加快。
但是,自从COM出现以后,以上问题就基本上迎刃而解了。
有了COM,软件开发人员就可以在应用程序发行后仍可以对它进行修改或给它加上一些新的特性,这大大方便了使用者,因为应用程序能够在更高的程度上被定制,使应用更加灵活、更具动态性。于是,将可能出现这样的情况:每个使用者都在使用相同的软件,而实际上每个使用者的软件却大相径庭。软件开发人员可以用逐步添加的方式开发程序,而不是每隔一两年将其完全重写一遍,这又在很大程度上加快了应用程序的开发进度。
3 创建客户端应用程序 3.1 C#编程环境
以下步骤为使用ISWorld6接口创建一个C#客户端应用程序(开发环境Visual Studio2010):
1. 添加ActiveX控件到工具箱-设计视图,右击工具箱,选择“选择项”,在“COM组件”标签中选择TE3DWindow Class, TEInformationWindow Class 和TENavigationMap Class,单击确定,
TE3DWindow Class, TEInformation Window Class和
TENavigationMap
Class添加到工具箱中。
2. 设置工程参考-右击解决方案资源管理器中的“引用”,选择“添加引用”/COM 标签,选择“TerraExplorerX 1.0 Type Library”,单击确定,将其添加到引用中。 3. 添加Using指令-在工程中添加”using TerraExplorerX;”
4. 添加控件-将工具箱中的TE3DWindow Class, TEInformationWindow Class 和TENavigationMap Class拖到窗体中,创建用户界面。
5. 创建TerraExplorer对象-SGWorld对象是TE接口的入口点,通过该对象可以访问TE中的其他接口。
This.sgworld=new SGWorld();
在此基础上,可以根据功能需求进行程序开发。以下代码为一个简单例子。
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;
using System.Windows.Forms;
using TerraExplorerX;
namespace Test {
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); sgworld = null; tCreate = null; LBPos = null; tWindow = null; tNavigate = null; myPolylin = null; myPolygon = null; bMove = false; geoPoints = null; pixelToWorld = null; tProjectTree = null; tAnalysis = null; tCoordServices = null;
LBPos = new List
private SGWorld sgworld; private ICreator6 tCreate; private IWindow6 tWindow; private INavigate6 tNavigate; private IAnalysis6 tAnalysis;
private IProjectTree6 tProjectTree;
private ICoordServices6 tCoordServices;
private int operateType;
private ITerrainPolyline6 myPolylin; private ITerrainPolygon6 myPolygon; private bool bMove;
private List
private IWorldPointInfo6 pixelToWorld;
private void Form1_Load(object sender, EventArgs e) {
if (sgworld == null) {
sgworld = new SGWorld(); sgworld.OnLButtonUp += new
_ISGWorld6Events_OnLButtonUpEventHandler(sgworld_OnLButtonUp); sgworld.OnRButtonUp += new
_ISGWorld6Events_OnRButtonUpEventHandler(sgworld_OnRButtonUp); sgworld.OnFrame += new
_ISGWorld6Events_OnFrameEventHandler(sgworld_OnFrame);
tCreate = sgworld.Creator; tWindow = sgworld.Window; tNavigate = sgworld.Navigate; tProjectTree = sgworld.ProjectTree; tAnalysis = sgworld.Analysis; tCoordServices = sgworld.CoordServices; }
sgworld.Open(@\培训教材\\data\\San Francisco样例数据\\Default.fly\); tWindow.HideMessageBarText(); }
bool sgworld_OnLButtonUp(int Flags, int X, int Y) {
if (operateType > 0) {
IWorldPointInfo6 worldPoint = tWindow.PixelToWorld(X, Y, WorldPointType.WPT_ALL); IPosition6 pos = worldPoint.Position; LBPos.Add(pos);
List
points.Add(temppos.X);
points.Add(temppos.Y);
points.Add(temppos.Altitude); }
geoPoints = points.ToArray(); switch (operateType) {
case 1: case 2:
bMove = true; break; case 3:
var location= tCreate.CreateLocation(LBPos[0], 0, \); operateType = 0;
tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false); location.Position .Pitch = -45; location.Position.Distance = 80000; tNavigate.FlyTo(location, ActionCode.AC_FLYTO); break; case 4:
ITerrainLabel6 label= tCreate.CreateLabel(LBPos[0], \, \, null , 0,
\标签\);
operateType = 0; tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false); break; case 5: pixelToWorld = tWindow.PixelToWorld(X, Y, WorldPointType.WPT_MODEL );
operateType = 0; tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false);/ if (pixelToWorld == null) {
MessageBox.Show(\对象类型选择错误\); } else {
MessageBox .Show (\+pixelToWorld .ObjectID +\ position:\+pixelToWorld .Position .X +\ type:\+pixelToWorld .Type .ToString ()); } break; } }
return false; } void sgworld_OnFrame() {
if (bMove)
{
IMouseInfo6 mouseInfo = tWindow.GetMouseInfo();
IWorldPointInfo6 worldPoint = tWindow.PixelToWorld(mouseInfo.X, mouseInfo.Y, WorldPointType.WPT_ALL);
IPosition6 pos = worldPoint.Position;
double [] movePos = new double [] { pos.X, pos.Y, pos.Altitude };
double [] tempPos = new double[geoPoints.Length + 3]; geoPoints.CopyTo(tempPos, 0);
movePos.CopyTo(tempPos, geoPoints.Length); switch (operateType) {
case 1:
if (myPolylin != null) {
tCreate.DeleteObject(myPolylin.ID); }
myPolylin = tCreate.CreatePolylineFromArray(tempPos, Color.Red, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \); break; case 2: if (myPolygon != null )
{
tCreate.DeleteObject(myPolygon.ID); }
if (tempPos.Length >= 9) { ILinearRing lineRing = tCreate.GeometryCreator.CreateLinearRingGeometry(tempPos);//创建环必须大于等于三个点
myPolygon = tCreate.CreatePolygon(lineRing, Color.Red, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \); } break; } } }
bool sgworld_OnRButtonUp(int Flags, int X, int Y) {
if (operateType > 0) {
switch (operateType) {
case 1:
if (myPolylin != null) {
tCreate.DeleteObject(myPolylin.ID); myPolylin = null; }
ITerrainPolyline6 Polylin = tCreate.CreatePolylineFromArray(geoPoints, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \);
Polylin.SaveInFlyFile = true; operateType = 0; bMove = false;
tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT , \, false);
break; case 2:
if (myPolygon !=null ) {
tCreate.DeleteObject (myPolygon .ID ); myPolygon =null ; } ILinearRing lineRing = tCreate.GeometryCreator.CreateLinearRingGeometry(geoPoints); ITerrainPolygon6 Polygon = tCreate.CreatePolygon(lineRing, Color.Red, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \);
Polygon.SaveInFlyFile = true; operateType =0; bMove =false ;
tWindow .SetInputMode (MouseInputMode .MI_FREE_FLIGHT ,\,false ); break ; } }
return true; }
private void btnPolyline_Click(object sender, EventArgs e) {
operateType = 1;
tWindow.SetInputMode(MouseInputMode.MI_COM_CLIENT, \, false); LBPos = new List
private void btnPolygon_Click(object sender, EventArgs e) {
operateType = 2;
tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT,\,false ); LBPos = new List
private void btnLocation_Click(object sender, EventArgs e) {
operateType = 3;
tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT ,\,false ); LBPos = new List
private void btnLabel_Click(object sender, EventArgs e) {
operateType = 4;
tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT ,\,false ); LBPos = new List
3.2 JavaScript编程环境 以下步骤为使用TE接口创建一个JavaScript客户端应用程序:
1. 添加ActiveX控件到网页-通过
注:三个控件的CLASSID 均是唯一的,使用时请别混淆。每个嵌入的对象ID是可以更改的。
2. 创建TerraExplorer对象-使用
< OBJECT ID =\style=\
//**********************************************// function CreateSGWorld() {
obj = document.getElementById(\ if (obj == null) {
obj = document.createElement('object');
document.body.appendChild(obj); obj.id = \ obj.name = \ obj.classid = \ }
Var sgworld=CreateSGWorld(); 在此基础上,可以根据功能需求进行程序开发。以下代码为一个简单例子。