19. Revit API: Parameter(参数)

一、前言

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

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

其次,有时族上没有我们想要的信息,但又需要在族上存与展示,这时我们可以为元素批量加上参数,对应着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.SharedFilePathFileStream 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.mzph.cn/web/50236.shtml

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

相关文章

一文讲透如何使用CSS美化HTML界面

上一篇文章(初识HTML文件&#xff0c;创建自己的第一个网页&#xff01;)介绍了HTML文件&#xff0c;并实战练习了如何编写一个结构简单的HTML网页&#xff0c;但最后也提到了单纯使用HTML语言创建的网页并不美观&#xff0c;有没有一个东西像PS能够美化图片一样让我们能够对我…

【前端 16】使用Ajax发送异步请求

Ajax 基础入门&#xff1a;实现异步请求 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过使用 Ajax&#xff0c;可以在后台与服务器交换数据&#xff0c;这意味着可以在不影响用户…

【代码】Python3|Scrapy框架初探(汽车之家大连市二手车车辆数据爬取、清洗与可视化)

本篇主要是整个项目的介绍&#xff0c;没提到太多琐碎的技术细节&#xff0c;以后有空的话会整理一下 Scrapy 和原生爬虫的差异&#xff0c;还有它坑人的一些地方&#xff0c;单发出来。 开源地址&#xff1a;https://github.com/shandianchengzi/car_home_spider 使用说明&a…

Github 2024-07-28 php开源项目日报Top10

根据Github Trendings的统计,今日(2024-07-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目2TypeScript项目2Java项目1ASP项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar…

openssl 加密

使用tar命令在Linux中加密文件可以通过两种方式实现&#xff1a;使用gzip压缩的同时加密&#xff0c;或者使用加密选项。 1. 使用gzip压缩的同时加密&#xff1a; “ tar cz file1 file2 | openssl enc -e -aes256 -out archive.tar.gz.enc “ – cz&#xff1a;创建tar压缩文…

基于粒子群优化算法(PSO)永磁同步电机电流环多参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真模型简介 在同步旋转dq 轴坐标系下建立PMSM 数学模型&#xff0c;将定子dq 轴电压设为辨识模型和实际测量值的输入&#xff0c;设计了PSO 辨识PMSM 参数的适应度函数。该辨识方法不需推导复杂的电机数学…

R语言统计分析——整合和重构

参考资料&#xff1a;R语言实战【第2版】 R中提供了许多用来整合&#xff08;aggregate&#xff09;和重塑&#xff08;reshape&#xff09;数据的强大方法。在整合数据时&#xff0c;往往将多组观测替换为根据这些观测计算的描述性统计量。在重塑数据时&#xff0c;则会通过修…

STM32——GPIO(点亮LEDLED闪烁)

一、什么是GPIO&#xff1f; GPIO&#xff08;通用输入输出接口&#xff09;&#xff1a; 1.GPIO 功能概述 GPIO 是通用输入/输出&#xff08;General Purpose I/O&#xff09;的简称&#xff0c;既能当输入口使用&#xff0c;又能当输出口使用。端口&#xff0c;就是元器件…

数据结构(5.3_5)——二叉树的线索化

第一种寻找中序前驱方法 中序线索化 本质上就是一次中序遍历&#xff0c;只不过需要在一边遍历一边处理结点线索化 代码&#xff1a; //全局变量pre 指向当前访问结点的前驱 ThreadNode* pre NULL;struct ElemType {int value; };//线索二叉树结点 typedef struct ThreadNode…

linux练习2

一、搭建nfs服务器&#xff0c;客户端可从服务端/share目录上传与下载文件 **服务端** 1、下载相关安装包 [rootserver ~]# yum install rpcbind -y [rootserver ~]# yum install nfs-utils -y 2、 创建共享文件夹/share并授予权限 [rootserver ~]# mkdir /share [rootserv…

vector以及迭代器失效

前言 学习完string&#xff0c;之后学习的就是vector。vector就是之前C语言中讲到过的顺序表&#xff0c;用三个变量分别记录资源的位置&#xff0c;容器的容量和容器中元素个数。原来的写法是直接使用指针加两个int变量&#xff0c;而标准库中&#xff0c;三个都是由指针确定的…

sql server 连接报错error 40

做个简单的记录,造成40 的原因有很多,你的错误并不一定就是我遇到的这种情况. 错误描述: 首先我在使用ssms 工具连接的时候是可以正常连接的,也能对数据库进行操作. 在使用 ef core 连接 Sql Server 时报错: Microsoft.Data.SqlClient.SqlException (0x80131904): A network-r…

hadoop学习(二)

一.MapReduce 1.1定义&#xff1a;是一个分布式运算程序的编程框架 1.2核心功能&#xff1a;将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 1.3优点 1&#xff09;易于编程 它简单的实现一些接口&#…

【Linux】Ubuntu解决Release 文件已经过期问题

​今天在执行update更新软件包时遇到了此问题&#xff1a;E: http://cn.archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease 的 Release 文件已经过期(已经过期了 247天 21小时 33分 15秒)。该仓库的更新将不会应用&#xff0c;如图 ​ 这个报错之前其实经常遇到&#x…

电脑虚拟摄像头软件分享|用手机打破电脑摄像头的极限

随着手机摄像头的不断更新迭代&#xff0c;手机已经接近专业电脑摄像头的画质。这让我们可以花费更低的成本获取优质的电脑录像画面。今天小编给大家详细讲解电脑虚拟摄像头的在我们日常生活中的妙用&#xff0c;以及分享几款口碑不错的电脑虚拟摄像头软件。有需要的小伙伴可以…

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

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

「C++系列」数组

文章目录 一、数组1. 声明数组2. 初始化数组3. 访问数组元素4. 遍历数组注意事项示例代码 二、多维数组1. 声明二维数组2. 初始化二维数组3. 访问二维数组元素4. 遍历二维数组注意事项示例代码 三、指向数组的指针1. 声明指向数组的指针2. 通过指针访问数组元素3. 指针和数组的…

Android 10.0 framework默认沉浸式状态栏功能实现

1. 前言 在10.0的系统rom定制化开发中,在实现状态栏的某些定制化开发中,在某些产品需要实现沉浸式状态栏,就是需要app 能全屏显示同样也能显示状态栏,接下来就来分析下相关的功能实现 如图: 2.framework默认沉浸式状态栏功能实现的核心类 frameworks\base\core\java\andro…

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

文章目录 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;作者介绍&#…

国防科技大学深圳地区新生欢送会圆满举行

2024年7月28日&#xff0c;第97个八一建军节来临之际&#xff0c;在这个充满希望的盛夏时节&#xff0c;深圳地区迎来了13名即将踏入国防科技大学的优秀学子。 为了庆祝这一荣耀时刻&#xff0c;并表达对新生的深切祝福&#xff0c;在国防科技大学深圳校友会黄丹会长的积极倡议…