对物流自定义文件进行简化,调整部分类别名字
This commit is contained in:
parent
69765e092b
commit
d336f8302a
@ -2,76 +2,85 @@
|
||||
# 位置: %ProgramData%/Autodesk/Navisworks Manage 2026/plugins/TransportPlugin/custom_categories.toml
|
||||
# 说明: 本文件定义用户自定义的物流类别,与模型文件无关,可跨项目共享
|
||||
|
||||
# 类别属性说明:
|
||||
# ============================================================
|
||||
# 类别属性说明
|
||||
# ============================================================
|
||||
#
|
||||
# 【必填属性】
|
||||
# id: 唯一标识(英文,用于存储和内部识别)
|
||||
# - 不能与内置类别名称重复(如 door, elevator 等)
|
||||
# - 建议使用小写和下划线,如: "ramp", "clean_room"
|
||||
#
|
||||
# display_name: 显示名称(中文)
|
||||
# icon: 图标标识(可选,默认 Box)
|
||||
# traversable: 是否默认可通行(可选,默认 true)
|
||||
# priority: 优先级 1-10(可选,默认 5)
|
||||
# weight: 寻路权重(可选,默认 1.0,越低越优先)
|
||||
# color: UI显示颜色(可选,默认 #9E9E9E)
|
||||
# height_limit_meters: 默认高度限制米数(可选,默认 3.0)
|
||||
# speed_limit_meters_per_second: 默认速度限制米/秒(可选,默认 1.0)
|
||||
# width_limit_meters: 默认宽度限制米数(可选,默认 3.0)
|
||||
|
||||
# 示例自定义类别(可根据需要添加更多)
|
||||
# - 在UI类别下拉框和物流模型列表中显示
|
||||
#
|
||||
# 【可选属性 - 有特殊需求时才设置】
|
||||
# traversable: 是否默认可通行
|
||||
# - 默认: true(可通行)
|
||||
# - 仅当类别不可通行时设置为 false(如限制区域)
|
||||
#
|
||||
# weight: 寻路权重
|
||||
# - 默认: 1.0
|
||||
# - 值越小优先级越高,越大越难走
|
||||
# - 不可通行区域建议设为极大值如 999999.0
|
||||
#
|
||||
# 【预留属性 - 当前未使用,可不设置】
|
||||
# icon: 图标标识(默认 Box)
|
||||
# priority: 优先级 1-10(默认 5)
|
||||
# color: UI显示颜色(默认 #9E9E9E)
|
||||
# height_limit_meters: 默认高度限制米数(默认 3.0)
|
||||
# speed_limit_meters_per_second: 默认速度限制米/秒(默认 1.0)
|
||||
# width_limit_meters: 默认宽度限制米数(默认 3.0)
|
||||
#
|
||||
# ============================================================
|
||||
# 配置示例
|
||||
# ============================================================
|
||||
|
||||
# --------------------------------------------------
|
||||
# 示例1: 最简配置(只有必填,其他用默认)
|
||||
# --------------------------------------------------
|
||||
# 坡道:默认可通行(weight=1.0),无需设置其他属性
|
||||
[[category]]
|
||||
id = "ramp"
|
||||
display_name = "坡道"
|
||||
icon = "Ramp"
|
||||
traversable = true
|
||||
priority = 4
|
||||
weight = 1.5
|
||||
color = "#FF9800"
|
||||
height_limit_meters = 3.0
|
||||
speed_limit_meters_per_second = 0.5
|
||||
width_limit_meters = 4.0
|
||||
|
||||
[[category]]
|
||||
id = "tunnel"
|
||||
display_name = "隧道"
|
||||
icon = "Tunnel"
|
||||
traversable = true
|
||||
priority = 3
|
||||
weight = 1.8
|
||||
color = "#795548"
|
||||
height_limit_meters = 2.5
|
||||
speed_limit_meters_per_second = 0.3
|
||||
width_limit_meters = 2.5
|
||||
|
||||
# --------------------------------------------------
|
||||
# 示例2: 不可通行区域(必须设置特殊属性)
|
||||
# --------------------------------------------------
|
||||
# 限制区域:不可通行,寻路时避开
|
||||
[[category]]
|
||||
id = "restricted_area"
|
||||
display_name = "限制区域"
|
||||
icon = "Warning"
|
||||
traversable = false
|
||||
priority = 1
|
||||
weight = 999999.0
|
||||
color = "#F44336"
|
||||
height_limit_meters = 0.0
|
||||
speed_limit_meters_per_second = 0.0
|
||||
width_limit_meters = 0.0
|
||||
|
||||
# --------------------------------------------------
|
||||
# 示例3: 优先选择的通道(设置更小weight)
|
||||
# --------------------------------------------------
|
||||
# 快速通道:比默认值(1.0)优先,寻路时优先走这里
|
||||
[[category]]
|
||||
id = "express_lane"
|
||||
display_name = "快速通道"
|
||||
weight = 0.6
|
||||
|
||||
# --------------------------------------------------
|
||||
# 示例4: 较难的通行区域(设置更大weight)
|
||||
# --------------------------------------------------
|
||||
# 狭窄通道:比默认值难走,只有必要时才走
|
||||
[[category]]
|
||||
id = "narrow_passage"
|
||||
display_name = "狭窄通道"
|
||||
weight = 2.5
|
||||
|
||||
# --------------------------------------------------
|
||||
# 示例5: 完整配置(展示所有可用属性)
|
||||
# --------------------------------------------------
|
||||
# 一般不需要这么多,按需设置即可
|
||||
[[category]]
|
||||
id = "temporary_storage"
|
||||
display_name = "临时堆放区"
|
||||
# 可通行但较慢(weight > 1.0)
|
||||
weight = 1.5
|
||||
# 预留属性(当前未使用)
|
||||
icon = "Package"
|
||||
traversable = true
|
||||
priority = 6
|
||||
weight = 1.2
|
||||
color = "#FFC107"
|
||||
height_limit_meters = 5.0
|
||||
speed_limit_meters_per_second = 0.8
|
||||
width_limit_meters = 5.0
|
||||
|
||||
[[category]]
|
||||
id = "cleanroom"
|
||||
display_name = "洁净室"
|
||||
icon = "Shield"
|
||||
traversable = true
|
||||
priority = 2
|
||||
weight = 2.0
|
||||
color = "#E1F5FE"
|
||||
height_limit_meters = 3.5
|
||||
speed_limit_meters_per_second = 0.4
|
||||
width_limit_meters = 3.0
|
||||
|
||||
@ -255,7 +255,7 @@ namespace NavisworksTransport.Core.Config
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成 TOML 内容
|
||||
/// 生成 TOML 内容(只输出非默认值的属性)
|
||||
/// </summary>
|
||||
private string GenerateTomlContent()
|
||||
{
|
||||
@ -264,17 +264,21 @@ namespace NavisworksTransport.Core.Config
|
||||
sb.AppendLine("# 位置: %ProgramData%/Autodesk/Navisworks Manage 2026/plugins/TransportPlugin/custom_categories.toml");
|
||||
sb.AppendLine("# 说明: 本文件定义用户自定义的物流类别,与模型文件无关,可跨项目共享");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine("# 类别属性说明:");
|
||||
sb.AppendLine("# id: 唯一标识(英文,用于存储和内部识别)");
|
||||
sb.AppendLine("# ============================================================");
|
||||
sb.AppendLine("# 类别属性说明");
|
||||
sb.AppendLine("# ============================================================");
|
||||
sb.AppendLine("#");
|
||||
sb.AppendLine("# 【必填】");
|
||||
sb.AppendLine("# id: 唯一标识(英文)");
|
||||
sb.AppendLine("# display_name: 显示名称(中文)");
|
||||
sb.AppendLine("# icon: 图标标识(可选,默认 Box)");
|
||||
sb.AppendLine("# traversable: 是否默认可通行(可选,默认 true)");
|
||||
sb.AppendLine("# priority: 优先级 1-10(可选,默认 5)");
|
||||
sb.AppendLine("# weight: 寻路权重(可选,默认 1.0,越低越优先)");
|
||||
sb.AppendLine("# color: UI显示颜色(可选,默认 #9E9E9E)");
|
||||
sb.AppendLine("# height_limit_meters: 默认高度限制米数(可选,默认 3.0)");
|
||||
sb.AppendLine("# speed_limit_meters_per_second: 默认速度限制米/秒(可选,默认 1.0)");
|
||||
sb.AppendLine("# width_limit_meters: 默认宽度限制米数(可选,默认 3.0)");
|
||||
sb.AppendLine("#");
|
||||
sb.AppendLine("# 【可选 - 有特殊需求才设置】");
|
||||
sb.AppendLine("# traversable: 是否可通行(默认 true)");
|
||||
sb.AppendLine("# weight: 寻路权重(默认 1.0)");
|
||||
sb.AppendLine("#");
|
||||
sb.AppendLine("# 【预留 - 当前未使用】");
|
||||
sb.AppendLine("# icon, priority, color, height_limit_meters 等");
|
||||
sb.AppendLine("#");
|
||||
sb.AppendLine();
|
||||
|
||||
foreach (var category in Categories)
|
||||
@ -282,14 +286,13 @@ namespace NavisworksTransport.Core.Config
|
||||
sb.AppendLine("[[category]]");
|
||||
sb.AppendLine($"id = \"{EscapeTomlString(category.Id)}\"");
|
||||
sb.AppendLine($"display_name = \"{EscapeTomlString(category.DisplayName)}\"");
|
||||
sb.AppendLine($"icon = \"{EscapeTomlString(category.Icon)}\"");
|
||||
sb.AppendLine($"traversable = {category.Traversable.ToString().ToLower()}");
|
||||
sb.AppendLine($"priority = {category.Priority}");
|
||||
sb.AppendLine($"weight = {category.Weight:F2}");
|
||||
sb.AppendLine($"color = \"{ColorToHex(category.DisplayColor)}\"");
|
||||
sb.AppendLine($"height_limit_meters = {category.Defaults.HeightLimitMeters:F2}");
|
||||
sb.AppendLine($"speed_limit_meters_per_second = {category.Defaults.SpeedLimitMetersPerSecond:F2}");
|
||||
sb.AppendLine($"width_limit_meters = {category.Defaults.WidthLimitMeters:F2}");
|
||||
|
||||
// 只输出非默认值的属性
|
||||
if (category.Traversable != true)
|
||||
sb.AppendLine($"traversable = {category.Traversable.ToString().ToLower()}");
|
||||
if (category.Weight != 1.0)
|
||||
sb.AppendLine($"weight = {category.Weight:F2}");
|
||||
|
||||
sb.AppendLine();
|
||||
}
|
||||
|
||||
@ -437,7 +440,7 @@ namespace NavisworksTransport.Core.Config
|
||||
switch (type)
|
||||
{
|
||||
case CategoryAttributeManager.LogisticsElementType.障碍物:
|
||||
case CategoryAttributeManager.LogisticsElementType.Unknown:
|
||||
case CategoryAttributeManager.LogisticsElementType.空洞:
|
||||
case CategoryAttributeManager.LogisticsElementType.无关项:
|
||||
return false;
|
||||
default:
|
||||
@ -477,7 +480,7 @@ namespace NavisworksTransport.Core.Config
|
||||
case CategoryAttributeManager.LogisticsElementType.电梯: return 2.0;
|
||||
case CategoryAttributeManager.LogisticsElementType.楼梯: return 3.0;
|
||||
case CategoryAttributeManager.LogisticsElementType.障碍物:
|
||||
case CategoryAttributeManager.LogisticsElementType.Unknown:
|
||||
case CategoryAttributeManager.LogisticsElementType.空洞:
|
||||
return double.MaxValue;
|
||||
default: return 1.0;
|
||||
}
|
||||
|
||||
@ -4693,7 +4693,7 @@ namespace NavisworksTransport
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (cell.CellType == "Unknown")
|
||||
else if (cell.CellType == "空洞")
|
||||
{
|
||||
// Unknown网格没有高度层,用于调试
|
||||
if (_showUnknownGrid)
|
||||
|
||||
@ -2032,7 +2032,7 @@ namespace NavisworksTransport
|
||||
if (isGridVisualization)
|
||||
{
|
||||
// 根据网格类型确定样式
|
||||
if (point.Name.Contains("空洞") || point.Name.Contains("Unknown"))
|
||||
if (point.Name.Contains("空洞"))
|
||||
{
|
||||
gridStyle = GetRenderStyle(RenderStyleName.GridUnknown);
|
||||
}
|
||||
@ -2048,9 +2048,9 @@ namespace NavisworksTransport
|
||||
else if (!string.IsNullOrEmpty(point.Notes) && point.Notes.StartsWith("GridType:"))
|
||||
{
|
||||
var gridTypeStr = point.Notes.Substring(9); // 去掉"GridType:"前缀
|
||||
if (gridTypeStr == "Unknown")
|
||||
if (gridTypeStr == "空洞")
|
||||
gridStyle = GetRenderStyle(RenderStyleName.GridUnknown);
|
||||
else if (gridTypeStr == "Obstacle")
|
||||
else if (gridTypeStr == "障碍物")
|
||||
gridStyle = GetRenderStyle(RenderStyleName.GridObstacle);
|
||||
else
|
||||
gridStyle = GetRenderStyle(RenderStyleName.GridChannel);
|
||||
|
||||
@ -41,9 +41,9 @@ namespace NavisworksTransport
|
||||
public enum LogisticsElementType
|
||||
{
|
||||
/// <summary>
|
||||
/// 未知/空洞 - 没有任何几何覆盖,不可通行(默认值)
|
||||
/// 空洞 - 没有任何几何覆盖,不可通行(默认值)
|
||||
/// </summary>
|
||||
Unknown = 0,
|
||||
空洞 = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 障碍物 - 墙体、柱子、设备等,不可通行
|
||||
|
||||
@ -2916,7 +2916,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
// 统计网格类型
|
||||
if (cell.CellType == "障碍物")
|
||||
obstacleCount++;
|
||||
else if (cell.CellType == "Unknown")
|
||||
else if (cell.CellType == "空洞")
|
||||
unknownCount++;
|
||||
else if (cell.HasAnyWalkableLayer())
|
||||
walkableCount++;
|
||||
|
||||
@ -125,7 +125,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
{
|
||||
return new GridCell
|
||||
{
|
||||
CellType = "Unknown",
|
||||
CellType = "空洞",
|
||||
IsInChannel = false,
|
||||
ChannelType = ChannelType.Other,
|
||||
RelatedModelItem = null,
|
||||
|
||||
@ -166,7 +166,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
{
|
||||
var cell = new GridCell
|
||||
{
|
||||
CellType = CategoryAttributeManager.LogisticsElementType.Unknown.ToString(), // 修改:默认为未知/空洞类型
|
||||
CellType = CategoryAttributeManager.LogisticsElementType.空洞.ToString(), // 修改:默认为未知/空洞类型
|
||||
IsInChannel = false,
|
||||
HeightLayers = new List<HeightLayer>(),
|
||||
ChannelType = ChannelType.Other
|
||||
@ -393,7 +393,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
private void ApplyCellValidationRules(ref GridCell cell, double originalCost)
|
||||
{
|
||||
// 🔥 关键验证:确保Unknown和障碍物类型永远不可通行
|
||||
if (cell.CellType == "Unknown" ||
|
||||
if (cell.CellType == "空洞" ||
|
||||
cell.CellType == "障碍物")
|
||||
{
|
||||
// Unknown和障碍物没有可通行层,HasAnyWalkableLayer()自动返回false
|
||||
@ -613,7 +613,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
int walkable_Other = 0;
|
||||
|
||||
// 按类型统计 - 不可通行的
|
||||
int nonWalkable_Unknown = 0;
|
||||
int nonWalkable_空洞 = 0;
|
||||
int nonWalkable_障碍物 = 0;
|
||||
int nonWalkable_楼板 = 0;
|
||||
int nonWalkable_门 = 0;
|
||||
@ -644,7 +644,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
{
|
||||
totalNonWalkable++;
|
||||
// 使用字符串比较(支持自定义类别)
|
||||
if (cell.CellType == "Unknown") nonWalkable_Unknown++;
|
||||
if (cell.CellType == "空洞") nonWalkable_空洞++;
|
||||
else if (cell.CellType == "障碍物") nonWalkable_障碍物++;
|
||||
else if (cell.CellType == "楼板") nonWalkable_楼板++;
|
||||
else if (cell.CellType == "门") nonWalkable_门++;
|
||||
@ -664,7 +664,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
stats += $" 楼梯: {walkable_楼梯}, 电梯: {walkable_电梯}, 其他: {walkable_Other}\n";
|
||||
|
||||
stats += $"【不可通行单元格详细统计】\n";
|
||||
stats += $" Unknown/空洞: {nonWalkable_Unknown}, 障碍物: {nonWalkable_障碍物}\n";
|
||||
stats += $" 空洞: {nonWalkable_空洞}, 障碍物: {nonWalkable_障碍物}\n";
|
||||
stats += $" 不可通行楼板: {nonWalkable_楼板}, 不可通行门: {nonWalkable_门}\n";
|
||||
stats += $" 不可通行通道: {nonWalkable_通道}, 其他不可通行: {nonWalkable_Other}\n";
|
||||
|
||||
|
||||
@ -492,7 +492,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
int neighborLayerCount = (neighbor.HeightLayers != null) ? neighbor.HeightLayers.Count : 0;
|
||||
|
||||
// 情况2:邻居是Unknown - 标记当前网格所有层为边界
|
||||
if (neighbor.CellType == "Unknown")
|
||||
if (neighbor.CellType == "空洞")
|
||||
{
|
||||
for (int li = 0; li < currentLayerCount; li++)
|
||||
{
|
||||
@ -986,7 +986,7 @@ namespace NavisworksTransport.PathPlanning
|
||||
distanceMap[x, y] = double.MaxValue;
|
||||
|
||||
// Unknown网格 → distance=0(整个网格无法通行)
|
||||
if (cell.CellType == "Unknown")
|
||||
if (cell.CellType == "空洞")
|
||||
{
|
||||
distanceMap[x, y] = 0.0;
|
||||
continue;
|
||||
|
||||
@ -875,10 +875,22 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
// 直接使用 CategoryAttributeManager 的 API
|
||||
var info = CategoryAttributeManager.GetLogisticsAttributeInfo(item);
|
||||
|
||||
// 将类别ID转换为显示名称
|
||||
string categoryId = info?.ElementType ?? "未分类";
|
||||
string displayName = categoryId;
|
||||
if (categoryId != "未分类")
|
||||
{
|
||||
var categoryDef = CategoryAttributeManager.GetCategoryDefinition(categoryId);
|
||||
if (categoryDef != null)
|
||||
{
|
||||
displayName = categoryDef.DisplayName;
|
||||
}
|
||||
}
|
||||
|
||||
var model = new LogisticsModel
|
||||
{
|
||||
Name = item.DisplayName ?? "未命名模型",
|
||||
Category = info?.ElementType ?? "未分类",
|
||||
Category = displayName,
|
||||
Attributes = FormatLogisticsAttributes(info),
|
||||
IsVisible = !item.IsHidden,
|
||||
NavisworksItem = item
|
||||
|
||||
Loading…
Reference in New Issue
Block a user