19. Revit API: Parameter(参数)

news2024/11/17 8:54:23

一、前言

我们在前面或多或少提到也用到参数了,这篇便细讲一下。

首先,我们知道好多信息都藏在参数里,或者说可以从参数中获取。我们还能够通过调整参数的值,改变模型的形态,即族的参变。

其次,有时族上没有我们想要的信息,但又需要在族上存与展示,这时我们可以为元素批量加上参数,对应着Revit管理面板上的记载“参数”功能。

这几个的功能是什么怎么用就不讲了,去看帮助文档噢。

在这里插入图片描述

所以,这篇就讲这些内容:

  • 参数&内置参数
  • 族参数
  • 共享参数
  • 项目参数

二、Parameter

Parameter就是用来表示和操控元素信息的一类东西,所有的Element都有参数,可以使用通用的方法获取。

// Element Class
public ParameterSet Parameters { get; }
public IList<Parameter> GetParameters(...);

Parameter可以表示的元素字段类型有:DoubleIntegerStringElementId四种。

2.1. 方法

MethodsDescription
AsDouble
AsInteger
AsString
AsElementId
AsStringValue
获取double类型值,默认0
获取Intl类型值,默认0,常用作bool
获取string类型值,默认empty,用于文本描述
获取Id类型值,默认null,一般是关联作用
将值按照【显示格式】输出
Set(…) x4
SetValueString
设置参数值
CanBeAssociatedWithGlobalParameter(s)
DissociateFromGlobalParameter
GetAssociatedGlobalParameter
参数与全局参数的关联

很简单吧,主要就是获取与设置方法。

需要注意的是,一个参数只有1个值,我们需要使用对应的As方法获取。

所以这要求我们事先知道一个参数表示的是什么,以及用什么值类型表示的。

比如下面的面积,就需要使用AsDouble方法获取。
为什么是283.95呢?因为Revit计算,采用的是英尺作为单位。283.95平方英尺约等于26.38平方米。

在这里插入图片描述

2.2. 属性

再来看看属性,都是非常有用的。

PropertiesDescription
Definition参数的定义,包括参数名称、参数组、参数类型、单位类型
DisplayUnitType
HasValue
值显示的单位
是否有值
StorageType值的类型
UserModifiable值是否可以更改
IsShared是否为共享参数
  1. 值的类型可以让我们确定采用什么方法去获取值。
  2. 值的显示单位和参数定义上的单位类型,可以让我们计算出想要的值。

2.3. 参数名称 & 内置参数

我们知道Revit种有很多的参数,我们当然可以使用中文名称去获取,如上面的“面积”,但这样不好,Revit切换个语言代码就要炸了。

所以,对于Revit内置的参数,我们需要使用特定的代号去获取,它们都在BuiltInParameter(内置参数)枚举中。

可以通过RevitLookUp插件来获取,或者在文档中检索。

在这里插入图片描述


三、族参数

有时,一些族上没有我们需要的参数,但又需要用到,怎么办呢,那就加上呗。

  1. 编辑族,给这个族加个参数。
  2. 设置项目参数,让一批族都有这个参数。

这里,我们先讲第一种方式,第二种在后面项目参数那里讲。

3.1. 为族添加参数

来看流程:

  • 获取族、进入族编辑态
  • 获取族管理器
  • 开启事务,为族添加参数,提交事务
  • 将族载入到项目中
  • 关闭族文档
/// <summary>
/// 通过族实例为族添加参数
/// </summary>
/// <param name="familyInstance">族实例</param>
/// <param name="parameterName">参数名称</param>
/// <param name="builtInParameterGroup">参数组</param>
/// <param name="parameterType">参数类型</param>
/// <param name="isInstance">是否为族参数</param>
public static void CreateFamilyParameter(
    FamilyInstance familyInstance, 
    string parameterName,
    BuiltInParameterGroup builtInParameterGroup,
    ParameterType parameterType,
    bool isInstance = true)
{
    Document Document = familyInstance.Document;
    Document familyDocument = Document.EditFamily(familyInstance.Symbol.Family);
    FamilyManager familyManager = familyDocument.FamilyManager;

    using (Transaction ts = new Transaction(familyDocument, "创建参数"))
    {
        ts.Start();
        familyManager.AddParameter(parameterName, builtInParameterGroup, parameterType, isInstance);
        ts.Commit();
    }

    familyDocument.LoadFamily(Document, new ProjectFamLoadOption());
    familyDocument.Close(false);
}

3.2. FamilyManager(族管理器)

好吧,这个破玩意儿,当初可是找了好些时间,才知道有这么个类,及其离谱,非常不爽,鬼知道我都看了些什么。

简单瞅瞅吧,重要的加粗了。

MehtodsDescription
AddParameter(…) x3
RemoveParameter
RenameParameter
添加参数,3个重载,有一个可以添加共享参数
移除参数
修改参数名称
GetParameters
GetAssociatedFamilyParameter
获取参数
Set(…) x4
SetValueString
SetFormula
SetDescription
设置参数值

设置参数公式
设置参数描述
ReplaceParameter x2族参数和共享参数间的替换
MakeInstance
MakeType
MakeNonReporting
MakeReporting
设置参数为实例参数(各族实例可为不同值)
设置参数为类型参数(各族实例为相同值)
??
??
IsParameterLockable
IsParameterLocked
SetParameterLocked
参数锁定
DeleteCurrentType
RenameCurrentType
属性:Types
属性:CurrentType{ get; }
族类型,就下面这个。【Types需要注意*】。
image.png

属性Types注意:
族类型可以在族编辑文档中添加,也可在项目文档中,通过“编辑类型”添加。

  • 族文档中添加:Types能获取到
  • 项目文档编辑类型添加:Types不能获取到

在这里插入图片描述

3.3. FamilyParameter(族参数)

FamilyParameter,就上面的GetParameters()方法获取。不同于Parameter,虽然部分属性相同,但两者间并不存在继承/派生关系。

  • Parameter:倾向于值的读写
  • FamilyParameter:倾向于参数的定义

方法嘛,没有。就是一些属性,用来定义参数。

PropertiesDescription
Definition
DisplayUnitType
StorageType
定义
显示单位
存储类型(double、int …)
IsInstance
IsShared
IsReporting
是否为实例参数
是否为共享参数
?
IsReadOnly是否只读
UserModifiable是否通过交互修改
Formula
CanAssignFormula
IsDeterminedByFormula
公式
AssociatedParameters关联

3.4. 参数与族参数获取比较

这个还是有必要提一下的。

  1. 参数获取,自基类Element的GetParameters方法获取。
  2. 族参数获取,自族管理类FamilyManager的GetParameters方法获取。

前者,获取到“实例”元素上所有参数。
后者,获取到“抽象”元素(族)上所有参数。
那么可以理解前者比后者多一些吧,毕竟Revit在生成模型时还是会偷偷做一些操作的。

问题呢,在于族参数获取上。
我们在自定义族时,可以塞很多参数,能获取到。

如何只获取用户添加的参数呢?即过滤掉Revit给加上的参数。

目前我还没有去做,但一个可能的操作是:遍历排除所有BuiltInParameter中的参数
当然我没有去尝试,有兴趣的小伙伴可以试试。有更好的方法也欢迎留言。


四、项目参数 & 共享参数

项目参数的创建过程中,用到了一个叫“共享参数文件”的东西。

从Revit项目参数的交互创建方式上,可以看到既可以由“项目参数”定义,也可以从“共享参数”创建。

但从API上看,我们只能采用“共享参数”的方式,并没有Definition直接运用的方法。

所以,共享参数和项目参数的创建,代码上是同步的,就多一步少一步而已。

前面提示:共享参数仅是提供了参数定义,与其它元素并无关联关系。

在这里插入图片描述

4.1. 项目参数的创建

先来看看创建项目参数的创建流程:

  1. 文件,创建一个txt文件,获取其路径filePath(已有则不创建)
  2. 引用,app.SharedParametersFilename = filePath
  3. 打开,app.OpenSharedParameterFile()
  4. 定义,此时创建共享参数:DefinitionFile -> DefinitionGroup -> Definition -> ExternalDefinitionCreationOptions
  5. 类型,CategorySet -> Category
  6. 绑定,Binding -> InstanceBinding / TypeBinding
  7. 应用,此时绑定项目参数。BindingMap:doc.ParameterBindings.Insert(…)

流程有了,那就来看看代码示例吧。名称,

/// <summary>
/// 为指定类型的元素创建项目参数
/// </summary>
/// <param name="uidoc">文档</param>
/// <param name="parameterName">参数名称</param>
/// <param name="builtInCategory">指定元素的类别</param>
/// <param name="parameterType">参数类型</param>
public void CreateProjectParameter(
    UIDocument uidoc,
    string parameterName,
    BuiltInCategory builtInCategory,
    ParameterType parameterType)
{
    Document doc = uidoc.Document;
    Autodesk.Revit.ApplicationServices.Application app = uidoc.Application.Application;
    // 1.
    string filePath = Path.Combine(Config.SharedFilePath, "MySharedParameterFile.txt");  // Config.SharedFilePath
    FileStream fs = File.Create(filePath);
    fs.Close();
    // 2.
    app.SharedParametersFilename = filePath;
    // 3.
    DefinitionFile definitionFile = app.OpenSharedParameterFile();
    
    // 4. 共享参数创建
    DefinitionGroup group = definitionFile.Groups.get_Item("Group");
    group ??= definitionFile.Groups.Create("Group");

    Definition definition = group.Definitions.get_Item(parameterName);
    if (definition == null)
    {
        ExternalDefinitionCreationOptions edco = new ExternalDefinitionCreationOptions(parameterName, parameterType);
        definition = group.Definitions.Create(edco);
    }
    
    // 5.
    CategorySet categories = app.Create.NewCategorySet();
    Category category = doc.Settings.Categories.get_Item(builtInCategory);
    categories.Insert(category);

    // 6. 
    ElementBinding binding = app.Create.NewInstanceBinding(categories); //  new InstanceBinding(categories);
    //ElementBinding binding = app.Create.NewTypeBinding(categories);

    // 7. 项目参数绑定
    BindingMap bingingMap = doc.ParameterBindings;
    bingingMap.Insert(definition, binding);

    doc.Regenerate();
    
    //definitionFile.Dispose();
    //File.Delete(filePath);
}

// 使用
this.CreateProjectParameter( uiDoc, "MySharedParameter", BuiltInCategory.OST_Walls,ParameterType.Text);

使用效果如下:
在这里插入图片描述

4.2. 项目参数的删除

项目参数删除,需要从BindingMap中找到要删除的参数Definition

// 删除项目参数
public void DeleteProjectParameter(UIDocument uiDoc, string parameterName, BuiltInCategory builtInCategory = BuiltInCategory.INVALID)
{
    Document doc = uiDoc.Document;
    BindingMap bindingMap = doc.ParameterBindings;

    DefinitionBindingMapIterator iterator = bindingMap.ForwardIterator();

    List<Definition> removeds = new List<Definition>();

    while (iterator.MoveNext())
    {
        Definition definition = iterator.Key;
        if (definition.Name == parameterName)
        {
            if (builtInCategory != BuiltInCategory.INVALID)
            {
                ElementBinding binding = iterator.Current as ElementBinding;
                CategorySet categories = binding.Categories;
                Category category = doc.Settings.Categories.get_Item(builtInCategory);  // Category.GetCategory(doc, builtInCategory);
                if (categories.Contains(category))
                    removeds.Add(definition);
            }
            else
            {
                removeds.Add(definition);
            }
        }
    }

    foreach (Definition definition in removeds)
    {
        bindingMap.Remove(definition);
    }

    doc.Regenerate();
}

4.3. 共享参数的删除

哎~项目参数是删除了,共享参数可咋办嘞。

咋办,凉拌。: |

不知道通过代码删,没见提供删除方法哇。

4.4. 族共享参数

是“族共享参数”,不是“共享参数”嗷。

共享参数是可以塞给族的,这样就能够单个族拥有该参数了,而不会像项目参数那样,给整个类型的族。

怎么做到的呢?

结合上面的“族管理器”和“项目参数创建”连部分内容。

// FamilyManager 添加共享参数
public FamilyParameter AddParameter(
	ExternalDefinition familyDefinition,
	BuiltInParameterGroup parameterGroup,
	bool isInstance
)
  1. 走创建共享参数那套流程,整个ExternalDefinition出来。
  2. 走族管理器那套流程,把这个外部参数定义给塞进去

删除嘛,通过族管理器删除咯。

emm…我直接把共享参数删掉(交互),通过共享参数添加的族参数还在,也就是说,这两着并无关联,创建仅仅是采用了共享参数中的参数定义 ㄟ( ▔, ▔ )ㄏ。上面补充提示了嗷。

吐槽:花里胡哨的,有个锤子用


五、总结

写完参数相关的内容了,

鼓掌👏👏👏

结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CAN通讯系列4】CAN通讯如何传递信号?

在【CAN通讯系列3】如何学习CAN通讯&#xff1f;中举了一个例子&#xff1a;新能源汽车要实现驱动功能&#xff0c;先需要整车控制器VCU计算目标转速或扭矩请求等信号&#xff0c;再通过CAN通讯传递给电机控制器MCU&#xff0c;就这个例子继续探讨CAN通讯的基础问题。 1 CAN数据…

入门 PyQt6 看过来(案例)08~ 页面布局

主题&#xff1a;学习页面布局控件以及布局容器的使用&#xff08;理论知识&#xff09; 1 布局控件 PyQt6的布局方式包括绝对布局、水平布局、垂直布局、网格布局和表单布局。 绝对布局&#xff1a;直接设置控件对象在参考坐标中的位置水平布局&#xff1a;对加入的控件对象从…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错&#xff1a; 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决&#xff1a; 进入对应的 json 文件&#xff1a; 修改&#xff1a; "noEmit": false 当 noEmit 设置为 false 时&#xff0c;TypeScript 编译器将根据项目配置生成相应的输出文…

【数据结构初阶】单链表经典算法题十道(详解+图例)—得道飞升(终篇)

hi &#xff01; 目录 9、 环形链表 || 10、随机链表的复制 终章 9、 环形链表 || 【图解】 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *detectCy…

Live800:客户服务中的情感智能,建立深厚客户关系的秘诀

在当今竞争激烈的市场环境中&#xff0c;客户服务已成为企业脱颖而出的关键因素之一。而情感智能&#xff0c;作为客户服务中的重要组成部分&#xff0c;更是建立深厚客户关系、提升客户满意度的秘诀所在。优秀的客户服务不仅关乎问题的解决&#xff0c;更在于情感的交流与共鸣…

物联网云盒多路开关量模拟量转无线MQTT钡铼技术S275

物联网云盒多路开关量模拟量转无线MQTT技术在现代工业自动化和远程监测中扮演着关键角色。钡铼第四代RTU S275作为一款先进的物联网数据监测采集控制短信报警终端&#xff0c;集成了多种先进技术和功能&#xff0c;旨在提升远程数据采集与控制的效率和可靠性。 钡铼第四代RTU …

在Ubuntu 12.10上安装和使用tmux的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 tmux tmux 是一个终端复用工具。它允许您使用多个虚拟终端访问 tmux 终端。 tmux 利用了客户端-服务器模型&#xff0c;这使您可…

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

【OSCP系列】OSCP靶机-LemonSqueezy(原创)

【OSCP系列】OSCP靶机-LemonSqueezy 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 只有一个80端口 3、版本系统探测 80端口http的apache服务&#xff0…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变&#xff0c;带着运气和实力以社招身份重新看今天的互联网环境&#xff0c;从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试&#xff0c;申请了一个周日&#xff0c;直接安排三面。下周周中就开启…

【神经网络】梯度下降的优化方法【数学公式+代码示例】

文章目录 1、简介2、指数加权平均2.1、公式2.2、代码 3、Momentum⭐3.1、公式演变3.2、代码 4、AdaGrad4.1、计算步骤4.2、代码示例 5、RMSProp5.1、公式5.2、代码5.3、小结 6、Adam6.1、公式和步骤解释⭐6.2、代码⭐6.3、优点 7、何为鞍点8、小结 &#x1f343;作者介绍&#…

Unity3D 转换微信小游戏指引 05 广告内购

Unity3D 转换微信小游戏指引系列&#xff08;第五期 完结&#xff09; 广告 在小程序后台页面找到推广->流量主 开通条件如下&#xff1a; 开通之后&#xff0c;需要接入广告组件。 调用创建广告组件的接口时&#xff0c;需要传入参数 adUnitId&#xff0c;这个是开通流量…

等保测评练习卷20

等级保护初级测评师试题20 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 应根据资产的危害程度对资产进行标识管理&#xff0c;根据资产的价值选择相应的管理措施&#xff08;F&#xff09;不是危…

十七、操作符详解(2)

1.操作符 &#xff08;1&#xff09;按位取反~ C语言中&#xff0c;0的符号位是0。 例&#xff1a;int a 0; ~a -1 按二进制补码取反&#xff0c;符号位也要取反&#xff0c;打印的是原码。 把一个数的二进制位的第n位变成1&#xff1a;a a | (1<<n-1) 应用场合 把…

猫头虎分享:图文创作者发布文章之前需要预览哪些内容?

&#x1f4dd; 猫头虎分享&#xff1a;作为创作者发布文章之前&#xff0c;需要预览哪些内容&#xff1f; 摘要 在发布一篇文章之前&#xff0c;预览是一个至关重要的步骤。确保文章的结构完整性、内容的连贯性以及读者的阅读体验&#xff0c;都是我们需要关注的重点。本文将…

OSPF动态路由协议实验

首先地址划分 一个骨干网段分成三个&#xff0c;r1&#xff0c;r2&#xff0c;r5三个环回网段 &#xff0c;总共要四个网段 192.168.1.0/24 192.168.1.0/26---骨干网段 192.168.1.0/28 192.168.1.16/28 192.168.1.32/28 备用 192.168.1.64/28 192.168.1.64/26---r1环回 192.1…

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月&#xff0c;被业界称为“金九银十”&#xff0c;这是人才市场一年中最活跃的时期。此时&#xff0c;企业为了来年的业务扩展&#xff0c;纷纷加大招聘力度&#xff0c;空缺岗位众多&#xff0c;招聘需求集中。同时&#xff0c;初秋的招聘活动也避开酷暑&am…

物理数据库迁移到云上

物理数据库迁移到云上 物理数据库迁移到云上通常需要以下步骤: 评估和规划 评估物理数据库的需求和约束条件&#xff0c;确定迁移的目标。考虑数据库大小、性能要求、数据复杂性等因素&#xff0c;选择合适的云服务提供商和服务模式。 设置云环境 在云平台上创建适当的虚拟…

特朗普比特币演讲:“梭哈”比特币,“抵制”数字美元!懂王新晋喊单王:比特币冲上月球,永远不要出售比特币!

2024年7月28日&#xff0c;在比特币大会(Bitcoin 2024)上&#xff0c;前总统特朗普发表了一场激情澎湃的演讲&#xff0c;放出了一系列令人振奋的政策诺言&#xff0c;引发了全场加密货币支持者的热烈掌声。特朗普表示&#xff0c;如果再次当选总统&#xff0c;他将采取一系列强…