From 049673c6bba5d9958d9675bcec55bbceedf1a5f7 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Fri, 12 Sep 2025 11:54:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=E7=B1=BB=E5=88=AB=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=92=8C=E6=8F=92=E4=BB=B6=E4=B8=BB=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E6=97=A0=E6=95=88=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PathPlanning/AutoPathFinder.cs | 25 +- .../ViewModels/LogisticsControlViewModel.cs | 464 +----------------- .../WPF/ViewModels/ModelSettingsViewModel.cs | 242 +-------- 3 files changed, 30 insertions(+), 701 deletions(-) diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs index f94b2b3..2dd5d59 100644 --- a/src/PathPlanning/AutoPathFinder.cs +++ b/src/PathPlanning/AutoPathFinder.cs @@ -830,9 +830,6 @@ namespace NavisworksTransport.PathPlanning // 最少采样5个点,最多10000个点(提高性能限制) samples = Math.Max(5, Math.Min(samples, 10000)); - LogManager.Debug($"[斜线检查] 开始检查路径:起点({start.X:F2},{start.Y:F2})→终点({end.X:F2},{end.Y:F2})," + - $"距离={distance:F2}m,采样数={samples}"); - for (int i = 0; i <= samples; i++) { // 线性插值计算采样点 @@ -860,12 +857,12 @@ namespace NavisworksTransport.PathPlanning var deltaX = samplePoint.X - gridCenterX; var deltaY = samplePoint.Y - gridCenterY; - LogManager.Debug($"[斜线检查] 采样点{i}/{samples}失败:" + - $"采样点({samplePoint.X:F3},{samplePoint.Y:F3},{samplePoint.Z:F3})," + - $"网格({gridPos.X},{gridPos.Y})左下角({gridMinX:F3},{gridMinY:F3})," + - $"网格中心({gridCenterX:F3},{gridCenterY:F3},{gridCenterZ:F3})," + - $"偏差(ΔX={deltaX:F3}, ΔY={deltaY:F3})," + - $"原因:{(!gridMap.IsValidGridPosition(gridPos) ? "网格无效" : "不可通行")}"); + // LogManager.Debug($"[斜线检查] 采样点{i}/{samples}失败:" + + // $"采样点({samplePoint.X:F3},{samplePoint.Y:F3},{samplePoint.Z:F3})," + + // $"网格({gridPos.X},{gridPos.Y})左下角({gridMinX:F3},{gridMinY:F3})," + + // $"网格中心({gridCenterX:F3},{gridCenterY:F3},{gridCenterZ:F3})," + + // $"偏差(ΔX={deltaX:F3}, ΔY={deltaY:F3})," + + // $"原因:{(!gridMap.IsValidGridPosition(gridPos) ? "网格无效" : "不可通行")}"); return false; } @@ -882,11 +879,11 @@ namespace NavisworksTransport.PathPlanning var deltaX = samplePoint.X - gridCenterX; var deltaY = samplePoint.Y - gridCenterY; - LogManager.Debug($"[斜线检查] 采样点{i}/{samples}邻居障碍检查失败:" + - $"采样点({samplePoint.X:F3},{samplePoint.Y:F3})," + - $"网格左下角({gridMinX:F3},{gridMinY:F3})," + - $"网格中心({gridCenterX:F3},{gridCenterY:F3})," + - $"偏差(ΔX={deltaX:F3}, ΔY={deltaY:F3})"); + // LogManager.Debug($"[斜线检查] 采样点{i}/{samples}邻居障碍检查失败:" + + // $"采样点({samplePoint.X:F3},{samplePoint.Y:F3})," + + // $"网格左下角({gridMinX:F3},{gridMinY:F3})," + + // $"网格中心({gridCenterX:F3},{gridCenterY:F3})," + + // $"偏差(ΔX={deltaX:F3}, ΔY={deltaY:F3})"); return false; } } diff --git a/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs b/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs index 8a02349..9f06a63 100644 --- a/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs +++ b/src/UI/WPF/ViewModels/LogisticsControlViewModel.cs @@ -25,19 +25,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels private string _selectedModelsText; private string _instructionText; private string _statusText; - private ObservableCollection _logisticsModels; - private LogisticsModel _selectedLogisticsModel; private string _animationStatus; private double _animationProgress; private ObservableCollection _availableCategories; - private string _selectedCategory; - private double _widthLimit; - private bool _isLogisticsOnlyMode = false; private bool _isProcessing = false; // UI状态管理和命令框架 @@ -94,23 +89,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetProperty(ref _statusText, value); } - /// - /// 物流模型集合 - /// - public ObservableCollection LogisticsModels - { - get => _logisticsModels; - set => SetProperty(ref _logisticsModels, value); - } - - /// - /// 选中的物流模型 - /// - public LogisticsModel SelectedLogisticsModel - { - get => _selectedLogisticsModel; - set => SetProperty(ref _selectedLogisticsModel, value); - } /// /// 路径集合 @@ -154,45 +132,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels set => SetProperty(ref _availableCategories, value); } - /// - /// 选中的类别 - /// - public string SelectedCategory - { - get => _selectedCategory; - set => SetProperty(ref _selectedCategory, value); - } - - /// - /// 宽度限制(米) - /// - public double WidthLimit - { - get => _widthLimit; - set => SetProperty(ref _widthLimit, value); - } - - /// - /// 路径文件状态 - /// - - - /// - /// 是否处于仅显示物流模式 - /// - public bool IsLogisticsOnlyMode - { - get => _isLogisticsOnlyMode; - set - { - if (SetProperty(ref _isLogisticsOnlyMode, value)) - { - // 当开关状态改变时,自动应用可见性设置 - ApplyVisibilityMode(); - } - } - } - /// /// 是否正在处理中(用于统一状态栏进度条显示) /// @@ -366,7 +305,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels public ICommand StopAnimationCommand { get; private set; } public ICommand RunCollisionDetectionCommand { get; private set; } public ICommand ViewCollisionReportCommand { get; private set; } - public ICommand SetLogisticsAttributeCommand { get; private set; } #endregion @@ -394,8 +332,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels } // 初始化线程安全的集合 - LogisticsModels = new ThreadSafeObservableCollection(); - AvailableCategories = new ThreadSafeObservableCollection(); AvailableFrameRates = new ThreadSafeObservableCollection(); // 初始化命令(使用新的Command Pattern框架) @@ -426,14 +362,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels { await UpdateInstructionTextAsync(); await UpdateSelectionDisplayAsync(); - await InitializeCategoriesAsync(); await _uiStateManager.ExecuteUIUpdateAsync(() => { StatusText = "插件已就绪"; AnimationStatus = "动画状态: 就绪"; AnimationProgress = 0; - WidthLimit = 3.0; // 默认宽度限制3米 }); // 初始化动画参数 @@ -459,9 +393,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels // 碰撞检测命令 RunCollisionDetectionCommand = new RelayCommand(async () => await ExecuteRunCollisionDetectionAsync(), () => CanRunCollisionDetection); ViewCollisionReportCommand = new RelayCommand(async () => await ExecuteViewCollisionReportAsync(), () => HasCollisionResults); - - // 物流属性命令 - SetLogisticsAttributeCommand = new RelayCommand(async () => await ExecuteSetLogisticsAttributeAsync()); LogManager.Info("命令初始化完成 - 使用新的异步Command Pattern框架"); }, "初始化命令"); @@ -514,91 +445,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels #region 命令实现 - /// - /// 应用可见性模式 - /// - private void ApplyVisibilityMode() - { - SafeExecute(() => - { - if (IsLogisticsOnlyMode) - { - // 仅显示物流模式 - ShowLogisticsOnlyInternal(); - } - else - { - // 显示全部模式 - ShowAllInternal(); - } - }, "应用可见性模式"); - } - - /// - /// 内部方法:显示所有元素 - /// - private void ShowAllInternal() - { - bool success = VisibilityHelper.ShowAllItems(); - - if (success) - { - // 更新物流模型列表中的可见性状态 - foreach (var model in LogisticsModels) - { - model.IsVisible = true; - } - - StatusText = "显示所有元素"; - LogManager.Info("切换到显示全部模式"); - } - else - { - StatusText = "显示全部失败"; - LogManager.Error("显示全部失败"); - } - } - - /// - /// 内部方法:仅显示物流元素 - /// - private void ShowLogisticsOnlyInternal() - { - var document = NavisApplication.ActiveDocument; - if (document?.Models != null) - { - // 查找所有具有物流属性的元素 - var logisticsItems = FindAllLogisticsModels(); - - if (logisticsItems.Count > 0) - { - // 使用 VisibilityHelper 来隔离显示物流元素 - bool success = VisibilityHelper.IsolateSpecificItems(logisticsItems); - - if (success) - { - // 更新物流模型列表中的可见性状态 - foreach (var model in LogisticsModels) - { - model.IsVisible = true; - } - - StatusText = $"仅显示物流元素 ({logisticsItems.Count} 个物流节点)"; - LogManager.Info($"切换到仅显示物流模式: 找到 {logisticsItems.Count} 个物流节点"); - } - else - { - StatusText = "隔离显示物流元素失败"; - LogManager.Error("隔离显示物流元素失败"); - } - } - else - { - StatusText = "未找到物流元素"; - LogManager.Info("未找到任何物流元素"); - } - } - } /// /// 异步开始动画命令(使用UIStateManager和Command Pattern) @@ -821,113 +667,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels } } - /// - /// 异步设置物流属性命令(使用UIStateManager和Command Pattern) - /// - private async Task ExecuteSetLogisticsAttributeAsync() - { - try - { - // 验证输入 - if (string.IsNullOrEmpty(SelectedCategory)) - { - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - StatusText = "请先选择物流类别"; - }); - return; - } - - var selectedItems = NavisApplication.ActiveDocument?.CurrentSelection?.SelectedItems; - if (selectedItems == null || selectedItems.Count == 0) - { - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - StatusText = "请先选择模型元素"; - }); - return; - } - - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - StatusText = "正在设置物流属性..."; - }); - - // 在后台线程执行属性设置 - var result = await Task.Run(() => - { - if (Enum.TryParse(SelectedCategory, out var elementType)) - { - int successCount = CategoryAttributeManager.AddLogisticsAttributes( - selectedItems, - elementType, - isTraversable: true, - priority: 5, - heightLimit: 3.0, - speedLimit: 10.0, - widthLimit: WidthLimit); - - return new { Success = true, Count = successCount, Category = SelectedCategory, Width = WidthLimit }; - } - - return new { Success = false, Count = 0, Category = SelectedCategory, Width = WidthLimit }; - }); - - // 更新UI结果 - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - if (result.Success) - { - StatusText = $"已为 {result.Count} 个元素设置物流属性: {result.Category} (宽度限制: {result.Width}m)"; - LogManager.Info($"设置物流属性: {result.Category}, 宽度限制: {result.Width}m, 影响元素: {result.Count}"); - } - else - { - StatusText = $"无效的物流类别: {result.Category}"; - LogManager.Warning($"无效的物流类别: {result.Category}"); - } - }); - - // 异步刷新物流模型列表 - await RefreshAllLogisticsModelsAsync(); - - // 如果当前处于仅显示物流模式,重新应用可见性设置 - if (IsLogisticsOnlyMode) - { - await Task.Run(() => - { - ApplyVisibilityMode(); - }); - } - } - catch (Exception ex) - { - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - StatusText = $"设置物流属性出错: {ex.Message}"; - LogManager.Error($"设置物流属性异常: {ex.Message}", ex); - }); - } - } - - #region 自动路径规划命令实现 - - /// - /// 设置自动路径规划的起点(供外部调用) - /// - - - /// - /// 设置自动路径规划的终点(供外部调用) - /// - - - /// - /// 处理自动路径规划的鼠标点击事件(直接从PathClickToolPlugin获取) - /// - - - #endregion #endregion @@ -1038,165 +777,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels }, "更新选择显示"); } - /// - /// 初始化物流类别 - /// - private async Task InitializeCategoriesAsync() - { - await SafeExecuteAsync(async () => - { - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - AvailableCategories.Clear(); - - // 添加所有物流元素类型 - foreach (var elementType in Enum.GetValues(typeof(CategoryAttributeManager.LogisticsElementType))) - { - AvailableCategories.Add(elementType.ToString()); - } - - // 设置默认选择 - if (AvailableCategories.Count > 0) - { - SelectedCategory = AvailableCategories[0]; - } - }); - - LogManager.Info($"已初始化 {AvailableCategories.Count} 个物流类别"); - }, "初始化物流类别"); - } - /// - /// 从模型项获取物流类型 - /// - private string GetLogisticsTypeFromItem(ModelItem item) - { - try - { - // 使用 CategoryAttributeManager 的专用方法获取物流属性值 - return CategoryAttributeManager.GetLogisticsPropertyValue(item, CategoryAttributeManager.LogisticsProperties.TYPE); - } - catch (Exception ex) - { - LogManager.Error($"获取物流类型失败: {ex.Message}"); - return null; - } - } - /// - /// 从模型项获取物流属性描述 - /// - private string GetLogisticsAttributesFromItem(ModelItem item) - { - try - { - var attributes = new System.Text.StringBuilder(); - - // 查找物流属性类别 - foreach (var category in item.PropertyCategories) - { - if (category.DisplayName == CategoryAttributeManager.LogisticsCategories.LOGISTICS) - { - foreach (var property in category.Properties) - { - if (property.DisplayName != CategoryAttributeManager.LogisticsProperties.TYPE) - { - if (attributes.Length > 0) attributes.Append(", "); - attributes.Append($"{property.DisplayName}: {property.Value.ToDisplayString()}"); - } - } - break; - } - } - - return attributes.Length > 0 ? attributes.ToString() : null; - } - catch (Exception ex) - { - LogManager.Error($"获取物流属性失败: {ex.Message}"); - return null; - } - } - - /// - /// 查找所有具有物流属性的模型项 - /// - private ModelItemCollection FindAllLogisticsModels() - { - var logisticsItems = new ModelItemCollection(); - - try - { - var document = NavisApplication.ActiveDocument; - if (document?.Models != null) - { - // 使用Search API查找所有具有物流属性的模型项 - var search = new Search(); - search.Selection.SelectAll(); - - // 查找具有物流属性类别的项目 - search.SearchConditions.Add( - SearchCondition.HasCategoryByDisplayName(CategoryAttributeManager.LogisticsCategories.LOGISTICS) - ); - - logisticsItems = search.FindAll(document, false); - LogManager.Info($"找到 {logisticsItems.Count} 个具有物流属性的模型项"); - } - } - catch (Exception ex) - { - LogManager.Error($"查找物流模型失败: {ex.Message}"); - } - - return logisticsItems; - } - - /// - /// 获取模型中的所有ModelItem - /// - private List GetAllModelItems() - { - var allItems = new List(); - try - { - var document = NavisApplication.ActiveDocument; - if (document?.Models != null) - { - foreach (var model in document.Models) - { - // 从根模型的子项开始收集,以避免包含不可见的根节点 - foreach (var item in model.RootItem.Children) - { - CollectModelItems(item, allItems); - } - } - } - } - catch (Exception ex) - { - LogManager.Error($"获取所有模型项失败: {ex.Message}"); - } - return allItems; - } - - /// - /// 递归收集ModelItem及其所有子项 - /// - private void CollectModelItems(ModelItem item, List collection) - { - if (item == null) return; - - collection.Add(item); - - // 递归添加子项目 - if (item.Children != null && item.Children.Count() > 0) - { - foreach (ModelItem child in item.Children) - { - CollectModelItems(child, collection); - } - } - } #endregion @@ -1220,49 +802,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels Task.Run(async () => await UpdateSelectionDisplayAsync()); } - /// - /// 向后兼容:同步版本的刷新物流模型方法 - /// - [Obsolete("请使用RefreshAllLogisticsModelsAsync方法以获得更好的性能", false)] - public void RefreshAllLogisticsModels() - { - Task.Run(async () => await RefreshAllLogisticsModelsAsync()); - } - /// - /// 异步版本的刷新所有物流模型方法 - /// - public async Task RefreshAllLogisticsModelsAsync() - { - await SafeExecuteAsync(async () => - { - await _uiStateManager.ExecuteUIUpdateAsync(() => - { - LogisticsModels.Clear(); - - // 查找所有具有物流属性的模型项 - var allLogisticsItems = FindAllLogisticsModels(); - - foreach (var item in allLogisticsItems) - { - var logisticsType = GetLogisticsTypeFromItem(item); - var attributes = GetLogisticsAttributesFromItem(item); - - var model = new LogisticsModel - { - Name = item.DisplayName ?? "未命名模型", - Category = logisticsType ?? "未分类", - Attributes = attributes ?? "无属性", - IsVisible = !item.IsHidden, - NavisworksItem = item - }; - LogisticsModels.Add(model); - } - }); - - LogManager.Info($"已刷新所有物流模型列表,共 {LogisticsModels.Count} 个模型"); - }, "刷新所有物流模型列表"); - } /// /// 向后兼容:提供CommandManager访问接口 @@ -1281,7 +821,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels { return _uiStateManager != null && _commandManager != null && - LogisticsModels != null && AvailableCategories != null; } @@ -1291,8 +830,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels public string GetStateInfo() { return $"UIStateManager: {(_uiStateManager != null ? "已初始化" : "未初始化")}, " + - $"CommandManager: {(_commandManager != null ? "已初始化" : "未初始化")}, " + - $"物流模型数量: {LogisticsModels?.Count ?? 0}"; + $"CommandManager: {(_commandManager != null ? "已初始化" : "未初始化")}"; } #endregion diff --git a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs index 6e31f7a..46e62b4 100644 --- a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs +++ b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs @@ -624,19 +624,21 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var logisticsItems = FindAllLogisticsModels(); + // 直接使用 CategoryAttributeManager 的 API + var document = NavisApplication.ActiveDocument; + var logisticsItems = CategoryAttributeManager.GetAllLogisticsItems(document); var models = new List(); foreach (var item in logisticsItems) { - var logisticsType = GetLogisticsTypeFromItem(item); - var attributes = GetLogisticsAttributesFromItem(item); + // 直接使用 CategoryAttributeManager 的 API + var info = CategoryAttributeManager.GetLogisticsAttributeInfo(item); var model = new LogisticsModel { Name = item.DisplayName ?? "未命名模型", - Category = logisticsType ?? "未分类", - Attributes = attributes ?? "无属性", + Category = info?.ElementType ?? "未分类", + Attributes = FormatLogisticsAttributes(info), IsVisible = !item.IsHidden, NavisworksItem = item }; @@ -922,7 +924,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - LogManager.Info("[UI-ModelSettings] 开始仅显示物流元素(优化版)"); + LogManager.Info("[UI-ModelSettings] 开始仅显示物流元素"); var document = NavisApplication.ActiveDocument; if (document == null || document.Models == null) @@ -932,7 +934,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels return; } - // 使用 CategoryAttributeManager 的优化查询方法(Search API) var logisticsItems = CategoryAttributeManager.GetAllLogisticsItems(document); if (logisticsItems == null || logisticsItems.Count == 0) @@ -942,9 +943,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels return; } - LogManager.Info($"[UI-ModelSettings] 使用 Search API 找到 {logisticsItems.Count} 个物流元素"); + LogManager.Info($"[UI-ModelSettings] 找到 {logisticsItems.Count} 个物流元素"); - // 使用 VisibilityManager 的优化隔离显示方法(带缓存,4-148ms) bool success = VisibilityHelper.IsolateSpecificItems(logisticsItems); if (success) @@ -955,7 +955,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels model.IsVisible = true; } - LogManager.Info($"[UI-ModelSettings] 成功隔离显示物流元素:显示 {logisticsItems.Count} 个核心项"); + LogManager.Info($"[UI-ModelSettings] 成功隔离显示物流元素"); UpdateMainStatus($"仅显示物流元素 ({logisticsItems.Count} 个物流节点)"); } else @@ -971,225 +971,19 @@ namespace NavisworksTransport.UI.WPF.ViewModels } } - /// - /// 查找所有具有物流属性的模型项 - /// - private ModelItemCollection FindAllLogisticsModels() - { - var logisticsItems = new ModelItemCollection(); - - try - { - var document = NavisApplication.ActiveDocument; - if (document?.Models != null) - { - var search = new Search(); - search.Selection.SelectAll(); - - search.SearchConditions.Add( - SearchCondition.HasCategoryByDisplayName(CategoryAttributeManager.LogisticsCategories.LOGISTICS) - ); - - logisticsItems = search.FindAll(document, false); - LogManager.Info($"找到 {logisticsItems.Count} 个具有物流属性的模型项"); - } - } - catch (Exception ex) - { - LogManager.Error($"查找物流模型失败: {ex.Message}"); - } - - return logisticsItems; - } /// - /// 从模型项获取物流类型 + /// 格式化物流属性为显示字符串 /// - private string GetLogisticsTypeFromItem(ModelItem item) + private string FormatLogisticsAttributes(LogisticsAttributeInfo info) { - try - { - // 防御性检查:确保item和其属性集合不为null - if (item?.PropertyCategories == null) - { - return null; - } - - foreach (var category in item.PropertyCategories) - { - // 防御性检查:跳过无效或损坏的属性类别 - if (category == null) - { - continue; - } - - try - { - // 检查类别显示名称,捕获"幽灵"属性异常 - if (category.DisplayName == CategoryAttributeManager.LogisticsCategories.LOGISTICS) - { - // 防御性检查:确保Properties集合存在 - if (category.Properties == null) - { - continue; - } - - foreach (var property in category.Properties) - { - // 防御性检查:跳过无效属性 - if (property == null) - { - continue; - } - - try - { - if (property.DisplayName == CategoryAttributeManager.LogisticsProperties.TYPE) - { - return property.Value.ToDisplayString(); - } - } - catch (Exception propEx) - { - // 捕获单个属性读取异常,继续处理其他属性 - LogManager.Warning($"读取物流属性失败,跳过: {propEx.Message}"); - } - } - } - } - catch (Exception catEx) - { - // 捕获单个类别处理异常(如"幽灵"属性错误),继续处理其他类别 - LogManager.Warning($"处理属性类别时发生异常,跳过: {catEx.Message}"); - } - } - } - catch (Exception ex) - { - LogManager.Error($"获取物流类型失败: {ex.Message}"); - } + if (info == null) return "无属性"; - return null; - } - - /// - /// 从模型项获取物流属性描述 - /// - private string GetLogisticsAttributesFromItem(ModelItem item) - { - try - { - // 防御性检查:确保item和其属性集合不为null - if (item?.PropertyCategories == null) - { - return null; - } - - var attributes = new System.Text.StringBuilder(); - - foreach (var category in item.PropertyCategories) - { - // 防御性检查:跳过无效或损坏的属性类别 - if (category == null) - { - continue; - } - - try - { - // 检查类别显示名称,捕获"幽灵"属性异常 - if (category.DisplayName == CategoryAttributeManager.LogisticsCategories.LOGISTICS) - { - // 防御性检查:确保Properties集合存在 - if (category.Properties == null) - { - break; - } - - foreach (var property in category.Properties) - { - // 防御性检查:跳过无效属性 - if (property == null) - { - continue; - } - - try - { - if (property.DisplayName != CategoryAttributeManager.LogisticsProperties.TYPE) - { - if (attributes.Length > 0) attributes.Append(", "); - attributes.Append($"{property.DisplayName}: {property.Value.ToDisplayString()}"); - } - } - catch (Exception propEx) - { - // 捕获单个属性读取异常,继续处理其他属性 - LogManager.Warning($"读取物流属性详情失败,跳过: {propEx.Message}"); - } - } - break; - } - } - catch (Exception catEx) - { - // 捕获单个类别处理异常(如"幽灵"属性错误),继续处理其他类别 - LogManager.Warning($"处理属性类别详情时发生异常,跳过: {catEx.Message}"); - } - } - - return attributes.Length > 0 ? attributes.ToString() : null; - } - catch (Exception ex) - { - LogManager.Error($"获取物流属性失败: {ex.Message}"); - return null; - } - } - - /// - /// 获取模型中的所有ModelItem - /// - private List GetAllModelItems() - { - var allItems = new List(); - try - { - var document = NavisApplication.ActiveDocument; - if (document?.Models != null) - { - foreach (var model in document.Models) - { - foreach (var item in model.RootItem.Children) - { - CollectModelItems(item, allItems); - } - } - } - } - catch (Exception ex) - { - LogManager.Error($"获取所有模型项失败: {ex.Message}"); - } - return allItems; - } - - /// - /// 递归收集ModelItem及其所有子项 - /// - private void CollectModelItems(ModelItem item, List collection) - { - if (item == null) return; - - collection.Add(item); - - if (item.Children != null && item.Children.Count() > 0) - { - foreach (ModelItem child in item.Children) - { - CollectModelItems(child, collection); - } - } + // 简单格式化:可通行、优先级、限制等 + return $"可通行: {(info.IsTraversable ? "是" : "否")}, " + + $"优先级: {info.Priority}, " + + $"高度限制: {info.HeightLimit}m, " + + $"速度限制: {info.SpeedLimit}km/h"; } private void RefreshAllCommands()