STK与WPF二次开发

本文简要介绍使用Windows WPF(C#)方式进行STK Engine的二次开发,如何添加AGI Global Control和AGI Map Control控件到用户软件界面,以及如何初始化STK场景。

WinForm与WPF方式
在使用STK Engine进行二次开发客户端软件的时候,通常使用的是Windows Form的形式,在这种开发模式下,我们使用STK 3D、2D控件的时候,是直接从控件栏将3D、2D控件直接拖到面板上实现的。这种方式简单,方便。

本文阐述使用Windows WPF方式使用STK Engine进行二次开发客户端软件的前期设置。使用WPF方式开发时,其软件GUI界面使用类似XML语言的方式,不清楚的可以自行搜索一下WPF,这里就不过多阐述了。相比WinForm方式,WPF开发方式有以下两个优点:

当STK Engine为64位时,在使用Visual Studio开发时,控件栏里是添加不了STK 3D/2D的控件的,也就是说无法使用鼠标直接拖拽的方式将控件添加到界面上,只能通过原始代码的方式自行添加,非常繁琐;

使用WPF方式,采用XML语言的方式,可以直接将3D、2D控件直接嵌入软件界面,同时可以使用WPF的样式等丰富自己的软件界面。

STK Engine API
对于.Net方式的STK Engine二次开发,本质是调用其提供的API,API以程序集(DLL)的方式存放在STK软件的安装目录下(STK安装目录\bin\Primary Interop Assemblies)。

既然是程序集DLL文件形式,那么我们使用它和任何其他第三方的DLL都是一样的过程。一是在工程中引用相关的DLL文件,二是通过Using命名空间的方式来使用相关类。

新建Visual Studio WPF工程
打开Visual Studio,新建Wpf工程项目(文件-新建-项目-Visual C#-WPF应用程序)。选择.Net FrameWork 4作为工程配置,项目名称(可任意设置):TestEngineWpf。新创建的工程如下图。

image.png

添加引用文件
为项目添加STK Engine API引用。右键“引用”-添加引用打开引用管理器,分别按照以下操作,添加几个dll程序集。

点击“程序集”,选择(前面打√)“System.Windows.Forms”和“WindowsFormsIntegration”,这两个程序集是wpf程序里安装winform控件所需要的;
点击“COM”,选择“AGI STK Objects 11”、“AGI STK X 11”;
点击“浏览”,导航到文件路径(STK安装目录\bin\Primary Interop Assemblies),选择程序集“AxAGI.STKX.Interop.dll”,然后点击“确定”。

image.png

添加引用完成后,即可在引用栏里看到添加的引用,其中AGI.STKUtil和AGI.STKVgt两个程序是AGI.STKObjects所依赖的,系统自动帮我们添加了。
注意,由于此工程项目为示范项目,所以涉及到的程序集较少;如果STK Engine二次开发项目涉及较多程序集的话,应该添加其他相应的程序集(DLL),比如如果涉及到STK桌面软件相关操作,则应添加“AGI UI Application 11”等程序集。

image.png

主窗口添加控件
项目中,MainWindow.xaml为程序主窗口GUI,双击后,显示两个编辑界面:GUI窗口和XAML窗口。XAML窗口使用xml语言的方式添加控件,GUI窗口及时显示效果。

XAML窗口中,首先添加对STK程序集的命名空间引用,然后添加STK 3D、2D控件及三个按钮,整个XAML代码如下:

<Window x:Class="TestEngineWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        
        xmlns:stkEng="clr-namespace:AxAGI.STKX;assembly=AxAGI.STKX.Interop" 
        
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <!--此面板包含STK 3D/2D控件,高度、宽度可根据需要自行设置,或者自动适应-->
            <StackPanel Orientation="Horizontal">
                <WindowsFormsHost Height="280" Width="250">
                    <stkEng:AxAgUiAxVOCntrl></stkEng:AxAgUiAxVOCntrl>                    
                </WindowsFormsHost>
                <WindowsFormsHost Height="280" Width="250">
                    <stkEng:AxAgUiAx2DCntrl></stkEng:AxAgUiAx2DCntrl>
                </WindowsFormsHost>
            </StackPanel>
            <!--此面板设置简单的功能按钮-->
            <StackPanel Orientation="Horizontal">
                <Button Name="NewScenario" Width="100" Click="NewScenario_Click">新建场景</Button>
                <Button Name="NewSatellite" Width="100" Click="NewSatellite_Click">新建卫星</Button>
                <Button Name="SaveScenario" Width="100" Click="SaveScenario_Click">保存场景</Button>                
            </StackPanel>
        </StackPanel>               
    </Grid>
</Window>

注意,上述代码中,添加xml命名空间的引用时,写入"xmlns:stkEng="时,则会自动弹出命名空间,见下图,此时查找选择"AxAGI.STKX(AxAGI.STKX.Interop)"即可。
其中,stkEng是命名空间名称,可自己任意设定。

image.png

添加响应函数
上面创建了控件,我们没有使用一行代码。下面开始为按钮创建响应函数。

在解决方案资源管理器中,右键“MainWindow.xaml”,点击“查看代码”,则其代码窗口(MainWindow.xaml.cs)打开。在其中添加相应的响应函数代码,具体含义见其中注释。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

//  引用命名空间,目前此文件内相关类仅涉及到此命名空间,
//  如果需要,还需要添加对其他命名空间的应用。
using AGI.STKObjects;

namespace TestEngineWpf
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        //*********
        //  此为STK Engine的根,控制整个STK场景
        AgStkObjectRoot stkRoot;

        public MainWindow()
        {
            InitializeComponent();

            //  初始化
            stkRoot = new AgStkObjectRoot();
        }

        //  新建STK场景,场景名为Test
        private void NewScenario_Click(object sender, RoutedEventArgs e)
        {                        
            stkRoot.NewScenario("Test");
        }

        //  新建卫星
        private void NewSatellite_Click(object sender, RoutedEventArgs e)
        {
            // Create the Satellite 
            IAgSatellite satellite = stkRoot.CurrentScenario.Children.New(AgESTKObjectType.eSatellite, "MySatellite") as IAgSatellite;

            // Set propagator to J2 Perturbation 
            satellite.SetPropagatorType(AgEVePropagatorType.ePropagatorJ2Perturbation);

            // Get the J2 Perturbation propagator 
            IAgVePropagatorJ2Perturbation propagator = satellite.Propagator as IAgVePropagatorJ2Perturbation;

            //  轨道积分(相当于STK软件中的Apply按钮)
            propagator.Propagate();
        }

        //  保存场景
        private void SaveScenario_Click(object sender, RoutedEventArgs e)
        {            
            stkRoot.SaveAs(@"D:\Test");

            //  也可保存在具体的文件内,如D:\MySTK\Test,但要确保MySTK文件夹存在。
            //  Test为场景名称,也可改为其他名称,则自动将之前设定的场景名称更改。
            //stkRoot.SaveAs(@"D:\MySTK\Test");
        }
    }
}


总结
本文大部分内容可参考STK Component的Help文档Getting Started部分。

本文给出的例子仅仅是如何使用Wpf方式加载Insight3D控件,后面具体在此控件中添加更进一步的功能,如飞行器的轨迹显示、地面站显示、图标显示等等请参考Help文档中相关说明,也可参见其提供的例子(Example文件夹下的HowTo工程),见下图,里面针对每个功能都直接提供了相关代码,可直接照搬。
————————————————
版权声明:本文为CSDN博主「云上飞47636962」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011575168/article/details/53047597

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容