添加项目文件。
This commit is contained in:
138
Sai.Toolkit.Revit/Helpers/EncryptParameters.cs
Normal file
138
Sai.Toolkit.Revit/Helpers/EncryptParameters.cs
Normal file
@@ -0,0 +1,138 @@
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Sai.Toolkit.Revit.Helpers;
|
||||
|
||||
internal class EncryptParameters
|
||||
{
|
||||
public static bool InvokeModule(string mName, object[] parameters, bool apiModule = true)
|
||||
{
|
||||
try
|
||||
{
|
||||
MethodInfo m;
|
||||
|
||||
if (apiModule)
|
||||
|
||||
m = NativeModule.GetApiModuleMethod(mName);
|
||||
else
|
||||
|
||||
m = NativeModule.GetUiModuleMethod(mName);
|
||||
|
||||
m.Invoke(null, parameters);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class NativeModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取RevitAPI程序集Module内的方法名称.
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
public static MethodInfo GetApiModuleMethod(string name)
|
||||
{
|
||||
var module = GetApiModule();
|
||||
|
||||
var rs = module.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name).ToList();
|
||||
|
||||
return !rs.Any() ? null : rs.First();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取RevitAPIUI程序集Module内的方法名称.
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
public static MethodInfo GetUiModuleMethod(string name)
|
||||
{
|
||||
var module = GetUiModule();
|
||||
|
||||
var rs = module.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name).ToList();
|
||||
return !rs.Any() ? null : rs.First();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取RevitAPI Modules.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal static Module GetApiModule()
|
||||
{
|
||||
return typeof(Document).Assembly.Modules.First();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取RevitAPIUI Modules.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal static Module GetUiModule()
|
||||
{
|
||||
return typeof(UIDocument).Assembly.Modules.First();
|
||||
}
|
||||
}
|
||||
|
||||
public static class ParameterExtension
|
||||
{
|
||||
/// <summary>
|
||||
/// 设置参数对象对用户是否可见.
|
||||
/// </summary>
|
||||
/// <param name="parameter"></param>
|
||||
/// <param name="visible"></param>
|
||||
/// <returns></returns>
|
||||
public static bool SetVisibility(this Parameter parameter, bool visible)
|
||||
{
|
||||
var parameterIntPtr = parameter.ToParamDef();
|
||||
|
||||
if (parameterIntPtr == IntPtr.Zero)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var result = EncryptParameters.InvokeModule("ParamDef.setUserVisible", new object[] { parameterIntPtr, visible });
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将参数对象转为非托管指针.
|
||||
/// </summary>
|
||||
/// <param name="parameter"></param>
|
||||
/// <returns></returns>
|
||||
public static IntPtr ToParamDef(this Parameter parameter)
|
||||
{
|
||||
try
|
||||
{
|
||||
var m = typeof(Parameter).GetMethod("getParamDef", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
return (m?.Invoke(parameter, null) as Pointer).ToIntPtr();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class PointerExtension
|
||||
{
|
||||
/// 将指针转为句柄.
|
||||
/// <summary>
|
||||
/// 将指针转为句柄.
|
||||
/// </summary>
|
||||
/// <param name="p"></param>
|
||||
/// <returns></returns>
|
||||
public static IntPtr ToIntPtr(this Pointer p)
|
||||
{
|
||||
return (IntPtr)p.GetType().GetMethod("GetPointerValue", BindingFlags.NonPublic | BindingFlags.Instance)?.Invoke(p, null)!;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user