diff --git a/NavisworksTransportPlugin.csproj b/NavisworksTransportPlugin.csproj
index c0f08a9..7e793b0 100644
--- a/NavisworksTransportPlugin.csproj
+++ b/NavisworksTransportPlugin.csproj
@@ -275,6 +275,7 @@
+
@@ -448,18 +449,25 @@
-
+
PreserveNewest
- NavisworksTransportPlugin.name.txt
+ TransportPlugin.name.txt
-
-
+
+
PreserveNewest
+ resources\default_config.toml
+
+
+
+ PreserveNewest
+ resources\TransportPlugin.name.txt
+
\ No newline at end of file
diff --git a/deploy-plugin.bat b/deploy-plugin.bat
index e62aaab..7dff4e0 100644
--- a/deploy-plugin.bat
+++ b/deploy-plugin.bat
@@ -12,7 +12,12 @@ set "TARGET_DIR=C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\Naviswork
if not exist "%TARGET_DIR%" mkdir "%TARGET_DIR%"
copy "bin\x64\Release\NavisworksTransportPlugin.dll" "%TARGET_DIR%\" >nul
-if exist "bin\x64\Release\NavisworksTransportPlugin.name.txt" copy "bin\x64\Release\NavisworksTransportPlugin.name.txt" "%TARGET_DIR%\" >nul
-if exist "bin\x64\Release\default_config.toml" copy "bin\x64\Release\default_config.toml" "%TARGET_DIR%\" >nul
+
+:: 复制resources文件夹(包含chart.js等本地资源)
+if exist "bin\x64\Release\resources" (
+ if not exist "%TARGET_DIR%\resources" mkdir "%TARGET_DIR%\resources"
+ copy "bin\x64\Release\resources\*" "%TARGET_DIR%\resources\" >nul
+ echo Resources folder deployed.
+)
echo Plugin deployed successfully!
\ No newline at end of file
diff --git a/doc/requirement/todo_features.md b/doc/requirement/todo_features.md
index c42d672..a0f26eb 100644
--- a/doc/requirement/todo_features.md
+++ b/doc/requirement/todo_features.md
@@ -2,6 +2,10 @@
## 功能点
+### [2026/2/14]
+
+1. [x] (优化)实现完整的路径分析功能
+
### [2026/2/8]
1. [x] (功能)增加预计算结果分析和排除建议
diff --git a/doc/working/path_analysis_design.md b/doc/working/path_analysis_design.md
index 0058f48..c26a8ec 100644
--- a/doc/working/path_analysis_design.md
+++ b/doc/working/path_analysis_design.md
@@ -9,6 +9,7 @@
## 一、项目背景与目标
### 1.1 背景
+
- **应用场景**: 大型装置内进行精密组件物流仿真
- **核心目标**: 确保组件能安全到达安装位置(终点)
- **最高优先级**: 减少碰撞(安全性)
@@ -16,6 +17,7 @@
- **不涉及**: 经济成本
### 1.2 设计原则
+
1. **实用优先**: 指标不在于多,而在于有用
2. **聚焦终点**: 核心目标是"找出到同一安装位置的最佳路径"
3. **可解释性**: 每个指标和评分都要有明确的物理意义
@@ -27,11 +29,11 @@
### 2.1 三种分析策略
-| 策略 | 权重配置(安全/效率/转弯/曲折/冗余) | 适用场景 |
-|-----|-----------------------------------|---------|
-| **安全优先** | 50% / 20% / 10% / 10% / 10% | 精密/易损组件,首次运输 |
-| **效率优先** | 20% / 40% / 15% / 15% / 10% | 紧急任务,多次往返 |
-| **平衡模式** | 35% / 30% / 10% / 15% / 10% | 通用场景(默认) |
+| 策略 | 权重配置(安全/效率/转弯/直达) | 适用场景 |
+|-----|--------------------------------|---------|
+| **安全优先** | 50% / 30% / 10% / 10% | 精密/易损组件,首次运输 |
+| **效率优先** | 20% / 50% / 15% / 15% | 紧急任务,多次往返 |
+| **平衡模式** | 35% / 35% / 15% / 15% | 通用场景(默认) |
### 2.2 权重配置代码
@@ -42,19 +44,19 @@ public static class AnalysisStrategies
public const string EfficiencyFirst = "效率优先";
public const string Balanced = "平衡模式";
- // 权重顺序: 安全、效率、转弯、曲折、冗余
+ // 权重顺序: 安全、效率、转弯、直达
public static readonly Dictionary Weights = new Dictionary
{
- [SafetyFirst] = new[] { 0.50, 0.20, 0.10, 0.10, 0.10 },
- [EfficiencyFirst] = new[] { 0.20, 0.40, 0.15, 0.15, 0.10 },
- [Balanced] = new[] { 0.35, 0.30, 0.10, 0.15, 0.10 }
+ [SafetyFirst] = new[] { 0.50, 0.30, 0.10, 0.10 },
+ [EfficiencyFirst] = new[] { 0.20, 0.50, 0.15, 0.15 },
+ [Balanced] = new[] { 0.35, 0.35, 0.15, 0.15 }
};
}
```
---
-## 三、指标体系(5维度)
+## 三、指标体系(4维度)
### 3.1 安全性(碰撞风险指数)- 权重最高
@@ -108,7 +110,7 @@ RadiusPenalty = MinRadius < 2.0 ? 20 : 0;
TurnDifficultyScore = Max(0, 100 - TurnPenalty - RadiusPenalty);
```
-### 3.4 平顺性(路径曲折度)
+### 3.4 直达性(路径曲折度)
```csharp
// 计算起点到终点的直线距离
@@ -123,27 +125,7 @@ Tortuosity = TotalLength / StraightDistance;
TortuosityScore = Max(0, 100 - (Tortuosity - 1.0) * 50);
```
-### 3.5 冗余度(通道冗余度)
-```csharp
-// 获取路径经过的通道
-Channels = GetChannelsAlongPath(this);
-
-// 通道最小限宽限高
-MinChannelWidth = Channels.Min(c => c.WidthLimit);
-MinChannelHeight = Channels.Min(c => c.HeightLimit);
-
-// 车辆实际尺寸(含安全间隙)
-EffectiveVehicleWidth = MaxVehicleWidth + SafetyMargin;
-EffectiveVehicleHeight = MaxVehicleHeight + SafetyMargin;
-
-// 冗余率
-WidthRedundancy = (MinChannelWidth - EffectiveVehicleWidth) / EffectiveVehicleWidth;
-HeightRedundancy = (MinChannelHeight - EffectiveVehicleHeight) / EffectiveVehicleHeight;
-
-// 冗余度分(0-100)
-RedundancyScore = Min(100, (WidthRedundancy + HeightRedundancy) / 2 * 100);
-```
---
@@ -234,6 +216,7 @@ public PathRoute FindBestPathInGroup(EndpointGroup group, string strategy)
## 五、碰撞热点计算
### 5.1 热点定义
+
- **范围**: 3米半径球体
- **阈值**: 范围内 ≥2 次碰撞
- **数据来源**: `ClashDetectiveCollisionObjects` 表的 `Item1PosX/Y/Z`
@@ -295,7 +278,7 @@ public List DetectHotspots(List collisions, d
| **安全建议** | 碰撞数>0 | 发现X次碰撞,其中Y个热点,建议检查碰撞位置 |
| **效率建议** | 长度差异率>30% | 该路径比组内最短路径长X%,建议优化路线 |
| **转弯建议** | 转弯次数>3 | 路径包含X个转弯,建议减少急转弯 |
-| **冗余建议** | 冗余度<20% | 通道余量较小,建议确认车辆尺寸匹配 |
+| **直达建议** | 直达性<70% | 路径较为曲折,建议考虑更直接的路线 |
| **组内对比** | 组内路径>1 | 本组共X条路径,推荐【路径名】为最佳选择 |
### 6.2 建议生成示例
@@ -344,8 +327,7 @@ public List GenerateSuggestions(PathDetailedAnalysis analysis, EndpointG
-- AnalysisResults 表扩展字段
ALTER TABLE AnalysisResults ADD COLUMN
TurnDifficultyScore REAL, -- 转弯难度分
- TortuosityScore REAL, -- 曲折度分
- RedundancyScore REAL, -- 冗余度分
+ TortuosityScore REAL, -- 直达性分
HotspotCount INTEGER, -- 热点数量
AnalysisStrategy TEXT, -- 分析策略
GroupId TEXT, -- 所属终点组ID
@@ -399,16 +381,15 @@ CREATE TABLE IF NOT EXISTS CollisionHotspots (
| 任务 | 文件 | 说明 |
|-----|------|------|
| 2.1 ViewModel更新 | `src/UI/WPF/ViewModels/PathAnalysisViewModel.cs` | 修改,增加新属性和命令 |
-| 2.2 对话框更新 | `src/UI/WPF/Views/PathAnalysisDialog.xaml` | 修改,增加可视化元素 |
-| 2.3 图表组件 | `src/UI/WPF/Views/PathAnalysisCharts.xaml` | 新建,雷达图/柱状图 |
+| 2.2 对话框更新 | `src/UI/WPF/Views/PathAnalysisDialog.xaml` | 修改,增加Canvas图表区域 |
+| 2.3 图表绘制 | `src/UI/WPF/Views/PathAnalysisDialog.xaml.cs` | 修改,Canvas自绘柱状图和雷达图 |
### Phase 3: HTML报告(第三步)
| 任务 | 文件 | 说明 |
|-----|------|------|
| 3.1 报告生成器 | `src/Core/PathAnalysisReportGenerator.cs` | 新建,HTML生成逻辑 |
-| 3.2 Chart.js部署 | `resources/js/chart.min.js` | 下载本地Chart.js |
-| 3.3 报告模板 | `resources/templates/` | 新建,HTML模板文件 |
+| 3.2 报告样式 | 嵌入式CSS | 使用内联样式,无需外部依赖 |
---
@@ -425,16 +406,14 @@ public double CalculateWeightedScore(PathDetailedAnalysis analysis, string strat
double safety = analysis.SafetyScore; // 安全
double efficiency = analysis.EfficiencyScore; // 效率
double turn = analysis.TurnDifficultyScore; // 转弯
- double tortuosity = analysis.TortuosityScore; // 曲折
- double redundancy = analysis.RedundancyScore; // 冗余
+ double tortuosity = analysis.TortuosityScore; // 直达
// 加权计算
double weightedScore =
safety * weights[0] +
efficiency * weights[1] +
turn * weights[2] +
- tortuosity * weights[3] +
- redundancy * weights[4];
+ tortuosity * weights[3];
return Math.Round(weightedScore, 1);
}
@@ -464,7 +443,6 @@ public PathDetailedAnalysis AnalyzePath(PathRoute route, AnalysisContext context
analysis.EfficiencyScore = CalculateEfficiencyScore(route, context.GroupMinTime);
analysis.TurnDifficultyScore = CalculateTurnDifficultyScore(route.Edges);
analysis.TortuosityScore = CalculateTortuosityScore(route);
- analysis.RedundancyScore = CalculateRedundancyScore(route, context.Channels);
// 4. 计算综合评分
analysis.WeightedScore = CalculateWeightedScore(analysis, context.Strategy);
@@ -484,35 +462,46 @@ public PathDetailedAnalysis AnalyzePath(PathRoute route, AnalysisContext context
| 路径分析 - 多路径对比 [关闭] |
+----------------------------------------------------------+
| +----------------+ +------------------+ +-----------+ |
-| | 路径选择 | | 对比分析表格 | | 分析结果 | |
-| | - 路径A | | 名称|安全|效率|... | | 最佳路径 | |
-| | - 路径B [x] | | A | 90 | 85 |... | | 优化建议 | |
-| | - 路径C [x] | | B |100 | 70 |... | | ... | |
-| | | | C | 80 | 90 |... | | | |
-| | [全选][清空] | +------------------+ +-----------+ |
-| | | +------------------+ |
-| | 策略: | | 雷达图可视化 | |
-| | ○ 安全优先 | | | |
-| | ○ 效率优先 | +------------------+ |
-| | ● 平衡模式 | +------------------+ |
-| | | | 同终点组分析 | |
-| | [开始分析] | | 组1: 终点A (3条) | |
-| +----------------+ | - 路径B [推荐] | |
+| | 路径选择 | | 🏆 推荐最佳路径 | | 💡 优化建议| |
+| | - 路径A | | 路径名称 | | 建议1... | |
+| | - 路径B [x] | | 长度: XXm | 评分 | | 建议2... | |
+| | - 路径C [x] | +------------------+ | ... | |
+| | | +------------------+ +-----------+ |
+| | [全选][清空] | | 📊 多路径对比图表 | |
+| | | | +--------------+ | |
+| | 策略: | | | 柱状图 | | |
+| | ○ 安全优先 | | | (4维度对比) | | |
+| | ○ 效率优先 | | +--------------+ | |
+| | ● 平衡模式 | | +--------------+ | |
+| | | | | 雷达图 | | |
+| | [开始分析] | | | (组内对比) | | |
+| +----------------+ +------------------+ |
+| +------------------+ |
+| | 🎯 同终点路径组 | |
+| | 组1: 终点 (2条) | |
+| | - 路径B (最佳) | |
| | - 路径A | |
-| | - 路径C | |
| +------------------+ |
+----------------------------------------------------------+
| [导出报告] [关闭] |
+----------------------------------------------------------+
```
-### 11.2 可视化元素
+### 11.2 可视化元素(WPF Canvas自绘)
-1. **雷达图**: 展示单条路径5维度分数
-2. **柱状图**: 组内路径长度/时间对比
-3. **表格**: 所有路径的详细指标
-4. **推荐卡片**: 高亮显示最佳路径
-5. **热点标记**: 在路径上标注碰撞热点位置
+1. **柱状图**: 使用WPF Canvas绘制,展示各路径4维度分数对比(安全/效率/转弯/直达)
+ - 每个柱子显示具体分数
+ - 路径名称水平显示在柱组下方
+ - 右上角显示图例
+
+2. **雷达图**: 使用WPF Canvas绘制,展示选中组内所有路径的4维度表现
+ - 五边形网格背景
+ - 不同颜色区分各路径
+ - 最佳路径用粗线标识
+
+3. **推荐卡片**: 显示最佳路径名称、长度和综合评分
+
+4. **优化建议列表**: 分类显示安全、效率、转弯等建议
---
@@ -524,15 +513,15 @@ public PathDetailedAnalysis AnalyzePath(PathRoute route, AnalysisContext context
路径分析报告
-
-