194 lines
7.4 KiB
C#
194 lines
7.4 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 创建空中路径命令
|
||
/// </summary>
|
||
public class CreateAerialPathCommand : CommandBase
|
||
{
|
||
private readonly AerialPathParameters _parameters;
|
||
private readonly PathPlanningManager _pathPlanningManager;
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="parameters">空中路径参数</param>
|
||
public CreateAerialPathCommand(AerialPathParameters parameters)
|
||
{
|
||
_parameters = parameters ?? throw new ArgumentNullException(nameof(parameters));
|
||
_pathPlanningManager = PathPlanningManager.Instance;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 执行命令
|
||
/// </summary>
|
||
protected override Task<PathPlanningResult> ExecuteInternalAsync(CancellationToken cancellationToken)
|
||
{
|
||
try
|
||
{
|
||
// 验证参数
|
||
var validationResult = ValidateParameters();
|
||
if (!validationResult.IsSuccess)
|
||
{
|
||
return Task.FromResult<PathPlanningResult>(validationResult);
|
||
}
|
||
|
||
LogManager.Info($"开始创建空中路径({_parameters.AerialSubType})...");
|
||
|
||
List<PathPoint> 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<PathRoute>.Success(route, "空中路径创建成功");
|
||
return Task.FromResult<PathPlanningResult>(genericResult);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogManager.Error($"创建空中路径失败: {ex.Message}", ex);
|
||
var genericResult = PathPlanningResult<PathRoute>.Failure($"创建空中路径失败: {ex.Message}", ex);
|
||
return Task.FromResult<PathPlanningResult>(genericResult);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证参数
|
||
/// </summary>
|
||
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("参数验证通过");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 从点击点生成空轨路径点(使用现有的空轨吸附逻辑)
|
||
/// </summary>
|
||
private List<PathPoint> GenerateRailPathPoints(List<Point3D> clickedPoints)
|
||
{
|
||
var pathPoints = new List<PathPoint>();
|
||
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 空中路径参数
|
||
/// </summary>
|
||
public class AerialPathParameters
|
||
{
|
||
/// <summary>
|
||
/// 空中路径子类型
|
||
/// </summary>
|
||
public AerialSubType AerialSubType { get; set; }
|
||
|
||
/// <summary>
|
||
/// 吊装参数:起点(吊起位置)
|
||
/// </summary>
|
||
public Point3D StartPoint { get; set; }
|
||
|
||
/// <summary>
|
||
/// 吊装参数:终点(下降位置)
|
||
/// </summary>
|
||
public Point3D EndPoint { get; set; }
|
||
|
||
/// <summary>
|
||
/// 吊装参数:提升高度(米)
|
||
/// </summary>
|
||
public double LiftHeightMeters { get; set; }
|
||
|
||
/// <summary>
|
||
/// 空轨参数:点击点列表
|
||
/// </summary>
|
||
public List<Point3D> ClickedPoints { get; set; }
|
||
}
|
||
} |