修改了保存当前选择集无响应的bug,去掉了多余的子节点展开代码
This commit is contained in:
parent
a552ea3a1d
commit
a832e91b7b
@ -1793,7 +1793,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存选中项目 - 使用复杂导出测试验证的成功逻辑
|
||||
/// 保存选中项目
|
||||
/// </summary>
|
||||
private async Task SaveSelectedItemsAsync()
|
||||
{
|
||||
@ -1801,42 +1801,25 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
{
|
||||
LogManager.Info("[LayerManagementViewModel] 开始保存当前选择项");
|
||||
|
||||
// 1. 简单状态更新
|
||||
IsProcessing = true;
|
||||
|
||||
// 获取当前文档
|
||||
var document = Autodesk.Navisworks.Api.Application.ActiveDocument;
|
||||
if (document?.Models?.Count == 0)
|
||||
if (document?.Models?.Count == 0 || document.CurrentSelection.SelectedItems.Count == 0)
|
||||
{
|
||||
LogManager.Error("[LayerManagementViewModel] 没有活动文档或模型");
|
||||
MessageBox.Show("没有活动文档或模型", "保存错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
LogManager.Warning("[LayerManagementViewModel] 没有活动文档或未选择节点");
|
||||
MessageBox.Show("请先选择要保存的项目", "保存提示", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
// 保存当前选择状态
|
||||
var originalSelection = new List<ModelItem>();
|
||||
foreach (ModelItem item in document.CurrentSelection.SelectedItems)
|
||||
{
|
||||
originalSelection.Add(item);
|
||||
}
|
||||
|
||||
if (originalSelection.Count == 0)
|
||||
{
|
||||
LogManager.Warning("[LayerManagementViewModel] 当前没有选中的节点");
|
||||
MessageBox.Show("当前没有选中的节点,请先选择要保存的项目", "保存提示", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
var originalSelection = new List<ModelItem>(document.CurrentSelection.SelectedItems);
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 用户选中了 {originalSelection.Count} 个节点");
|
||||
foreach (var item in originalSelection)
|
||||
{
|
||||
LogManager.Info($"[LayerManagementViewModel] 选中节点: {item.DisplayName}");
|
||||
}
|
||||
|
||||
// 2. 生成默认文件名:根节点名_选中节点名_时间戳(多选时显示节点数量)
|
||||
// 生成默认文件名
|
||||
string defaultFileName = GenerateDefaultFileNameForMultipleItems(document, originalSelection);
|
||||
|
||||
// 3. 获取保存路径
|
||||
// 获取保存路径
|
||||
string saveFilePath = null;
|
||||
System.Windows.Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
@ -1856,199 +1839,90 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
|
||||
if (string.IsNullOrEmpty(saveFilePath))
|
||||
{
|
||||
LogManager.Info("[LayerManagementViewModel] 用户取消了保存操作");
|
||||
return;
|
||||
}
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 开始保存选中项目到: {saveFilePath}");
|
||||
LogManager.Info($"[LayerManagementViewModel] 保存 {originalSelection.Count} 个选中节点及其所有子项");
|
||||
|
||||
// 4. 使用借鉴自 ModelSplitterManager.ExportLayerToNwd 的精确隔离逻辑
|
||||
bool exportResult = false;
|
||||
string errorMessage = "";
|
||||
|
||||
try
|
||||
// 在主线程执行导出
|
||||
await Task.Run(() =>
|
||||
{
|
||||
// 收集要导出的项目(包含子节点)
|
||||
var itemsToExport = new List<ModelItem>();
|
||||
|
||||
foreach (var selectedItem in originalSelection)
|
||||
{
|
||||
// 添加选中节点本身
|
||||
itemsToExport.Add(selectedItem);
|
||||
LogManager.Info($"[LayerManagementViewModel] 添加选中节点到导出列表: {selectedItem.DisplayName}");
|
||||
|
||||
// 添加所有子节点(如果用户开启了包含子节点选项)
|
||||
if (IncludeChildNodes)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 使用DescendantsAndSelf来获取所有后代节点
|
||||
var childItems = selectedItem.DescendantsAndSelf.Where(x => x != selectedItem);
|
||||
int childCount = 0;
|
||||
|
||||
foreach (ModelItem child in childItems)
|
||||
{
|
||||
itemsToExport.Add(child);
|
||||
childCount++;
|
||||
}
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 为选中节点 {selectedItem.DisplayName} 添加了 {childCount} 个子节点");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Warning($"[LayerManagementViewModel] 遍历子节点失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 总共需要导出的节点数量: {itemsToExport.Count}");
|
||||
|
||||
// 核心修复:使用与 ModelSplitterManager.ExportLayerToNwd 相同的精确隔离逻辑
|
||||
// 在主线程中执行 Navisworks API 调用
|
||||
System.Windows.Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
LogManager.Info($"[LayerManagementViewModel] 在主线程中执行导出操作");
|
||||
// 收集要导出的项目 (仅根节点)
|
||||
var itemsToExport = new ModelItemCollection();
|
||||
itemsToExport.AddRange(originalSelection);
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 准备导出 {itemsToExport.Count} 个节点");
|
||||
|
||||
// 保存当前可见性状态
|
||||
LogManager.Info($"[LayerManagementViewModel] 开始保存当前可见性状态");
|
||||
var originalVisibilityState = SaveCurrentVisibilityState(document);
|
||||
LogManager.Info($"[LayerManagementViewModel] 已保存可见性状态");
|
||||
|
||||
try
|
||||
{
|
||||
// 使用 VisibilityHelper.IsolateSpecificItems 精确隔离显示
|
||||
// 这个方法已经在分层导出中验证有效,不会包含额外的祖先节点
|
||||
LogManager.Info($"[LayerManagementViewModel] 准备隔离显示 {itemsToExport.Count} 个节点");
|
||||
// 隔离显示
|
||||
bool isolateSuccess = VisibilityHelper.IsolateSpecificItems(itemsToExport);
|
||||
if (!isolateSuccess) throw new InvalidOperationException("隔离显示失败");
|
||||
|
||||
// 将 List<ModelItem> 转换为 ModelItemCollection
|
||||
var itemsToIsolate = new ModelItemCollection();
|
||||
foreach (var item in itemsToExport)
|
||||
{
|
||||
itemsToIsolate.Add(item);
|
||||
}
|
||||
|
||||
bool isolateSuccess = VisibilityHelper.IsolateSpecificItems(itemsToIsolate);
|
||||
|
||||
if (!isolateSuccess)
|
||||
{
|
||||
throw new InvalidOperationException("隔离显示失败");
|
||||
}
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] 隔离显示成功");
|
||||
|
||||
// 创建导出选项 - 使用用户配置的参数
|
||||
// 导出选项
|
||||
var exportOptions = new Autodesk.Navisworks.Api.NwdExportOptions
|
||||
{
|
||||
ExcludeHiddenItems = true, // 只导出可见项目(选中节点及其子项)
|
||||
ExcludeHiddenItems = true,
|
||||
EmbedXrefs = EmbedXrefs,
|
||||
PreventObjectPropertyExport = PreventObjectPropertyExport
|
||||
};
|
||||
|
||||
LogManager.Info($"[LayerManagementViewModel] SaveSelectedItems导出选项: EmbedXrefs={exportOptions.EmbedXrefs}, PreventObjectPropertyExport={exportOptions.PreventObjectPropertyExport}");
|
||||
LogManager.Info("[LayerManagementViewModel] 开始调用ExportToNwd API");
|
||||
|
||||
// 使用ExportToNwd API
|
||||
document.ExportToNwd(saveFilePath, exportOptions);
|
||||
|
||||
exportResult = true;
|
||||
LogManager.Info("[LayerManagementViewModel] ExportToNwd API调用完成");
|
||||
}
|
||||
finally
|
||||
{
|
||||
// 恢复原始可见性状态
|
||||
try
|
||||
{
|
||||
RestoreVisibilityState(document, originalVisibilityState);
|
||||
LogManager.Info("[LayerManagementViewModel] 已恢复原始可见性状态");
|
||||
}
|
||||
catch (Exception restoreEx)
|
||||
{
|
||||
LogManager.Error($"[LayerManagementViewModel] 恢复可见性失败: {restoreEx.Message}");
|
||||
}
|
||||
// 恢复可见性
|
||||
RestoreVisibilityState(document, originalVisibilityState);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Error($"[LayerManagementViewModel] 主线程导出异常: {ex.Message}", ex);
|
||||
LogManager.Error($"[LayerManagementViewModel] 导出异常: {ex.Message}", ex);
|
||||
errorMessage = ex.Message;
|
||||
exportResult = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 恢复原始选择
|
||||
// 恢复原始选择 (需要在主线程)
|
||||
System.Windows.Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
document.CurrentSelection.Clear();
|
||||
foreach (ModelItem item in originalSelection)
|
||||
{
|
||||
try
|
||||
{
|
||||
document.CurrentSelection.Add(item);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Warning($"[LayerManagementViewModel] 恢复选择项时出错: {ex.Message}");
|
||||
}
|
||||
}
|
||||
LogManager.Info("[LayerManagementViewModel] 已恢复原始选择");
|
||||
document.CurrentSelection.AddRange(originalSelection);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Warning($"[LayerManagementViewModel] 恢复选择失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogManager.Error($"[LayerManagementViewModel] 保存选中项目异常: {ex.Message}", ex);
|
||||
errorMessage = ex.Message;
|
||||
exportResult = false;
|
||||
}
|
||||
});
|
||||
|
||||
// 5. 显示结果
|
||||
// 显示结果
|
||||
if (exportResult)
|
||||
{
|
||||
if (File.Exists(saveFilePath))
|
||||
{
|
||||
var fileInfo = new FileInfo(saveFilePath);
|
||||
|
||||
// 构建选中节点的描述
|
||||
string nodeDescription;
|
||||
if (originalSelection.Count == 1)
|
||||
{
|
||||
nodeDescription = $"选中节点: {originalSelection[0].DisplayName}";
|
||||
}
|
||||
else
|
||||
{
|
||||
nodeDescription = $"选中 {originalSelection.Count} 个节点:\n";
|
||||
for (int i = 0; i < Math.Min(originalSelection.Count, 5); i++)
|
||||
{
|
||||
nodeDescription += $" • {originalSelection[i].DisplayName}\n";
|
||||
}
|
||||
if (originalSelection.Count > 5)
|
||||
{
|
||||
nodeDescription += $" ... 以及其他 {originalSelection.Count - 5} 个节点";
|
||||
}
|
||||
}
|
||||
|
||||
MessageBox.Show(
|
||||
$"保存选中项目成功!\n\n文件路径: {saveFilePath}\n文件大小: {fileInfo.Length / 1024} KB\n创建时间: {fileInfo.CreationTime}\n\n{nodeDescription}",
|
||||
$"保存成功!\n\n文件: {saveFilePath}\n大小: {fileInfo.Length / 1024} KB",
|
||||
"保存结果", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("保存操作完成,但文件不存在。", "保存结果", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show($"保存选中项目失败!\n\n错误信息: {errorMessage}\n\n请检查日志了解详细信息。",
|
||||
"保存结果", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
MessageBox.Show($"保存失败: {errorMessage}", "保存错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
|
||||
LogManager.Info("[LayerManagementViewModel] 保存当前选择项完成");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -2057,7 +1931,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
}
|
||||
finally
|
||||
{
|
||||
// 6. 简单的状态清理
|
||||
IsProcessing = false;
|
||||
}
|
||||
}
|
||||
@ -3276,7 +3149,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
return new {
|
||||
return new
|
||||
{
|
||||
Success = successCount > 0,
|
||||
Count = successCount,
|
||||
TotalCount = selectedItems.Count,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user