网格生成把给所有网格设置高度区间放到门之前;修复寻路中高度检查的单位转换bug

This commit is contained in:
tian 2025-09-16 18:47:15 +08:00
parent 8fbad77e65
commit 6f1efe53af
3 changed files with 18 additions and 19 deletions

View File

@ -136,7 +136,8 @@
"Bash(xcopy:*)",
"Read(//c/ProgramData/Autodesk/Navisworks Manage 2026/NavisworksTransport/logs/**)",
"Bash(sed:*)",
"Read(//c/ProgramData/Autodesk/**)"
"Read(//c/ProgramData/Autodesk/**)",
"Bash(cd:*)"
],
"deny": [],
"additionalDirectories": [

View File

@ -1244,17 +1244,15 @@ namespace NavisworksTransport.PathPlanning
// 检查高度约束
if (cell.PassableHeights != null && cell.PassableHeights.Any())
{
// 将车辆高度从米转换为模型单位
double vehicleHeightInModelUnits = vehicleHeight * UnitsConverter.GetMetersToUnitsConversionFactor(Application.ActiveDocument.Units);
LogManager.Info($"[高度检查] 检查 {cell.PassableHeights.Count} 个高度区间,车辆高度:{vehicleHeight}m ({vehicleHeightInModelUnits:F2}模型单位)");
LogManager.Info($"[高度检查] 检查 {cell.PassableHeights.Count} 个高度区间,车辆高度:{vehicleHeight}模型单位)");
foreach (var interval in cell.PassableHeights)
{
bool spanOk = interval.GetSpan() >= vehicleHeightInModelUnits;
bool spanOk = interval.GetSpan() >= vehicleHeight;
// 将绝对坐标转换为相对于网格底面的坐标
double relativeZ = point.Z - cell.WorldPosition.Z;
bool containsHeight = interval.Contains(relativeZ);
LogManager.Info($"[高度检查] 区间 {interval}: 跨度={interval.GetSpan():F2}模型单位 (需要≥{vehicleHeightInModelUnits:F2}模型单位): {spanOk}, 包含相对Z={relativeZ:F2}: {containsHeight}");
LogManager.Info($"[高度检查] 区间 {interval}: 跨度={interval.GetSpan():F2}模型单位 (需要≥{vehicleHeight:F2}模型单位): {spanOk}, 包含相对Z={relativeZ:F2}: {containsHeight}");
if (spanOk && containsHeight)
{

View File

@ -84,7 +84,7 @@ namespace NavisworksTransport.PathPlanning
var allChannelItems = CategoryAttributeManager.GetAllTraversableLogisticsItems(document);
LogManager.Info($"【生成网格地图】直接获取到 {allChannelItems.Count} 个可通行物流元素");
// 智能收集通道相关节点(包括父节点、同级节点等)
// 智能收集可通行模型相关节点(包括父节点、同级节点等)
var channelRelatedItems = CollectChannelRelatedItems(allChannelItems.ToList());
LogManager.Info($"【生成网格地图】智能收集到 {channelRelatedItems.Count} 个通道相关节点");
@ -95,15 +95,15 @@ namespace NavisworksTransport.PathPlanning
LogManager.Info($"【阶段2完成】障碍物处理后网格统计: {channelCoverage.GridMap.GetStatistics()}");
// 2.5. 单独处理门元素,设置为可通行
LogManager.Info("【生成网格地图】步骤2.5: 处理门元素");
ProcessDoorElements(channelCoverage.GridMap, allChannelItems);
LogManager.Info($"【阶段2.5完成】门元素处理后网格统计: {channelCoverage.GridMap.GetStatistics()}");
// 2.6. 为通道网格设置PassableHeights确保高度约束检查
LogManager.Info("【生成网格地图】步骤2.6: 为通道网格设置高度约束");
// 2.5. 为所有可通行网格设置PassableHeights确保高度约束检查
LogManager.Info("【生成网格地图】步骤2.5: 为可通行网格设置高度约束");
SetChannelPassableHeights(channelCoverage.GridMap, scanHeight);
LogManager.Info($"【阶段2.6完成】通道高度约束设置后网格统计: {channelCoverage.GridMap.GetStatistics()}");
LogManager.Info($"【阶段2.5完成】高度约束设置后网格统计: {channelCoverage.GridMap.GetStatistics()}");
// 2.6. 单独处理门元素,设置为可通行,并设置通行高度
LogManager.Info("【生成网格地图】步骤2.6: 处理门元素");
ProcessDoorElements(channelCoverage.GridMap, allChannelItems);
LogManager.Info($"【阶段2.6完成】门元素处理后网格统计: {channelCoverage.GridMap.GetStatistics()}");
// 3. 应用车辆尺寸膨胀(如果需要)
if (vehicleRadius > 0 || safetyMargin > 0)
@ -268,7 +268,7 @@ namespace NavisworksTransport.PathPlanning
}
/// <summary>
/// 为通道网格设置PassableHeights确保高度约束检查
/// 为所有可通行网格设置PassableHeights确保高度约束检查
/// </summary>
/// <param name="gridMap">网格地图</param>
/// <param name="scanHeight">扫描高度(车辆高度+安全间隙)</param>
@ -278,7 +278,7 @@ namespace NavisworksTransport.PathPlanning
double metersToModelUnits = UnitsConverter.GetMetersToUnitsConversionFactor(Application.ActiveDocument.Units);
double scanHeightInModelUnits = scanHeight * metersToModelUnits;
LogManager.Info($"【通道高度设置】开始为通道网格设置高度约束,扫描高度: {scanHeight:F2}米 ({scanHeightInModelUnits:F2}模型单位)");
LogManager.Info($"【高度约束设置】开始为所有可通行网格设置高度约束,扫描高度: {scanHeight:F2}米 ({scanHeightInModelUnits:F2}模型单位)");
int processedCount = 0;
for (int x = 0; x < gridMap.Width; x++)
@ -286,7 +286,7 @@ namespace NavisworksTransport.PathPlanning
for (int y = 0; y < gridMap.Height; y++)
{
var cell = gridMap.Cells[x, y];
if (cell.CellType == CategoryAttributeManager.LogisticsElementType. && cell.IsWalkable)
if (cell.IsWalkable)
{
cell.PassableHeights = new List<HeightInterval>
{
@ -298,7 +298,7 @@ namespace NavisworksTransport.PathPlanning
}
}
LogManager.Info($"【通道高度设置】完成,已处理 {processedCount} 个通道网格");
LogManager.Info($"【高度约束设置】完成,已处理 {processedCount} 个可通行网格");
}
/// <summary>