下載app免費(fèi)領(lǐng)取會(huì)員
很多人出于某種用途為族設(shè)置特殊的參數(shù)之后,希望可以將其隱藏。在Revit官方暴露出來的API中,是沒有方法來實(shí)現(xiàn)的。以下代碼演示了如何將墻體所有參數(shù)隱藏!
using System;
using System.Linq;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using System.Reflection;
namespace RevitAPITest
{
[Transaction(TransactionMode.Manual)]
public class APITest : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
var uiDoc = commandData.Application.ActiveUIDocument;
var doc = uiDoc.Document;
var elemIds = uiDoc.Selection.GetElementIds();
if (elemIds.Count == 0)
{
TaskDialog.Show("Error", "Please select an element....!");
return Result.Failed;
}
var elem = doc.GetElement(elemIds.First());
//var eum = elem.Parameters.GetEnumerator();
var elemType = doc.GetElement(elem.GetTypeId()) as ElementType;
if (elemType == null)
{
return Result.Failed;
}
var eum = elemType.Parameters.GetEnumerator();
while (eum.MoveNext())
{
var parameter = eum.Current as Parameter;
parameter.SetVisibility(false);
}
return Result.Succeeded;
}
}
public class NativeCore
{
public static bool InvokeMoudle(string mName, object[] paramters, bool apiMoudle = true)
{
try
{
MethodInfo m = null;
if (apiMoudle)
m = NativeMoudle.GetAPIMoudlerMethod(mName);
else
m = NativeMoudle.GetUIMoudlerMethod(mName);
m.Invoke(null, paramters);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
public class NativeMoudle
{
/// 獲取RevitAPI程序集Moudle內(nèi)的方法名稱.
/// <summary>
/// 獲取RevitAPI程序集Moudle內(nèi)的方法名稱.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static MethodInfo GetAPIMoudlerMethod(string name)
{
var moudle = NativeMoudle.getAPIMoudle();
var rs = moudle.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name);
return rs.Count() == 0 ? null : rs.First();
}
/// 獲取RevitAPIUI程序集Moudle內(nèi)的方法名稱.
/// <summary>
/// 獲取RevitAPIUI程序集Moudle內(nèi)的方法名稱.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static MethodInfo GetUIMoudlerMethod(string name)
{
var moudle = NativeMoudle.getUIMoudle();
var rs = moudle.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name);
return rs.Count() == 0 ? null : rs.First();
}
/// 獲取RevitAPI Modules.
/// <summary>
/// 獲取RevitAPI Modules.
/// </summary>
/// <returns></returns>
internal static Module getAPIMoudle()
{
return typeof(Document).Assembly.Modules.First();
}
/// 獲取RevitAPIUI Modules.
/// <summary>
/// 獲取RevitAPIUI Modules.
/// </summary>
/// <returns></returns>
internal static Module getUIMoudle()
{
return typeof(UIDocument).Assembly.Modules.First();
}
}
public static class ParameterExtension
{
/// <summary>
/// 設(shè)置參數(shù)對象對用戶是否可見.
/// </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 = NativeCore.InvokeMoudle("ParamDef.setUserVisible", new object[]
{
parameterIntPtr, visible
});
return result;
}
/// <summary>
/// 將參數(shù)對象轉(zhuǎn)為非托管指針.
/// </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 ((Pointer)m.Invoke(parameter, null)).ToIntPtr();
}
catch
{
return IntPtr.Zero;
}
}
}
public static class PointerExtension
{
/// 將指針轉(zhuǎn)為句柄.
/// <summary>
/// 將指針轉(zhuǎn)為句柄.
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public unsafe static IntPtr ToIntPtr(this Pointer p)
{
return (IntPtr)p
.GetType()
.GetMethod("GetPointerValue", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(p, null);
}
}
}
本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。
下一篇:Revit二次開發(fā)教程:Revit API Hook 之 攔截鼠標(biāo)雙擊元素事件
推薦專題