NavisworksTransport/src/Commands/CreateAerialPathCommand.cs

194 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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