* 新增 ControllerClientCompatOptions.ConfigRoot 及解析方法 * 兼容层默认从运行目录 Config 加载模型、轨迹和配置 * 移除隐式父工作区根目录推断,旧路径仅在显式配置时生效 * Host 项目编译时将 Config 目录复制到输出目录 * 请求响应日志中间件忽略 /api/status/snapshot 高频轮询 * 补充 ConfigRoot 和日志过滤相关单元测试
81 lines
3.3 KiB
C#
81 lines
3.3 KiB
C#
using Flyshot.Core.Config;
|
|
using Flyshot.Core.Domain;
|
|
|
|
namespace Flyshot.ControllerClientCompat;
|
|
|
|
/// <summary>
|
|
/// 根据旧版 ControllerClient 的机器人名称,解析当前 replacement 仓库支持的真实模型文件。
|
|
/// </summary>
|
|
public sealed class ControllerClientCompatRobotCatalog
|
|
{
|
|
/// <summary>
|
|
/// 保存当前现场支持的机器人名称到运行目录模型文件名映射。
|
|
/// </summary>
|
|
private static readonly IReadOnlyDictionary<string, string> SupportedRobotModelFileMap = new Dictionary<string, string>(StringComparer.Ordinal)
|
|
{
|
|
["FANUC_LR_Mate_200iD"] = "LR_Mate_200iD_7L.robot",
|
|
["FANUC_LR_Mate_200iD_7L"] = "LR_Mate_200iD_7L.robot"
|
|
};
|
|
|
|
private readonly ControllerClientCompatOptions _options;
|
|
private readonly RobotModelLoader _robotModelLoader;
|
|
|
|
/// <summary>
|
|
/// 初始化机器人兼容目录解析器。
|
|
/// </summary>
|
|
/// <param name="options">兼容层基础配置。</param>
|
|
/// <param name="robotModelLoader">.robot 文件加载器。</param>
|
|
public ControllerClientCompatRobotCatalog(
|
|
ControllerClientCompatOptions options,
|
|
RobotModelLoader robotModelLoader)
|
|
{
|
|
_options = options ?? throw new ArgumentNullException(nameof(options));
|
|
_robotModelLoader = robotModelLoader ?? throw new ArgumentNullException(nameof(robotModelLoader));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 根据旧客户端的机器人名称加载对应模型。
|
|
/// </summary>
|
|
/// <param name="robotName">旧客户端传入的机器人名称。</param>
|
|
/// <param name="accLimitScale">RobotConfig.json 中的加速度倍率。</param>
|
|
/// <param name="jerkLimitScale">RobotConfig.json 中的 jerk 倍率。</param>
|
|
/// <returns>兼容层加载出的机器人模型。</returns>
|
|
public RobotProfile LoadProfile(string robotName, double accLimitScale = 1.0, double jerkLimitScale = 1.0)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(robotName))
|
|
{
|
|
throw new ArgumentException("机器人名称不能为空。", nameof(robotName));
|
|
}
|
|
|
|
if (!SupportedRobotModelFileMap.TryGetValue(robotName, out var modelFileName))
|
|
{
|
|
throw new InvalidOperationException($"Unsupported robot name: {robotName}");
|
|
}
|
|
|
|
var modelPath = ResolveModelPath(modelFileName);
|
|
return _robotModelLoader.LoadProfile(modelPath, accLimitScale, jerkLimitScale);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 解析机器人模型路径,运行目录 Config/Models 优先,旧父工作区只作为显式兼容入口。
|
|
/// </summary>
|
|
/// <param name="modelFileName">运行目录 Models 下的机器人模型文件名。</param>
|
|
/// <returns>可传给 .robot 加载器的模型文件绝对路径。</returns>
|
|
private string ResolveModelPath(string modelFileName)
|
|
{
|
|
var configModelPath = Path.Combine(_options.ResolveConfigRoot(), "Models", modelFileName);
|
|
if (File.Exists(configModelPath))
|
|
{
|
|
return configModelPath;
|
|
}
|
|
|
|
var legacyWorkspaceRoot = _options.ResolveLegacyWorkspaceRoot();
|
|
if (legacyWorkspaceRoot is not null)
|
|
{
|
|
return Path.Combine(legacyWorkspaceRoot, "FlyingShot", "FlyingShot", "Models", modelFileName);
|
|
}
|
|
|
|
return configModelPath;
|
|
}
|
|
}
|