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; } } }