2025-02-10 20:53:40 +08:00
|
|
|
|
using System.Reflection;
|
|
|
|
|
|
using Autodesk.Revit.DB;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
using Autodesk.Revit.UI;
|
|
|
|
|
|
|
2025-02-10 20:53:40 +08:00
|
|
|
|
namespace ShrlAlgo.Toolkit.Revit.Helpers;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
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)!;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|