您的位置:首页 > 其它

Revit API 进阶之隐藏Element用户可见参数.

2017-02-26 00:39 295 查看
在阅读本文章之前,应具有一定Revit API开发基础.

在RevitAPI进阶其他博文中讲到此话题,但是并没有具体代码示例,在此即贴出具体代码,如下所示:

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 tr
4000
ue;
}
catch (Exception ex)
{
return false;
}
}
}

public class NativeMoudle
{
/// 获取RevitAPI程序集Moudle内的方法名称.
/// <summary>
/// 获取RevitAPI程序集Moudle内的方法名称.
/// </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内的方法名称.
/// <summary>
/// 获取RevitAPIUI程序集Moudle内的方法名称.
/// </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>
/// 设置参数对象对用户是否可见.
/// </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>
/// 将参数对象转为非托管指针.
/// </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
{
/// 将指针转为句柄.
/// <summary>
/// 将指针转为句柄.
/// </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);
}
}
}








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: