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
思考
能不能按照设定的要求或路径进行编码?