Autodesk Revit参数化设计之道:Dynamo实战剖析
上QQ阅读APP看书,第一时间看更新

2.1 案例1:幕墙嵌板编号

1.案例背景

随着装配式建筑的发展日益成熟,预制构件的运输、吊装、定位、施工等过程,均需要根据施工工艺顺序提前对构件进行编码。预制构件的数量多且烦琐,人为因素的影响会产生编码错误和重复劳动;同时构件的编码又有一定的规则,利用这一逻辑,借助于Dynamo软件可进行快速准确的编码工作。

本案例以幕墙嵌板为例进行简单的讲解,实现快速自动编码,如图2-1所示。

图2-1

2.解决方案

选择幕墙嵌板→根据幕墙嵌板数量生成编码列表→将生成的编码按顺序依次为每个幕墙嵌板参数赋值。

3.案例知识点

● Dynamo与Revit的数据交互

● Revit数据写入

● Dynamo列表过滤

● Categories

● All Elements of Category

● All Elements of Family Type

● GetParameterValueByName

● Element. SetParameterByName

● String

● List. List. FilterByBoolMask

● FamilyType. Name

4.案例详解

(1)选择幕墙嵌板族实例。打开案例文件,进入Dynamo界面。

利用Dynamo与Revit的数据交互,在Dynamo中选择Revit的构件。选择元素的节点在Revit下的Selection(选择)里,如图2-2所示。

图2-2

Selection(选择)中又有多种选择方式,结合最初的解决方案,通过Categories(族类别)、All Elements of Category(选择项目中该族类别的所有族实例)节点对,在项目中获取“幕墙嵌板类别”的所有族实例。

在Dynamo中,对于族类别、族、族类型、族实例都有着如图2-3所示的对应关系。

结合对应关系,找到了Categories(族类别)这个节点,但最终目的是要对这个类别下的所有幕墙嵌板族实例进行编码,所以需要提取该类别的所有族实例,也就是选择All Elements of Category(选择项目中该族类别的所有族实例)这个节点,使之连成一组,如图2-4所示。

图2-3

图2-4

(2)设置幕墙嵌板族实例参数。有一对节点常用于Revit构件参数信息数据的读取与写入,分别是Revit→Elements(Revit图元)→Element(族实例)中的GetParameterValueByName(根据参数名获取参数的值)和SetParameterByName(根据参数名设置参数的值),如图2-5所示。

图2-5

而在本项目中,需要Element.SetParameterByName(根据参数名设置参数的值)这个节点,如图2-6所示。根据节点的输入信息,需要对哪个族实例(element)的哪个参数(parameterName)设置什么值(value)。

幕墙嵌板的编码信息一定要写入一个实例参数,而不是类型参数。

在这里暂定将编码信息写入“注释”这个参数,当然也可以创建一个单独的项目实例参数用于存储编码信息。参数(parameterName)需要连接一个字符串,即Input(输入)→Basic(基础数据)→String(字符串)节点,如图2-7所示。

图2-6

图2-7

根据现有节点和逻辑,先尝试连接现有节点,如图2-8所示。

图2-8

(3)幕墙嵌板编码。对于幕墙嵌板的编码,需要根据嵌板的总数n,生成一个1~n的数列(列表),然后将值赋到“注释”这个参数里。

这是一个关于列表的问题,在List(列表)下找到Count(获取列表项数)节点来统计嵌板族实例的总数。通过简单的DesignScript语言,利用Code Block节点,生成一个1~n的列表,如图2-9所示。

图2-9

运行之后系统会报错,这是由于数据类型的不对应,这也是常见的错误。

要保证接收数据类型的正确性。Value(值)接收的数据类型是string(字符串),所以找到String from Object(将对象类型转化为字符串)节点,将对象转化为字符串,如图2-10所示。

图2-10

这样便实现了对幕墙嵌板的编码,如图2-11所示。

图2-11

可以结合标记族对编码进行检查,如图2-12所示。

图2-12

通过观察测试发现,Dynamo会根据幕墙绘制的起点、终点确定编码1的起点位置。同时也会根据幕墙嵌板的层数按从左到右递增的规律进行编码。默认情况下,构件编码顺序是按照放置在项目中的先后顺序编码。

5.案例拓展

在项目实际应用中,同一个项目有多种幕墙嵌板类型,以上根据族类别选择族实例方法,将一次性选择所有幕墙嵌板族实例,不能实现根据幕墙嵌板族类型,分别编码应用。如图2-13所示,同一项目中有点爪式幕墙嵌板和玻璃嵌板两种。

图2-13

根据族类别、族、族类型、族实例的层级关系,也可以通过选择族类型实现对构件的选择,如图2-14所示。结合对应关系,找到了Family Types(族类型)这个节点,但最终目的是要对这个类型下的所有幕墙嵌板族实例进行编码,所以需要提取所有类型的族实例,也就是选择All Elements of Family Type(在项目中获取该族类型的所有构件)这个节点,使之连成一组。

图2-14

根据以上内容及所学知识,读者自行补充完善脚本。

6.脚本优化

在项目实际应用中,幕墙嵌板下料生成是根据施工组织计划按进度按需下料,可能会要求按楼层或按朝向分别给幕墙嵌板类型编码。

通过族类别、族类型选择构件的方法只能实现选择所有族类型或族类别实例,且需要用户对Revit中的属性有清楚的认识,并不能实现按楼层或按分区朝向过滤编码;最好能采用直接框选构件的方法,再将族类型名称作为过滤的判断依据,最后分别编码。

(1)框选族实例。利用Revit→Selection(选择)→Select Model Elements(选择Revit图元实例),选择多个构建元素。Select Model Element(选择Revit图元实例)用于选择一个构件元素,如图2-15所示。

图2-15

(2)读取族类型名称。因为要使用族类型名称作为过滤的判断依据,所以需要读取Revit中框选的族实例名称。在Revit→Elements(Revit图元)→FamilyType(族类型)中选择Name(查询族类型名称)节点,如图2-16所示。

图2-16

(3)过滤族类型。Dynamo的数据处理都是对列表的处理,接下来需要找一个过滤的节点。

在List(列表)里找到两个过滤节点:Filter(通过函数条件过滤)和FilterByBoolMask(通过布尔条件过滤),如图2-17所示。本案例将讲解List.FilterByBoolMask(通过布尔条件过滤)节点的使用。

图2-17

List.FilterByBoolMask(通过布尔条件过滤)节点需要对列表进行布尔判断。那么判断的依据是什么?根据族类型名称是否等于“玻璃”或“点爪式幕墙嵌板”进行true(真值)和false(假值)的判断,如图2-18所示。

图2-18

如何建立两者的逻辑判断联系?

筛选出框选构件里族类型名称等于“玻璃”或“点爪式幕墙嵌板”的构件,并通过布尔运算判断连接FilterByBoolMask(通过布尔条件过滤)节点的mask(过滤布尔列表)。在这里介绍Math(数学)→Operators(运算符)→“==”节点,该节点用于判断两个端口的输入值是否相等,并输出布尔值[true(真值)和false(假值)],如图2-19所示。注意对比数据信息格式的一致性,同类才能比较。

图2-19

框选元素列表,通过List.FilterByBoolMask(通过布尔条件过滤)节点,按true(真值)和false(假值)的逻辑判断,分别从in和out输出结果,如图2-20所示。

图2-20

这里需要注意的是,要得到Revit中族类型名称为“玻璃”的元素,需要将“Elements”(Revit图元)接入List.FilterByBoolMask(通过布尔条件过滤)节点的“list”(列表),而不是接入族类型名称,如图2-21所示。

图2-21

(4)编码。如果要对不同类型的幕墙嵌板设置不同的前缀,如朝向分区等,直接用“+”连接即可。结合解决方案中的知识点,完成剩下的内容,如图2-22所示。保存文件。

图2-22

思考

能不能按照设定的要求或路径进行编码?