要先明白类型参数和实例参数怎么拿到。
类型参数的取法:
是基于族类型(FamilySymbol)来取的。当你得到一个族类型对象时,就可以使用下述三个方法来得到类型参数:
当然,实际还有更多方法。
需要注意的是,这三个方法,都定义在Element基类中:
---------------
下面看下实例参数的取法:
实例参数和类型参数是一样的,都是上面的方法。所不同的是他们的对象不同。
类型参数是使用对象FamilySymbol取到的,而实例参数是使用对象FamilyInstance取到的。
这2个对象,都继承自Element基类,所以,他们取参数,都是上面的那几个方法,是一样的。
-------------------
设置类型参数和实例参数的参数值,也就是修改参数值,也是一样的:
使用如上图红圈的方法即可。
最后,我列出一个Element扩展类,供您使用,你只要在项目中直接使用即可:
using Autodesk.Revit.DB; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RevitDevelopment.Extensions { /// <summary> /// 与元素有关的公共方法 /// </summary> /// <creator>marc</creator> public static class ElementExtensions { /// <summary> /// 设置族参数值 /// </summary> /// <param name="familySymbol">族类型</param> /// <param name="parameterName">族参数名称</param> /// <param name="parameterValue">族参数值。自动转英尺。</param> public static void SetParameterValue(this Element familySymbol, string parameterName, double parameterValue) { IList<Parameter> parameters = familySymbol.GetParameters(parameterName); CheckParametersCount(parameters, parameterName); Parameter p = parameters[0]; if (p.StorageType != StorageType.Double) { throw new InvalidOperationException("参数接受的类型为" + nameof(Double)); } CheckParameterIsReadOnly(p); p.Set(parameterValue / RevitConsts.FTToMMScale); } /// <summary> /// 设置族参数值 /// </summary> /// <param name="familySymbol">族类型</param> /// <param name="parameterName">族参数名称</param> /// <param name="parameterValue">族参数值</param> public static void SetParameterValue(this Element familySymbol, string parameterName, string parameterValue) { IList<Parameter> parameters = familySymbol.GetParameters(parameterName); CheckParametersCount(parameters, parameterName); Parameter p = parameters[0]; if (p.StorageType != StorageType.String) { throw new InvalidOperationException("参数接受的类型为" + nameof(String)); } CheckParameterIsReadOnly(p); p.Set(parameterValue); } /// <summary> /// 设置族参数值 /// </summary> /// <param name="familySymbol">族类型</param> /// <param name="parameterName">族参数名称</param> /// <param name="parameterValue">族参数值</param> public static void SetParameterValue(this Element familySymbol, string parameterName, int parameterValue) { IList<Parameter> parameters = familySymbol.GetParameters(parameterName); CheckParametersCount(parameters, parameterName); Parameter p = parameters[0]; if (p.StorageType != StorageType.Double) { throw new InvalidOperationException("参数接受的类型为" + nameof(Int32)); } CheckParameterIsReadOnly(p); p.Set(parameterValue); } /// <summary> /// 检查参数个数是否正常 /// </summary> /// <param name="parameters">参数列表</param> /// <param name="parameterName">参数名</param> private static void CheckParametersCount(IList<Parameter> parameters, string parameterName) { if (parameters.Count == 0) { return; } else if (parameters.Count > 1) { throw new InvalidOperationException($"存在多个名为【{parameterName}】的参数"); } } /// <summary> /// 检测参数是否只读 /// </summary> /// <param name="parameter">参数</param> private static void CheckParameterIsReadOnly(Parameter parameter) { if (parameter.IsReadOnly) { throw new InvalidOperationException("参数只读,不能修改"); } } } }
上图红圈,是该类的使用方法。上面红圈是类型参数值的修改。下面红圈是实体参数值的修改。