diff --git a/NavisworksTransportPlugin.csproj b/NavisworksTransportPlugin.csproj index 795647e..1eb33ea 100644 --- a/NavisworksTransportPlugin.csproj +++ b/NavisworksTransportPlugin.csproj @@ -162,11 +162,6 @@ - - - UserControl - - LogisticsControlPanel.xaml @@ -208,7 +203,6 @@ - @@ -218,9 +212,6 @@ - - - @@ -257,9 +248,6 @@ - - - diff --git a/doc/design/2026/NavisworksAPI使用方法.md b/doc/design/2026/NavisworksAPI使用方法.md index d767f41..fded3bb 100644 --- a/doc/design/2026/NavisworksAPI使用方法.md +++ b/doc/design/2026/NavisworksAPI使用方法.md @@ -1774,3 +1774,56 @@ public class PathClickToolPlugin : ToolPlugin } } ``` + +### 只显示选中项 + +```csharp +Examples +CopyHide the unselected ModelItems +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Windows.Forms; + +using System.Text; + +using Autodesk.Navisworks.Api.Controls; + + static public void HideUnselected() + { + //Create hidden collection + ModelItemCollection hidden = new ModelItemCollection(); + + //create a store for the visible items + ModelItemCollection visible = new ModelItemCollection(); + + //Add all the items that are visible to the visible collection + foreach (ModelItem item in Autodesk.Navisworks.Api.Application.ActiveDocument.CurrentSelection.SelectedItems) + { + if (item.AncestorsAndSelf != null) + visible.AddRange(item.AncestorsAndSelf); + if (item.Descendants != null) + visible.AddRange(item.Descendants); + } + + //mark as invisible all the siblings of the visible items as well as the visible items + foreach (ModelItem toShow in visible) + { + if (toShow.Parent != null) + { + hidden.AddRange(toShow.Parent.Children); + } + } + + //remove the visible items from the collection + foreach (ModelItem toShow in visible) + { + hidden.Remove(toShow); + } + + //hide the remaining items + Autodesk.Navisworks.Api.Application.ActiveDocument.Models. + SetHidden(hidden, true); + } +``` \ No newline at end of file diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs index e87dfa5..46b9420 100644 --- a/src/Core/Collision/ClashDetectiveIntegration.cs +++ b/src/Core/Collision/ClashDetectiveIntegration.cs @@ -16,9 +16,7 @@ namespace NavisworksTransport { private static ClashDetectiveIntegration _instance; private DocumentClash _documentClash; - private ClashTest _dynamicClashTest; private List _currentCollisions; - private bool _isInitialized = false; // 通道对象缓存,用于优化碰撞检测性能 private static HashSet _channelObjectsCache = null; private static readonly object _cacheLock = new object(); @@ -94,19 +92,16 @@ namespace NavisworksTransport if (_documentClash != null) { LogManager.Info("成功获取.NET API Clash文档"); - _isInitialized = true; LogManager.Info("Clash Detective集成初始化成功(.NET API模式)"); } else { LogManager.Warning("无法获取Clash文档,Clash Detective可能未安装"); - _isInitialized = false; } } catch (Exception ex) { LogManager.Error($"初始化Clash Detective集成失败: {ex.Message}"); - _isInitialized = false; } } @@ -1675,11 +1670,8 @@ namespace NavisworksTransport } // 清理.NET API引用 - _dynamicClashTest = null; _documentClash = null; - _isInitialized = false; - LogManager.Info("Clash Detective集成资源清理完成"); } catch (Exception ex) diff --git a/src/Core/FloorAttributeManager.cs b/src/Core/FloorAttributeManager.cs index 1d1e43d..de36249 100644 --- a/src/Core/FloorAttributeManager.cs +++ b/src/Core/FloorAttributeManager.cs @@ -188,84 +188,96 @@ namespace NavisworksTransport.Core + /// - /// 直接获取对象的楼层属性 + /// 获取楼层属性值(使用 Native API,性能最优) /// - /// 目标模型项 - /// 楼层标识,未找到返回null - public string GetFloorLevel(ModelItem item) + /// 模型项 + /// 属性显示名称,如 "楼层"、"区域"、"子系统" + /// 属性值,不存在返回 null + public string GetFloorProperty(ModelItem item, string propertyName) { if (item == null) return null; - + try { - return ExecuteWithUIThread(() => + foreach (PropertyCategory category in item.PropertyCategories) { - return NavisworksComPropertyManager.GetFloorPropertyValue( - item, - FLOOR_CATEGORY, - FLOOR_LEVEL_PROPERTY); - }); + if (category.DisplayName == FLOOR_CATEGORY) + { + foreach (DataProperty property in category.Properties) + { + if (property.DisplayName == propertyName) + { + return property.Value.ToDisplayString(); + } + } + } + } } catch (Exception ex) { - LogManager.Error($"[FloorAttributeManager] 直接获取楼层属性失败:{ex.Message}"); - return null; + LogManager.Debug($"[FloorAttributeManager] 获取楼层属性 '{propertyName}' 失败: {ex.Message}"); } + return null; } /// - /// 直接获取对象的区域属性 + /// 检查模型项是否有楼层属性(性能优化版本) /// - /// 目标模型项 - /// 区域属性值,未找到返回null - public string GetZoneAttribute(ModelItem item) + public bool HasFloorAttributes(ModelItem item) { - if (item == null) return null; - + if (item == null) return false; + try { - return ExecuteWithUIThread(() => + foreach (PropertyCategory category in item.PropertyCategories) { - return NavisworksComPropertyManager.GetFloorPropertyValue( - item, - FLOOR_CATEGORY, - ZONE_PROPERTY); - }); - } - catch (Exception ex) - { - LogManager.Error($"[FloorAttributeManager] 直接获取区域属性失败:{ex.Message}"); - return null; + if (category.DisplayName == FLOOR_CATEGORY) + return true; + } } + catch { } + return false; } /// - /// 直接获取对象的子系统属性 + /// 通过 COM API 获取楼层属性值(特殊场景使用) + /// 仅在以下情况使用: + /// 1. 刚通过 COM API 更新属性后需要立即读取 + /// 2. 遇到 Native API 缓存不同步问题时 + /// 注意:性能较差,需要 UI 线程同步 /// - /// 目标模型项 - /// 子系统属性值,未找到返回null - public string GetSubSystemAttribute(ModelItem item) + public string GetFloorPropertyViaCom(ModelItem item, string propertyName) { if (item == null) return null; + + // 将显示名称转换为内部名称 + string internalName = ConvertToInternalName(propertyName); + + return ExecuteWithUIThread(() => + { + return NavisworksComPropertyManager.GetFloorPropertyValue( + item, FLOOR_CATEGORY, internalName); + }); + } - try + /// + /// 将显示名称转换为内部名称 + /// + private string ConvertToInternalName(string displayName) + { + switch (displayName) { - return ExecuteWithUIThread(() => - { - return NavisworksComPropertyManager.GetFloorPropertyValue( - item, - FLOOR_CATEGORY, - SUBSYSTEM_PROPERTY); - }); - } - catch (Exception ex) - { - LogManager.Error($"[FloorAttributeManager] 直接获取子系统属性失败:{ex.Message}"); - return null; + case "楼层": return FLOOR_LEVEL_PROPERTY; + case "区域": return ZONE_PROPERTY; + case "子系统": return SUBSYSTEM_PROPERTY; + default: return displayName + "_Internal"; } } + + /// /// 批量设置楼层属性 /// @@ -330,7 +342,7 @@ namespace NavisworksTransport.Core { try { - string floorLevel = GetFloorLevel(item); + string floorLevel = GetFloorProperty(item, "楼层"); if (!string.IsNullOrEmpty(floorLevel)) { if (!floorGroups.ContainsKey(floorLevel)) diff --git a/src/Core/ModelSplitterManager.cs b/src/Core/ModelSplitterManager.cs index 5ff4368..68ebfdd 100644 --- a/src/Core/ModelSplitterManager.cs +++ b/src/Core/ModelSplitterManager.cs @@ -308,7 +308,7 @@ namespace NavisworksTransport protected override string GetAttributeValue(ModelItem item) { - return _floorManager.GetFloorLevel(item); + return _floorManager.GetFloorProperty(item, "楼层"); } } @@ -322,7 +322,7 @@ namespace NavisworksTransport protected override string GetAttributeValue(ModelItem item) { - return _floorManager.GetZoneAttribute(item); + return _floorManager.GetFloorProperty(item, "区域"); } } @@ -336,7 +336,7 @@ namespace NavisworksTransport protected override string GetAttributeValue(ModelItem item) { - return _floorManager.GetSubSystemAttribute(item); + return _floorManager.GetFloorProperty(item, "子系统"); } } @@ -467,7 +467,7 @@ namespace NavisworksTransport // 1. 检查线程模型 - 必须在STA线程中 var apartmentState = System.Threading.Thread.CurrentThread.GetApartmentState(); - LogManager.Info($"[SimplifiedModelSplitter] 当前线程状态: {apartmentState}"); + LogManager.Info($"[分层管理器] 当前线程状态: {apartmentState}"); if (apartmentState != System.Threading.ApartmentState.STA) { LogManager.Warning("[SimplifiedModelSplitter] 警告:当前不在STA线程中,这可能导致API调用失败"); @@ -483,7 +483,7 @@ namespace NavisworksTransport } catch (Exception apiEx) { - LogManager.Error($"[SimplifiedModelSplitter] Navisworks API不可用: {apiEx.Message}"); + LogManager.Error($"[分层管理器] Navisworks API不可用: {apiEx.Message}"); LogManager.Error("[SimplifiedModelSplitter] 解决方案:确保在Navisworks环境中运行此插件"); } @@ -493,8 +493,8 @@ namespace NavisworksTransport var document = NavisApplication.ActiveDocument; if (document != null) { - LogManager.Info($"[SimplifiedModelSplitter] 活动文档: {document.FileName ?? "未命名"}"); - LogManager.Info($"[SimplifiedModelSplitter] 文档模型数量: {document.Models?.Count ?? 0}"); + LogManager.Info($"[分层管理器] 活动文档: {document.FileName ?? "未命名"}"); + LogManager.Info($"[分层管理器] 文档模型数量: {document.Models?.Count ?? 0}"); } else { @@ -503,18 +503,18 @@ namespace NavisworksTransport } catch (Exception docEx) { - LogManager.Warning($"[SimplifiedModelSplitter] 检查文档状态时出错: {docEx.Message}"); + LogManager.Warning($"[分层管理器] 检查文档状态时出错: {docEx.Message}"); } // 4. 内存状态检查 long memoryMB = GC.GetTotalMemory(false) / 1024 / 1024; - LogManager.Info($"[SimplifiedModelSplitter] 当前内存使用: {memoryMB} MB"); + LogManager.Info($"[分层管理器] 当前内存使用: {memoryMB} MB"); LogManager.Info("[SimplifiedModelSplitter] Navisworks运行时环境验证完成"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 运行时环境验证失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 运行时环境验证失败: {ex.Message}"); } } @@ -541,7 +541,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始智能遍历分层预览,策略: {config.Strategy},深度限制: {config.MaxDepth}"); + LogManager.Info($"[分层管理器] 开始智能遍历分层预览,策略: {config.Strategy},深度限制: {config.MaxDepth}"); // 步骤1:初始化和缓存检查 (0-10%) OnStatusChanged("正在初始化智能分层预览..."); @@ -549,7 +549,7 @@ namespace NavisworksTransport // 生成缓存键(注意:智能遍历的缓存键需要区别于原有方式) string cacheKey = GenerateSmartTraversalCacheKey(config); - LogManager.Info($"[SimplifiedModelSplitter] 生成智能遍历缓存键: {cacheKey}"); + LogManager.Info($"[分层管理器] 生成智能遍历缓存键: {cacheKey}"); OnProgressChanged(new ProgressChangedEventArgs(5, "检查缓存")); @@ -557,7 +557,7 @@ namespace NavisworksTransport List cachedResults = GetFromCache(config.Strategy, cacheKey); if (cachedResults != null && cachedResults.Count > 0) { - LogManager.Info($"[SimplifiedModelSplitter] 使用缓存结果,共 {cachedResults.Count} 个分层"); + LogManager.Info($"[分层管理器] 使用缓存结果,共 {cachedResults.Count} 个分层"); OnStatusChanged($"使用缓存结果,识别到 {cachedResults.Count} 个分层"); OnProgressChanged(new ProgressChangedEventArgs(100, $"从缓存加载 {cachedResults.Count} 个分层")); return cachedResults; @@ -574,7 +574,7 @@ namespace NavisworksTransport } OnProgressChanged(new ProgressChangedEventArgs(15, $"文档验证完成,包含 {document.Models.Count} 个模型")); - LogManager.Info($"[SimplifiedModelSplitter] 文档验证完成,包含 {document.Models.Count} 个模型"); + LogManager.Info($"[分层管理器] 文档验证完成,包含 {document.Models.Count} 个模型"); // 步骤3:执行智能遍历分层分析 (15-90%) OnStatusChanged($"正在执行{GetStrategyDisplayName(config.Strategy)}..."); @@ -584,7 +584,7 @@ namespace NavisworksTransport var strategy = CreateStrategy(config.Strategy); // 关键改变:直接使用智能遍历,不再预收集所有节点 - LogManager.Info($"[SimplifiedModelSplitter] 使用智能遍历算法,策略: {strategy.GroupTypeName}"); + LogManager.Info($"[分层管理器] 使用智能遍历算法,策略: {strategy.GroupTypeName}"); previewResults = PreviewSplitWithSmartTraversal(config, strategy); OnProgressChanged(new ProgressChangedEventArgs(90, $"智能分析完成,识别到 {previewResults.Count} 个分层")); @@ -600,13 +600,13 @@ namespace NavisworksTransport OnStatusChanged($"智能预览完成,识别到 {previewResults.Count} 个分层"); OnProgressChanged(new ProgressChangedEventArgs(100, $"预览完成,共 {previewResults.Count} 个分层")); - LogManager.Info($"[SimplifiedModelSplitter] 智能遍历预览完成,共识别 {previewResults.Count} 个分层(深度: {config.MaxDepth}级),已缓存"); + LogManager.Info($"[分层管理器] 智能遍历预览完成,共识别 {previewResults.Count} 个分层(深度: {config.MaxDepth}级),已缓存"); return previewResults; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 智能遍历预览失败: {ex.Message}", ex); + LogManager.Error($"[分层管理器] 智能遍历预览失败: {ex.Message}", ex); OnStatusChanged($"预览失败: {ex.Message}"); OnProgressChanged(new ProgressChangedEventArgs(0, $"预览失败: {ex.Message}")); throw; @@ -675,7 +675,7 @@ namespace NavisworksTransport // 只支持楼层缓存和自定义楼层缓存 var cache = _floorCache; cache[cacheKey] = results; - LogManager.Info($"[SimplifiedModelSplitter] 结果已缓存: {strategy}, 键: {cacheKey}, 数量: {results.Count}"); + LogManager.Info($"[分层管理器] 结果已缓存: {strategy}, 键: {cacheKey}, 数量: {results.Count}"); } } @@ -686,7 +686,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始执行分层,策略: {config.Strategy}"); + LogManager.Info($"[分层管理器] 开始执行分层,策略: {config.Strategy}"); OnStatusChanged("正在准备分层..."); // 优先从缓存获取分层结果,避免重复检测 @@ -695,7 +695,7 @@ namespace NavisworksTransport if (previewResults == null || previewResults.Count == 0) { - LogManager.Info($"[SimplifiedModelSplitter] 缓存中没有结果,重新预览分层"); + LogManager.Info($"[分层管理器] 缓存中没有结果,重新预览分层"); previewResults = PreviewSplit(config); if (previewResults.Count == 0) { @@ -704,7 +704,7 @@ namespace NavisworksTransport } else { - LogManager.Info($"[SimplifiedModelSplitter] 使用缓存的分层结果,共 {previewResults.Count} 个分层"); + LogManager.Info($"[分层管理器] 使用缓存的分层结果,共 {previewResults.Count} 个分层"); } // 过滤出需要保存的分层 @@ -716,7 +716,7 @@ namespace NavisworksTransport return; } - LogManager.Info($"[SimplifiedModelSplitter] 将保存 {layersToSave.Count}/{previewResults.Count} 个选中的分层"); + LogManager.Info($"[分层管理器] 将保存 {layersToSave.Count}/{previewResults.Count} 个选中的分层"); // 确保输出目录存在 EnsureOutputDirectory(config.OutputDirectory); @@ -729,7 +729,7 @@ namespace NavisworksTransport { if (cancellationToken.IsCancellationRequested) { - LogManager.Info($"[SimplifiedModelSplitter] 用户取消分层操作,已处理 {successCount}/{layersToSave.Count} 个分层"); + LogManager.Info($"[分层管理器] 用户取消分层操作,已处理 {successCount}/{layersToSave.Count} 个分层"); break; } @@ -743,12 +743,12 @@ namespace NavisworksTransport // 实现具体的分层保存逻辑 await ProcessSingleLayerAsync(preview, config, cancellationToken); successCount++; - LogManager.Info($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 处理成功 ({successCount}/{layersToSave.Count})"); + LogManager.Info($"[分层管理器] 分层 {preview.LayerName} 处理成功 ({successCount}/{layersToSave.Count})"); } catch (Exception layerEx) { string errorMsg = $"分层 {preview.LayerName} 处理失败: {layerEx.Message}"; - LogManager.Error($"[SimplifiedModelSplitter] {errorMsg}"); + LogManager.Error($"[分层管理器] {errorMsg}"); failedLayers.Add(preview.LayerName); // 继续处理其他分层,不因单个失败而中断整个进程 @@ -766,11 +766,11 @@ namespace NavisworksTransport if (failedLayers.Count > 0) { finalMessage += $"\n失败列表: {string.Join(", ", failedLayers)}"; - LogManager.Warning($"[SimplifiedModelSplitter] {finalMessage}"); + LogManager.Warning($"[分层管理器] {finalMessage}"); } else { - LogManager.Info($"[SimplifiedModelSplitter] {finalMessage}"); + LogManager.Info($"[分层管理器] {finalMessage}"); } OnStatusChanged(finalMessage); @@ -781,11 +781,11 @@ namespace NavisworksTransport throw new InvalidOperationException($"所有选中的分层处理都失败了,共 {layersToSave.Count} 个分层"); } - LogManager.Info($"[SimplifiedModelSplitter] 分层执行完成:成功 {successCount}/{layersToSave.Count}"); + LogManager.Info($"[分层管理器] 分层执行完成:成功 {successCount}/{layersToSave.Count}"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 分层执行失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 分层执行失败: {ex.Message}"); OnStatusChanged($"分层失败: {ex.Message}"); throw; } @@ -798,7 +798,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始执行分层,策略: {config.Strategy}"); + LogManager.Info($"[分层管理器] 开始执行分层,策略: {config.Strategy}"); OnStatusChanged("正在准备分层..."); // 优先从缓存获取分层结果,避免重复检测 @@ -807,7 +807,7 @@ namespace NavisworksTransport if (previewResults == null || previewResults.Count == 0) { - LogManager.Info($"[SimplifiedModelSplitter] 缓存中没有结果,重新预览分层"); + LogManager.Info($"[分层管理器] 缓存中没有结果,重新预览分层"); previewResults = PreviewSplit(config); if (previewResults.Count == 0) { @@ -816,7 +816,7 @@ namespace NavisworksTransport } else { - LogManager.Info($"[SimplifiedModelSplitter] 使用缓存的分层结果,共 {previewResults.Count} 个分层"); + LogManager.Info($"[分层管理器] 使用缓存的分层结果,共 {previewResults.Count} 个分层"); } // 过滤出需要保存的分层 @@ -828,7 +828,7 @@ namespace NavisworksTransport return; } - LogManager.Info($"[SimplifiedModelSplitter] 将保存 {layersToSave.Count}/{previewResults.Count} 个选中的分层"); + LogManager.Info($"[分层管理器] 将保存 {layersToSave.Count}/{previewResults.Count} 个选中的分层"); // 确保输出目录存在 EnsureOutputDirectory(config.OutputDirectory); @@ -849,12 +849,12 @@ namespace NavisworksTransport // 同步处理单个分层 ProcessSingleLayer(preview, config); successCount++; - LogManager.Info($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 处理成功 ({successCount}/{layersToSave.Count})"); + LogManager.Info($"[分层管理器] 分层 {preview.LayerName} 处理成功 ({successCount}/{layersToSave.Count})"); } catch (Exception layerEx) { string errorMsg = $"分层 {preview.LayerName} 处理失败: {layerEx.Message}"; - LogManager.Error($"[SimplifiedModelSplitter] {errorMsg}"); + LogManager.Error($"[分层管理器] {errorMsg}"); failedLayers.Add(preview.LayerName); // 继续处理其他分层,不因单个失败而中断整个进程 @@ -872,11 +872,11 @@ namespace NavisworksTransport if (failedLayers.Count > 0) { finalMessage += $"\n失败列表: {string.Join(", ", failedLayers)}"; - LogManager.Warning($"[SimplifiedModelSplitter] {finalMessage}"); + LogManager.Warning($"[分层管理器] {finalMessage}"); } else { - LogManager.Info($"[SimplifiedModelSplitter] {finalMessage}"); + LogManager.Info($"[分层管理器] {finalMessage}"); } OnStatusChanged(finalMessage); @@ -887,11 +887,11 @@ namespace NavisworksTransport throw new InvalidOperationException($"所有选中的分层处理都失败了,共 {layersToSave.Count} 个分层"); } - LogManager.Info($"[SimplifiedModelSplitter] 分层执行完成:成功 {successCount}/{layersToSave.Count}"); + LogManager.Info($"[分层管理器] 分层执行完成:成功 {successCount}/{layersToSave.Count}"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 分层执行失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 分层执行失败: {ex.Message}"); OnStatusChanged($"分层失败: {ex.Message}"); throw; } @@ -910,7 +910,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] ===== GetItemsByDepthUnified开始 ===== maxDepth={maxDepth}"); + LogManager.Info($"[分层管理器] ===== GetItemsByDepthUnified开始 ===== maxDepth={maxDepth}"); var document = NavisApplication.ActiveDocument; if (document?.Models?.Count == 0) @@ -925,7 +925,7 @@ namespace NavisworksTransport { // 深度为0表示包含所有级别 result.AddRange(document.Models.RootItemDescendantsAndSelf); - LogManager.Info($"[SimplifiedModelSplitter] maxDepth=0,返回所有级别的项,共{result.Count}个"); + LogManager.Info($"[分层管理器] maxDepth=0,返回所有级别的项,共{result.Count}个"); return result; } @@ -948,12 +948,12 @@ namespace NavisworksTransport } } - LogManager.Info($"[SimplifiedModelSplitter] ===== GetItemsByDepthUnified完成 ===== 返回{result.Count}个模型项(深度:{maxDepth}级)"); + LogManager.Info($"[分层管理器] ===== GetItemsByDepthUnified完成 ===== 返回{result.Count}个模型项(深度:{maxDepth}级)"); return result; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] GetItemsByDepthUnified异常: {ex.Message}"); + LogManager.Error($"[分层管理器] GetItemsByDepthUnified异常: {ex.Message}"); return new ModelItemCollection(); } } @@ -1004,7 +1004,7 @@ namespace NavisworksTransport OnProgressChanged(new ProgressChangedEventArgs(40, $"正在分析 {items.Count} 个模型元素的{strategy.GroupTypeName}信息")); var groups = strategy.GroupItems(items, config); - LogManager.Info($"[SimplifiedModelSplitter] {strategy.GroupTypeName}属性检测完成,发现 {groups?.Count ?? 0} 个{strategy.GroupTypeName}分组"); + LogManager.Info($"[分层管理器] {strategy.GroupTypeName}属性检测完成,发现 {groups?.Count ?? 0} 个{strategy.GroupTypeName}分组"); OnProgressChanged(new ProgressChangedEventArgs(70, $"{strategy.GroupTypeName}分组完成,发现 {groups?.Count ?? 0} 个{strategy.GroupTypeName}")); @@ -1027,11 +1027,11 @@ namespace NavisworksTransport if (group.Items != null && group.Items.Count > 0) { previewResult.Items.AddRange(group.Items); - LogManager.Info($"[SimplifiedModelSplitter] {strategy.GroupTypeName}预览结果已缓存模型项: {strategy.GroupTypeName}='{previewResult.LayerName}', 模型项数量={previewResult.Items.Count}"); + LogManager.Info($"[分层管理器] {strategy.GroupTypeName}预览结果已缓存模型项: {strategy.GroupTypeName}='{previewResult.LayerName}', 模型项数量={previewResult.Items.Count}"); } else { - LogManager.Warning($"[SimplifiedModelSplitter] {strategy.GroupTypeName}预览结果没有模型项: {strategy.GroupTypeName}='{previewResult.LayerName}'"); + LogManager.Warning($"[分层管理器] {strategy.GroupTypeName}预览结果没有模型项: {strategy.GroupTypeName}='{previewResult.LayerName}'"); } // 添加元数据 @@ -1059,12 +1059,12 @@ namespace NavisworksTransport else { OnProgressChanged(new ProgressChangedEventArgs(85, $"未检测到{strategy.GroupTypeName}信息")); - LogManager.Warning($"[SimplifiedModelSplitter] 未检测到任何{strategy.GroupTypeName}信息"); + LogManager.Warning($"[分层管理器] 未检测到任何{strategy.GroupTypeName}信息"); } } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 按{strategy.GroupTypeName}属性预览失败: {ex.Message}", ex); + LogManager.Error($"[分层管理器] 按{strategy.GroupTypeName}属性预览失败: {ex.Message}", ex); OnProgressChanged(new ProgressChangedEventArgs(35, $"{strategy.GroupTypeName}分析失败: {ex.Message}")); throw; } @@ -1082,8 +1082,8 @@ namespace NavisworksTransport try { - LogManager.Info($"[SimplifiedModelSplitter] ========== 开始智能遍历分层预览 =========="); - LogManager.Info($"[SimplifiedModelSplitter] 策略: {strategy.GroupTypeName}, 深度限制: {config.MaxDepth}"); + LogManager.Info($"[分层管理器] ========== 开始智能遍历分层预览 =========="); + LogManager.Info($"[分层管理器] 策略: {strategy.GroupTypeName}, 深度限制: {config.MaxDepth}"); var document = NavisApplication.ActiveDocument; if (document?.Models?.Count == 0) @@ -1106,18 +1106,18 @@ namespace NavisworksTransport // 每处理10个顶级节点记录一次进度 if (processedTopNodes % 10 == 0) { - LogManager.Info($"[SimplifiedModelSplitter] 已处理 {processedTopNodes} 个顶级节点,找到 {results.Count} 个分层"); + LogManager.Info($"[分层管理器] 已处理 {processedTopNodes} 个顶级节点,找到 {results.Count} 个分层"); } } } } - LogManager.Info($"[SimplifiedModelSplitter] ========== 智能遍历完成 =========="); - LogManager.Info($"[SimplifiedModelSplitter] 处理了 {processedTopNodes} 个顶级节点,识别到 {results.Count} 个{strategy.GroupTypeName}分层"); + LogManager.Info($"[分层管理器] ========== 智能遍历完成 =========="); + LogManager.Info($"[分层管理器] 处理了 {processedTopNodes} 个顶级节点,识别到 {results.Count} 个{strategy.GroupTypeName}分层"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 智能遍历失败: {ex.Message}", ex); + LogManager.Error($"[分层管理器] 智能遍历失败: {ex.Message}", ex); throw; } @@ -1143,14 +1143,14 @@ namespace NavisworksTransport { var (attributeName, attributeValue) = floorStrategy.ExtractAttributeInfo(node); detectedAttributeName = attributeName; - LogManager.Info($"[SimplifiedModelSplitter] 智能检测到属性类型: '{attributeName}', 值: '{attributeValue}'"); + LogManager.Info($"[分层管理器] 智能检测到属性类型: '{attributeName}', 值: '{attributeValue}'"); } // 创建轻量化预览结果,停止该分支遍历 var layerResult = CreateLayerResult(layerValue, node, strategy.GroupTypeName, config.Strategy, detectedAttributeName); results.Add(layerResult); - LogManager.Info($"[SimplifiedModelSplitter] 找到{strategy.GroupTypeName}分层: '{layerValue}' 于节点 '{node.DisplayName}' (深度{currentDepth})"); + LogManager.Info($"[分层管理器] 找到{strategy.GroupTypeName}分层: '{layerValue}' 于节点 '{node.DisplayName}' (深度{currentDepth})"); return; // 关键:停止遍历该分支 } @@ -1165,7 +1165,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 遍历节点失败: {node?.DisplayName ?? "null"}, 错误: {ex.Message}"); + LogManager.Warning($"[分层管理器] 遍历节点失败: {node?.DisplayName ?? "null"}, 错误: {ex.Message}"); } } @@ -1207,7 +1207,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始处理分层: {preview.LayerName}, 类型: {preview.LayerAttribute}"); + LogManager.Info($"[分层管理器] 开始处理分层: {preview.LayerName}, 类型: {preview.LayerAttribute}"); // 检查取消请求 cancellationToken.ThrowIfCancellationRequested(); @@ -1216,24 +1216,24 @@ namespace NavisworksTransport string fileName = GenerateFileName(preview.LayerName, config.Strategy, config); string outputPath = Path.Combine(config.OutputDirectory, fileName); - LogManager.Info($"[SimplifiedModelSplitter] 分层文件路径: {outputPath}"); + LogManager.Info($"[分层管理器] 分层文件路径: {outputPath}"); // 直接在UI线程调用,不使用Task.Run包装 bool success = ExportLayerToNwd(preview, outputPath, config); if (success) { - LogManager.Info($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 导出成功: {outputPath}"); + LogManager.Info($"[分层管理器] 分层 {preview.LayerName} 导出成功: {outputPath}"); } else { - LogManager.Error($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 导出失败"); + LogManager.Error($"[分层管理器] 分层 {preview.LayerName} 导出失败"); throw new InvalidOperationException($"分层 {preview.LayerName} 导出失败"); } } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 处理分层失败 {preview.LayerName}: {ex.Message}"); + LogManager.Error($"[分层管理器] 处理分层失败 {preview.LayerName}: {ex.Message}"); throw; } } @@ -1245,11 +1245,11 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始同步处理分层: {preview.LayerName}, 类型: {preview.LayerAttribute}"); + LogManager.Info($"[分层管理器] 开始同步处理分层: {preview.LayerName}, 类型: {preview.LayerAttribute}"); if (preview.Items == null || preview.Items.Count == 0) { - LogManager.Warning($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 没有包含模型元素,跳过导出"); + LogManager.Warning($"[分层管理器] 分层 {preview.LayerName} 没有包含模型元素,跳过导出"); return; } @@ -1257,19 +1257,19 @@ namespace NavisworksTransport string fileName = GenerateFileName(preview.LayerName, config.Strategy, config); string outputPath = Path.Combine(config.OutputDirectory, fileName); - LogManager.Info($"[SimplifiedModelSplitter] 分层文件路径: {outputPath}"); + LogManager.Info($"[分层管理器] 分层文件路径: {outputPath}"); // 检查模型项数量,对大量模型项进行特殊处理 if (preview.Items != null && preview.Items.Count > 100) { - LogManager.Warning($"[SimplifiedModelSplitter] 大量模型项检测:{preview.Items.Count}个,可能需要更多内存和时间"); + LogManager.Warning($"[分层管理器] 大量模型项检测:{preview.Items.Count}个,可能需要更多内存和时间"); // 强制垃圾回收,释放内存 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); - LogManager.Info($"[SimplifiedModelSplitter] 垃圾回收完成,当前内存: {GC.GetTotalMemory(false) / 1024 / 1024} MB"); + LogManager.Info($"[分层管理器] 垃圾回收完成,当前内存: {GC.GetTotalMemory(false) / 1024 / 1024} MB"); } // 使用TryExportToNwd API导出分层 @@ -1277,17 +1277,17 @@ namespace NavisworksTransport if (success) { - LogManager.Info($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 导出成功: {outputPath}"); + LogManager.Info($"[分层管理器] 分层 {preview.LayerName} 导出成功: {outputPath}"); } else { - LogManager.Error($"[SimplifiedModelSplitter] 分层 {preview.LayerName} 导出失败"); + LogManager.Error($"[分层管理器] 分层 {preview.LayerName} 导出失败"); throw new InvalidOperationException($"分层 {preview.LayerName} 导出失败"); } } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 同步处理分层失败 {preview.LayerName}: {ex.Message}"); + LogManager.Error($"[分层管理器] 同步处理分层失败 {preview.LayerName}: {ex.Message}"); throw; } } @@ -1303,7 +1303,7 @@ namespace NavisworksTransport if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); - LogManager.Info($"[SimplifiedModelSplitter] 创建输出目录: {directory}"); + LogManager.Info($"[分层管理器] 创建输出目录: {directory}"); } } @@ -1465,17 +1465,17 @@ namespace NavisworksTransport // 确保文件名唯一性 fileName = EnsureUniqueFileName(fileName, config.OutputDirectory); - LogManager.Info($"[SimplifiedModelSplitter] 生成智能文件名: {fileName}"); - LogManager.Info($"[SimplifiedModelSplitter] 文件名组成: 根节点='{rootNodeName}', 属性类型='{attributeTypeName}', 属性值='{sanitizedAttributeValue}', 时间戳='{timestamp}'"); + LogManager.Info($"[分层管理器] 生成智能文件名: {fileName}"); + LogManager.Info($"[分层管理器] 文件名组成: 根节点='{rootNodeName}', 属性类型='{attributeTypeName}', 属性值='{sanitizedAttributeValue}', 时间戳='{timestamp}'"); return fileName; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 生成智能文件名失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 生成智能文件名失败: {ex.Message}"); // 失败时使用后备命名方式 string fallbackName = $"NavisworksModel_分层_{SanitizeLayerName(attributeValue)}_{DateTime.Now:yyyyMMdd_HHmmss}.nwd"; - LogManager.Warning($"[SimplifiedModelSplitter] 使用后备文件名: {fallbackName}"); + LogManager.Warning($"[分层管理器] 使用后备文件名: {fallbackName}"); return fallbackName; } } @@ -1530,7 +1530,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 获取根节点名称失败: {ex.Message}"); + LogManager.Warning($"[分层管理器] 获取根节点名称失败: {ex.Message}"); return "NavisworksModel"; } } @@ -1597,12 +1597,12 @@ namespace NavisworksTransport counter++; } while (File.Exists(filePath) && counter < 100); - LogManager.Info($"[SimplifiedModelSplitter] 文件名冲突,重命名为: {newFileName}"); + LogManager.Info($"[分层管理器] 文件名冲突,重命名为: {newFileName}"); return newFileName; } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 检查文件名唯一性失败: {ex.Message}"); + LogManager.Warning($"[分层管理器] 检查文件名唯一性失败: {ex.Message}"); return originalFileName; } } @@ -1614,30 +1614,30 @@ namespace NavisworksTransport { if (preview == null) { - LogManager.Error($"[SimplifiedModelSplitter] 预览结果为null"); + LogManager.Error($"[分层管理器] 预览结果为null"); return false; } try { - LogManager.Info($"[SimplifiedModelSplitter] ========== ExportLayerToNwd开始 =========="); - LogManager.Info($"[SimplifiedModelSplitter] 导出层: {preview.LayerName}"); - LogManager.Info($"[SimplifiedModelSplitter] 预览项数量: {preview.Items?.Count ?? 0}"); - LogManager.Info($"[SimplifiedModelSplitter] 输出路径: {outputPath}"); + LogManager.Info($"[分层管理器] ========== ExportLayerToNwd开始 =========="); + LogManager.Info($"[分层管理器] 导出层: {preview.LayerName}"); + LogManager.Info($"[分层管理器] 预览项数量: {preview.Items?.Count ?? 0}"); + LogManager.Info($"[分层管理器] 输出路径: {outputPath}"); // 直接使用预览结果中的项目 if (preview.Items == null || preview.Items.Count == 0) { - LogManager.Warning($"[SimplifiedModelSplitter] 预览结果中没有模型项"); + LogManager.Warning($"[分层管理器] 预览结果中没有模型项"); return false; } var itemsToExport = preview.Items; - LogManager.Info($"[SimplifiedModelSplitter] 将导出 {itemsToExport.Count} 个模型项"); + LogManager.Info($"[分层管理器] 将导出 {itemsToExport.Count} 个模型项"); // 检查线程状态 var apartmentState = System.Threading.Thread.CurrentThread.GetApartmentState(); - LogManager.Info($"[SimplifiedModelSplitter] 当前线程状态: {apartmentState}"); + LogManager.Info($"[分层管理器] 当前线程状态: {apartmentState}"); // 核心修复:确保在主 UI 线程中执行 Navisworks API 调用 bool exportResult = false; @@ -1648,13 +1648,13 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 在主线程中执行导出操作"); + LogManager.Info($"[分层管理器] 在主线程中执行导出操作"); var document = NavisApplication.ActiveDocument; // 保存当前可见性状态(在主线程中) - LogManager.Info($"[SimplifiedModelSplitter] 开始保存当前可见性状态"); + LogManager.Info($"[分层管理器] 开始保存当前可见性状态"); var originalVisibilityState = SaveCurrentVisibilityState(document); - LogManager.Info($"[SimplifiedModelSplitter] 已保存 {originalVisibilityState.Count} 个项目的可见性状态"); + LogManager.Info($"[分层管理器] 已保存 {originalVisibilityState.Count} 个项目的可见性状态"); try { @@ -1670,7 +1670,7 @@ namespace NavisworksTransport } } - LogManager.Info($"[SimplifiedModelSplitter] 收集到 {allTopLevelItems.Count} 个顶级节点"); + LogManager.Info($"[分层管理器] 收集到 {allTopLevelItems.Count} 个顶级节点"); // 智能隐藏策略:如果顶级节点包含要导出的项目,则保持可见;否则隐藏整个顶级分支 var itemsToHide = new ModelItemCollection(); @@ -1686,7 +1686,7 @@ namespace NavisworksTransport if (topLevelItem.Equals(exportItem)) { shouldKeepTopLevel = true; - LogManager.Info($"[SimplifiedModelSplitter] 顶级节点 {topLevelItem.DisplayName} 本身被选中,保持可见"); + LogManager.Info($"[分层管理器] 顶级节点 {topLevelItem.DisplayName} 本身被选中,保持可见"); break; } } @@ -1702,7 +1702,7 @@ namespace NavisworksTransport if (current == topLevelItem) { shouldKeepTopLevel = true; - LogManager.Info($"[SimplifiedModelSplitter] 顶级节点 {topLevelItem.DisplayName} 包含导出项目,保持可见"); + LogManager.Info($"[分层管理器] 顶级节点 {topLevelItem.DisplayName} 包含导出项目,保持可见"); break; } current = current.Parent; @@ -1718,11 +1718,11 @@ namespace NavisworksTransport { itemsToHide.Add(topLevelItem); hiddenCount++; - LogManager.Info($"[SimplifiedModelSplitter] 隐藏顶级节点: {topLevelItem.DisplayName}"); + LogManager.Info($"[分层管理器] 隐藏顶级节点: {topLevelItem.DisplayName}"); } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 添加隐藏项目失败: {topLevelItem.DisplayName} - {ex.Message}"); + LogManager.Warning($"[分层管理器] 添加隐藏项目失败: {topLevelItem.DisplayName} - {ex.Message}"); } } } @@ -1733,11 +1733,11 @@ namespace NavisworksTransport try { document.Models.SetHidden(itemsToHide, true); - LogManager.Info($"[SimplifiedModelSplitter] 成功隐藏 {hiddenCount} 个顶级节点,保留导出项目可见"); + LogManager.Info($"[分层管理器] 成功隐藏 {hiddenCount} 个顶级节点,保留导出项目可见"); } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 隐藏操作失败: {ex.Message}"); + LogManager.Warning($"[分层管理器] 隐藏操作失败: {ex.Message}"); } } @@ -1749,12 +1749,12 @@ namespace NavisworksTransport PreventObjectPropertyExport = false }; - LogManager.Info($"[SimplifiedModelSplitter] 开始调用ExportToNwd API(主线程)"); + LogManager.Info($"[分层管理器] 开始调用ExportToNwd API(主线程)"); // 在主线程中执行导出 document.ExportToNwd(outputPath, exportOptions); - LogManager.Info($"[SimplifiedModelSplitter] ExportToNwd API调用完成(主线程)"); + LogManager.Info($"[分层管理器] ExportToNwd API调用完成(主线程)"); exportResult = true; } finally @@ -1763,11 +1763,11 @@ namespace NavisworksTransport try { RestoreVisibilityState(document, originalVisibilityState); - LogManager.Info($"[SimplifiedModelSplitter] 已恢复原始可见性状态"); + LogManager.Info($"[分层管理器] 已恢复原始可见性状态"); } catch (Exception restoreEx) { - LogManager.Error($"[SimplifiedModelSplitter] 恢复可见性失败: {restoreEx.Message}"); + LogManager.Error($"[分层管理器] 恢复可见性失败: {restoreEx.Message}"); } } } @@ -1780,18 +1780,18 @@ namespace NavisworksTransport // 检查导出结果 if (exportException != null) { - LogManager.Error($"[SimplifiedModelSplitter] 主线程导出异常: {exportException.Message}"); - LogManager.Error($"[SimplifiedModelSplitter] 异常堆栈: {exportException.StackTrace}"); + LogManager.Error($"[分层管理器] 主线程导出异常: {exportException.Message}"); + LogManager.Error($"[分层管理器] 异常堆栈: {exportException.StackTrace}"); return false; } - LogManager.Info($"[SimplifiedModelSplitter] ========== ExportLayerToNwd完成 ========== 成功导出到: {outputPath}"); + LogManager.Info($"[分层管理器] ========== ExportLayerToNwd完成 ========== 成功导出到: {outputPath}"); return exportResult; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] ExportLayerToNwd异常: {ex.Message}"); - LogManager.Error($"[SimplifiedModelSplitter] 异常堆栈: {ex.StackTrace}"); + LogManager.Error($"[分层管理器] ExportLayerToNwd异常: {ex.Message}"); + LogManager.Error($"[分层管理器] 异常堆栈: {ex.StackTrace}"); return false; } } @@ -1823,11 +1823,11 @@ namespace NavisworksTransport } } - LogManager.Info($"[SimplifiedModelSplitter] 保存可见性状态完成,记录了 {visibilityState.Count} 个顶级项目"); + LogManager.Info($"[分层管理器] 保存可见性状态完成,记录了 {visibilityState.Count} 个顶级项目"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 保存可见性状态失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 保存可见性状态失败: {ex.Message}"); } return visibilityState; @@ -1910,8 +1910,8 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] ========== ExpandFloorItems开始 =========="); - LogManager.Info($"[SimplifiedModelSplitter] 输入顶层节点数量: {floorTopLevelItems.Count}"); + LogManager.Info($"[分层管理器] ========== ExpandFloorItems开始 =========="); + LogManager.Info($"[分层管理器] 输入顶层节点数量: {floorTopLevelItems.Count}"); var expandedItems = new ModelItemCollection(); int totalCollected = 0; @@ -1920,7 +1920,7 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] 开始展开顶层节点: '{topLevelItem.DisplayName}'"); + LogManager.Info($"[分层管理器] 开始展开顶层节点: '{topLevelItem.DisplayName}'"); // 添加顶层节点本身(如果它是具体的构件) if (IsActualComponent(topLevelItem)) @@ -1937,21 +1937,21 @@ namespace NavisworksTransport expandedItems.AddRange(validChildItems); totalCollected += validChildItems.Count; - LogManager.Info($"[SimplifiedModelSplitter] 顶层节点 '{topLevelItem.DisplayName}' 展开完成: 收集到{childItems.Count}个子项,有效{validChildItems.Count}个"); + LogManager.Info($"[分层管理器] 顶层节点 '{topLevelItem.DisplayName}' 展开完成: 收集到{childItems.Count}个子项,有效{validChildItems.Count}个"); } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 展开顶层节点失败: {topLevelItem?.DisplayName ?? "null"}, 错误: {ex.Message}"); + LogManager.Warning($"[分层管理器] 展开顶层节点失败: {topLevelItem?.DisplayName ?? "null"}, 错误: {ex.Message}"); } } - LogManager.Info($"[SimplifiedModelSplitter] ========== ExpandFloorItems完成 ========== 总计收集: {totalCollected}个模型项"); + LogManager.Info($"[分层管理器] ========== ExpandFloorItems完成 ========== 总计收集: {totalCollected}个模型项"); return expandedItems; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] ExpandFloorItems异常: {ex.Message}"); - LogManager.Error($"[SimplifiedModelSplitter] 异常堆栈: {ex.StackTrace}"); + LogManager.Error($"[分层管理器] ExpandFloorItems异常: {ex.Message}"); + LogManager.Error($"[分层管理器] 异常堆栈: {ex.StackTrace}"); return new ModelItemCollection(); } } @@ -1972,7 +1972,7 @@ namespace NavisworksTransport // 防止递归过深 if (currentDepth >= maxDepth) { - LogManager.Warning($"[SimplifiedModelSplitter] 达到最大递归深度 {maxDepth},停止展开: {parentItem?.DisplayName}"); + LogManager.Warning($"[分层管理器] 达到最大递归深度 {maxDepth},停止展开: {parentItem?.DisplayName}"); return childItems; } @@ -1998,18 +1998,18 @@ namespace NavisworksTransport // 每收集100个项目记录一次进度(只在顶层记录) if (currentDepth == 0 && childItems.Count % 100 == 0) { - LogManager.Info($"[SimplifiedModelSplitter] 已收集 {childItems.Count} 个子项..."); + LogManager.Info($"[分层管理器] 已收集 {childItems.Count} 个子项..."); } } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 收集子项失败: {child?.DisplayName ?? "null"}, 错误: {ex.Message}"); + LogManager.Warning($"[分层管理器] 收集子项失败: {child?.DisplayName ?? "null"}, 错误: {ex.Message}"); } } } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] CollectAllChildItems异常: {ex.Message}"); + LogManager.Error($"[分层管理器] CollectAllChildItems异常: {ex.Message}"); } return childItems; @@ -2028,7 +2028,7 @@ namespace NavisworksTransport try { - LogManager.Info($"[SimplifiedModelSplitter] 开始验证 {items.Count} 个模型项的有效性..."); + LogManager.Info($"[分层管理器] 开始验证 {items.Count} 个模型项的有效性..."); foreach (ModelItem item in items) { @@ -2051,17 +2051,17 @@ namespace NavisworksTransport catch (Exception ex) { invalidCount++; - LogManager.Warning($"[SimplifiedModelSplitter] 发现无效模型项: {ex.Message}"); + LogManager.Warning($"[分层管理器] 发现无效模型项: {ex.Message}"); } } - LogManager.Info($"[SimplifiedModelSplitter] 模型项验证完成: 总数{items.Count}, 有效{validItems.Count}, 空项{nullCount}, 无效{invalidCount}"); + LogManager.Info($"[分层管理器] 模型项验证完成: 总数{items.Count}, 有效{validItems.Count}, 空项{nullCount}, 无效{invalidCount}"); return validItems; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 验证模型项时发生异常: {ex.Message}"); + LogManager.Error($"[分层管理器] 验证模型项时发生异常: {ex.Message}"); // 异常时返回原始集合,避免完全失败 return items; } @@ -2099,7 +2099,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 判断构件类型失败: {ex.Message}"); + LogManager.Warning($"[分层管理器] 判断构件类型失败: {ex.Message}"); return false; } } @@ -2113,9 +2113,9 @@ namespace NavisworksTransport try { - LogManager.Info($"[SimplifiedModelSplitter] ===== GetFloorItems开始 ====="); - LogManager.Info($"[SimplifiedModelSplitter] 目标楼层名称: '{floorName}'"); - LogManager.Info($"[SimplifiedModelSplitter] 输入模型项数: {allItems.Count}"); + LogManager.Info($"[分层管理器] ===== GetFloorItems开始 ====="); + LogManager.Info($"[分层管理器] 目标楼层名称: '{floorName}'"); + LogManager.Info($"[分层管理器] 输入模型项数: {allItems.Count}"); int checkedCount = 0; int matchedCount = 0; @@ -2138,27 +2138,27 @@ namespace NavisworksTransport if (matchedCount <= 5) // 只记录前5个匹配的详细信息 { - LogManager.Info($"[SimplifiedModelSplitter] 找到匹配模型项 #{matchedCount}: {item.DisplayName}"); + LogManager.Info($"[分层管理器] 找到匹配模型项 #{matchedCount}: {item.DisplayName}"); } } // 每处理1000个项记录进度 if (checkedCount % 1000 == 0) { - LogManager.Info($"[SimplifiedModelSplitter] 已检查 {checkedCount}/{allItems.Count} 个模型项,找到 {matchedCount} 个匹配"); + LogManager.Info($"[分层管理器] 已检查 {checkedCount}/{allItems.Count} 个模型项,找到 {matchedCount} 个匹配"); } } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 检查模型项楼层属性时出错: {ex.Message}"); + LogManager.Warning($"[分层管理器] 检查模型项楼层属性时出错: {ex.Message}"); } } - LogManager.Info($"[SimplifiedModelSplitter] ===== GetFloorItems完成 ===== 检查了 {checkedCount} 个模型项,找到 {matchedCount} 个匹配的楼层项目"); + LogManager.Info($"[分层管理器] ===== GetFloorItems完成 ===== 检查了 {checkedCount} 个模型项,找到 {matchedCount} 个匹配的楼层项目"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 获取楼层项目失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 获取楼层项目失败: {ex.Message}"); } return floorItems; @@ -2194,7 +2194,7 @@ namespace NavisworksTransport // 详细调试日志 - 当找到楼层相关属性时 if (!string.IsNullOrEmpty(propValue)) { - LogManager.Info($"[SimplifiedModelSplitter] 楼层属性检查: 项目='{item.DisplayName}', 属性='{property.DisplayName}', 值='{propValue}', 目标='{floorName}', 匹配={isMatch}"); + LogManager.Info($"[分层管理器] 楼层属性检查: 项目='{item.DisplayName}', 属性='{property.DisplayName}', 值='{propValue}', 目标='{floorName}', 匹配={isMatch}"); } if (isMatch) @@ -2209,7 +2209,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 检查楼层属性时出错: {ex.Message}"); + LogManager.Warning($"[分层管理器] 检查楼层属性时出错: {ex.Message}"); } return false; @@ -2244,7 +2244,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 检查属性值时出错: {ex.Message}"); + LogManager.Warning($"[分层管理器] 检查属性值时出错: {ex.Message}"); } return false; @@ -2285,7 +2285,7 @@ namespace NavisworksTransport } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 处理项目可见性状态时出错: {ex.Message}"); + LogManager.Warning($"[分层管理器] 处理项目可见性状态时出错: {ex.Message}"); } } @@ -2296,14 +2296,14 @@ namespace NavisworksTransport if (itemsToHide.Count > 0) { document.Models.SetHidden(itemsToHide, true); - LogManager.Info($"[SimplifiedModelSplitter] 恢复隐藏 {itemsToHide.Count} 个项目"); + LogManager.Info($"[分层管理器] 恢复隐藏 {itemsToHide.Count} 个项目"); } LogManager.Info("[SimplifiedModelSplitter] 可见性状态恢复完成"); } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 恢复可见性状态失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 恢复可见性状态失败: {ex.Message}"); // 失败时至少确保模型处于可见状态 try { @@ -2312,7 +2312,7 @@ namespace NavisworksTransport } catch (Exception resetEx) { - LogManager.Error($"[SimplifiedModelSplitter] 重置可见性也失败: {resetEx.Message}"); + LogManager.Error($"[分层管理器] 重置可见性也失败: {resetEx.Message}"); } } } @@ -2328,9 +2328,9 @@ namespace NavisworksTransport { try { - LogManager.Info($"[SimplifiedModelSplitter] ========== 开始基础导出测试 =========="); - LogManager.Info($"[SimplifiedModelSplitter] 测试文件路径: {outputPath}"); - LogManager.Info($"[SimplifiedModelSplitter] 最大测试项目数: {maxItems}"); + LogManager.Info($"[分层管理器] ========== 开始基础导出测试 =========="); + LogManager.Info($"[分层管理器] 测试文件路径: {outputPath}"); + LogManager.Info($"[分层管理器] 最大测试项目数: {maxItems}"); var document = NavisApplication.ActiveDocument; if (document?.Models?.Count == 0) @@ -2360,11 +2360,11 @@ namespace NavisworksTransport string displayName = item.DisplayName; testItems.Add(item); addedCount++; - LogManager.Info($"[SimplifiedModelSplitter] 添加测试项目 #{addedCount}: {displayName}"); + LogManager.Info($"[分层管理器] 添加测试项目 #{addedCount}: {displayName}"); } catch (Exception ex) { - LogManager.Warning($"[SimplifiedModelSplitter] 跳过无效测试项目: {ex.Message}"); + LogManager.Warning($"[分层管理器] 跳过无效测试项目: {ex.Message}"); } } @@ -2374,14 +2374,14 @@ namespace NavisworksTransport return false; } - LogManager.Info($"[SimplifiedModelSplitter] 准备测试导出 {testItems.Count} 个模型项"); + LogManager.Info($"[分层管理器] 准备测试导出 {testItems.Count} 个模型项"); // 确保输出目录存在 string directory = Path.GetDirectoryName(outputPath); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); - LogManager.Info($"[SimplifiedModelSplitter] 创建测试输出目录: {directory}"); + LogManager.Info($"[分层管理器] 创建测试输出目录: {directory}"); } // 创建测试预览结果 @@ -2403,20 +2403,20 @@ namespace NavisworksTransport // 执行测试导出 bool testResult = ExportLayerToNwd(testPreview, outputPath, testConfig); - LogManager.Info($"[SimplifiedModelSplitter] ========== 基础导出测试完成 ========== 结果: {testResult}"); + LogManager.Info($"[分层管理器] ========== 基础导出测试完成 ========== 结果: {testResult}"); if (testResult && File.Exists(outputPath)) { var fileInfo = new FileInfo(outputPath); - LogManager.Info($"[SimplifiedModelSplitter] 测试文件生成成功,大小: {fileInfo.Length / 1024} KB"); + LogManager.Info($"[分层管理器] 测试文件生成成功,大小: {fileInfo.Length / 1024} KB"); } return testResult; } catch (Exception ex) { - LogManager.Error($"[SimplifiedModelSplitter] 基础导出测试失败: {ex.Message}"); - LogManager.Error($"[SimplifiedModelSplitter] 测试异常堆栈: {ex.StackTrace}"); + LogManager.Error($"[分层管理器] 基础导出测试失败: {ex.Message}"); + LogManager.Error($"[分层管理器] 测试异常堆栈: {ex.StackTrace}"); return false; } } diff --git a/src/Core/VisibilityManager.cs b/src/Core/VisibilityManager.cs index e347d78..66d3ff5 100644 --- a/src/Core/VisibilityManager.cs +++ b/src/Core/VisibilityManager.cs @@ -7,6 +7,206 @@ using NavisApplication = Autodesk.Navisworks.Api.Application; namespace NavisworksTransport { + /// + /// 模型结构缓存 - 优化重复遍历性能 + /// + internal static class ModelStructureCache + { + // 缓存数据 + private static Dictionary> _siblingsCache; + private static Dictionary _parentCache; + private static Dictionary> _childrenCache; + private static HashSet _allModelItems; + + // 缓存验证 + private static string _documentIdentifier; + private static DateTime _cacheTime; + private static readonly object _cacheLock = new object(); + + /// + /// 检查缓存是否有效,无效则清除 + /// + public static void InvalidateIfDocumentChanged(Document document) + { + lock (_cacheLock) + { + string currentId = GenerateDocumentId(document); + if (currentId != _documentIdentifier) + { + LogManager.Debug($"[ModelStructureCache] 文档已改变,清除缓存"); + ClearCache(); + _documentIdentifier = currentId; + } + } + } + + /// + /// 获取所有需要隐藏的兄弟节点(批量优化版) + /// + public static HashSet GetSiblingsToHide(HashSet visibleItems) + { + lock (_cacheLock) + { + EnsureCacheBuilt(); + + var siblingsToHide = new HashSet(); + var processedParents = new HashSet(); + + foreach (var item in visibleItems) + { + if (_parentCache.TryGetValue(item, out var parent) && parent != null) + { + if (!processedParents.Contains(parent)) + { + processedParents.Add(parent); + + // 获取缓存的兄弟节点 + if (_siblingsCache.TryGetValue(item, out var siblings)) + { + foreach (var sibling in siblings) + { + if (!visibleItems.Contains(sibling)) + { + siblingsToHide.Add(sibling); + } + } + } + } + } + } + + LogManager.Debug($"[ModelStructureCache] 从缓存获取兄弟节点: 处理了{processedParents.Count}个父节点,找到{siblingsToHide.Count}个需隐藏项"); + return siblingsToHide; + } + } + + /// + /// 构建缓存 + /// + private static void EnsureCacheBuilt() + { + if (_siblingsCache != null && _parentCache != null) + return; + + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + LogManager.Info("[ModelStructureCache] 开始构建模型结构缓存..."); + + _siblingsCache = new Dictionary>(); + _parentCache = new Dictionary(); + _childrenCache = new Dictionary>(); + _allModelItems = new HashSet(); + + var document = NavisApplication.ActiveDocument; + if (document?.Models == null) return; + + // 遍历一次,建立所有关系 + foreach (Model model in document.Models) + { + if (model.RootItem != null) + { + BuildCacheRecursive(model.RootItem, null); + } + } + + // 构建兄弟节点缓存 + foreach (var kvp in _childrenCache) + { + var parent = kvp.Key; + var children = kvp.Value; + + // 为每个子节点建立兄弟关系 + foreach (var child in children) + { + _siblingsCache[child] = new HashSet(children); + } + } + + _cacheTime = DateTime.Now; + stopwatch.Stop(); + + LogManager.Info($"[ModelStructureCache] 缓存构建完成: {_allModelItems.Count}个节点, " + + $"{_parentCache.Count}个父子关系, {_siblingsCache.Count}个兄弟关系, " + + $"耗时{stopwatch.ElapsedMilliseconds}ms"); + } + + /// + /// 递归构建缓存 + /// + private static void BuildCacheRecursive(ModelItem item, ModelItem parent) + { + if (item == null) return; + + _allModelItems.Add(item); + + if (parent != null) + { + _parentCache[item] = parent; + + if (!_childrenCache.ContainsKey(parent)) + _childrenCache[parent] = new HashSet(); + _childrenCache[parent].Add(item); + } + + // 递归处理子节点 + if (item.Children != null && item.Children.Count() > 0) + { + foreach (ModelItem child in item.Children) + { + BuildCacheRecursive(child, item); + } + } + } + + /// + /// 清除缓存 + /// + public static void ClearCache() + { + _siblingsCache?.Clear(); + _parentCache?.Clear(); + _childrenCache?.Clear(); + _allModelItems?.Clear(); + + _siblingsCache = null; + _parentCache = null; + _childrenCache = null; + _allModelItems = null; + + // 强制垃圾回收 + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + + LogManager.Debug("[ModelStructureCache] 缓存已清除"); + } + + /// + /// 生成文档唯一标识 + /// + private static string GenerateDocumentId(Document document) + { + if (document == null) return "empty"; + return $"{document.FileName}_{document.Models?.Count ?? 0}_{document.CurrentSelection?.SelectedItems?.Count ?? 0}"; + } + + /// + /// 获取缓存统计信息 + /// + public static string GetCacheStatistics() + { + lock (_cacheLock) + { + if (_siblingsCache == null) return "缓存未建立"; + + var age = DateTime.Now - _cacheTime; + return $"缓存统计: {_allModelItems?.Count ?? 0}个节点, " + + $"{_parentCache?.Count ?? 0}个父子关系, " + + $"{_siblingsCache?.Count ?? 0}个兄弟关系, " + + $"缓存年龄: {age.TotalSeconds:F1}秒"; + } + } + } + /// /// 可见性操作结果 /// @@ -247,6 +447,7 @@ namespace NavisworksTransport /// /// 仅显示指定的模型项集合,隐藏其他所有项 + /// 使用缓存优化:避免重复遍历模型结构 /// /// 要显示的模型项集合 /// 操作结果 @@ -254,6 +455,8 @@ namespace NavisworksTransport { try { + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + var document = NavisApplication.ActiveDocument; if (document == null || document.Models.Count == 0) { @@ -273,47 +476,102 @@ namespace NavisworksTransport }; } + LogManager.Debug($"[VisibilityManager] 开始隔离显示 {itemsToShow.Count} 个项目"); + + // 检查并更新缓存 + ModelStructureCache.InvalidateIfDocumentChanged(document); + + // 记录内存使用情况 + long memoryBefore = GC.GetTotalMemory(false) / 1024 / 1024; + LogManager.Debug($"[VisibilityManager] 操作前内存: {memoryBefore}MB"); + // 首先重置所有隐藏状态 document.Models.ResetAllHidden(); - // 使用新的智能保护算法构建完整的可见性保护集合 - var protectionSet = BuildProtectionSet(itemsToShow); + // 使用HashSet提高性能(预设容量) + var visibleSet = new HashSet(itemsToShow.Count * 10); - // 获取所有项目 - var allItems = document.Models.SelectMany(model => - model.RootItem.DescendantsAndSelf).ToList(); - - // 创建需要隐藏的项目集合(所有项目除了保护集合中的) - var itemsToHide = new ModelItemCollection(); - foreach (var item in allItems) + // 步骤1:收集所有需要显示的项目(包括祖先和后代) + var collectStopwatch = System.Diagnostics.Stopwatch.StartNew(); + foreach (ModelItem item in itemsToShow) { - if (!protectionSet.Contains(item)) + // 添加祖先路径(确保父节点可见) + if (item.AncestorsAndSelf != null) { - itemsToHide.Add(item); + foreach (ModelItem ancestor in item.AncestorsAndSelf) + { + visibleSet.Add(ancestor); + } + } + // 添加所有后代(确保子节点可见) + if (item.Descendants != null) + { + foreach (ModelItem descendant in item.Descendants) + { + visibleSet.Add(descendant); + } } } + collectStopwatch.Stop(); + LogManager.Debug($"[VisibilityManager] 收集可见项完成,共 {visibleSet.Count} 个,耗时 {collectStopwatch.ElapsedMilliseconds}ms"); - // 隐藏不在保护集合中的项目 - if (itemsToHide.Any()) + // 步骤2:使用缓存获取需要隐藏的兄弟节点 + var cacheStopwatch = System.Diagnostics.Stopwatch.StartNew(); + var siblingsToHide = ModelStructureCache.GetSiblingsToHide(visibleSet); + cacheStopwatch.Stop(); + LogManager.Debug($"[VisibilityManager] 从缓存获取兄弟节点,耗时 {cacheStopwatch.ElapsedMilliseconds}ms"); + + // 步骤3:构建最终的隐藏集合 + var finalHidden = new ModelItemCollection(); + foreach (var item in siblingsToHide) { - document.Models.SetHidden(itemsToHide, true); + finalHidden.Add(item); } + LogManager.Debug($"[VisibilityManager] 过滤完成,需要隐藏 {finalHidden.Count} 个项目"); + + // 步骤4:执行隐藏操作 + if (finalHidden.Any()) + { + var hideStopwatch = System.Diagnostics.Stopwatch.StartNew(); + document.Models.SetHidden(finalHidden, true); + hideStopwatch.Stop(); + LogManager.Debug($"[VisibilityManager] 执行隐藏操作,耗时 {hideStopwatch.ElapsedMilliseconds}ms"); + } + + stopwatch.Stop(); + // 计算结果统计 - int totalItemsCount = allItems.Count; - int hiddenCount = itemsToHide.Count; - int visibleCount = protectionSet.Count; + int hiddenCount = finalHidden.Count; + int visibleCount = visibleSet.Count; + + // 记录内存和缓存信息 + long memoryAfter = GC.GetTotalMemory(false) / 1024 / 1024; + LogManager.Debug($"[VisibilityManager] 操作后内存: {memoryAfter}MB (增加 {memoryAfter - memoryBefore}MB)"); + LogManager.Debug($"[VisibilityManager] {ModelStructureCache.GetCacheStatistics()}"); + + LogManager.Info($"[VisibilityManager] 隔离显示完成,总耗时 {stopwatch.ElapsedMilliseconds}ms"); + + // 如果内存增长过多,考虑触发GC + if (memoryAfter - memoryBefore > 50) // 增长超过50MB + { + LogManager.Debug("[VisibilityManager] 内存增长较多,触发垃圾回收"); + GC.Collect(); + GC.WaitForPendingFinalizers(); + GC.Collect(); + } return new VisibilityOperationResult { Success = true, Message = $"已隔离显示 {itemsToShow.Count} 个核心项目(含路径 {visibleCount} 个可见项),隐藏了 {hiddenCount} 个项目", HiddenCount = hiddenCount, - TotalCount = totalItemsCount + TotalCount = hiddenCount + visibleCount }; } catch (Exception ex) { + LogManager.Error($"[VisibilityManager] 隔离显示失败: {ex.Message}"); return new VisibilityOperationResult { Success = false, diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs index c082aae..f94b2b3 100644 --- a/src/PathPlanning/AutoPathFinder.cs +++ b/src/PathPlanning/AutoPathFinder.cs @@ -250,7 +250,6 @@ namespace NavisworksTransport.PathPlanning // 检查基本可通行性和高度约束 bool isPassable = cell.IsWalkable; - bool heightRestricted = false; if (isPassable && cell.PassableHeights != null && cell.PassableHeights.Any()) { @@ -258,7 +257,6 @@ namespace NavisworksTransport.PathPlanning if (!heightOk) { heightConstrainedCells++; - heightRestricted = true; // 详细日志:记录被高度约束排除的单元格(仅记录前10个避免日志过多) if (heightConstrainedCells <= 10) diff --git a/src/UI/Forms/SimpleDockPaneControl.cs b/src/UI/Forms/SimpleDockPaneControl.cs deleted file mode 100644 index b3efe24..0000000 --- a/src/UI/Forms/SimpleDockPaneControl.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using Autodesk.Navisworks.Api; -using NavisApplication = Autodesk.Navisworks.Api.Application; - -namespace NavisworksTransport.UI.Forms -{ - /// - /// 简单的DockPane控件,用于验证DockPanePlugin基础功能 - /// - public partial class SimpleDockPaneControl : UserControl - { - private Label _statusLabel; - private Button _testButton; - private ListView _infoListView; - - public SimpleDockPaneControl() - { - InitializeComponent(); - InitializeSession(); - } - - private void InitializeComponent() - { - this.SuspendLayout(); - - // 设置控件基本属性 - this.Size = new Size(400, 600); - this.BackColor = SystemColors.Control; - this.Padding = new Padding(10); - - // 创建状态标签 - _statusLabel = new Label - { - Text = "物流路径规划插件 - DockPane模式", - Font = new Font("微软雅黑", 10, FontStyle.Bold), - ForeColor = System.Drawing.Color.DarkBlue, - AutoSize = true, - Location = new Point(10, 10) - }; - this.Controls.Add(_statusLabel); - - // 创建测试按钮 - _testButton = new Button - { - Text = "测试功能", - Size = new Size(100, 30), - Location = new Point(10, 40), - Font = new Font("微软雅黑", 9) - }; - _testButton.Click += OnTestButtonClick; - this.Controls.Add(_testButton); - - // 创建信息列表 - _infoListView = new ListView - { - View = System.Windows.Forms.View.Details, - FullRowSelect = true, - GridLines = true, - Location = new Point(10, 80), - Size = new Size(380, 500), - Font = new Font("微软雅黑", 8) - }; - - // 添加列 - _infoListView.Columns.Add("时间", 120); - _infoListView.Columns.Add("事件", 100); - _infoListView.Columns.Add("描述", 160); - - this.Controls.Add(_infoListView); - - this.ResumeLayout(false); - } - - private void InitializeSession() - { - GlobalExceptionHandler.SafeExecute(() => - { - LogManager.Info("=== SimpleDockPaneControl 初始化开始 ==="); - - // 初始化全局异常处理 - GlobalExceptionHandler.Initialize(); - - // 订阅选择变化事件 - if (NavisApplication.ActiveDocument != null) - { - NavisApplication.ActiveDocument.CurrentSelection.Changed += OnSelectionChanged; - } - - // 添加初始化信息 - AddInfoItem("初始化", "插件已加载"); - - LogManager.Info("SimpleDockPaneControl 初始化完成"); - - }, "初始化SimpleDockPaneControl"); - } - - private void OnTestButtonClick(object sender, EventArgs e) - { - GlobalExceptionHandler.SafeExecute(() => - { - LogManager.Info("测试按钮被点击"); - - // 获取当前文档信息 - var doc = NavisApplication.ActiveDocument; - if (doc != null) - { - var modelCount = doc.Models?.Count ?? 0; - var selectedCount = doc.CurrentSelection?.SelectedItems?.Count ?? 0; - - AddInfoItem("测试", $"模型数量: {modelCount}, 选中: {selectedCount}"); - - MessageBox.Show($"当前文档信息:\n模型数量: {modelCount}\n选中项目: {selectedCount}", - "测试结果", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - else - { - AddInfoItem("测试", "没有打开的文档"); - MessageBox.Show("请先打开一个Navisworks文档", - "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - - }, "测试按钮点击"); - } - - private void OnSelectionChanged(object sender, EventArgs e) - { - if (this.InvokeRequired) - { - this.BeginInvoke(new Action(() => OnSelectionChanged(sender, e))); - return; - } - - try - { - var selectedCount = NavisApplication.ActiveDocument?.CurrentSelection?.SelectedItems?.Count ?? 0; - AddInfoItem("选择变更", $"选中 {selectedCount} 个项目"); - } - catch (Exception ex) - { - LogManager.Error($"处理选择变更事件失败: {ex.Message}"); - } - } - - private void AddInfoItem(string eventType, string description) - { - try - { - if (this.InvokeRequired) - { - this.BeginInvoke(new Action(() => AddInfoItem(eventType, description))); - return; - } - - var item = new ListViewItem(DateTime.Now.ToString("HH:mm:ss")); - item.SubItems.Add(eventType); - item.SubItems.Add(description); - - _infoListView.Items.Insert(0, item); - - // 保持最多50条记录 - while (_infoListView.Items.Count > 50) - { - _infoListView.Items.RemoveAt(_infoListView.Items.Count - 1); - } - } - catch (Exception ex) - { - LogManager.Error($"添加信息项失败: {ex.Message}"); - } - } - - public void Cleanup() - { - try - { - LogManager.Info("开始清理SimpleDockPaneControl资源"); - - // 取消事件订阅 - if (NavisApplication.ActiveDocument != null) - { - NavisApplication.ActiveDocument.CurrentSelection.Changed -= OnSelectionChanged; - } - - AddInfoItem("清理", "资源已清理"); - - LogManager.Info("SimpleDockPaneControl资源清理完成"); - } - catch (Exception ex) - { - LogManager.Error($"清理SimpleDockPaneControl资源失败: {ex.Message}"); - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - Cleanup(); - } - base.Dispose(disposing); - } - } -} \ No newline at end of file diff --git a/src/UI/WPF/SimpleLogisticsControlPanel.cs b/src/UI/WPF/SimpleLogisticsControlPanel.cs deleted file mode 100644 index a8a173d..0000000 --- a/src/UI/WPF/SimpleLogisticsControlPanel.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Windows.Controls; -using NavisworksTransport.UI.WPF.ViewModels; - -namespace NavisworksTransport.UI.WPF -{ - /// - /// 简化的物流控制面板,用于诊断ViewModel问题 - /// - public partial class SimpleLogisticsControlPanel : UserControl - { - public SimpleLogisticsControlViewModel ViewModel { get; private set; } - - public SimpleLogisticsControlPanel() - { - try - { - NavisworksTransport.LogManager.Info("SimpleLogisticsControlPanel构造函数开始"); - - NavisworksTransport.LogManager.Info("开始InitializeComponent..."); - InitializeComponent(); - NavisworksTransport.LogManager.Info("InitializeComponent完成"); - - NavisworksTransport.LogManager.Info("开始创建ViewModel..."); - // 使用简化的ViewModel - ViewModel = new SimpleLogisticsControlViewModel(); - NavisworksTransport.LogManager.Info("ViewModel创建完成"); - - NavisworksTransport.LogManager.Info("设置DataContext..."); - DataContext = ViewModel; - NavisworksTransport.LogManager.Info("DataContext设置完成"); - - NavisworksTransport.LogManager.Info("SimpleLogisticsControlPanel构造函数完成"); - } - catch (Exception ex) - { - NavisworksTransport.LogManager.Error($"SimpleLogisticsControlPanel构造函数异常: {ex.Message}"); - NavisworksTransport.LogManager.Error($"堆栈跟踪: {ex.StackTrace}"); - throw; - } - } - - private void InitializeComponent() - { - var stackPanel = new StackPanel(); - stackPanel.Margin = new System.Windows.Thickness(10); - - var titleTextBlock = new TextBlock(); - titleTextBlock.Text = "简化的物流控制面板"; - titleTextBlock.FontSize = 16; - titleTextBlock.FontWeight = System.Windows.FontWeights.Bold; - titleTextBlock.Margin = new System.Windows.Thickness(0, 0, 0, 10); - - var statusTextBlock = new TextBlock(); - statusTextBlock.SetBinding(TextBlock.TextProperty, - new System.Windows.Data.Binding("StatusText")); - statusTextBlock.Margin = new System.Windows.Thickness(0, 0, 0, 5); - - var selectedModelsTextBlock = new TextBlock(); - selectedModelsTextBlock.SetBinding(TextBlock.TextProperty, - new System.Windows.Data.Binding("SelectedModelsText")); - - stackPanel.Children.Add(titleTextBlock); - stackPanel.Children.Add(statusTextBlock); - stackPanel.Children.Add(selectedModelsTextBlock); - - this.Content = stackPanel; - } - } -} \ No newline at end of file diff --git a/src/UI/WPF/ViewModels/LayerManagementViewModel.cs b/src/UI/WPF/ViewModels/LayerManagementViewModel.cs index 99f400f..7771fc1 100644 --- a/src/UI/WPF/ViewModels/LayerManagementViewModel.cs +++ b/src/UI/WPF/ViewModels/LayerManagementViewModel.cs @@ -12,7 +12,6 @@ using System.Windows.Media; using NavisworksTransport.UI.WPF.Collections; using NavisworksTransport.UI.WPF.Models; using NavisworksTransport.UI.WPF.Commands; -using NavisworksTransport.Commands; using Autodesk.Navisworks.Api; using NavisApplication = Autodesk.Navisworks.Api.Application; using NavisworksTransport.Utils; @@ -40,6 +39,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels #region 私有字段和依赖注入 private readonly FloorDetector _floorDetector; + private readonly FloorAttributeManager _floorAttributeManager = new FloorAttributeManager(); private readonly ModelSplitterManager _modelSplitterManager; private readonly AttributeGrouper _attributeGrouper; private readonly UIStateManager _uiStateManager; @@ -655,14 +655,12 @@ namespace NavisworksTransport.UI.WPF.ViewModels var document = Autodesk.Navisworks.Api.Application.ActiveDocument; if (document?.CurrentSelection?.SelectedItems?.Count > 0) { - var floorManager = new FloorAttributeManager(); var selection = document.CurrentSelection.SelectedItems; foreach (var item in selection) { - // 使用GetFloorLevel方法检查是否有楼层属性 - var floorLevel = floorManager.GetFloorLevel(item); - if (!string.IsNullOrEmpty(floorLevel)) + // 使用新的快速检查方法 + if (_floorAttributeManager.HasFloorAttributes(item)) { return true; } @@ -685,30 +683,33 @@ namespace NavisworksTransport.UI.WPF.ViewModels { get { - if (!HasSelectedModels || IsProcessing) - return false; - try { - var document = Autodesk.Navisworks.Api.Application.ActiveDocument; - if (document?.CurrentSelection?.SelectedItems == null || document.CurrentSelection.SelectedItems.Count == 0) + if (IsProcessing || !HasSelectedItems) return false; - var floorManager = new FloorAttributeManager(); - // 检查是否有任何选中模型拥有分层属性 - foreach (ModelItem item in document.CurrentSelection.SelectedItems) + // 检查选中的模型是否有楼层属性 + var document = Autodesk.Navisworks.Api.Application.ActiveDocument; + if (document?.CurrentSelection?.SelectedItems?.Count > 0) { - string floorLevel = floorManager.GetFloorLevel(item); - if (!string.IsNullOrEmpty(floorLevel)) + var selection = document.CurrentSelection.SelectedItems; + + foreach (var item in selection) { - return true; // 只要找到一个有属性的就可以清除 + // 使用新的 Native API 方法 + var floorLevel = _floorAttributeManager.GetFloorProperty(item, "楼层"); + if (!string.IsNullOrEmpty(floorLevel)) + { + return true; + } } } - return false; // 没有找到任何有属性的模型 + return false; } - catch + catch (Exception ex) { - return false; // 出错时默认禁用 + LogManager.Error($"[LayerManagementViewModel] 检查清除楼层属性条件异常: {ex.Message}", ex); + return false; } } } @@ -3147,7 +3148,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels return; } - var floorManager = new FloorAttributeManager(); + // 使用成员变量 _floorAttributeManager var selectedItems = document.CurrentSelection.SelectedItems.ToList(); var successCount = 0; @@ -3155,7 +3156,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - bool result = floorManager.SetFloorAttribute( + bool result = _floorAttributeManager.SetFloorAttribute( item, SelectedFloorLevel, string.IsNullOrWhiteSpace(SelectedZone) ? null : SelectedZone, @@ -3207,7 +3208,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels return new { Success = false, Count = 0, Message = "请先选择模型元素" }; } - var floorManager = new FloorAttributeManager(); + // 使用成员变量 _floorAttributeManager var selectedItems = document.CurrentSelection.SelectedItems.ToList(); var successCount = 0; @@ -3215,7 +3216,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - bool itemResult = floorManager.ClearFloorAttribute(item); + bool itemResult = _floorAttributeManager.ClearFloorAttribute(item); if (itemResult) { successCount++; @@ -3313,7 +3314,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var floorManager = new FloorAttributeManager(); var selectedItems = document.CurrentSelection.SelectedItems.ToList(); var floorAttributeInfo = new List(); @@ -3321,7 +3321,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - string floorLevel = floorManager.GetFloorLevel(item); + string floorLevel = _floorAttributeManager.GetFloorProperty(item, "楼层"); string itemName = item.DisplayName ?? "未命名"; if (!string.IsNullOrEmpty(floorLevel)) @@ -3402,13 +3402,13 @@ namespace NavisworksTransport.UI.WPF.ViewModels try { - var floorManager = new FloorAttributeManager(); + // 使用成员变量 _floorAttributeManager var selectedItems = document.CurrentSelection.SelectedItems.ToList(); foreach (var item in selectedItems) { // 使用新的SetSingleLayerAttribute方法,只设置指定的属性类型 - bool result = floorManager.SetSingleLayerAttribute(item, SelectedLayerParameter, SelectedParameterValue); + bool result = _floorAttributeManager.SetSingleLayerAttribute(item, SelectedLayerParameter, SelectedParameterValue); if (result) { @@ -3459,14 +3459,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels try { - var floorManager = new FloorAttributeManager(); + // 使用成员变量 _floorAttributeManager var selectedItems = document.CurrentSelection.SelectedItems.ToList(); foreach (var item in selectedItems) { try { - bool result = floorManager.ClearFloorAttribute(item); + bool result = _floorAttributeManager.ClearFloorAttribute(item); if (result) { processedItems++; @@ -3524,7 +3524,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var floorManager = new FloorAttributeManager(); var selectedItems = document.CurrentSelection.SelectedItems.ToList(); var totalItems = selectedItems.Count; var attributeInfo = new System.Text.StringBuilder(); @@ -3542,21 +3541,21 @@ namespace NavisworksTransport.UI.WPF.ViewModels var itemAttributes = new List(); // 获取楼层属性 - var floorLevel = floorManager.GetFloorLevel(item); + var floorLevel = _floorAttributeManager.GetFloorProperty(item, "楼层"); if (!string.IsNullOrEmpty(floorLevel)) { itemAttributes.Add($"楼层={floorLevel}"); } // 获取区域属性 - var zone = floorManager.GetZoneAttribute(item); + var zone = _floorAttributeManager.GetFloorProperty(item, "区域"); if (!string.IsNullOrEmpty(zone)) { itemAttributes.Add($"区域={zone}"); } // 获取子系统属性 - var subsystem = floorManager.GetSubSystemAttribute(item); + var subsystem = _floorAttributeManager.GetFloorProperty(item, "子系统"); if (!string.IsNullOrEmpty(subsystem)) { itemAttributes.Add($"子系统={subsystem}"); diff --git a/src/UI/WPF/ViewModels/SimpleLogisticsControlViewModel.cs b/src/UI/WPF/ViewModels/SimpleLogisticsControlViewModel.cs deleted file mode 100644 index c0aa55f..0000000 --- a/src/UI/WPF/ViewModels/SimpleLogisticsControlViewModel.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace NavisworksTransport.UI.WPF.ViewModels -{ - /// - /// 简化的物流控制面板ViewModel,用于诊断问题 - /// - public class SimpleLogisticsControlViewModel : INotifyPropertyChanged - { - private string _statusText = "简化ViewModel已加载"; - private string _selectedModelsText = "选中模型: 0 个"; - - public string StatusText - { - get => _statusText; - set => SetProperty(ref _statusText, value); - } - - public string SelectedModelsText - { - get => _selectedModelsText; - set => SetProperty(ref _selectedModelsText, value); - } - - public SimpleLogisticsControlViewModel() - { - // 最简单的初始化,没有复杂依赖 - StatusText = "简化ViewModel初始化成功"; - SelectedModelsText = "等待模型加载..."; - } - - public event PropertyChangedEventHandler PropertyChanged; - - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - protected bool SetProperty(ref T field, T value, [CallerMemberName] string propertyName = null) - { - if (Equals(field, value)) return false; - field = value; - OnPropertyChanged(propertyName); - return true; - } - } -} \ No newline at end of file