1)设定目标
标签门编号的脚本略有不同。相对于“房间”,“门”元件在平面中目标较小,穿过每一个“门”去绘制曲线略显麻烦,所以这里的脚本就不会通过“导向曲线与元件相交”的方式来排序,而是通过“导向曲线与元件相邻”的方式来获取排位。在这个方式中,导向曲线只需要通过“需进行重新编号的模型元件”区域,不需要严格相交,再用相邻“门”元件坐标点来定义导向曲线点位,最后利用导向曲线点位顺序对“门”元件进行重新编号。
2)节点思路
选择项目文件中的“门”元件,并获得定义其位置的坐标点,绘制代表排序顺序的导向曲线,不需要与“门”严格相交,但尽量相邻。接着通过将定位坐标点投影到相邻导向曲线的方式将“门”元件坐标点重新排序,进而根据该排序对“门”元件进行重新编号。脚本节点群组主体结构如下:
①取得门元件并获得定位坐标。
②取得导向曲线并根据门元件定位坐标点取得导向曲线上对应位置的坐标点。
③通过坐标点顺序将门元件排序获得新的门列表。
④根据新门列表顺序为门元件编号。
3)分步说明
(1)打开项目“范例文件.rvt”或使用任何有门元素的项目文件,绘制代表排序顺序的导向曲线尽量与“门”相邻,运行Dynamo 并打开范例文件“05门批次编号(按导向曲线方向).dyn”(见图4.24)。
图4.24 Dynamo 节点范例
“获取数据”节点在本脚本用来取得需要编号的门元件及指引门元件编号的导向曲线。运用“Category”和“All Element of Category”组合获得门元件的所有实例,链接到“FamilyInstance.Location”节点入埠处,运行后获得门元件的定位坐标。通常,族文件的定位坐标与族的定义原点是同一个点,比如在建立门的族文件时,定义门底边中线中点为原点,则“FamilyInstance.Location”也会将该点作为该族文件的定位坐标来读取。
调用“Select Model Element”节点,选择项目文件中的导向曲线,同样链接导向曲线到“CurveELement.Curve”入埠处获得可编辑的样条曲线“NurbsCurve”,并根据门元件定位坐标点取得导向曲线上对应位置的坐标点。此处调用节点“Point.CurveAtParameter”:将任一曲线看作连续坐标点的几何图形,并且该曲线长度为1,使用曲线附近的任意点作为参照,通过节点“Point.CurveAtParameter”获取曲线上相对应位置的坐标点。本案例中,门的定位坐标即是曲线附近的参照点,通过节点获得的列表即是曲线上对应位置的坐标点(见图4.25)。
图4.25 获取“门”元件并定义导向曲线
引用节点“list.Create”将列表合并,该列表包含3 个子列表,分别是曲线坐标点、门定位坐标点及门元件,每个子列表有29 个分项,对应29 个门元件。接着引用“List.Transpose”将子列表转置,将3 个子列表的第一项取出来组成新列表的第一项,以此类推,重新生成29 个列表。如前文中反复提到,Dynamo 中的数据结构是一致且连续的,因此新生成的29 个列表中的元素也是具有对应关系的,比如0 List 里面的3 个分项就是代表同一个门的定位坐标、曲线坐标及实例文件。
这一系列操作的目的就是获取曲线坐标,并根据曲线坐标将同组的门元件排序,因为只有处于[0,1]阈值内的曲线坐标才能用来进行排序,如图4.26 所示“Curve.ParameterAtPoint”的下拉列表中0.0031 就比0.894 靠近导向曲线的前端,应该被排在前面;而定位坐标的[x,y,z]值则不具有类似的属性,因此需要进行转化使其具有可以排序的属性。(www.xing528.com)
图4.26 导向曲线及门元件在Revit 及Dynamo 中的显示
(2)节点“List.SortByKey”用于在给定的关键值的逻辑下,将原有列表排序。List 入埠处链接转置后的综合列表,Key 入埠处链接曲线坐标列表,因为此处正是要用[0,1]阈值内的曲线坐标来将列表重新排序。运行脚本检查该节点的下拉菜单,发现列表已重新排序,0 List 曲线坐标为0.0031,1List为0.018,2List 为0.052,以此类推。
由于上一组节点命令已经将曲线坐标及对应的门元件分组,现在只需要将重新排序后列表中的门元件子列表分离出来就可以进行下一步的编号工作了。引用“List.GetItemAtIndex”,在Index 入埠处输入“2”,并且在List 处选择层级@L2,运行脚本发现节点下拉菜单筛选出了新列表中所有的门元件。
(3)最后一步与上一节中的房间批次编号类似,同样调用“Element.SetParameterbyName”,element 入埠处此次链接到重新排序并筛选出来的门列表;由于门的标签族用“标记”属性来记录门标号,因此parameterName 入埠处通过“Code Block”节点输入相应信息;命名部分可根据需求灵活编辑,此处简单以数量统计,并加上前缀“1-”,得到门编号1-1,1-2…以此类推(见图4.27)。
图4.27 根据导向曲线将门元件排序并依序命名
4)实现目标
最后一次运行脚本并检查项目文件,如图4.28 右图所示门的标签族自动根据导向曲线方向显示出从1-1 到1-29 的编号信息,而不需要一个一个地手动输入。相对于房间,门的数量更是巨大,运用这个简单脚本简化门的批次编号流程,是非常有必要的。可尝试用相交或相邻关系这两种不同思路对不同模型元件进行排序及编号。
图4.28 成果范例Revit VS Dynamo
【学习测试】
问题1:Dynamo 中获取Revit 模型元件的节点组合是什么?
问题2:Dynamo 中获取Revit 模型元件位置坐标的节点是什么?
问题3:Dynamo 中根据一个函数f(x)从旧列表生成一个新列表的节点是什么?
问题4:在Dynamo 中尝试使用“相交关系”(范例中房间排序的方法)将其他模型元件排序。
问题5:在Dynamo 中尝试使用“相邻关系”(范例中门排序的方法)将其他模型元件排序。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。