skyline 二次开发

转载: http://www.cnblogs.com/shaoge/articles/1540717.html  
 
        经过几个月的摸索,对skyline的开发有了一定的了解。入门的阶段总是让人郁闷,现将本人的经验进行简单的总结,方便自己,方便他人。本文是个人的经验总结,如果有不同的见解,欢迎各位朋友一起讨论。欢迎转载本文,转载是请注明本文地址 www.3snews.net/?gisbamboo,谢谢!

本文包括两方面的内容,一方面是介绍skyline开发帮助文档,另一方面是根据帮助文档编写一个skyline的例程。

一、帮助文档介绍

         安装好skyline pro后,在安装目录下可以找到开发帮助文档ProgrammersGuide.chm

我是把软件安装在C盘,C:\Program Files\Skyline\TerraExplorer Pro\Help。

         帮助文档共有七个章节,skylin桌面开发主要是用到第三章和第四章。

 

1、TerraExplorer CoClass Interfaces

TerraExplorerClass类是创建TerraExplorer组件类的入口,TerraExplorer CoClass Interfaces中所有的接口都实现了TerraExplorerClass类。

以获得IInformationTree5对象为例,代码如下:

TerraExplorer terraExplorer = new TerraExplorerClass();

IInformationTree5 iInformationTree5 = new TerraExplorerClass();

以上两行代码,就可以得到iInformationTree5实例了,就可以调用iInformationTree5的方法。其他组件类接口的使用方法都是类似的。

TerraExplorerClass除了能实现组件类接口,也能直接实例化。

TerraExplorerClass  terraExplorerClass = new TerraExplorerClass();

terraExplorerClass对象提供了丰富的方法,最常用的就是Invoke方法了,这个方法实际上是和IMenu接口的Invoke方法是一样的,只要传入菜单命令ID,就可以调用skyline已经封装好的很多功能了,菜单命令可以参考开发帮助IMenu接口的介绍。

2、ITerraExplorerObject5 Interfaces

主要是介绍创建TerraExplorer各种对象的接口。

 

 

以上接口不能通过直接实现,必须通过组件类实例的方法创建。

实现ITerrainPolyline接口的代码如下:

方法一:

ITerrainPolyline iTerrainPolyline= null;

iTerrainPolyline= terraExplorerClass.CreatePolyline(null,Color, HeightStyleCode.HS_ON_TERRAIN, groupID, “线的名称”);

方法二:

IObjectManager51 iObjectManager51 = (IObjectManager51)terraExplorer;

ITerrainPolyline iTerrainPolyline= null;

iTerrainPolyline =iObjectManager51.CreatePolyline(null,Color, HeightStyleCode.HS_ON_TERRAIN, groupID, “线的名称”);

二、开发实例——路线转移

路线转移功能,可以通过鼠标画一个转移的路线,双击鼠标结束画线。创建好路线之后,再创建一个动态对象,动态对象以之前创建好的路线作为运动的轨迹。

1、创建私有变量

private TerraExplorerClass terraExplorerClass;

ITerrainPolyline iTerrainPolyline= null;

 

2、创建路线

iTerrainPolyline= terraExplorerClass.CreatePolyline(null,Color, HeightStyleCode.HS_ON_TERRAIN, groupID, “路线”);

//创建鼠标左键委托

this. terraExplorerClass.OnLButtonDown += new _ITerraExplorerEvents5_OnLButtonDownEventHandler(TE_OnLButtonDown);

//创建鼠标双击委托

this. terraExplorerClass.OnLButtonDblClk += new_ITerraExplorerEvents5_OnLButtonDblClkEventHandler(TE_OnLButtonDblClk);

               this.TE.SetMouseInputMode(MouseInputMode.MI_COM_CLIENT);

3、私有方法

///

       /// 添加线坐标

       ///

       ///

       ///

       ///

       ///

       void TE_OnLButtonDown(int Flags, int X, int Y, ref object pbHandled)

       {

           object x, y, flag;

           double terrainX, terrainY, terrainH;

           //获得鼠标坐标

           this. terraExplorerClass.GetMouseInfo(out flag, out x, out y);

      //将鼠标坐标转为地理坐标

           this. terraExplorerClass.IRender3_ScreenToTerrain(Convert.ToInt32(x), Convert.ToInt32(y), out terrainX, out terrainY, out terrainH);

//将地理坐标添加到鼠标点击创建的线中

iTerrainPolyline.AddVertex(terrainX, newPolylineHeigh, terrainY, (int)flag);

         

       }

 

///

       /// 双击结束

       ///

       ///

       ///

       ///

       ///

       void TE_OnLButtonDblClk(int Flags, int X, int Y, ref object pbHandled)

       {

           this. terraExplorerClass.OnLButtonDown -= new _ITerraExplorerEvents5_OnLButtonDownEventHandler(TE_OnLButtonDown);

           this. terraExplorerClass.OnLButtonDblClk -= new _ITerraExplorerEvents5_OnLButtonDblClkEventHandler(TE_OnLButtonDblClk);

           this. terraExplorerClass.SetMouseInputMode(MouseInputMode.MI_FREE_FLIGHT);

       }

 

///

        /// 根据对象名称获取ItemID

        ///

        /// 组名

        /// 对象名称

        ///

        public static int GetItemIDByName(string Name)

        {

            int ItemID = terraExplorerClass.GetNextItem(0, ItemCode.CHILD);

            while (ItemID != 0)

            {

                string itemName = terraExplorerClass.GetItemName(ItemID);

                if (itemName.Equals(Name))

                {

                    return ItemID;

                }

                ItemID = terraExplorerClass.GetNextItem(ItemID, ItemCode.NEXT);

            }

            return ItemID;

        }

4、创建动态对象,并与创建好的路线作为运动的轨迹

//创建动态对象

IObjectManager51 objectCar = new TerraExplorerClass();

                string filename = @".\data\小车.xpc";

                ITerrainDynamicObject5 iTDynamicObject = objectCar.CreateDynamicObject(DynamicMotionStyle.MOTION_GROUND_VEHICLE,

                DynamicObjectType.DYNAMIC_3D_MODEL, filename, 2.0, HeightStyleCode.HS_ON_TERRAIN, gorupID, obejectName);

                iTDynamicObject.TurnSpeed = 200;

                iTDynamicObject.Distance = 300;

                iTDynamicObject.CircularRoute = 0;

                iTDynamicObject.ScaleFactor = 3;

//添加路线里面的坐标

int itemID = this.GetItemIDByName(“路线”);

ITerrainPolyline5 iTerrainPolyline5=terraExplorerClass.GetObjectEx(itemID, "ITerrainPolyline5");

//添加路线里的坐标点

int NumofPoint = iTerrainPolyline5.NumOfVertices;

                    object X, Height, Y;

                    for (int i = 0; i <= NumofPoint - 1; i++)

                    {

                        iTerrainPolyline5.GetVertex(i, out X, out Height, out Y);

                        iTerrainDynamicObject5.AddWaypoint((double)X, (double)Height, (double)Y, speed, i);

                    }

//视角定位至路线的第一个点

terraExplorerClass.FlyTo((double)X, (double)Y, (double)Height, 123, 0, -90, "FlyToLocation");

//飞至该路线

terraExplorerClass.FlyToObject(iTerrainDynamicObject5.ID, ActionCode.AC_PLAY);

三、小结

TerraExplorerClass是skyline开发的起点,本身能实例化,也实现了TerraExplorer接口和所有的组件类接口。应该说TerraExplorerClass是skyline开发最重要的一个类了,如果要做成插件式的三维系统,只要实例化TerraExplorerClass,并将其对象声明为公共变量,就可以与地图窗口和树控件进行交互了。

你可能感兴趣的:(skyline 二次开发)