# Business Commands使用指南 ## 概述 本文档介绍NavisworksTransport项目中新实现的7个业务Commands的使用方法和最佳实践。这些Commands基于Command Pattern设计,与UIStateManager深度集成,提供线程安全、异步执行和进度报告功能。 ## 实现的Commands ### 1. SetLogisticsAttributeCommand - 设置物流属性 **功能**:为选中的模型项设置物流分类属性 **使用方式**: ```csharp // 方式1:直接创建Command var targetItems = document.CurrentSelection.SelectedItems; var parameters = new SetLogisticsAttributeParameters { TargetItems = targetItems, ElementType = CategoryAttributeManager.LogisticsElementType.Door, IsTraversable = true, OverwriteExisting = true }; var command = new SetLogisticsAttributeCommand(parameters); var result = await command.ExecuteAsync(); // 方式2:通过CommandManager var result = await CommandManager.Instance.ExecuteCommandAsync("SetLogisticsAttribute", new object[] { targetItems, CategoryAttributeManager.LogisticsElementType.Door, true, true }); ``` **支持的物流元素类型**: - Door (门) - Elevator (电梯) - Stairs (楼梯) - Channel (通道) - Obstacle (障碍物) - LoadingZone (装卸区) - Parking (停车区) - Checkpoint (检查点) ### 2. DeletePathCommand - 删除路径 **功能**:删除特定路径或所有路径,支持备份 **使用方式**: ```csharp // 删除特定路径 var deleteParams = new DeletePathParameters(); deleteParams.PathsToDelete.Add(specificRoute); deleteParams.CreateBackup = true; var command = new DeletePathCommand(deleteParams); var result = await command.ExecuteAsync(); // 删除所有路径(谨慎使用) var deleteAllParams = new DeletePathParameters { DeleteAll = true, CreateBackup = true, // 强烈建议 ForceDelete = false // 安全模式 }; ``` **安全特性**: - 自动备份功能 - 确认机制(ForceDelete=false时) - 批量删除支持 ### 3. ImportPathCommand - 导入路径数据 **功能**:从XML/JSON文件导入路径数据 **使用方式**: ```csharp var importParams = new ImportPathParameters { FilePath = @"C:\Data\logistics_paths.xml", ImportFormat = ExportFormat.Xml, MergeWithExisting = true, CreateBackup = true, DuplicateNameHandling = ImportPathParameters.DuplicateNameHandling.Rename }; var command = new ImportPathCommand(importParams); var result = await command.ExecuteAsync(); if (result.IsSuccess && result is PathPlanningResult importResult) { Console.WriteLine($"成功导入 {importResult.Data.ImportedPathCount} 个路径"); } ``` **支持格式**: - XML格式 - JSON格式 - 自动格式检测 **重复处理策略**: - Skip: 跳过重复项 - Overwrite: 覆盖现有项 - Rename: 自动重命名 ### 4. ExportPathCommand - 导出路径数据 **功能**:将路径数据导出为多种格式 **使用方式**: ```csharp var exportParams = new ExportPathParameters { OutputFilePath = @"C:\Export\current_paths.xml", ExportAll = true, ExportFormat = ExportFormat.Xml, OverwriteExisting = false, GenerateReport = true }; var command = new ExportPathCommand(exportParams); var result = await command.ExecuteAsync(); ``` **支持格式**: - XML: 标准XML格式 - JSON: 轻量级JSON格式 - DELMIA: 兼容DELMIA软件格式 **报告功能**: - HTML格式导出报告 - 统计信息和验证结果 - 导出性能指标 ### 5. RunCollisionDetectionCommand - 碰撞检测 **功能**:检测路径与模型的碰撞冲突 **使用方式**: ```csharp var collisionParams = new CollisionDetectionParameters { TargetRoute = specificRoute, // 或设置 CheckAllRoutes = true VehicleSize = 1.8, // 车辆尺寸(米) SafetyMargin = 0.5, // 安全边距(米) GenerateReport = true }; var command = new RunCollisionDetectionCommand(collisionParams); var result = await command.ExecuteAsync(); ``` **检测功能**: - 单路径检测 - 全部路径批量检测 - 可配置车辆尺寸和安全边距 - 详细碰撞报告 ### 6. StartAnimationCommand - 启动动画 **功能**:启动路径动画播放 **使用方式**: ```csharp var animationParams = new StartAnimationParameters { TargetRoute = animationRoute, AnimationSpeed = 2.0, // 米/秒 Loop = false, // 是否循环 AutoStart = true // 自动开始 }; var command = new StartAnimationCommand(animationParams); var result = await command.ExecuteAsync(); // 快捷创建方式 var quickCommand = StartAnimationCommand.CreateForRoute(route, speed: 1.5, loop: true); ``` **动画控制**: - 可调节播放速度 - 循环播放选项 - 与LogisticsAnimationManager集成 - TimeLiner兼容 ### 7. ModelSplitterCommand - 模型分层 **功能**:按不同策略分割和导出模型 **使用方式**: ```csharp // 按楼层分层 var splitConfig = new ModelSplitterManager.SplitConfiguration { Strategy = ModelSplitterManager.SplitStrategy.ByFloor, OutputDirectory = @"C:\ModelSplits\ByFloor", AttributeName = "Level", GenerateReport = true }; var command = new ModelSplitterCommand(splitConfig); var result = await command.ExecuteAsync(); // 快捷创建方式 var quickCommand = ModelSplitterCommand.CreateByFloor(@"C:\Output", "LevelName"); ``` **分层策略**: - ByFloor: 按楼层分层 - ByCategory: 按类别分层 - 自定义属性分层 ## CommandManager集成 ### 队列执行 ```csharp // 添加命令到执行队列 var task1 = CommandManager.Instance.EnqueueCommandAsync("ExportPath", new object[] { @"C:\backup.xml", true, ExportFormat.Xml, true }, CommandPriority.High); var task2 = CommandManager.Instance.EnqueueCommandAsync("RunCollisionDetection", new object[] { true, 2.0, 0.5 }, CommandPriority.Normal); // 等待所有任务完成 var results = await Task.WhenAll(task1, task2); ``` ### 批量工作流 ```csharp // 典型的备份-清理-导入-验证工作流 public async Task ExecuteMaintenanceWorkflow() { // 1. 备份现有数据 var backupResult = await CommandManager.Instance.ExecuteCommandAsync("ExportPath", new object[] { GetBackupPath(), true, ExportFormat.Xml, false }); if (!backupResult.IsSuccess) return; // 2. 清理现有路径 await CommandManager.Instance.ExecuteCommandAsync("DeletePath", new object[] { true, false, false }); // 3. 导入新配置 await CommandManager.Instance.ExecuteCommandAsync("ImportPath", new object[] { GetConfigPath(), ExportFormat.Xml, true, false }); // 4. 安全验证 await CommandManager.Instance.ExecuteCommandAsync("RunCollisionDetection", new object[] { true, 1.8, 0.5 }); } ``` ## 事件处理 ### 进度监控 ```csharp command.ProgressChanged += (sender, e) => { // 更新UI进度条 progressBar.Value = e.Progress; statusLabel.Text = e.Message; }; command.StatusChanged += (sender, e) => { // 处理状态变化 switch (e.CurrentStatus) { case CommandStatus.Running: startButton.Enabled = false; break; case CommandStatus.Completed: case CommandStatus.Failed: startButton.Enabled = true; break; } }; ``` ### CommandManager事件 ```csharp CommandManager.Instance.CommandExecutionStarted += (sender, e) => { LogManager.Info($"开始执行命令: {e.CommandId}"); }; CommandManager.Instance.CommandExecutionCompleted += (sender, e) => { LogManager.Info($"命令执行完成: {e.CommandId}, 结果: {e.Result.IsSuccess}"); }; ``` ## 最佳实践 ### 1. 错误处理 ```csharp try { var result = await command.ExecuteAsync(cancellationToken); if (result.IsSuccess) { // 处理成功结果 ProcessSuccessResult(result); } else { // 处理业务错误 HandleBusinessError(result.ErrorMessage); } } catch (OperationCanceledException) { // 处理用户取消 HandleUserCancellation(); } catch (Exception ex) { // 处理系统异常 HandleSystemError(ex); } ``` ### 2. 参数验证 ```csharp // 在执行前验证参数 var canExecute = command.CanExecute(); if (!canExecute.IsSuccess) { MessageBox.Show($"参数验证失败: {canExecute.ErrorMessage}"); return; } ``` ### 3. 取消支持 ```csharp using (var cts = new CancellationTokenSource()) { // 设置取消按钮 cancelButton.Click += (s, e) => cts.Cancel(); try { var result = await command.ExecuteAsync(cts.Token); } catch (OperationCanceledException) { // 用户取消操作 } } ``` ### 4. UI线程安全 ```csharp // Commands会自动处理UI线程调用 command.ProgressChanged += async (sender, e) => { // 这个事件处理器在UI线程中执行 await UIStateManager.Instance.ExecuteUIUpdateAsync(() => { progressBar.Value = e.Progress; statusLabel.Text = e.Message; }); }; ``` ## 性能考虑 ### 1. 批量操作优化 ```csharp // 对于大量路径操作,使用批量模式 var exportParams = new ExportPathParameters { ExportAll = true, // 批量导出 GenerateReport = false, // 跳过报告生成以提高性能 BatchSize = 100 // 分批处理 }; ``` ### 2. 并发限制 ```csharp // CommandManager会自动管理并发,但可以检查状态 var status = CommandManager.Instance.GetStatus(); if (status.RunningCommandCount > 3) { // 等待当前命令完成或使用队列 await CommandManager.Instance.EnqueueCommandAsync(commandKey, parameters); } ``` ### 3. 内存管理 ```csharp // 对于大文件操作,监控内存使用 var memoryBefore = GC.GetTotalMemory(false); var result = await importCommand.ExecuteAsync(); var memoryAfter = GC.GetTotalMemory(true); // 强制GC LogManager.Info($"内存使用: {memoryAfter - memoryBefore} 字节"); ``` ## 故障排除 ### 常见问题 1. **文件访问权限错误** - 确保输出目录具有写权限 - 检查文件是否被其他程序占用 2. **UI线程阻塞** - 所有Commands都是异步执行,不会阻塞UI - 使用await而不是.Result来等待结果 3. **取消操作无响应** - 确保传递了CancellationToken - 检查命令是否支持取消操作 4. **内存占用过高** - 对大文件分批处理 - 及时释放不再使用的资源 ### 调试技巧 ```csharp // 启用详细日志记录 LogManager.SetLogLevel(LogLevel.Debug); // 监控命令执行状态 var status = CommandManager.Instance.GetStatus(); LogManager.Debug($"运行中命令: {status.RunningCommandCount}"); LogManager.Debug($"队列中命令: {status.QueuedCommandCount}"); // 检查命令注册状态 var registeredCommands = CommandManager.Instance.GetRegisteredCommands(); foreach (var cmd in registeredCommands) { LogManager.Debug($"已注册命令: {cmd}"); } ``` ## 测试 ### 运行测试 ```bash # 运行所有业务Commands测试 ./run-tests.bat # 或者在代码中运行 await NavisworksTransport.Tests.TestRunner.RunBusinessCommandsTests(); # 快速验证测试 await NavisworksTransport.Tests.TestRunner.RunQuickTests(); # 特定命令测试 await NavisworksTransport.Tests.TestRunner.RunSpecificCommandTest("SetLogisticsAttribute"); ``` ### 测试覆盖 - ✅ 参数验证测试 - ✅ 命令创建测试 - ✅ 执行流程测试 - ✅ 错误处理测试 - ✅ 取消操作测试 - ✅ 集成测试 - ✅ 性能测试 ## 总结 新实现的7个业务Commands提供了完整的物流路径管理功能: 1. **设置属性** - 为模型元素分类 2. **路径管理** - 删除、导入、导出路径数据 3. **安全检查** - 碰撞检测和验证 4. **可视化** - 动画播放和演示 5. **模型处理** - 分层和导出 所有Commands都基于统一的Command Pattern架构,提供: - 异步执行和进度报告 - 线程安全的UI集成 - 完整的错误处理和取消支持 - 灵活的参数化配置 - 高性能的批量操作支持 通过CommandManager可以方便地进行命令组合和工作流管理,满足复杂的业务需求。