diff --git a/src/UI/WPF/LogisticsControlPanel.xaml b/src/UI/WPF/LogisticsControlPanel.xaml index c5078e6..0351541 100644 --- a/src/UI/WPF/LogisticsControlPanel.xaml +++ b/src/UI/WPF/LogisticsControlPanel.xaml @@ -90,7 +90,8 @@ NavisworksTransport 主控制面板 - 采用与其他视图一致的Navisworks 2 SetPropertyThreadSafe(ref _showPreviewPrompt, value); } - /// - /// 是否显示预览信息 - /// - public bool ShowPreviewInfo - { - get => _showPreviewInfo; - set => SetPropertyThreadSafe(ref _showPreviewInfo, value); - } - - /// - /// 预览信息提示消息 - /// - public string PreviewInfoMessage - { - get => _previewInfoMessage; - set => SetPropertyThreadSafe(ref _previewInfoMessage, value); - } /// /// 当前选择文本 @@ -489,15 +470,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetPropertyThreadSafe(ref _currentOperationText, value); } - /// - /// 进度详细文本 - /// - public string ProgressDetailText - { - get => _progressDetailText; - set => SetPropertyThreadSafe(ref _progressDetailText, value); - } - /// /// 进度百分比 /// @@ -829,6 +801,56 @@ namespace NavisworksTransport.UI.WPF.ViewModels } } + /// + /// 构造函数 - 支持统一状态栏 + /// + /// 主ViewModel,用于统一状态栏 + public LayerManagementViewModel(LogisticsControlViewModel mainViewModel) : base() + { + try + { + // 保存主ViewModel引用 + _mainViewModel = mainViewModel; + + // 获取UI状态管理器实例 + _uiStateManager = UIStateManager.Instance; + // 验证关键组件是否正常初始化 + if (_uiStateManager == null) + { + LogManager.Error("UIStateManager初始化失败"); + throw new InvalidOperationException("UIStateManager初始化失败"); + } + + // 初始化业务逻辑组件 + _floorDetector = new FloorDetector(); + _modelSplitterManager = new ModelSplitterManager(); + _attributeGrouper = new AttributeGrouper(); + + // 初始化命令 - 使用异步Command Pattern + InitializeCommands(); + + // 订阅事件 + _modelSplitterManager.ProgressChanged += OnProgressChanged; + _modelSplitterManager.StatusChanged += OnStatusChanged; + + // 订阅Navisworks选择变化事件 - 使用新的选择管理服务 + SubscribeToSelectionEvents(); + + // 异步初始化 + InitializeAsync(); + + LogManager.Info("LayerManagementViewModel构造函数执行完成 - 支持统一状态栏"); + } + catch (Exception ex) + { + LogManager.Error($"LayerManagementViewModel构造函数异常: {ex.Message}", ex); + + // 在构造函数中尽量保证对象处于可用状态 + CurrentOperationText = "初始化失败,请检查日志"; + throw; + } + } + #endregion #region 命令初始化 - 统一的Command Pattern @@ -944,12 +966,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels IsProcessing = true; ShowCancelButton = false; // 分析楼层操作不支持取消 CurrentOperationText = "正在分析楼层..."; - ProgressDetailText = "检测模型中的楼层属性"; - ProgressPercentage = 0; - - // 初始化预览状态 - ShowPreviewInfo = true; - PreviewInfoMessage = "正在使用智能遍历模式快速生成预览,仅显示关键节点..."; + UpdateMainStatus("检测模型中的楼层属性", -1, true); }); try @@ -965,12 +982,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels { SetFloorAnalysisResult(result.Message, result.StatusColor); NeedsManualFloorSetup = result.NeedsManualSetup; - ProgressDetailText = "楼层分析完成"; + UpdateMainStatus("楼层分析完成"); } else { SetFloorAnalysisResult(result.ErrorMessage, Brushes.Red); - ProgressDetailText = "楼层分析失败"; + UpdateMainStatus("楼层分析失败"); } }); } @@ -982,7 +999,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { SetFloorAnalysisResult($"分析失败: {ex.Message}", Brushes.Red); - ProgressDetailText = "操作异常"; + UpdateMainStatus("操作异常"); }); } finally @@ -1008,7 +1025,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { IsProcessing = true; CurrentOperationText = "正在刷新属性列表..."; - ProgressDetailText = "获取模型属性"; + UpdateMainStatus("获取模型属性"); }); try @@ -1027,11 +1044,11 @@ namespace NavisworksTransport.UI.WPF.ViewModels { AvailableAttributes.Add(attr); } - ProgressDetailText = $"成功获取 {result.Attributes.Count} 个属性"; + UpdateMainStatus($"成功获取 {result.Attributes.Count} 个属性"); } else { - ProgressDetailText = result.ErrorMessage ?? "获取属性失败"; + UpdateMainStatus(result.ErrorMessage ?? "获取属性失败"); } }); } @@ -1043,7 +1060,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { AvailableAttributes.Clear(); - ProgressDetailText = $"刷新失败: {ex.Message}"; + UpdateMainStatus($"刷新失败: {ex.Message}"); }); } finally @@ -1067,7 +1084,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { IsProcessing = true; CurrentOperationText = "正在获取选中节点..."; - ProgressDetailText = "检查当前选择"; + UpdateMainStatus("检查当前选择"); }); try @@ -1082,14 +1099,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (result.IsSuccess) { SelectedNodesText = NavisworksSelectionHelper.FormatSelectionText(result.Count, result.SelectedItems, "个节点"); - ProgressDetailText = result.Count > 0 + UpdateMainStatus(result.Count > 0 ? $"获取到 {result.Count} 个选中节点" - : "当前没有选中的节点"; + : "当前没有选中的节点"); } else { SelectedNodesText = "获取节点失败"; - ProgressDetailText = result.ErrorMessage ?? "选择节点操作失败"; + UpdateMainStatus(result.ErrorMessage ?? "选择节点操作失败"); } }); } @@ -1101,7 +1118,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { SelectedNodesText = "获取节点异常"; - ProgressDetailText = $"操作失败: {ex.Message}"; + UpdateMainStatus($"操作失败: {ex.Message}"); }); } finally @@ -1126,7 +1143,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels IsProcessing = true; CurrentOperationText = "正在应用楼层属性..."; FloorAttributeStatus = "处理中..."; - ProgressDetailText = "为选中节点设置楼层属性"; + UpdateMainStatus("为选中节点设置楼层属性"); }); try @@ -1141,12 +1158,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (result.IsSuccess) { FloorAttributeStatus = $"成功为 {result.Count} 个节点设置楼层属性"; - ProgressDetailText = $"属性设置完成,影响 {result.Count} 个节点"; + UpdateMainStatus($"属性设置完成,影响 {result.Count} 个节点"); } else { FloorAttributeStatus = result.ErrorMessage ?? "楼层属性设置失败"; - ProgressDetailText = "属性设置操作失败"; + UpdateMainStatus("属性设置操作失败"); } }); } @@ -1158,7 +1175,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { FloorAttributeStatus = $"设置失败: {ex.Message}"; - ProgressDetailText = "属性设置异常"; + UpdateMainStatus("属性设置异常"); }); } finally @@ -1184,7 +1201,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ShowCancelButton = false; // 预览操作不支持取消 CurrentOperationText = "正在生成分层预览..."; ProgressPercentage = 0; - ProgressDetailText = "准备分层配置"; + UpdateMainStatus("准备分层配置"); // 清空旧的预览结果 SplitPreviewResults.Clear(); @@ -1192,8 +1209,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 显示加载状态 ShowPreviewResults = false; ShowPreviewPrompt = false; - ShowPreviewInfo = true; - PreviewInfoMessage = "正在使用智能遍历模式快速生成预览..."; // 添加加载提示项 var loadingItem = new SplitPreviewItem @@ -1245,18 +1260,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels ShowPreviewResults = true; ShowPreviewPrompt = false; - ShowPreviewInfo = true; - PreviewInfoMessage = $"预览完成:共检测到 {SplitPreviewResults.Count} 个分层(智能遍历仅显示关键节点)"; - ProgressDetailText = $"预览完成,共 {SplitPreviewResults.Count} 个分层"; + UpdateMainStatus($"预览完成:共检测到 {SplitPreviewResults.Count} 个分层(智能遍历仅显示关键节点)"); } else { // 预览失败或无结果,不在列表中显示错误项,而是隐藏结果列表并显示提示 ShowPreviewResults = false; ShowPreviewPrompt = true; // 显示提示信息 - ShowPreviewInfo = true; // 显示预览信息提示 - PreviewInfoMessage = result.ErrorMessage ?? "未找到任何分层属性,请先设置模型的分层属性(楼层、区域或子系统)"; - ProgressDetailText = result.ErrorMessage ?? "未找到任何分层属性,请先设置模型的分层属性(楼层、区域或子系统)"; + UpdateMainStatus(result.ErrorMessage ?? "未找到任何分层属性,请先设置模型的分层属性(楼层、区域或子系统)"); } }); } @@ -1272,9 +1283,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ShowPreviewResults = false; ShowPreviewPrompt = true; // 显示提示信息 - ShowPreviewInfo = true; // 显示预览信息提示 - PreviewInfoMessage = $"预览异常: {ex.Message}"; - ProgressDetailText = $"预览异常: {ex.Message}"; + UpdateMainStatus($"预览异常: {ex.Message}"); }); } finally @@ -1325,7 +1334,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "没有选中任何分层进行保存"; - ProgressDetailText = "请勾选需要保存的分层"; + UpdateMainStatus("请勾选需要保存的分层"); }); return; } @@ -1338,7 +1347,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels IsProcessing = true; ShowCancelButton = true; // 分层保存支持取消 CurrentOperationText = "正在执行分层保存..."; - ProgressDetailText = $"准备保存到: {selectedDirectory}"; + UpdateMainStatus($"准备保存到: {selectedDirectory}"); }); _cancellationTokenSource = new CancellationTokenSource(); @@ -1378,7 +1387,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "分层保存完成"; - ProgressDetailText = $"文件已保存到: {selectedDirectory}"; + UpdateMainStatus($"文件已保存到: {selectedDirectory}"); // 更新OutputDirectory显示(可选) OutputDirectory = selectedDirectory; }); @@ -1391,7 +1400,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "分层保存异常"; - ProgressDetailText = $"保存失败: {ex.Message}"; + UpdateMainStatus($"保存失败: {ex.Message}"); }); } finally @@ -1441,8 +1450,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = $"正在处理分层: {preview.LayerName} ({i + 1}/{previewResultsForSave.Count})"; - ProgressPercentage = (double)(i + 1) * 100 / previewResultsForSave.Count; - ProgressDetailText = $"处理分层 {i + 1}/{previewResultsForSave.Count}: {preview.LayerName}"; + double percentage = (double)(i + 1) * 100 / previewResultsForSave.Count; + UpdateMainStatus($"处理分层 {i + 1}/{previewResultsForSave.Count}: {preview.LayerName}", percentage); }); try @@ -1461,7 +1470,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 继续处理其他分层,不因单个失败而中断整个进程 await _uiStateManager.ExecuteUIUpdateAsync(() => { - ProgressDetailText = errorMsg; + UpdateMainStatus(errorMsg); }); } } @@ -1480,7 +1489,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { - ProgressDetailText = finalMessage; + UpdateMainStatus(finalMessage); }); // 如果所有分层都失败,抛出异常 @@ -2116,7 +2125,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { IsProcessing = true; CurrentOperationText = "正在进行环境诊断..."; - ProgressDetailText = "检查Navisworks API环境和线程状态"; + UpdateMainStatus("检查Navisworks API环境和线程状态"); }); // 2. 纯业务逻辑执行(后台线程) @@ -2129,7 +2138,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "环境诊断完成"; - ProgressDetailText = "环境诊断报告已生成"; + UpdateMainStatus("环境诊断报告已生成"); }); // 显示诊断结果 @@ -2145,7 +2154,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "环境诊断异常"; - ProgressDetailText = $"诊断失败: {ex.Message}"; + UpdateMainStatus($"诊断失败: {ex.Message}"); }); ShowDiagnosticResult($"诊断过程中发生异常: {ex.Message}"); @@ -2679,7 +2688,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels _uiStateManager.QueueUIUpdate(() => { ProgressPercentage = e.ProgressPercentage; - ProgressDetailText = e.UserState?.ToString() ?? ""; + UpdateMainStatus(e.UserState?.ToString() ?? ""); }, UIUpdatePriority.Normal); } @@ -3183,7 +3192,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels IsProcessing = true; ShowCancelButton = false; // 清除楼层属性不支持取消 CurrentOperationText = "正在清除楼层属性..."; - ProgressDetailText = "正在清除选中模型的楼层属性"; + UpdateMainStatus("正在清除选中模型的楼层属性"); }); try @@ -3238,9 +3247,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = result.Message; - ProgressDetailText = result.Success ? + UpdateMainStatus(result.Success ? $"楼层属性清除完成,成功清除 {result.Count}/{result.TotalCount} 个模型项" : - "楼层属性清除失败"; + "楼层属性清除失败"); if (result.Success) { @@ -3267,7 +3276,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "清除楼层属性异常"; - ProgressDetailText = $"清除失败: {ex.Message}"; + UpdateMainStatus($"清除失败: {ex.Message}"); }); } finally @@ -3625,7 +3634,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { IsProcessing = true; CurrentOperationText = "正在准备单独显示..."; - ProgressDetailText = $"隐藏除'{SelectedPreviewResult.LayerName}'之外的其他分层"; + UpdateMainStatus($"隐藏除'{SelectedPreviewResult.LayerName}'之外的其他分层"); }); // 2. 在UI线程执行Navisworks API调用 @@ -3666,12 +3675,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (isolateResult) { CurrentOperationText = $"已单独显示: {SelectedPreviewResult.LayerName}"; - ProgressDetailText = "其他分层已隐藏,您可以预览选中的分层内容"; + UpdateMainStatus("其他分层已隐藏,您可以预览选中的分层内容"); } else { CurrentOperationText = "单独显示失败"; - ProgressDetailText = resultMessage ?? "请检查日志了解详细信息"; + UpdateMainStatus(resultMessage ?? "请检查日志了解详细信息"); } }); @@ -3685,7 +3694,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "单独显示异常"; - ProgressDetailText = $"操作失败: {ex.Message}"; + UpdateMainStatus($"操作失败: {ex.Message}"); }); } finally @@ -3712,7 +3721,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { IsProcessing = true; CurrentOperationText = "正在恢复显示..."; - ProgressDetailText = "恢复所有分层的可见性"; + UpdateMainStatus("恢复所有分层的可见性"); }); // 2. 在UI线程执行Navisworks API调用 @@ -3744,12 +3753,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels if (restoreResult) { CurrentOperationText = "已恢复所有分层显示"; - ProgressDetailText = "所有分层内容都已可见"; + UpdateMainStatus("所有分层内容都已可见"); } else { CurrentOperationText = "恢复显示失败"; - ProgressDetailText = resultMessage ?? "请检查日志了解详细信息"; + UpdateMainStatus(resultMessage ?? "请检查日志了解详细信息"); } }); @@ -3763,7 +3772,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels await _uiStateManager.ExecuteUIUpdateAsync(() => { CurrentOperationText = "恢复显示异常"; - ProgressDetailText = $"操作失败: {ex.Message}"; + UpdateMainStatus($"操作失败: {ex.Message}"); }); } finally @@ -3777,5 +3786,66 @@ namespace NavisworksTransport.UI.WPF.ViewModels } #endregion + + #region 统一状态栏方法 + + /// + /// 更新统一状态栏(简单版本,不显示进度条) + /// + private void UpdateMainStatus(string message) + { + try + { + // 如果有主ViewModel引用,更新统一状态栏 + if (_mainViewModel != null) + { + _mainViewModel.UpdateStatus(message); + } + } + catch (Exception ex) + { + LogManager.Error($"更新统一状态栏失败: {ex.Message}", ex); + } + } + + /// + /// 更新统一状态栏(支持百分比进度) + /// + private void UpdateMainStatus(string message, double percentage) + { + try + { + // 如果有主ViewModel引用,更新统一状态栏 + if (_mainViewModel != null) + { + _mainViewModel.UpdateStatus(message, percentage); + } + } + catch (Exception ex) + { + LogManager.Error($"更新统一状态栏失败: {ex.Message}", ex); + } + } + + /// + /// 更新统一状态栏(完整版本,支持不确定进度) + /// + private void UpdateMainStatus(string message, double progress = -1, bool? isProcessing = null) + { + try + { + // 如果有主ViewModel引用,更新统一状态栏 + if (_mainViewModel != null) + { + _mainViewModel.UpdateStatus(message, progress, isProcessing); + } + } + catch (Exception ex) + { + LogManager.Error($"更新统一状态栏失败: {ex.Message}", ex); + } + } + + #endregion } } \ No newline at end of file diff --git a/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs b/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs index 90d88d0..a2c28a3 100644 --- a/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs +++ b/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs @@ -202,6 +202,26 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetProperty(ref _isProcessing, value); } + /// + /// 进度百分比(0-100,-1表示不确定进度) + /// + public double ProgressPercentage + { + get => _animationProgress; + set + { + if (SetProperty(ref _animationProgress, value)) + { + OnPropertyChanged(nameof(IsIndeterminateProgress)); + } + } + } + + /// + /// 是否使用不确定进度模式 + /// + public bool IsIndeterminateProgress => ProgressPercentage < 0; + #region 动画控制属性 /// @@ -1002,7 +1022,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels StatusText = message ?? "就绪"; if (progress >= 0) { - AnimationProgress = Math.Max(0, Math.Min(100, progress)); + ProgressPercentage = Math.Max(0, Math.Min(100, progress)); } if (isProcessing.HasValue) { @@ -1011,6 +1031,21 @@ namespace NavisworksTransport.UI.WPF.ViewModels }, "更新统一状态栏", runOnUIThread: true); } + /// + /// 更新统一状态栏信息(支持百分比进度) + /// + /// 状态消息 + /// 进度百分比 (0-100) + public void UpdateStatus(string message, double percentage) + { + SafeExecute(() => + { + StatusText = message ?? "就绪"; + ProgressPercentage = Math.Max(0, Math.Min(100, percentage)); + IsProcessing = true; // 有百分比进度时显示进度条 + }, "更新统一状态栏(百分比模式)", runOnUIThread: true); + } + /// /// 重置状态栏到默认状态 /// diff --git a/src/UI/WPF/Views/LayerManagementView.xaml b/src/UI/WPF/Views/LayerManagementView.xaml index a4166ee..54efdfb 100644 --- a/src/UI/WPF/Views/LayerManagementView.xaml +++ b/src/UI/WPF/Views/LayerManagementView.xaml @@ -286,16 +286,6 @@ NavisworksTransport 分层管理页签视图 - 重构优化版本 - - - - - @@ -336,26 +326,6 @@ NavisworksTransport 分层管理页签视图 - 重构优化版本 - - - - - - - -