Files
StandardSence/StandardScene.Core/InterLock/TrafficInterlockMission.cs
T
2026-06-14 11:19:15 +08:00

168 lines
4.9 KiB
C#

using LessokajiWeaverUtilities.Utilities;
using LoopViewerApp;
using Newtonsoft.Json;
using SimpleLite.RCS;
using SimpleLite.RCS.CarTypes;
using SimpleCore;
using SimpleCore.PropType;
using SimpleCore.Traffic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace StandardScene.InterLock
{
[MissionType(Name = "交通管制", editor = typeof(TrafficInterlockMission))]
[I18N.DocumentTranslation(Name = "Traffic Mission", locale = "en")]
public class TrafficInterlockMission : Mission
{
public static List<TrafficArea> TrafficAreaList { get; set; } = new List<TrafficArea>();
public TrafficInterlockMission()
{
TrafficControl.BeforeLock += (car, siteId) =>
{
return EnterArea(car, siteId);
};
TrafficControl.AfterLeave += (car, siteId) =>
{
LeaveArea(car, siteId);
};
}
[MethodMember(Name = "启动进程", Description = "开始交通监控")]
public void StartTrafficControl()
{
if (InitTrafficConfig()) { status.status = "已启动"; }
}
[MethodMember(Name = "停止进程", Description = "停止交通监控")]
public void StopTrafficControl()
{
status.status = "已停止";
}
[MethodMember(Name = "查看管制区")]
public void ShowViewer()
{
var viewer = new TrafficInterlockViewer();
viewer.Show();
}
/// <summary>
/// 初始化交管配置文件
/// </summary>
/// <returns></returns>
private bool InitTrafficConfig()
{
try
{
string ConfigPath = Path.Combine(Application.StartupPath, "Config/traffic.json");
if (File.Exists(ConfigPath))
{
TrafficAreaList = JsonConvert.DeserializeObject<List<TrafficArea>>(File.ReadAllText(ConfigPath));
return true;
}
return false;
}
catch (Exception ex)
{
Console.WriteLine("初始化交管配置文件失败: " + ex.Message); return false;
}
}
/// <summary>
/// 判断小车是否可以进入区域
/// </summary>
/// <param name="car"></param>
/// <param name="siteId"></param>
/// <returns></returns>
public bool EnterArea(AbstractCar car, int siteId)
{
var TrafficAreas = TrafficAreaList.FindAll(area => area.SiteList.Contains(siteId) && area.IsEnable);
if (TrafficAreas.Count == 0) { return true; }
if (!TrafficAreas.Exists(t => t.IsOccupy && t.ControllerName != car.id.ToString()))
{
lock (TrafficAreaList)
{
TrafficAreas.ForEach(t => { t.IsOccupy = true; t.ControllerName = car.id.ToString(); });
}
Console.WriteLine($"小车 {car.id} 进入了交管区域 {string.Join(",", TrafficAreas.Select(t => t.AreaName))}");
return true;
}
return false;
}
/// <summary>
/// 离开区域
/// </summary>
/// <param name="car"></param>
/// <param name="siteId"></param>
/// <returns></returns>
public bool LeaveArea(AbstractCar car, int siteId)
{
var TrafficAreas = TrafficAreaList.FindAll(area => area.SiteList.Contains(siteId) && area.IsEnable);
if (TrafficAreas.Count == 0) { return true; }
foreach (var item in TrafficAreas)
{
var Sites = SimpleLib.GetAllSites().Where(s => item.SiteList.Contains(s.id)).ToList();
if (!Sites.Exists(t => t.status.owner == car.id))
{
lock (TrafficAreaList)
{
item.ControllerName = string.Empty; item.IsOccupy = false;
}
Console.WriteLine($"小车 {car.id} 离开了交管区域 {item.AreaName}");
}
}
return true;
}
}
public class TrafficArea
{
/// <summary>
/// 区域名称
/// </summary>
public string AreaName { get; set; }
/// <summary>
/// 区域站点集合
/// </summary>
public List<int> SiteList { get; set; }
/// <summary>
/// 控制权
/// </summary>
[JsonIgnore]
public string ControllerName { get; set; }
/// <summary>
/// 是否被占用
/// </summary>
[JsonIgnore]
public bool IsOccupy { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnable { get; set; }
}
}