Files
RevitArchive/RevitLess/RevitContext.cs
2026-02-23 14:58:05 +08:00

158 lines
5.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using Autodesk.Revit;
using Autodesk.Revit.DB;
namespace RevitLess
{
/// <summary>
/// Revit环境
/// </summary>
internal class RevitContext
{
/// <summary>
/// 使用此构造方法前需要调用 RevitContext.AddEnv();
/// </summary>
static RevitContext()
{
OnAssemblyResolve();
}
public event EventHandler<Product> InitFinished;
//用于判断当前类的实例是否存在
private static readonly object lockobj = new();
private static RevitContext _instance;
/// <summary>
/// revit程序目录
/// </summary>
public static string RevitAppPath;
// 此路径为动态反射搜索路径 、 此路径可为任意路径只要路径下有RevitNET 所需依赖项即可,完整依赖项可在 Naviswork 2016 下面找到)
private Product revitProduct;
/// <summary>
/// Revit应用程序实例
/// </summary>
public Autodesk.Revit.ApplicationServices.Application Application => revitProduct?.Application;
/// <summary>
/// 自身静态类,单例,内存中只有一份
/// </summary>
public static RevitContext Instance
{
get
{
if (_instance == null)
{
lock (lockobj)
{
_instance ??= new RevitContext();
}
}
return _instance;
}
}
/// <summary>
/// 打开REVIT文件时的设置
/// </summary>
public OpenOptions OpenOptions { get; set; }
public void Exit()
{
revitProduct?.Exit();
}
public void InitRevitAppAndOpenFile()
{
InitFinished?.Invoke(this, revitProduct);
}
/// <summary>
/// 添加revit安装路径到环境变量以便加载相应的DLL
/// </summary>
/// <param name="revitPath">添加revit安装路径</param>
public static void OnAssemblyResolve(string revitPath = null)
{
if (revitPath != null)
{
RevitAppPath = revitPath;
}
AddEnvironmentPaths(RevitAppPath);
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
/// <summary>
/// 打开文件
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public Document OpenFile(string filename)
{
if (File.Exists(filename))
{
ModelPath model = new FilePath(filename);
return revitProduct.Application.OpenDocumentFile(model, OpenOptions);
}
throw new FileNotFoundException($"{filename}不存在。");
}
public void Run()
{
OpenOptions = new OpenOptions
{
Audit = true,
AllowOpeningLocalByWrongUser = false,
DetachFromCentralOption = DetachFromCentralOption.DetachAndDiscardWorksets //从中心模型分离
};
revitProduct = Product.GetInstalledProduct();
var clientApplicationId = new ClientApplicationId(Guid.NewGuid(), "RevitContext", "BIM");
revitProduct.SetPreferredLanguage(Autodesk.Revit.ApplicationServices.LanguageType.Chinese_Simplified);
revitProduct.Initialize_ForAutodeskInternalUseOnly(clientApplicationId, "I am authorized by Autodesk to use this UI-less functionality.");
}
/// <summary>
/// 添加环境变量
/// </summary>
/// <param name="paths">revit安装路径</param>
private static void AddEnvironmentPaths(params string[] paths)
{
string[] first =
{
Environment.GetEnvironmentVariable("PATH") ?? string.Empty
};
var value = string.Join(Path.PathSeparator.ToString(), first.Concat(paths));
Environment.SetEnvironmentVariable("PATH", value);
}
/// <summary>
/// 动态加载revit相关的dll
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var assemblyName = new AssemblyName(args.Name);
var text = $"{Path.Combine(RevitAppPath, assemblyName.Name)}.dll";
////$字符将{0}占位直接用对象相关字段替换
//var file = string.Format("{0}.dll", System.IO.Path.Combine(item, assemblyName.Name));
if (File.Exists(text))
{
//Console.WriteLine($"加载Revit Dll路径:{text}");
return Assembly.LoadFrom(text);
}
return args.RequestingAssembly;
}
}
}