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 路径分析报告 - -