117 lines
4.7 KiB
C#
117 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows;
|
|
using Autodesk.Navisworks.Api;
|
|
using NavisApplication = Autodesk.Navisworks.Api.Application;
|
|
|
|
namespace NavisworksTransport.Utils
|
|
{
|
|
/// <summary>
|
|
/// NWD 文件导出工具类
|
|
/// 提供通用的 NWD 导出功能,与具体业务场景解耦
|
|
/// </summary>
|
|
public static class NwdExportHelper
|
|
{
|
|
/// <summary>
|
|
/// 导出指定对象到 NWD 文件
|
|
/// 使用 ExecuteInIsolation 自动计算并隐藏无关节点
|
|
/// </summary>
|
|
/// <param name="objects">要导出的对象列表</param>
|
|
/// <param name="filePath">导出文件路径</param>
|
|
/// <param name="excludeHiddenItems">是否排除隐藏项,默认 true</param>
|
|
/// <returns>导出文件路径,失败返回 null</returns>
|
|
public static string ExportToNwd(List<ModelItem> objects, string filePath, bool excludeHiddenItems = true)
|
|
{
|
|
if (objects == null || objects.Count == 0)
|
|
throw new ArgumentException("对象列表不能为空", nameof(objects));
|
|
if (string.IsNullOrEmpty(filePath))
|
|
throw new ArgumentException("文件路径不能为空", nameof(filePath));
|
|
|
|
var document = NavisApplication.ActiveDocument;
|
|
if (document == null)
|
|
{
|
|
LogManager.Warning("[NwdExportHelper] 没有活动文档");
|
|
return null;
|
|
}
|
|
|
|
// 必须在主线程执行
|
|
string result = null;
|
|
System.Windows.Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
// 准备要显示的项目
|
|
var itemsToShow = new ModelItemCollection();
|
|
foreach (var item in objects)
|
|
itemsToShow.Add(item);
|
|
|
|
// 在隔离模式下执行导出
|
|
result = VisibilityHelper.ExecuteInIsolation(itemsToShow, () =>
|
|
{
|
|
var exportOptions = new NwdExportOptions
|
|
{
|
|
ExcludeHiddenItems = excludeHiddenItems
|
|
};
|
|
|
|
document.ExportToNwd(filePath, exportOptions);
|
|
LogManager.Info($"[NwdExportHelper] NWD导出完成: {objects.Count} 个对象 -> {filePath}");
|
|
return filePath;
|
|
});
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 使用预计算的隐藏节点列表导出到 NWD 文件
|
|
/// 适用于已经遍历并计算好隐藏节点的场景(如剖面盒导出)
|
|
/// </summary>
|
|
/// <param name="objects">要导出的对象列表</param>
|
|
/// <param name="itemsToHide">预计算的隐藏节点集合</param>
|
|
/// <param name="filePath">导出文件路径</param>
|
|
/// <param name="operationName">操作名称(用于日志)</param>
|
|
/// <returns>导出文件路径,失败返回 null</returns>
|
|
public static string ExportToNwdWithPrecomputedHiddenItems(
|
|
List<ModelItem> objects,
|
|
ModelItemCollection itemsToHide,
|
|
string filePath,
|
|
string operationName = "NWD导出")
|
|
{
|
|
if (objects == null || objects.Count == 0)
|
|
throw new ArgumentException("对象列表不能为空", nameof(objects));
|
|
if (string.IsNullOrEmpty(filePath))
|
|
throw new ArgumentException("文件路径不能为空", nameof(filePath));
|
|
|
|
var document = NavisApplication.ActiveDocument;
|
|
if (document == null)
|
|
{
|
|
LogManager.Warning($"[NwdExportHelper] {operationName}失败:没有活动文档");
|
|
return null;
|
|
}
|
|
|
|
// 必须在主线程执行
|
|
string result = null;
|
|
System.Windows.Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
// 使用预计算隐藏节点的方法
|
|
result = VisibilityHelper.ExecuteWithPrecomputedHiddenItems(
|
|
itemsToHide,
|
|
() =>
|
|
{
|
|
var exportOptions = new NwdExportOptions
|
|
{
|
|
ExcludeHiddenItems = true
|
|
};
|
|
|
|
document.ExportToNwd(filePath, exportOptions);
|
|
|
|
LogManager.Info($"[NwdExportHelper] {operationName}完成: {objects.Count} 个对象,隐藏 {itemsToHide?.Count ?? 0} 个节点 -> {filePath}");
|
|
return filePath;
|
|
},
|
|
operationName
|
|
);
|
|
});
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|