using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Autodesk.Navisworks.Api;
using NavisworksTransport.Core;
using NavisworksTransport.PathPlanning;
using NavisworksTransport.Utils;
using NavisworksTransport.Core.Config;
namespace NavisworksTransport.Commands
{
///
/// 创建空中路径命令
///
public class CreateAerialPathCommand : CommandBase
{
private readonly AerialPathParameters _parameters;
private readonly PathPlanningManager _pathPlanningManager;
///
/// 构造函数
///
/// 空中路径参数
public CreateAerialPathCommand(AerialPathParameters parameters)
{
_parameters = parameters ?? throw new ArgumentNullException(nameof(parameters));
_pathPlanningManager = PathPlanningManager.Instance;
}
///
/// 执行命令
///
protected override Task ExecuteInternalAsync(CancellationToken cancellationToken)
{
try
{
// 验证参数
var validationResult = ValidateParameters();
if (!validationResult.IsSuccess)
{
return Task.FromResult(validationResult);
}
LogManager.Info($"开始创建空中路径({_parameters.AerialSubType})...");
List pathPoints;
if (_parameters.AerialSubType == AerialSubType.ThreeStepHoisting)
{
// 吊装:使用 AerialPathGenerator 生成4个路径点
var generator = new AerialPathGenerator();
pathPoints = generator.GenerateThreeStepHoistingPath(
_parameters.StartPoint,
_parameters.EndPoint,
_parameters.LiftHeightMeters);
LogManager.Info($"吊装路径: 起点=({_parameters.StartPoint.X:F2},{_parameters.StartPoint.Y:F2},{_parameters.StartPoint.Z:F2}), 终点=({_parameters.EndPoint.X:F2},{_parameters.EndPoint.Y:F2},{_parameters.EndPoint.Z:F2}), 提升高度={_parameters.LiftHeightMeters:F2}米");
}
else
{
// 空轨:使用现有的空轨吸附逻辑,从点击点生成路径点
pathPoints = GenerateRailPathPoints(_parameters.ClickedPoints);
LogManager.Info($"空轨路径: 路径点数={pathPoints.Count}");
}
// 创建路径对象
var route = new PathRoute($"空中路径_{DateTime.Now:HHmmss}")
{
PathType = PathType.Aerial,
AerialSubType = _parameters.AerialSubType,
LiftHeightMeters = _parameters.LiftHeightMeters,
Points = pathPoints,
CreatedTime = DateTime.Now,
LastModified = DateTime.Now
};
// 设置车辆参数(从配置获取)
var config = ConfigManager.Instance.Current;
route.MaxVehicleLength = config.PathEditing.VehicleLengthMeters;
route.MaxVehicleWidth = config.PathEditing.VehicleWidthMeters;
route.MaxVehicleHeight = config.PathEditing.VehicleHeightMeters;
route.SafetyMargin = config.PathEditing.SafetyMarginMeters;
// 计算总长度
double totalLengthInModelUnits = 0;
for (int i = 0; i < pathPoints.Count - 1; i++)
{
totalLengthInModelUnits += GeometryHelper.CalculatePointDistance(
pathPoints[i].Position,
pathPoints[i + 1].Position);
}
route.TotalLength = UnitsConverter.ConvertToMeters(totalLengthInModelUnits);
LogManager.Info($"空中路径创建成功: {route.Name}, 路径点数: {pathPoints.Count}, 总长度: {route.TotalLength:F2}米");
// 保存路径到数据库
_pathPlanningManager.AddRoute(route);
var genericResult = PathPlanningResult.Success(route, "空中路径创建成功");
return Task.FromResult(genericResult);
}
catch (Exception ex)
{
LogManager.Error($"创建空中路径失败: {ex.Message}", ex);
var genericResult = PathPlanningResult.Failure($"创建空中路径失败: {ex.Message}", ex);
return Task.FromResult(genericResult);
}
}
///
/// 验证参数
///
protected override PathPlanningResult ValidateParameters()
{
if (_parameters.AerialSubType == AerialSubType.ThreeStepHoisting)
{
if (_parameters.StartPoint == null)
return PathPlanningResult.ValidationFailure("起点不能为空");
if (_parameters.EndPoint == null)
return PathPlanningResult.ValidationFailure("终点不能为空");
if (_parameters.LiftHeightMeters <= 0)
return PathPlanningResult.ValidationFailure("提升高度必须大于0");
}
else if (_parameters.AerialSubType == AerialSubType.Rail)
{
if (_parameters.ClickedPoints == null || _parameters.ClickedPoints.Count == 0)
return PathPlanningResult.ValidationFailure("点击点不能为空");
}
return PathPlanningResult.Success("参数验证通过");
}
///
/// 从点击点生成空轨路径点(使用现有的空轨吸附逻辑)
///
private List GenerateRailPathPoints(List clickedPoints)
{
var pathPoints = new List();
for (int i = 0; i < clickedPoints.Count; i++)
{
var point = clickedPoints[i];
var pointType = PathPointType.WayPoint;
if (i == 0)
pointType = PathPointType.StartPoint;
else if (i == clickedPoints.Count - 1)
pointType = PathPointType.EndPoint;
pathPoints.Add(new PathPoint(
point,
$"路径点{i + 1}",
pointType));
}
return pathPoints;
}
}
///
/// 空中路径参数
///
public class AerialPathParameters
{
///
/// 空中路径子类型
///
public AerialSubType AerialSubType { get; set; }
///
/// 吊装参数:起点(吊起位置)
///
public Point3D StartPoint { get; set; }
///
/// 吊装参数:终点(下降位置)
///
public Point3D EndPoint { get; set; }
///
/// 吊装参数:提升高度(米)
///
public double LiftHeightMeters { get; set; }
///
/// 空轨参数:点击点列表
///
public List ClickedPoints { get; set; }
}
}