本文簡要介紹使用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。新創建的工程如下圖。
添加引用文件
為項目添加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”,然后點擊“確定”。
添加引用完成后,即可在引用欄里看到添加的引用,其中AGI.STKUtil和AGI.STKVgt兩個程序是AGI.STKObjects所依賴的,系統自動幫我們添加了。
注意,由于此工程項目為示范項目,所以涉及到的程序集較少;如果STK Engine二次開發項目涉及較多程序集的話,應該添加其他相應的程序集(DLL),比如如果涉及到STK桌面軟件相關操作,則應添加“AGI UI Application 11”等程序集。
主窗口添加控件
項目中,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是命名空間名稱,可自己任意設定。
添加響應函數
上面創建了控件,我們沒有使用一行代碼。下面開始為按鈕創建響應函數。
在解決方案資源管理器中,右鍵“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