添加项目文件。
This commit is contained in:
158
RevitLess/RevitContext.cs
Normal file
158
RevitLess/RevitContext.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user