惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - Franky
V
V2EX
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 叶小钗
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
D
Docker
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志

博客园 - 愚

Revit:二开使用Sqlite保存本地数据,并配合EF6等ORM框架 复习一下UML Revit:ElementFilter过滤器基类 Revit:Element、Reference、ReferenceIntersector、ReferenceWithContext的理解 Revit:使用代码如何发出选点、选对象指令 Reivt:过滤器FilteredElementIterator,采集器FilteredElementCollector Revit:Transaction事务 Revit:弄清楚Application、UIApplication、UIDocument 、Document、DocumentSet之间的关系 Revit:IExternalCommand和IExternalApplication的区别 什么是假程序员 若我有一天 聊聊面试官那些事。。分享我的个人看法,认同的顶一顶。。。 提供一个中国身份证号码判断的类 分享一个自己写的取中国农历相关数据的类。包含:农历年月日,生肖,星座,年龄,天干,地支等方法 从结亲网 的架构谈起,谈什么架构, 我理解的架构。我想很多人理解的架构应该可能比较 狭义 面向对象的全套“企业微信”api接口的代码实现,网上太多“面向过程”微信api接口的代码,这个开源给需要的人用 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下) (原创)面向对象的系统对接接口编写。第5篇(完结) (原创)面向对象的系统对接接口编写。第4篇
Revity:查找并修改类型参数和实例参数
· 2020-08-05 · via 博客园 - 愚

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

类型参数的取法:

是基于族类型(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="element">族类型</param>
        /// <param name="parameterName">族参数名称</param>
        public static Parameter FindParameter(this Element element, string parameterName)
        {
            IList<Parameter> parameters = element.GetParameters(parameterName);
            CheckParametersCount(parameters, parameterName);

            return parameters[0];
        }

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

        /// <summary>
        /// 设置族参数值
        /// </summary>
        /// <param name="element">族类型</param>
        /// <param name="parameterName">族参数名称</param>
        /// <param name="parameterValue">族参数值</param>
        public static void SetParameterValue(this Element element, string parameterName, string parameterValue)
        {
            IList<Parameter> 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);
        }

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

            Parameter p = parameters[0];

            CheckParameterIsReadOnly(p);

            p.SetValueString(parameterValueString);
        }

        /// <summary>
        /// 设置族参数值
        /// </summary>
        /// <param name="element">族类型</param>
        /// <param name="parameterName">族参数名称</param>
        /// <param name="parameterValue">族参数值</param>
        public static void SetParameterValue(this Element element, string parameterName, int parameterValue)
        {
            IList<Parameter> 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);
        }

        /// <summary>
        /// 检查参数个数是否正常
        /// </summary>
        /// <param name="parameters">参数列表</param>
        /// <param name="parameterName">参数名</param>
        private static void CheckParametersCount(IList<Parameter> parameters, string parameterName)
        {
            if (parameters.Count == 0)
            {
                throw new InvalidOperationException($"不存在名为【{parameterName}】的参数");
            }
            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("参数只读,不能修改");
            }
        }
    }
}

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