当前位置 博文首页 > 文章内容

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

    作者: 栏目:未分类 时间:2020-08-05 16:03:40

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



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

     

    类型参数的取法:

    是基于族类型(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("参数只读,不能修改");
                }
            }
        }
    }
    

      

     

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