using System.Reflection; using Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace ShrlAlgo.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 { /// /// 获取RevitAPI程序集Module内的方法名称. /// /// /// 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(); } /// /// 获取RevitAPIUI程序集Module内的方法名称. /// /// /// 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(); } /// /// 获取RevitAPI Modules. /// /// internal static Module GetApiModule() { return typeof(Document).Assembly.Modules.First(); } /// /// 获取RevitAPIUI Modules. /// /// internal static Module GetUiModule() { return typeof(UIDocument).Assembly.Modules.First(); } } public static class ParameterExtension { /// /// 设置参数对象对用户是否可见. /// /// /// /// 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; } /// /// 将参数对象转为非托管指针. /// /// /// 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 { /// 将指针转为句柄. /// /// 将指针转为句柄. /// /// /// public static IntPtr ToIntPtr(this Pointer p) { return (IntPtr)p.GetType().GetMethod("GetPointerValue", BindingFlags.NonPublic | BindingFlags.Instance)?.Invoke(p, null)!; } }