用ElementStatusInfo类,统一实现运行态信息返回,同时修改GetStatus方法

This commit is contained in:
Tian jianyong 2025-05-02 17:08:09 +08:00
parent 75cbcaa104
commit af88ac64ad
45 changed files with 439 additions and 752 deletions

View File

@ -81,8 +81,8 @@ namespace ThreatSource.Tests.Jamming
// Assert
Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态");
var status = _infraredTracker.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 受红外干扰"), "状态信息应该反映受干扰");
ElementStatusInfo statusInfo = _infraredTracker.GetStatusInfo();
Assert.IsTrue(statusInfo.ExtendedProperties.ContainsKey("IsJammed"), "状态信息应该反映受干扰");
}
[TestMethod]
@ -111,8 +111,8 @@ namespace ThreatSource.Tests.Jamming
// Assert
Assert.IsFalse(_infraredTracker.IsJammed, "测角仪不应该被干扰,因为干扰源不在角度范围内");
var status = _infraredTracker.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 正常"), "状态信息应该反映正常");
ElementStatusInfo statusInfo = _infraredTracker.GetStatusInfo();
Assert.IsTrue(statusInfo.ExtendedProperties.ContainsKey("IsJammed"), "状态信息应该反映正常");
}
[TestMethod]

View File

@ -99,8 +99,8 @@ namespace ThreatSource.Tests.Jamming
// Assert
Assert.IsTrue(_laserBeamRider.IsJammed, "激光驾束仪应该处于被干扰状态");
var status = _laserBeamRider.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 受激光干扰"), "状态信息应该反映受干扰");
ElementStatusInfo statusInfo = _laserBeamRider.GetStatusInfo();
Assert.IsTrue(statusInfo.ExtendedProperties.ContainsKey("IsJammed"), "状态信息应该反映受干扰");
}
[TestMethod]

View File

@ -99,8 +99,8 @@ namespace ThreatSource.Tests.Jamming
// Assert
Assert.IsTrue(_laserDesignator.IsJammed, "激光指示器应该处于被干扰状态");
var status = _laserDesignator.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 受激光干扰"), "状态信息应该反映受干扰");
ElementStatusInfo status = _laserDesignator.GetStatusInfo();
Assert.IsTrue(status.ExtendedProperties["IsJammed"].ToString() == "True", "状态信息应该反映受干扰");
}
[TestMethod]
@ -131,8 +131,8 @@ namespace ThreatSource.Tests.Jamming
// Assert
Assert.IsFalse(_laserDesignator.IsJammed, "指示器不应该被干扰,因为干扰源不在角度范围内");
var status = _laserDesignator.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 正常"), "状态信息应该反映正常");
ElementStatusInfo status = _laserDesignator.GetStatusInfo();
Assert.IsTrue(status.ExtendedProperties["IsJammed"].ToString() == "False", "状态信息应该反映正常");
}
[TestMethod]

View File

@ -417,8 +417,8 @@ namespace ThreatSource.Tests.Jamming
// 验证干扰效果
Assert.IsTrue(altimeter.IsJammed, "测高仪应该处于被干扰状态");
var status = submunition.GetStatus();
Assert.IsTrue(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器受到干扰");
ElementStatusInfo status = submunition.GetStatusInfo();
Assert.IsTrue(status.ExtendedProperties["IsSensorsJammed"].ToString() == "True", "子弹状态应该反映传感器受到干扰");
// 清除干扰
altimeter.ClearJamming(millimeterWaveJamming.Parameters);
@ -426,8 +426,8 @@ namespace ThreatSource.Tests.Jamming
// 验证恢复效果
Assert.IsFalse(altimeter.IsJammed, "测高仪应该恢复正常工作");
status = submunition.GetStatus();
Assert.IsFalse(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器恢复正常");
status = submunition.GetStatusInfo();
Assert.IsFalse(status.ExtendedProperties["IsSensorsJammed"].ToString() == "True", "子弹状态应该反映传感器恢复正常");
// 验证高度测量恢复
double? recoveredAltitude = ((AltimeterSensorData)altimeter.GetSensorData()).Altitude;
@ -529,9 +529,9 @@ namespace ThreatSource.Tests.Jamming
// 验证干扰效果
Assert.IsTrue(altimeter.IsJammed, "测高仪应该处于被干扰状态");
var status = submunition.GetStatus();
ElementStatusInfo status = submunition.GetStatusInfo();
Console.WriteLine($"干扰后状态:{status}");
Assert.IsTrue(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器受到干扰");
Assert.IsTrue(status.ExtendedProperties["IsSensorsJammed"].ToString() == "True", "子弹状态应该反映传感器受到干扰");
// 记录干扰时的位置
var jammedPosition = submunition.Position;
@ -552,9 +552,9 @@ namespace ThreatSource.Tests.Jamming
// 验证恢复效果
Assert.IsFalse(altimeter.IsJammed, "测高仪应该恢复正常工作");
status = submunition.GetStatus();
status = submunition.GetStatusInfo();
Console.WriteLine($"恢复后状态:{status}");
Assert.IsFalse(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器恢复正常");
Assert.IsFalse(status.ExtendedProperties["IsSensorsJammed"].ToString() == "True", "子弹状态应该反映传感器恢复正常");
// 验证速度变化
Assert.IsTrue(submunition.Speed <= 40, "速度应该保持在开伞阶段的限制范围内");

View File

@ -173,21 +173,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(_properties.Type, state.Type);
Assert.Equal(_properties.Type, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -166,49 +166,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
string status = _missile.GetStatus();
// Assert
var expectedParts = new[]
{
"导弹",
_missile.Id,
"位置",
_missile.Position.ToString(),
"速度",
_missile.Speed.ToString(),
"飞行时间",
_missile.FlightTime.ToString(),
"飞行距离",
_missile.FlightDistance.ToString(),
"当前阶段"
};
foreach (var part in expectedParts)
{
Assert.Contains(part, status);
}
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.InfraredCommandGuidance, state.Type);
Assert.Equal(MissileType.InfraredCommandGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -132,8 +132,7 @@ namespace ThreatSource.Tests.Missile
}
// Assert
string status = _missile.GetStatus();
Assert.Contains("状态: 非激活", status);
Assert.False(_missile.IsActive);
}
[Fact]
@ -151,50 +150,25 @@ namespace ThreatSource.Tests.Missile
}
// Assert
string status = _missile.GetStatus();
Assert.Contains("状态: 非激活", status);
Assert.False(_missile.IsActive);
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
{
// Arrange
_missile.Fire();
// Act
string status = _missile.GetStatus();
// Assert
Assert.Contains("红外成像末制导导弹", status);
Assert.Contains(_missile.Id, status);
Assert.Contains("状态:", status);
Assert.Contains("位置:", status);
Assert.Contains("速度:", status);
Assert.Contains("速度分量:", status);
Assert.Contains("朝向:", status);
Assert.Contains("飞行时间:", status);
Assert.Contains("飞行距离:", status);
Assert.Contains("发动机工作时间:", status);
Assert.Contains("有引导:", status);
Assert.Contains("失去引导时间:", status);
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.InfraredImagingTerminalGuidance, state.Type);
Assert.Equal(MissileType.InfraredImagingTerminalGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}

View File

@ -144,36 +144,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
string status = _missile.GetStatus();
// Assert
Assert.Contains("激光驾束制导导弹", status);
Assert.Contains(_missile.Id, status);
Assert.Contains(_missile.Position.ToString(), status);
Assert.Contains(_missile.Speed.ToString(), status);
Assert.Contains(_missile.FlightTime.ToString(), status);
Assert.Contains(_missile.FlightDistance.ToString(), status);
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.LaserBeamRiderGuidance, state.Type);
Assert.Equal(MissileType.LaserBeamRiderGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -148,48 +148,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
string status = _missile.GetStatus();
// Assert
var expectedParts = new[]
{
"激光半主动制导导弹",
_missile.Id,
"位置",
_missile.Position.ToString(),
"速度",
_missile.Speed.ToString(),
"飞行时间",
_missile.FlightTime.ToString(),
"飞行距离",
_missile.FlightDistance.ToString()
};
foreach (var part in expectedParts)
{
Assert.Contains(part, status);
}
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.LaserSemiActiveGuidance, state.Type);
Assert.Equal(MissileType.LaserSemiActiveGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -108,48 +108,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
string status = _missile.GetStatus();
// Assert
var expectedParts = new[]
{
"导弹",
_missile.Id,
"位置",
_missile.Position.ToString(),
"速度",
_missile.Speed.ToString(),
"飞行时间",
_missile.FlightTime.ToString(),
"飞行距离",
_missile.FlightDistance.ToString()
};
foreach (var part in expectedParts)
{
Assert.Contains(part, status);
}
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.MillimeterWaveTerminalGuidance, state.Type);
Assert.Equal(MissileType.MillimeterWaveTerminalGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -205,47 +205,21 @@ namespace ThreatSource.Tests.Missile
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
string status = _missile.GetStatus();
// Assert
var expectedParts = new[]
{
"末敏弹(母弹)",
_missile.Id,
"状态:",
"位置:",
_missile.Position.ToString(),
"速度:",
_missile.Speed.ToString(),
"飞行时间:",
_missile.FlightDistance.ToString()
};
foreach (var part in expectedParts)
{
Assert.Contains(part, status);
}
}
[Fact]
public void GetRunningState_ReturnsCorrectState()
{
// Act
var state = _missile.GetRunningState();
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.TerminalSensitiveMissile, state.Type);
Assert.Equal(MissileType.TerminalSensitiveMissile, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.Velocity);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.FlightTime);
Assert.Equal(_missile.FlightDistance, state.FlightDistance);
Assert.Equal(_missile.IsGuidance, state.IsGuidance);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}

View File

@ -174,31 +174,6 @@ namespace ThreatSource.Tests.Missile
Assert.False(_submunition.IsActive);
}
[Fact]
public void GetStatus_ReturnsCorrectStatus()
{
// Act
string status = _submunition.GetStatus();
// Assert
var expectedParts = new[]
{
"末敏弹(子弹)",
_submunition.Id,
"状态:",
"位置:",
"速度:",
"飞行时间:",
"飞行距离:",
"运行状态:"
};
foreach (var part in expectedParts)
{
Assert.Contains(part, status);
}
}
[Fact]
public void TestSensorAngleCorrection()
{

View File

@ -133,7 +133,7 @@ namespace ThreatSource.Data
/// <param name="missileId">导弹ID</param>
/// <param name="motionParameters">初始运动参数</param>
/// <returns>指示器实例</returns>
public IIndicator CreateIndicator(string indicatorId, string indicatorModel, string targetId, string missileId, MotionParameters motionParameters)
public BaseIndicator CreateIndicator(string indicatorId, string indicatorModel, string targetId, string missileId, MotionParameters motionParameters)
{
var data = _dataManager.GetIndicator(indicatorModel);

View File

@ -97,14 +97,27 @@ namespace ThreatSource.Equipment
SimulationManager.PublishEvent(new TargetDestroyedEvent { TargetId = Id });
}
}
/// <summary>
/// 获取目标状态信息
/// 获取目标的结构化状态信息
/// </summary>
/// <returns>目标状态信息</returns>
public override string GetStatus()
/// <returns>包含目标当前状态的结构化对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus() + $"目标状态:健康度:{Health}\n";
// 获取基础状态信息
var statusInfo = base.GetStatusInfo();
// 添加装备特有属性
statusInfo.ExtendedProperties["Health"] = Health;
statusInfo.ExtendedProperties["Length"] = Properties.Length;
statusInfo.ExtendedProperties["Width"] = Properties.Width;
statusInfo.ExtendedProperties["Height"] = Properties.Height;
statusInfo.ExtendedProperties["RadarCrossSection"] = Properties.RadarCrossSection;
statusInfo.ExtendedProperties["InfraredRadiationIntensity"] = Properties.InfraredRadiationIntensity;
statusInfo.ExtendedProperties["MillimeterWaveRadiationIntensity"] = Properties.MillimeterWaveRadiationIntensity;
statusInfo.ExtendedProperties["UltravioletRadiationIntensity"] = Properties.UltravioletRadiationIntensity;
return statusInfo;
}
}
}

View File

@ -219,21 +219,29 @@ namespace ThreatSource.Guidance
}
/// <summary>
/// 获取制导系统的状态信息
/// 获取制导系统的详细状态信息
/// </summary>
/// <returns>包含关键状态参数的字符串</returns>
/// <remarks>
/// 返回信息:
/// - 制导状态
/// - 干扰状态
/// - 位置信息
/// - 速度信息
/// - 加速度信息
/// 用于状态监控和调试
/// </remarks>
public override string GetStatus()
/// <returns>包含制导系统状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus() + $"导引头状态: 有制导={HasGuidance}, 被干扰={IsJammed}, 制导加速度={GuidanceAcceleration}";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["HasGuidance"] = HasGuidance;
statusInfo.ExtendedProperties["IsJammed"] = IsJammed;
statusInfo.ExtendedProperties["IsHardJammed"] = IsHardJammed;
statusInfo.ExtendedProperties["GuidanceAcceleration"] = GuidanceAcceleration;
statusInfo.ExtendedProperties["MaxAcceleration"] = MaxAcceleration;
statusInfo.ExtendedProperties["ProportionalNavigationCoefficient"] = ProportionalNavigationCoefficient;
// 如果有父实体添加父实体ID
if (!string.IsNullOrEmpty(ParentId))
{
statusInfo.ExtendedProperties["ParentId"] = ParentId;
}
return statusInfo;
}
/// <summary>

View File

@ -212,28 +212,29 @@ namespace ThreatSource.Guidance
}
/// <summary>
/// 获取制导系统的详细状态信息
/// 获取红外指令导引系统的详细状态信息
/// </summary>
/// <returns>包含完整状态参数的字符串</returns>
/// <remarks>
/// 返回信息:
/// - 基本状态信息
/// - 制导加速度
/// - 方向向量
/// - 转向速率
/// 用于系统监控和调试
/// </remarks>
public override string GetStatus()
/// <returns>包含导引系统状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
string angleStr = "null";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加角度信息
if (LastTrackerToTargetVector != null && LastTrackerToMissileVector != null)
{
angleStr = Vector3D.AngleBetween(LastTrackerToTargetVector, LastTrackerToMissileVector).ToString("F3");
double angle = Vector3D.AngleBetween(LastTrackerToTargetVector, LastTrackerToMissileVector);
statusInfo.ExtendedProperties["TurnAngle"] = angle;
}
else
{
statusInfo.ExtendedProperties["TurnAngle"] = "";
}
return base.GetStatus() +
$" 转向角度: {angleStr} 弧度," +
$" 转向速率: {turnRate:F3} 弧度/秒";
// 添加转向速率
statusInfo.ExtendedProperties["TurnRate"] = turnRate;
return statusInfo;
}
}
}

View File

@ -298,9 +298,8 @@ namespace ThreatSource.Guidance
/// <param name="missilePosition">导弹位置</param>
/// <param name="smokeAttenuation">衰减型烟幕透过率</param>
/// <param name="simulationManager">仿真管理器实例</param>
/// <param name="smokeGrenadeOverlapRatios">已计算的烟幕覆盖率字典键为烟幕ID值为覆盖率</param>
/// <returns>红外图像</returns>
public InfraredImage GenerateImage(BaseEquipment target, Vector3D missilePosition, double smokeAttenuation, ISimulationManager simulationManager, Dictionary<string, double> smokeGrenadeOverlapRatios = null)
public InfraredImage GenerateImage(BaseEquipment target, Vector3D missilePosition, double smokeAttenuation, ISimulationManager simulationManager)
{
// 更新视线坐标系
UpdateLineOfSightFrame(missilePosition, target.Position);

View File

@ -573,22 +573,19 @@ namespace ThreatSource.Guidance
}
/// <summary>
/// 获取制导系统的详细状态信息
/// 获取红外图像制导系统的详细状态信息
/// </summary>
/// <returns>包含完整状态参数的字符串</returns>
/// <remarks>
/// 返回信息:
/// - 基本状态信息
/// - 制导加速度
/// - 目标位置
/// 用于系统监控和调试
/// 特有的返回信息:
/// - 上次发现的目标位置
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
// Check for null before calling ToString()
var statusInfo = base.GetStatusInfo();
string lastPosStr = lastTargetPosition != null ? lastTargetPosition.ToString() : "null";
return base.GetStatus() + $", GuidanceAcceleration: {GuidanceAcceleration}, " +
$"Target Position: {lastPosStr}";
statusInfo.ExtendedProperties["lastPosStr"] = lastPosStr;
return statusInfo;
}
}
}

View File

@ -577,20 +577,27 @@ namespace ThreatSource.Guidance
/// <summary>
/// 获取制导系统的详细状态信息
/// </summary>
/// <returns>包含完整状态参数的字符串</returns>
/// <returns>包含完整状态参数的ElementStatusInfo对象</returns>
/// <remarks>
/// 返回信息:
/// - 基本状态信息
/// - 制导参数
/// - 控制状态
/// 特有的返回信息:
/// - 激光源位置
/// - 激光方向
/// - 激光功率
/// - 照明状态
/// 用于系统监控和调试
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
string sourcePosStr = LaserSourcePosition != null ? LaserSourcePosition.ToString() : "null";
string directionStr = LaserDirection != null ? LaserDirection.ToString() : "null";
return base.GetStatus() + $", SourcePos: {sourcePosStr}, Direction: {directionStr}, " +
$"LaserPower: {LaserPower:E} W, Illumination: {LaserIlluminationOn}";
statusInfo.ExtendedProperties["SourcePos"] = sourcePosStr;
statusInfo.ExtendedProperties["Direction"] = directionStr;
statusInfo.ExtendedProperties["LaserPower"] = LaserPower.ToString("E") + " W";
statusInfo.ExtendedProperties["Illumination"] = LaserIlluminationOn.ToString();
return statusInfo;
}
/// <summary>

View File

@ -698,21 +698,23 @@ namespace ThreatSource.Guidance
/// <summary>
/// 获取制导系统的详细状态信息
/// </summary>
/// <returns>包含完整状态参数的字符串</returns>
/// <returns>包含完整状态参数的ElementStatusInfo对象</returns>
/// <remarks>
/// 返回信息:
/// - 基本状态信息
/// 特有的返回信息:
/// - 接收功率数据
/// - 锁定阈值
/// - 四象限探测器状态
/// 用于系统监控和调试
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus() +
$" 接收到的激光功率: {ReceivedLaserPower:E} W," +
$" 锁定阈值: {config.LockThreshold:E} W," +
$" 四象限探测器: {quadrantDetector.GetStatus()}";
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["ReceivedLaserPower"] = ReceivedLaserPower.ToString("E") + " W";
statusInfo.ExtendedProperties["LockThreshold"] = config.LockThreshold.ToString("E") + " W";
statusInfo.ExtendedProperties["QuadrantDetectorStatus"] = quadrantDetector.GetStatus();
return statusInfo;
}
/// <summary>

View File

@ -661,23 +661,28 @@ namespace ThreatSource.Guidance
/// <summary>
/// 获取制导系统的详细状态信息
/// </summary>
/// <returns>包含完整状态参数的字符串</returns>
/// <returns>包含完整状态参数的ElementStatusInfo对象</returns>
/// <remarks>
/// 返回信息:
/// - 基本状态信息
/// 特有的返回信息:
/// - 当前模式
/// - 目标位置
/// - 目标速度
/// - 是否有目标
/// 用于系统监控和调试
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
string lastPosStr = lastTargetPosition != null ? lastTargetPosition.ToString() : "null";
string lastVelStr = lastTargetVelocity != null ? lastTargetVelocity.ToString() : "null";
return base.GetStatus() +
$"\n当前模式: {currentMode}" +
$"\n最后目标位置: {lastPosStr}" +
$"\n最后目标速度: {lastVelStr}" +
$"\n是否有目标: {HasTarget}";
statusInfo.ExtendedProperties["Mode"] = currentMode.ToString();
statusInfo.ExtendedProperties["LastTargetPosition"] = lastPosStr;
statusInfo.ExtendedProperties["LastTargetVelocity"] = lastVelStr;
statusInfo.ExtendedProperties["HasTarget"] = HasTarget.ToString();
return statusInfo;
}
/// <summary>

View File

@ -17,7 +17,7 @@ namespace ThreatSource.Indicator
/// - 干扰处理机制
/// 是具体指示器类的实现基础
/// </remarks>
public abstract class BaseIndicator : SimulationElement, IIndicator, IJammable
public abstract class BaseIndicator : SimulationElement, IJammable
{
/// <summary>
/// 视觉遮挡阈值 (0.0 - 1.0)
@ -253,22 +253,23 @@ namespace ThreatSource.Indicator
}
/// <summary>
/// 获取指示器运行状态
/// 获取指示器的详细状态信息
/// </summary>
/// <returns>包含指示器完整状态信息的结构体</returns>
/// <remarks>
/// 子类需要重写此方法以提供完整的状态信息
/// 包括位置、姿态、目标关联和干扰状态等
/// </remarks>
public abstract IndicatorRunningState GetRunningState();
/// <summary>
/// 获取指示器状态信息
/// </summary>
/// <returns>包含指示器状态信息的字符串</returns>
public override string GetStatus()
/// <returns>包含指示器状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return $"指示器 {Id} 当前状态: 上次目标位置: {_lastKnownTargetPosition}, 上次目标朝向: {_lastKnownTargetOrientation}";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["TargetId"] = TargetId ?? "";
statusInfo.ExtendedProperties["MissileId"] = MissileId ?? "";
statusInfo.ExtendedProperties["lastKnownTargetPosition"] = _lastKnownTargetPosition ?? Vector3D.Zero;
statusInfo.ExtendedProperties["lastKnownTargetOrientation"] = _lastKnownTargetOrientation ?? new Orientation(0, 0, 0);
statusInfo.ExtendedProperties["IsTargetObscured"] = IsTargetObscured;
statusInfo.ExtendedProperties["IsJammed"] = IsJammed;
return statusInfo;
}
/// <summary>

View File

@ -33,116 +33,6 @@ namespace ThreatSource.Indicator
/// 可以为null表示当前没有关联导弹
/// </remarks>
string? MissileId { get; }
/// <summary>
/// 获取指示器的当前运行状态
/// </summary>
/// <returns>包含指示器完整状态信息的结构体</returns>
/// <remarks>
/// 返回的状态信息包括:
/// - 目标和导弹的关联状态
/// - 指示器的工作状态
/// - 位置、速度和姿态信息
/// - 激活状态
/// - 干扰状态
/// </remarks>
IndicatorRunningState GetRunningState();
}
/// <summary>
/// 指示器运行状态结构体,包含了指示器的完整状态信息
/// </summary>
/// <remarks>
/// 该结构体封装了指示器的所有关键状态:
/// - 关联信息(目标和导弹)
/// - 工作状态(类型和状态)
/// - 运动状态(位置、速度、姿态)
/// - 功能状态(是否激活)
/// - 干扰状态(是否被干扰)
/// 用于状态监控和控制决策
/// </remarks>
public struct IndicatorRunningState
{
/// <summary>
/// 获取或设置目标ID
/// </summary>
/// <remarks>
/// 标识当前跟踪的目标
/// 用于目标关联和状态更新
/// </remarks>
public string TargetId { get; set; }
/// <summary>
/// 获取或设置导弹ID
/// </summary>
/// <remarks>
/// 标识当前控制的导弹
/// 用于导弹制导和状态同步
/// </remarks>
public string MissileId { get; set; }
/// <summary>
/// 获取或设置指示器类型
/// </summary>
/// <remarks>
/// 表示指示器的具体类型
/// 影响指示器的工作模式和性能参数
/// </remarks>
public IndicatorType Type { get; set; }
/// <summary>
/// 获取或设置指示器状态
/// </summary>
/// <remarks>
/// 表示指示器的当前工作状态
/// 用于控制指示器的工作模式
/// </remarks>
public IndicatorState State { get; set; }
/// <summary>
/// 获取或设置指示器位置
/// </summary>
/// <remarks>
/// 指示器在三维空间中的位置向量
/// 用于空间定位和运动控制
/// </remarks>
public Vector3D Position { get; set; }
/// <summary>
/// 获取或设置指示器速度
/// </summary>
/// <remarks>
/// 指示器在三维空间中的速度向量
/// 用于运动状态更新和预测
/// </remarks>
public Vector3D Velocity { get; set; }
/// <summary>
/// 获取或设置指示器朝向
/// </summary>
/// <remarks>
/// 指示器在三维空间中的姿态
/// 影响指示器的工作效果和精度
/// </remarks>
public Orientation Orientation { get; set; }
/// <summary>
/// 获取或设置指示器是否激活
/// </summary>
/// <remarks>
/// 表示指示器是否处于工作状态
/// true表示正在工作false表示待机
/// </remarks>
public bool IsActive { get; set; }
/// <summary>
/// 获取或设置指示器的干扰状态
/// </summary>
/// <remarks>
/// 表示指示器当前的干扰状态
/// 用于状态监控和干扰防护
/// </remarks>
public JammingState JammingState { get; set; }
}
/// <summary>

View File

@ -341,67 +341,17 @@ namespace ThreatSource.Indicator
}
/// <summary>
/// 获取红外测角仪运行状态
/// 获取红外测角仪的详细状态信息
/// </summary>
/// <returns>包含测角仪完整状态信息的结构体</returns>
/// <remarks>
/// 返回信息包括:
/// - 目标和导弹关联状态
/// - 工作类型和状态
/// - 位置和姿态信息
/// - 激活状态
/// - 干扰状态 (包括电子干扰和烟幕遮挡)
/// </remarks>
public override IndicatorRunningState GetRunningState()
/// <returns>包含红外测角仪状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return new IndicatorRunningState
{
TargetId = TargetId ?? "",
MissileId = MissileId ?? "",
Type = IndicatorType.InfraredTracker,
State = IsTracking ? IndicatorState.Indicating : IndicatorState.Idle,
Position = Position,
Orientation = Orientation,
IsActive = IsActive,
JammingState = (IsJammed || IsTargetObscured) ? JammingState.Jammed : JammingState.Normal
};
}
/// <summary>
/// 获取红外测角仪状态信息
/// </summary>
/// <returns>包含测角仪状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基本标识信息
/// - 位置信息
/// - 目标关联状态
/// - 工作状态
/// - 跟踪状态
/// - 干扰/遮挡状态
/// </remarks>
public override string GetStatus()
{
string jammingStatusString = "正常";
if (IsJammed)
{
if (IsTargetObscured)
{
jammingStatusString = "目标被烟幕遮挡";
}
else
{
jammingStatusString = "受红外干扰";
}
}
return base.GetStatus() + "\n" +
$" 位置: {Position}\n" +
$" 跟踪导弹: {MissileId ?? ""}\n" +
$" 目标: {TargetId ?? ""}\n" +
$" 状态: {(IsActive ? "" : "")}\n" +
$" 跟踪状态: {(IsTracking ? "" : "")}\n" +
$" 干扰/遮挡状态: {jammingStatusString}\n";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["IsTracking"] = IsTracking;
return statusInfo;
}
/// <summary>

View File

@ -291,70 +291,23 @@ namespace ThreatSource.Indicator
}
/// <summary>
/// 获取指示器运行状态
/// 获取激光驾束仪的详细状态信息
/// </summary>
/// <returns>包含指示器完整状态信息的结构体</returns>
/// <remarks>
/// 返回信息包括:
/// - 目标和导弹关联状态
/// - 工作类型和状态
/// - 位置和姿态信息
/// - 激活状态
/// - 干扰/遮挡状态
/// </remarks>
public override IndicatorRunningState GetRunningState()
/// <returns>包含激光驾束仪状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return new IndicatorRunningState
{
TargetId = TargetId ?? "",
MissileId = MissileId ?? "",
Type = IndicatorType.LaserBeamRider,
State = IsBeamOn ? IndicatorState.Indicating : IndicatorState.Idle,
Position = Position,
Orientation = Orientation,
IsActive = IsActive,
JammingState = (IsJammed || IsTargetObscured) ? JammingState.Jammed : JammingState.Normal
};
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["IsBeamOn"] = IsBeamOn;
statusInfo.ExtendedProperties["Power"] = config.Power;
statusInfo.ExtendedProperties["Wavelength"] = config.Wavelength;
statusInfo.ExtendedProperties["ControlFieldDiameter"] = config.ControlFieldDiameter;
statusInfo.ExtendedProperties["LaserDirection"] = LaserDirection;
return statusInfo;
}
/// <summary>
/// 获取激光驾束仪状态字符串
/// </summary>
/// <returns>包含设备状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 设备ID和位置
/// - 激光参数(功率、发散角等)
/// - 工作状态(激活、照射等)
/// - 制导范围参数
/// - 干扰/遮挡状态
/// </remarks>
public override string GetStatus()
{
string jammingStatusString = "正常";
if (IsJammed)
{
if (IsTargetObscured)
{
jammingStatusString = "目标被烟幕遮挡";
}
else
{
jammingStatusString = "受激光干扰";
}
}
return base.GetStatus() + "\n" +
$" 位置: {Position}\n" +
$" 方向: {LaserDirection}\n" +
$" 激活状态: {(IsActive ? "" : "")}\n" +
$" 激光束状态: {(IsBeamOn ? "" : "")}\n" +
$" 干扰/遮挡状态: {jammingStatusString}\n" +
$" 激光功率: {config.Power} W\n" +
$" 激光波长: {config.Wavelength} μm\n" +
$" 控制场直径: {config.ControlFieldDiameter} m\n";
}
/// <summary>
/// 处理指示器被干扰的事件
/// </summary>

View File

@ -345,71 +345,20 @@ namespace ThreatSource.Indicator
}
/// <summary>
/// 获取指示器运行状态
/// 获取激光驾束仪的详细状态信息
/// </summary>
/// <returns>包含指示器完整状态信息的结构体</returns>
/// <remarks>
/// 返回信息包括:
/// - 目标和导弹关联状态
/// - 工作类型和状态
/// - 位置和姿态信息
/// - 激活状态
/// - 干扰/遮挡状态
/// </remarks>
public override IndicatorRunningState GetRunningState()
/// <returns>包含激光驾束仪状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return new IndicatorRunningState
{
TargetId = TargetId ?? "",
MissileId = MissileId ?? "",
Type = IndicatorType.LaserDesignator,
State = IsIlluminationOn ? IndicatorState.Indicating : IndicatorState.Idle,
Position = Position,
Orientation = Orientation,
IsActive = IsActive,
JammingState = (IsJammed || IsTargetObscured) ? JammingState.Jammed : JammingState.Normal
};
}
/// <summary>
/// 获取激光指示器状态信息
/// </summary>
/// <returns>包含指示器状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基本标识信息
/// - 位置信息
/// - 目标关联状态
/// - 工作状态
/// - 干扰/遮挡状态
/// - 激光参数
/// </remarks>
public override string GetStatus()
{
string jammingStatusString = "正常";
if (IsJammed)
{
if (IsTargetObscured)
{
jammingStatusString = "目标被烟幕遮挡";
}
else
{
jammingStatusString = "受激光干扰";
}
}
return base.GetStatus() + "\n" +
$" 位置: {Position}\n" +
$" 目标: {TargetId}\n" +
$" 导弹: {MissileId}\n" +
$" 朝向: {Orientation}\n" +
$" 激活状态: {(IsActive ? "" : "")}\n" +
$" 照射状态: {(IsIlluminationOn ? "" : "")}\n" +
$" 干扰/遮挡状态: {jammingStatusString}\n" +
$" 编码状态: {(config.LaserCodeConfig != null ? "" : "")}\n" +
$" 波长: {config.Wavelength}um\n" +
$" 激光功率: {config.Power:E} W";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["IsIlluminationOn"] = IsIlluminationOn;
statusInfo.ExtendedProperties["Power"] = config.Power;
statusInfo.ExtendedProperties["Wavelength"] = config.Wavelength;
statusInfo.ExtendedProperties["LaserCodeConfig"] = config.LaserCodeConfig;
return statusInfo;
}
}
}

View File

@ -215,20 +215,31 @@ namespace ThreatSource.Jammer
}
/// <summary>
/// 获取干扰器状态信息
/// 获取干扰器的详细状态信息
/// </summary>
/// <returns>干扰器状态信息</returns>
public override string GetStatus()
/// <returns>包含干扰器状态信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus() + $"干扰器状态:{State}, type: {JammingType}, isJamming: {IsJamming}\n"
+ $"干扰模式: {CurrentParameters?.Mode}\n"
+ $"功率: {CurrentParameters?.Power}\n"
+ $"波长: {CurrentParameters?.Wavelength}\n"
+ $"方向: {CurrentParameters?.Direction}\n"
+ $"位置: {CurrentParameters?.SourcePosition}\n"
+ $"角度范围: {CurrentParameters?.AngleRange}\n"
+ $"持续时间: {CurrentParameters?.Duration}\n"
+ $"干扰类型: {CurrentParameters?.Type}\n";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["JammingType"] = JammingType;
statusInfo.ExtendedProperties["State"] = State;
statusInfo.ExtendedProperties["IsJamming"] = IsJamming;
if (CurrentParameters != null)
{
statusInfo.ExtendedProperties["Mode"] = CurrentParameters.Mode;
statusInfo.ExtendedProperties["Power"] = CurrentParameters.Power;
statusInfo.ExtendedProperties["Wavelength"] = CurrentParameters.Wavelength ?? 0;
statusInfo.ExtendedProperties["Direction"] = CurrentParameters.Direction;
statusInfo.ExtendedProperties["AngleRange"] = CurrentParameters.AngleRange;
statusInfo.ExtendedProperties["Duration"] = CurrentParameters.Duration ?? 0;
statusInfo.ExtendedProperties["Type"] = CurrentParameters.Type;
}
return statusInfo;
}
}
}

View File

@ -84,12 +84,20 @@ namespace ThreatSource.Jammer
}
/// <summary>
/// 获取激光诱偏目标状态
/// 获取激光诱偏目标的详细状态信息
/// </summary>
/// <returns>激光诱偏目标状态</returns>
public override string GetStatus()
/// <returns>包含激光诱偏目标状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus() + $"诱饵位置: {Position}, 源 ID: {SourceId}, 诱偏功率: {config.Power}, 诱偏激光发散角: {config.DivergenceAngle}, 反射系数: {config.ReflectionCoefficient}, 有效反射面积: {config.ReflectiveArea}, 生命周期: {config.Duration}\n";
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加诱偏目标特有属性
statusInfo.ExtendedProperties["SourceId"] = SourceId;
statusInfo.ExtendedProperties["ReflectiveArea"] = config.ReflectiveArea;
statusInfo.ExtendedProperties["ReflectionCoefficient"] = config.ReflectionCoefficient;
return statusInfo;
}
}
}

View File

@ -481,63 +481,31 @@ namespace ThreatSource.Missile
{
// 基类中的默认实现
}
/// <summary>
/// 获取导弹的完整运行状态
/// </summary>
/// <returns>包含导弹所有状态信息的结构体</returns>
/// <remarks>
/// 返回的状态包括:
/// - 基本信息ID、类型
/// - 运动状态(位置、速度、朝向)
/// - 飞行数据(时间、距离)
/// - 工作状态(制导、发动机)
/// </remarks>
public MissileRunningState GetRunningState()
/// <inheritdoc/>
public override ElementStatusInfo GetStatusInfo()
{
return new MissileRunningState
{
Id = Id,
Type = Properties.Type,
Position = Position,
Velocity = Velocity,
Orientation = Orientation,
Speed = Speed,
FlightTime = FlightTime,
FlightDistance = FlightDistance,
IsGuidance = IsGuidance,
LostGuidanceTime = LostGuidanceTime,
EngineBurnTime = EngineBurnTime,
IsActive = IsActive,
GuidanceAcceleration = GuidanceAcceleration
};
}
/// <summary>
/// 获取导弹的状态信息字符串
/// </summary>
/// <returns>包含导弹状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 导弹ID和类型
/// - 位置和速度信息
/// - 飞行时间和距离
/// - 制导和发动机状态
/// </remarks>
public override string GetStatus()
{
MissileRunningState missileRunningState = GetRunningState();
return $"导弹 {missileRunningState.Id}:\n" +
$" 状态: {(missileRunningState.IsActive ? "" : "")}\n" +
$" 位置: {missileRunningState.Position}\n" +
$" 速度: {missileRunningState.Speed:F2} m/s\n" +
$" 速度分量: {missileRunningState.Velocity}\n" +
$" 朝向: {missileRunningState.Orientation}\n" +
$" 飞行时间: {missileRunningState.FlightTime:F2}/{Properties.MaxFlightTime:F2}\n" +
$" 飞行距离: {missileRunningState.FlightDistance:F2}/{Properties.MaxFlightDistance:F2}\n" +
$" 发动机工作时间: {missileRunningState.EngineBurnTime:F2}/{Properties.MaxEngineBurnTime:F2}\n" +
$" 有引导: {(missileRunningState.IsGuidance ? "" : "")}\n" +
$" 失去引导时间: {missileRunningState.LostGuidanceTime:F2}\n";
// 获取基础状态信息
var statusInfo = base.GetStatusInfo();
// 添加导弹固有属性通过MissileProperties
statusInfo.ExtendedProperties["Type"] = Properties.Type;
statusInfo.ExtendedProperties["MaxSpeed"] = Properties.MaxSpeed;
statusInfo.ExtendedProperties["MaxAcceleration"] = Properties.MaxAcceleration;
statusInfo.ExtendedProperties["MaxRange"] = Properties.MaxFlightDistance;
statusInfo.ExtendedProperties["MaxFlightTime"] = Properties.MaxFlightTime;
statusInfo.ExtendedProperties["ExplosionRadius"] = Properties.ExplosionRadius;
statusInfo.ExtendedProperties["Mass"] = Properties.Mass;
// 添加导弹运行时状态
statusInfo.ExtendedProperties["FlightTime"] = FlightTime;
statusInfo.ExtendedProperties["FlightDistance"] = FlightDistance;
statusInfo.ExtendedProperties["EngineBurnTime"] = EngineBurnTime;
statusInfo.ExtendedProperties["IsGuidance"] = IsGuidance;
statusInfo.ExtendedProperties["LostGuidanceTime"] = LostGuidanceTime;
statusInfo.ExtendedProperties["Velocity"] = Velocity;
return statusInfo;
}
}
}

View File

@ -61,19 +61,6 @@ namespace ThreatSource.Missile
/// 自毁会立即停止导弹的工作并销毁
/// </remarks>
void SelfDestruct();
/// <summary>
/// 获取导弹的当前运行状态信息
/// </summary>
/// <returns>包含导弹完整状态信息的结构体</returns>
/// <remarks>
/// 返回的状态信息包括:
/// - 基本信息ID、类型
/// - 运动状态(位置、速度、朝向)
/// - 飞行数据(时间、距离)
/// - 工作状态(制导、发动机)
/// </remarks>
MissileRunningState GetRunningState();
}
/// <summary>

View File

@ -279,12 +279,11 @@ namespace ThreatSource.Missile
/// <remarks>
/// 返回信息包括:
/// - 基本状态信息
/// - 当前飞行阶段
/// - 制导系统状态
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "红外指令制导导弹") + $" 当前阶段: {currentStage}\n " + guidanceSystem.GetStatus();
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
return statusInfo;
}
}
}

View File

@ -300,19 +300,19 @@ namespace ThreatSource.Missile
}
/// <summary>
/// 获取导弹状态信息
/// 获取导弹状态信息
/// </summary>
/// <returns>包含导弹状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基状态信息
/// - 基状态信息
/// - 当前飞行阶段
/// - 制导系统状态
/// - 目标跟踪信息
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "红外成像末制导导弹") + $" 当前阶段: {currentStage}\n " + guidanceSystem.GetStatus();
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
return statusInfo;
}
}
}

View File

@ -246,12 +246,13 @@ namespace ThreatSource.Missile
/// <remarks>
/// 返回信息包括:
/// - 基本状态信息
/// - 波束跟踪状态
/// - 制导系统状态
/// - 当前飞行阶段
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "激光驾束制导导弹") + $" 当前阶段: {currentStage}\n " + guidanceSystem.GetStatus();
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
return statusInfo;
}
}
}

View File

@ -299,12 +299,13 @@ namespace ThreatSource.Missile
/// <remarks>
/// 返回信息包括:
/// - 基本状态信息
/// - 制导系统状态
/// - 目标跟踪状态
/// - 当前飞行阶段
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "激光半主动制导导弹") + $" 当前阶段: {currentStage}\n " + guidanceSystem.GetStatus();
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
return statusInfo;
}
}
}

View File

@ -227,19 +227,19 @@ namespace ThreatSource.Missile
}
/// <summary>
/// 获取导弹状态信息字符串
/// 获取导弹状态信息
/// </summary>
/// <returns>包含导弹状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基状态信息
/// - 基状态信息
/// - 当前飞行阶段
/// - 制导系统状态
/// - 目标跟踪信息
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "毫米波末制导导弹") + $" 当前阶段: {currentStage}\n " + guidanceSystem.GetStatus();
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
return statusInfo;
}
}
}

View File

@ -331,18 +331,19 @@ namespace ThreatSource.Missile
}
/// <summary>
/// 获取导弹状态信息字符串
/// 获取导弹状态信息
/// </summary>
/// <returns>包含导弹状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基类状态信息
/// - 分离点位置
/// - 母弹特有的状态信息
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
return base.GetStatus().Replace("导弹", "末敏弹(母弹)") + $" 分离点: {separationPoint}";
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["SeparationPoint"] = separationPoint.ToString();
return statusInfo;
}
}
}

View File

@ -699,21 +699,24 @@ namespace ThreatSource.Missile
/// - 扫描和检测状态
/// - 传感器工作状态
/// </remarks>
public override string GetStatus()
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
// 获取目标对象并计算距离
SimulationElement target = SimulationManager.GetEntityById(TargetId) as SimulationElement ?? throw new Exception("目标不存在");
double distanceToTarget = (target.Position - Position).Magnitude();
var status = $"{base.GetStatus().Replace("", "")}" +
$" 运行状态: {currentStage}\n" +
$" 扫描角度: {spiralAngle * 180 / Math.PI:F2}°, 弧度值: {spiralAngle:F6}\n" +
$" 目标检测: {lastDetectionTime != null}\n" +
$" 目标位置: {target.Position}\n" +
$" 目标距离: {distanceToTarget:F2}米\n" +
$" 传感器状态: {(IsSensorsJammed() ? "" : "")}";
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["SpiralAngle"] = spiralAngle * 180 / Math.PI;
statusInfo.ExtendedProperties["LastDetectionTime"] = lastDetectionTime?.ToString() ?? "null";
statusInfo.ExtendedProperties["FirstDetectionAngle"] = firstDetectionAngle?.ToString() ?? "null";
statusInfo.ExtendedProperties["IsTargetDetected"] = isTargetDetected.ToString();
statusInfo.ExtendedProperties["TargetPosition"] = target.Position.ToString();
statusInfo.ExtendedProperties["DistanceToTarget"] = distanceToTarget.ToString();
statusInfo.ExtendedProperties["IsSensorsJammed"] = IsSensorsJammed().ToString();
return status;
return statusInfo;
}
/// <summary>

View File

@ -39,7 +39,7 @@ namespace ThreatSource.Sensor
/// - 干扰处理机制
/// 是具体传感器类的实现基础
/// </remarks>
public abstract class Sensor : SimulationElement, ISensor, IJammable
public abstract class BaseSensor : SimulationElement, ISensor, IJammable
{
/// <summary>
/// 干扰处理组件
@ -79,7 +79,7 @@ namespace ThreatSource.Sensor
/// - 初始化工作状态
/// - 创建干扰处理组件
/// </remarks>
protected Sensor(string id, MotionParameters motionParameters, ISimulationManager simulationManager)
protected BaseSensor(string id, MotionParameters motionParameters, ISimulationManager simulationManager)
: base(id, motionParameters, simulationManager)
{
IsActive = false;

View File

@ -17,7 +17,7 @@ namespace ThreatSource.Sensor
/// - 实时状态更新
/// 用于末敏子弹的目标探测和跟踪
/// </remarks>
public class InfraredDetector : Sensor
public class InfraredDetector : BaseSensor
{
/// <summary>
/// 红外探测器配置

View File

@ -16,7 +16,7 @@ namespace ThreatSource.Sensor
/// - 数据采集
/// 用于目标距离的精确测量和跟踪
/// </remarks>
public class LaserRangefinder : Sensor
public class LaserRangefinder : BaseSensor
{
/// <summary>
/// 激光测距仪配置

View File

@ -17,7 +17,7 @@ namespace ThreatSource.Sensor
/// - 数据采集
/// 用于末敏子弹的高度测量和地形跟踪
/// </remarks>
public class MillimeterWaveAltimeter : Sensor
public class MillimeterWaveAltimeter : BaseSensor
{
/// <summary>
/// 毫米波测高雷达配置

View File

@ -17,7 +17,7 @@ namespace ThreatSource.Sensor
/// - 实时状态更新
/// 用于末敏子弹的目标探测和识别
/// </remarks>
public class MillimeterWaveRadiometer : Sensor
public class MillimeterWaveRadiometer : BaseSensor
{
/// <summary>
/// 毫米波辐射计配置

View File

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ThreatSource.Utils;
namespace ThreatSource.Simulation
{
/// <summary>
/// 仿真元素状态信息类,包含所有仿真元素的基本状态属性和扩展属性
/// </summary>
public class ElementStatusInfo
{
/// <summary>
/// 仿真元素的唯一标识符
/// </summary>
public string Id { get; set; }
/// <summary>
/// 仿真元素的类型名称
/// </summary>
public string ElementType { get; set; }
/// <summary>
/// 仿真元素的当前位置
/// </summary>
public Vector3D Position { get; set; }
/// <summary>
/// 仿真元素的当前朝向
/// </summary>
public Orientation Orientation { get; set; }
/// <summary>
/// 仿真元素的当前速度
/// </summary>
public double Speed { get; set; }
/// <summary>
/// 仿真元素是否处于活动状态
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// 状态信息的创建时间戳
/// </summary>
public long Timestamp { get; set; }
/// <summary>
/// 扩展属性字典,用于存储特定元素类型的额外属性
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; set; }
/// <summary>
/// 初始化状态信息对象
/// </summary>
public ElementStatusInfo()
{
ExtendedProperties = new Dictionary<string, object>();
Timestamp = DateTime.UtcNow.Ticks;
// 初始化非空属性
Id = string.Empty;
ElementType = string.Empty;
Position = Vector3D.Zero;
Orientation = new Orientation();
}
/// <summary>
/// 将状态信息转换为格式化的字符串表示
/// </summary>
/// <returns>状态的字符串表示</returns>
public override string ToString()
{
string baseInfo = $"仿真元素状态:{ElementType} {Id} at {Position}, Orientation: {Orientation}, Active: {IsActive}";
if (ExtendedProperties.Count > 0)
{
string extendedInfo = string.Join(", ", ExtendedProperties.Select(p => $"{p.Key}={p.Value}"));
return $"{baseInfo}, {extendedInfo}";
}
return baseInfo;
}
}
}

View File

@ -59,6 +59,12 @@ namespace ThreatSource.Simulation
/// 停用仿真元素,将其从仿真中移除
/// </summary>
void Deactivate();
/// <summary>
/// 获取仿真元素的结构化状态信息
/// </summary>
/// <returns>包含实体当前状态的结构化对象</returns>
ElementStatusInfo GetStatusInfo();
/// <summary>
/// 获取仿真元素的状态信息

View File

@ -93,7 +93,23 @@ namespace ThreatSource.Simulation
/// </remarks>
public virtual string GetStatus()
{
return $"仿真元素状态:{GetType().Name} {Id} at {Position}, Orientation: {Orientation}, Active: {IsActive}\n";
return GetStatusInfo().ToString();
}
/// <inheritdoc/>
public virtual ElementStatusInfo GetStatusInfo()
{
var statusInfo = new ElementStatusInfo
{
Id = Id,
ElementType = GetType().Name,
Position = Position,
Orientation = Orientation,
Speed = Speed,
IsActive = IsActive
};
return statusInfo;
}
/// <summary>