Visual Studio 2019 STK11.6 C#(WPF)二次开发

概述

介绍了使用 C#(WPF)方式进行STK的 二次开发,包括环境配置,STK场景构建,飞机、传感器、站点、雷达等模型的使用。

环境

  1. STK11.6
  2. Visual Studio2019

软件效果

软件二次开发效果图

工程创建

1.打开Visual Studio2019,创建WPF工程。输入Project Name,其余可保持默认,也可根据自己需要自行设置(.Net Framework 版本设置为4以上),如下图:
项目设置
2.点击“Create”,即可完成Project创建,如下图:
Project创建完毕

添加引用文件

1.右键References→Add Reference,如下图:
打开引用添加界面
2.进入添加引用界面,如下图:
添加引用界面
3.选择Assemblies→Framework,在“System.Windows.Forms”和“WindowsFormsIntegration”前面打勾✔,如下图:
引用Winform
4.选择COM,在“AGI STK Objects 11”和“AGI STK X 11”前面打勾✔,如下图:
引用STK对象引擎
5.点击Browser”,浏览到文件路径(STK安装目录\bin\Primary Interop Assemblies),选择程序集“AGI.STKX.Interop.dll”和“AxAGI.STKX.Interop.dll”,然后点击“Add”,如下图:
引用STK DLL
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);
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值