Revity:查找并修改类型参数和实例参数

要先明白类型参数和实例参数怎么拿到。

 

类型参数的取法:

是基于族类型(FamilySymbol)来取的。当你得到一个族类型对象时,就可以使用下述三个方法来得到类型参数:

 

 

 

 当然,实际还有更多方法。

 

需要注意的是,这三个方法,都定义在Element基类中:

 

 ---------------

下面看下实例参数的取法:

实例参数和类型参数是一样的,都是上面的方法。所不同的是他们的对象不同。

类型参数是使用对象FamilySymbol取到的,而实例参数是使用对象FamilyInstance取到的。

这2个对象,都继承自Element基类,所以,他们取参数,都是上面的那几个方法,是一样的。

 

-------------------

设置类型参数和实例参数的参数值,也就是修改参数值,也是一样的:

Revity:查找并修改类型参数和实例参数_第1张图片

 

 使用如上图红圈的方法即可。

 

最后,我列出一个Element扩展类,供您使用,你只要在项目中直接使用即可:

using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RevitDevelopment.Extensions
{
    /// 
    /// 与元素有关的公共方法
    /// 
    /// marc
    public static class ElementExtensions
    {
        /// 
        /// 查找参数
        /// 
        /// 族类型
        /// 族参数名称
        public static Parameter FindParameter(this Element element, string parameterName)
        {
            IList parameters = element.GetParameters(parameterName);
            CheckParametersCount(parameters, parameterName);

            return parameters[0];
        }

        /// 
        /// 设置族参数值
        /// 
        /// 族类型
        /// 族参数名称
        /// 族参数值。自动转英尺。
        public static void SetParameterValue(this Element element, string parameterName, double parameterValue)
        {
            IList parameters = element.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);
        }

        /// 
        /// 设置族参数值
        /// 
        /// 族类型
        /// 族参数名称
        /// 族参数值
        public static void SetParameterValue(this Element element, string parameterName, string parameterValue)
        {
            IList parameters = element.GetParameters(parameterName);
            CheckParametersCount(parameters, parameterName);

            Parameter p = parameters[0];
            if (p.StorageType != StorageType.String)
            {
                throw new InvalidOperationException("参数接受的类型为" + nameof(String));
            }

            CheckParameterIsReadOnly(p);

            p.Set(parameterValue);
        }

        /// 
        /// 设置族参数值。将字符串的值直接赋给参数。
        /// 
        /// 族类型
        /// 族参数名称
        /// 族参数值
        public static void SetParameterValueString(this Element element, string parameterName, string parameterValueString)
        {
            IList parameters = element.GetParameters(parameterName);
            CheckParametersCount(parameters, parameterName);

            Parameter p = parameters[0];

            CheckParameterIsReadOnly(p);

            p.SetValueString(parameterValueString);
        }

        /// 
        /// 设置族参数值
        /// 
        /// 族类型
        /// 族参数名称
        /// 族参数值
        public static void SetParameterValue(this Element element, string parameterName, int parameterValue)
        {
            IList parameters = element.GetParameters(parameterName);
            CheckParametersCount(parameters, parameterName);

            Parameter p = parameters[0];
            if (p.StorageType != StorageType.Double)
            {
                throw new InvalidOperationException("参数接受的类型为" + nameof(Int32));
            }

            CheckParameterIsReadOnly(p);

            p.Set(parameterValue);
        }

        /// 
        /// 检查参数个数是否正常
        /// 
        /// 参数列表
        /// 参数名
        private static void CheckParametersCount(IList parameters, string parameterName)
        {
            if (parameters.Count == 0)
            {
                throw new InvalidOperationException($"不存在名为【{parameterName}】的参数");
            }
            else if (parameters.Count > 1)
            {
                throw new InvalidOperationException($"存在多个名为【{parameterName}】的参数");
            }
        }

        /// 
        /// 检测参数是否只读
        /// 
        /// 参数
        private static void CheckParameterIsReadOnly(Parameter parameter)
        {
            if (parameter.IsReadOnly)
            {
                throw new InvalidOperationException("参数只读,不能修改");
            }
        }
    }
}

  

Revity:查找并修改类型参数和实例参数_第2张图片

 

 上图红圈,是该类的使用方法。上面红圈是类型参数值的修改。下面红圈是实体参数值的修改。

你可能感兴趣的:(Revity:查找并修改类型参数和实例参数)