• Skyline开发入门(C#)


     一、帮助文档介绍

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

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

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

     

    1TerraExplorer 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接口的介绍。

    2ITerraExplorerObject5 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、私有方法

    ///<summary>

           ///添加线坐标

           ///</summary>

           ///<param name="Flags"></param>

           ///<param name="X"></param>

           ///<param name="Y"></param>

           ///<param name="pbHandled"></param>

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

             

           }

     

    ///<summary>

           ///双击结束

           ///</summary>

           ///<param name="Flags"></param>

           ///<param name="X"></param>

           ///<param name="Y"></param>

           ///<param name="pbHandled"></param>

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

           }

     

    ///<summary>

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

            ///</summary>

            ///<param name="grourName">组名</param>

            ///<param name="Name">对象名称</param>

            ///<returns></returns>

            public static int GetItemIDByName(string Name)

            {

                int ItemID = terraExplorerClass.GetNextItem(, 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);

    三、小结

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

    本文转自网易博客木乐的文章,在此感谢!

  • 相关阅读:
    报告论文:数字图像噪音处理研究
    报告论文:汽车GPS调度系统车载终端设计技术方案
    疾病研究:我是一名34岁的进行性肌营养不良症患者
    08年最热门七大技术和最紧缺的IT人才
    C#序列化
    网络游戏的数据管理
    2008年3月Google占美国搜索请求量市场份额达67.3%
    C#反转字符串效率最高的方法
    何时应该使用极限编程
    几种字符串反转方法效率比较
  • 原文地址:https://www.cnblogs.com/julia/p/2218762.html
Copyright © 2020-2023  润新知