概述
介绍了使用 C#(WPF)方式进行STK的 二次开发,包括环境配置,STK场景构建,飞机、传感器、站点、雷达等模型的使用。
环境
- STK11.6
- Visual Studio2019
软件效果
工程创建
1.打开Visual Studio2019,创建WPF工程。输入Project Name,其余可保持默认,也可根据自己需要自行设置(.Net Framework 版本设置为4以上),如下图:
2.点击“Create”,即可完成Project创建,如下图:
添加引用文件
1.右键References→Add Reference,如下图:
2.进入添加引用界面,如下图:
3.选择Assemblies→Framework,在“System.Windows.Forms”和“WindowsFormsIntegration”前面打勾✔,如下图:
4.选择COM,在“AGI STK Objects 11”和“AGI STK X 11”前面打勾✔,如下图:
5.点击Browser”,浏览到文件路径(STK安装目录\bin\Primary Interop Assemblies),选择程序集“AGI.STKX.Interop.dll”和“AxAGI.STKX.Interop.dll”,然后点击“Add”,如下图:
6.点击“OK”,引用添加完毕,如下图:
主要代码
1.创建场景
AgStkObjectRoot stkRoot = new AgStkObjectRoot(); stkRoot.NewScenario(NewScenarioDialog.ScenarioName.Text);
stkRoot.UnitPreferences.SetCurrentUnit("DistanceUnit", "km");
stkRoot.UnitPreferences.SetCurrentUnit("DateFormat", "UTCG");
stkRoot.UnitPreferences.SetCurrentUnit("TimeUnit", "sec");
stkRoot.UnitPreferences.SetCurrentUnit("AngleUnit", "deg");
stkRoot.UnitPreferences.SetCurrentUnit("LongitudeUnit", "deg");
stkRoot.UnitPreferences.SetCurrentUnit("LatitudeUnit", "deg");
stkRoot.UnitPreferences.SetCurrentUnit("PRFUnit", "MHz");
stkRoot.UnitPreferences.SetCurrentUnit("PowerUnit", "dBW");
stkRoot.UnitPreferences.SetCurrentUnit("FrequencyUnit", "GHz");
IAgStkObject IAgObjectScenario = stkRoot.CurrentScenario;
IAgScenario IScenario = IAgObjectScenario as IAgScenario;
string StartTime = NewScenarioDialog.StartTime.Value.AddHours(-8).ToString("dd MMM yyyy HH:mm:ss.fff", CultureInfo.CreateSpecificCulture("en-GB"));
string StopTime = NewScenarioDialog.StopTime.Value.AddHours(-8).ToString("dd MMM yyyy HH:mm:ss.fff", CultureInfo.CreateSpecificCulture("en-GB"));
IScenario.SetTimePeriod(StartTime, StopTime);
IScenario.Epoch = StartTime;
IScenario.Animation.StartTime = StartTime;
IScenario.Animation.AnimStepValue = (double)NewScenarioDialog.StepLength.Value;//仿真步长
IScenario.Animation.RefreshDelta = (double)NewScenarioDialog.UpdateEverySeconds.Value;//每几秒更新
IScenario.Animation.EnableAnimCycleTime = true;
IScenario.Animation.AnimCycleType = AgEScEndLoopType.eLoopAtTime;
IScenario.Animation.AnimCycleTime = IScenario.StopTime;
IAgObjectScenario.LongDescription = NewScenarioDialog.ScenarioDescription.Text;
IAgStkGraphicsSceneManager manager = IScenario.SceneManager;
IAgStkGraphicsScene currentSence = manager.Scenes[0] as IAgStkGraphicsScene;
currentSence.CentralBodies.Earth.Imagery.AddUriString(@"C:\Users\DELL\Desktop\China.jp2");
/*添加地形文件*/
IAgCentralBodyTerrainCollection terrainCollection = IScenario.Terrain;
IAgTerrainCollection elementCollection = terrainCollection["Earth"].TerrainCollection;
IAgTerrain terrain = elementCollection.Add(@"C:\Users\DELL\Desktop\StHelens_Training.pdtt", AgETerrainFileType.ePDTTTerrainFile);
terrain.UseTerrain = true;
stkRoot.Rewind();
2.创建飞机
Aircraft = stkRoot.CurrentScenario.Children.New(AgESTKObjectType.eAircraft, NewAircraftDialog.AircraftName.Text) as AgAircraft;
//添加模型
String ModelFileName = NewAircraftDialog.Model.Text;
IAgVOModelFile modelFile = Aircraft.VO.Model.ModelData as IAgVOModelFile;
modelFile.Filename = ModelFileName;
//不从场景集成RCS,设置飞机RCS
Aircraft.RadarCrossSection.Inherit = false;
IAgRadarCrossSectionModel rcs = Aircraft.RadarCrossSection.Model as IAgRadarCrossSectionModel;
//此处飞机RCS设为定值,也可制定RCS文件,这样更真实
rcs.FrequencyBands[0].SetComputeStrategy("Constant Value");
IAgRadarCrossSectionComputeStrategyConstantValue constValRcs = rcs.FrequencyBands[0].ComputeStrategy as IAgRadarCrossSectionComputeStrategyConstantValue;
constValRcs.ConstantValue = 0.5; //dBsm
//添加航迹
Aircraft.SetRouteType(AgEVePropagatorType.ePropagatorGreatArc);
IAgVePropagatorGreatArc propagator = Aircraft.Route as IAgVePropagatorGreatArc;
propagator.ArcGranularity = 50;
propagator.DefaultTurnRadius = 20;
propagator.SetAltitudeRefType(AgEVeAltitudeRef.eWayPtAltRefTerrain);
IAgVeWayPtAltitudeRefTerrain altRef = propagator.AltitudeRef as IAgVeWayPtAltitudeRefTerrain;
altRef.Granularity = 50;
altRef.InterpMethod = AgEVeWayPtInterpMethod.eWayPtEllipsoidHeight;
propagator.Method = AgEVeWayPtCompMethod.eDetermineTimeAccFromVel;
String WaypointsFileName = NewAircraftDialog.Waypoints.Text;
List<double[]> ListDoubleArrayWaypoints = FileToListDoubleArray(WaypointsFileName);
foreach (var DoubleArrayWaypoints in ListDoubleArrayWaypoints)
{
IAgVeWaypointsElement point = propagator.Waypoints.Add();
point.Latitude = DoubleArrayWaypoints[0];
point.Longitude = DoubleArrayWaypoints[1];
point.Altitude = DoubleArrayWaypoints[2];
point.Speed = DoubleArrayWaypoints[3];
}
propagator.Propagate();
//飞机描述
Aircraft.LongDescription = NewAircraftDialog.Description.Text;
//渲染
IAgStkGraphicsSceneManager manager = ((IAgScenario)stkRoot.CurrentScenario).SceneManager;
manager.Render();
3.创建站点
Facility = this.stkRoot.CurrentScenario.Children.New(AgESTKObjectType.eFacility, NewFacilityDialog.FacilitytName.Text) as AgFacility;
Facility.UseTerrain = (bool)NewFacilityDialog.useTerrain.IsChecked;
Facility.HeightAboveGround = (double)NewFacilityDialog.HeightAboveGround.Value;
Facility.Position.AssignPlanetodetic(NewFacilityDialog.Latitude.Value, NewFacilityDialog.Longtitude.Value, (double)NewFacilityDialog.Altitude.Value);
Facility.LongDescription = NewFacilityDialog.Description.Text;
4.创建传感器
Sensor = ISTKObject.Children.New(AgESTKObjectType.eSensor, NewSensorDialog.SensortName.Text) as AgSensor;
Sensor.SetPatternType(AgESnPattern.eSnSimpleConic);
IAgSnSimpleConicPattern simpleConic = (IAgSnSimpleConicPattern)Sensor.Pattern;
//设置锥半角
simpleConic.ConeAngle = NewSensorDialog.ConeHalfAngle.Value;
Sensor.SetPointingType(AgESnPointing.eSnPtTargeted);
Sensor.LongDescription = NewSensorDialog.Description.Text;
5.创建传雷达
Radar = ISTKObject.Children.New(AgESTKObjectType.eRadar, NewRadarDialog.RadarName.Text) as AgRadar;
//设置雷达为单基地雷达
Radar.SetModel("Monostatic");
IAgRadarModelMonostatic monostaticModel = Radar.Model as IAgRadarModelMonostatic;
//设置雷达为搜索追踪模式
monostaticModel.SetMode("Search Track");
IAgRadarModeMonostaticSearchTrack searchTrackMode = monostaticModel.Mode as IAgRadarModeMonostaticSearchTrack;
//设置雷达模型参数
SetRadarProperty(monostaticModel, searchTrackMode, NewRadarDialog);