using KYFramework; using Model; using MongoDB.Bson; using SimulationCommon; namespace SimulationServer; public class AircraftDY : AircraftEntity { public TaskParameter SHJParameter; public KZDYTask taskContent; public MissionEndPoint MissionEndPoint; public bool IsOver; public bool Success; public TaskParameter taskParameter; public GetNCData getNCData; public double resulttime; public int targetCount; public bool isReadNC; Text_readNC text_ReadNC; public override void End() { TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel; } public override void Reset() { base.Reset(); IsOver = false; Success = false; TotalTime = 0; targetCount = 0; } public override void Start() { targetCount = FlightPlanEditor.targetpoint[0].TargetType.Count; if (!isReadNC) { getNCData = new GetNCData(); getNCData.initlatitudes = FlightPlanEditor.targetpoint[0].TargetPointLatitude; getNCData.initlongitudes = FlightPlanEditor.targetpoint[0].TargetPointLongitude; bool isSuccess3 = false; while (!isSuccess3) { isSuccess3 = getNCData.GetData(); } text_ReadNC = new Text_readNC(); text_ReadNC.initlatitudes = FlightPlanEditor.targetpoint[0].TargetPointLatitude; text_ReadNC.initlongitudes = FlightPlanEditor.targetpoint[0].TargetPointLongitude; //text_ReadNC = new Text_readNC(); bool isSuccess = false; while (!isSuccess) { isSuccess = text_ReadNC.GetNCData(); } isReadNC = true; } int hour = Convert.ToInt32(taskContent.missionInformation.StartTime.Split("时")[0]); //Console.WriteLine("hour:" + hour); double windSpeed = Convert.ToDouble(TargetQiXiangInfoSave("风速", hour)); //Console.WriteLine("windSpeed:" + windSpeed); double vis = Convert.ToDouble(TargetQiXiangInfoSave("能见度", hour)); //Console.WriteLine("vis:" + vis); FlightPlanEditor.missionpoint.MissionPointLatitude = FlightPlanEditor.targetpoint[0].TargetPointLatitude; FlightPlanEditor.missionpoint.MissionPointLongitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude; FlightPlanEditor.missionpoint.MissionPointHeight = FlightPlanEditor.targetpoint[0].TargetPointHeight; //Console.WriteLine("Latitude:" + FlightPlanEditor.missionpoint.MissionPointLatitude + "_" + "Longitude:" + FlightPlanEditor.missionpoint.MissionPointLongitude + "_" + "Height:" + FlightPlanEditor.missionpoint.MissionPointHeight); FXJHGenerate.FromStartToMission(FlightPlanEditor, ref TurningPoints);//生成从起点到任务段起点的航路点 // 吊运上升速度 吊运下降速度 Task文件读取 // Editor里读天气根据时间 resulttime = get_result_time_rope(taskParameter.Height, taskParameter.liftPersonnel, windSpeed, vis, taskParameter.liftUpSpeed, taskParameter.liftDownSpeed).time;//索滑降模型输出的索滑降时间 Console.WriteLine("resulttime:" + resulttime); FXJHGenerate.SuoHuaJiang(resulttime, FlightPlanEditor, ref TurningPoints); FXJHGenerate.FromMissionToEnd(FlightPlanEditor, FXJHGenerate.SuoHuaJiangMissionEndPoint(FlightPlanEditor), ref TurningPoints); FXJHGenerate.FXJHTPDiedai(FlightPlanEditor, ref TurningPoints, Velocitys, FuelConsumptions); // 飞到目标点时间与人员存活时间做对比 有一个人活着,整个任务成功 double time = 0; for (int i = 0; i < TurningPoints.Count - 1; i++) { time += TurningPoints[i].SegmentFlightTime; // 判断幸存-1 } //Console.WriteLine("time:" + time); // 类型只有人,其它不影响任务成功率 ,所有目标都影响识别成功率 任务准备时间 分钟 平均搜索时间 小时 平均救助时间 秒 总飞行时间 小时 第一列加单位 if (FlightPlanEditor.targetpoint[0].TargetType.Type == "落水人员") { double latitude = FlightPlanEditor.targetpoint[0].TargetPointLatitude; //落水人员纬度;数据测试用 double longitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude; //落水人员经度,数据测试用 int Days; int Hour; int Year = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[0]); int Month = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[1].Split("月")[0]); int Day = Convert.ToInt32(taskContent.missionInformation.StartDate.Split("年")[1].Split("月")[1].Split("日")[0]); Hour = Convert.ToInt32(taskContent.missionInformation.StartTime.Split("时")[0]); Days = GetDaysInYear(Year, Month, Day); double survivalTime = SurvivalTimeModel.SurvivalTime(getNCData.tempreadNC, latitude, longitude, time, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, Days, Hour); //幸存时间 //Console.WriteLine("survivalTime:" + survivalTime * 3600); if (survivalTime * 3600 > time) { Success = true; //Console.WriteLine("Success:" + true); } } if (FlightPlanEditor.targetpoint[0].TargetType.Type == "遇险人员") { if (FlightPlanEditor.targetpoint[0].TargetType.LiveTime > time) //陆上搜寻预期存活时间读配置文件 { Success = true; //Console.WriteLine("Success:" + true); } } for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间 { TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间 //仿真轮次1 数值1 } Console.WriteLine("TotalTime:" + TotalTime); IsOver = true; End(); } // --接口 // --输入 // -- // 1)吊运高度(m) //--H(double) // 2)吊运人数 //--person_number(int) // 3)风速(m/s) //--windspeed(double) // 4)能见度(m/) // --vis(double) // 5)吊运上升速度(m/s) //--upspeed(double) // 6)吊运下降速度(m/s) //--downspeed(double) // -- // --输出 // -- // 1)能否吊运、吊运时间 //--result(handling_result) // -- //--定义handling_result类 // 吊运函数 public static handling_result get_result_time_rope(double H, int person_number, double windspeed, double vis, double upspeed, double downspeed) { handling_result result = new handling_result(); if (windspeed < 8 && vis > 3) { result.time = (person_number * H) / downspeed + (person_number * H) / upspeed; result.success = true; } else { result.success = false; } return result; } public string TargetQiXiangInfoSave(string s, int hour) { string result = hour.ToString() + "-" + s; switch (s) { case "温度": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_00_08.ToString(); else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_08_19.ToString(); else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_19_24.ToString(); break; case "湿度": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_00_08.ToString(); else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_08_19.ToString(); else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_19_24.ToString(); break; case "能见度": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_00_08.ToString(); else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_08_19.ToString(); else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_19_24.ToString(); break; case "风速": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_00_08.ToString(); else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_08_19.ToString(); else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_19_24.ToString(); break; case "风向": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_00_08.ToString(); else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_08_19.ToString(); else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_19_24.ToString(); break; case "天气": if (hour >= 0 && hour < 8) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_00_08; else if (hour >= 8 && hour < 19) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_08_19; else if (hour >= 19 && hour <= 24) result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_19_24; break; } return result; } public static int GetDaysInYear(int year, int month, int day) { int[] daysInMonths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (IsLeapYear(year)) { daysInMonths[1] = 29; } int days = day; for (int i = 0; i < month - 1; i++) { days += daysInMonths[i]; } return days; } public static bool IsLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } } public class handling_result { public bool success { get; set; } public double time { get; set; } } [ObjectSystem] public class AircraftDYAwakeSystem : AwakeSystem { public override void Awake(AircraftDY self, FlightPlanEditor flightPlanEditor) { self.FlightPlanEditor = flightPlanEditor; self.Awake(); } }