当前位置:文档之家› SkylineV6二次开发培训教程

SkylineV6二次开发培训教程

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 https://www.doczj.com/doc/9b16122838.html,ponentModel;

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();

operateType = 0;

}

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 LBPos;

private double[] geoPoints;

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(@"E:\Skyline培训教材\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 = new List();

foreach (IPosition6 temppos in LBPos)

{

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, "Location");

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], "dfdfdfdf", "", 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 ("objectid:"+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, "myPolyline");

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, "myPolygon");

}

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, "myPolyline");

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, "myPolygon");

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控件到网页-通过标记可将3D Window、Information tree、Navigation Map控件嵌入到网页中。

三个控件在Web页中的声明如下:

CLASSID="CLSID: 3a4f9192-65a8-11d5-85c1-0001023952c1" width=500

height=400>

CLASSID="CLSID: 3a4f9193-65a8-11d5-85c1-0001023952c1" width=200

height=400 >

CLASSID="CLSID: 3a4f9194-65a8-11d5-85c1-0001023952c1" width=300

height=300 >

注:三个控件的CLASSID 均是唯一的,使用时请别混淆。每个嵌入的对象ID是可以更改的。

2.创建TerraExplorer对象-使用标记定义一个TerraExplorer对象或编写函数创建一个TerraExplorer对象。

< OBJECT ID ="SGWorld" classid="CLSID:3a4f91b0-65a8-11d5-85c1-0001023952c1"

style="visibility:hidden;height:0 ">

//**********************************************//

function CreateSGWorld() {

obj = document.getElementById("sgworld");

if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj);

obj.id = "sgworld";

https://www.doczj.com/doc/9b16122838.html, = "sgworld";

obj.classid = "CLSID:3a4f91b0-65a8-11d5-85c1-0001023952c1";

}

Var sgworld=CreateSGWorld();

在此基础上,可以根据功能需求进行程序开发。以下代码为一个简单例子。

脚本开发练习

classid="CLSID:3a4f9193-65a8-11d5-85c1-0001023952c1">

classid="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1">

4开发接口应用举例

4.1 ISGWorld6

ISGWorld6是TE主要接口的入口点。你可以通过这个接口管理应用程序和3D内容,并处理各种事件。

下面的接口可以通过ISGWorld6接口的属性获得:

●IProject6(.Project)-打开工程,管理工程属性和保存工程。

●INavigate6(.Navigate)-通过设置摄像机的位置在3D窗口中导航,并且可以产生复杂的动作,如飞到对象,放大/缩小等。

●IProjectTree6(.ProjectTree)-访问信息树。可以进行组的创建和检索树中的对象。

●ICreator6(.Creator)-创建和删除所有的图层、对象、位置、几何体、颜色和漫游路径。

●IAnalysis6(.Analysis)-进行地形分析操作。

●ITerrain6(.Terrain)-公开信息,如正在使用的MPT文件的名称,MPT坐标系和高程信息。

●IWindow6(.Window)-根据屏幕中的点检索3D窗口,创建和管理弹出窗体,创建快照和管理用户界面元素。

●ICommand6(.Command)- 激活TE用户界面操作,如打开/关闭地下模式,开始手动对象编辑。

●ICoordServices6(.CoordServices)-数据坐标系。可以定义坐标系统,将坐标系转换为当前地形坐标系等。

●Events-使用AttachEvent监听TE事件。

提示:以上接口为TEV6.0支持的接口。当使用旧版本进行开发时,请参照相应的开发指南。

相关主题
文本预览