欢迎光临散文网 会员登陆 & 注册

Dynamo数据淘金——03//批量修改编码并排序

2023-01-13 16:06 作者:非天生建筑师  | 我要投稿

常见需要编码的数据有门窗、房间的编号,一般情况下,在Revit建立好门窗、房间后,需要手动输入对应信息.随着模型的深入,这些构件将不断增加,数据也陡增.当需要修改大量编码时,再按照前期手动单个修改数据的办法将是巨大的人力浪费.尤其是后期增删部分编码,需要对原有编码进行重新排序或统一格式时,如何避免手动修改的浪费与错误呢?这些问题都将在本期解决.

以门编码的修改为例.假设模型有200多个门编码需要修改,本来是按照1\2\3\4\……202\203……这种顺序排列的,后期因模型调整,增删了多个门,导致排序错乱,需要重新排序;而且要求门编号应该增加统一前缀,改成M-AA-001\ M-AA-002\ M-AA-003\……的编码形式.

在解决这个编码问题前,我们先看一下解决排序的经典数学方法.

假定需要对下面几个元素进行排序(预定好了顺序).

我们沿着顺序绘制一条曲线,试图从中找到他们排序的数学逻辑.

从每个元素的中心向曲线找最近点,该点到起点的曲线长度与曲线总长度之比,分别为0.05、0.45、0.65、0.95.那么按照新得到的数字进行排序,就是元素的顺序.

好了,现在清楚了排序的数学逻辑.我们再归纳一遍.首先选择全部元素(五边形、圆形、四边形、三角形),分别从元素的中心找到距离曲线最近的点,每个点具有的参数(长度占比参数)就传递给了各个元素,按照这个参数对元素进行排序即完成了排序目标.

回归Revit,打开一个案例文件,选择一个门后,查看编号所对应的参数——属性列表中的”标记”.然后在Dynamo中进行操作.

(1) 选择需要排序的门

为了方便演示,将使用Select Model Elements节点通过框选来选择多个元素,但是框选会造成选择不相关的元素(比如墙体等),这时就直接采用以下节点组合来实现框选后仅选择门的操作.

框选后,门202-206将被选中,形成一个无序的列表.

通过Watch节点来观察选中的元素列表.从中可以看出一共5个元素,即5个0915X2134mm的门.

(2) 绘制参照曲线

绘制上述提到排序用的曲线,假定我们按照从左到右的顺序对这6个门进行排序即,206变成了1的序号,205变成2的序号,204变成3的序号,203变成4的序号,202变成5的序号,201变成6的序号.那么,按照这个顺序绘制曲线,保证曲线尽量靠近门即可.如下图:

按照之前定下的原则,完成如下节点.形成如下节点组合(理解大致思路即可,不用纠结每个节点),最后得到了这些点的参数.

有一点需要注意.就是5个门具有5个”中心点”,但曲线却只有一个,在求5个中心点到曲线的最近点程序时,默认表达是这样的:

获取中心点[中心点1,中线点2,中心点3,中心点4,中心点5]到[曲线]的最近点.

默认是一对一,就是说虽然有5个中心点,由于曲线只有1个,因此,拿取1个中心点(中心点1)与曲线对应.剩下的4个中心点将不被执行.要将以下两个节点连缀属性改为”最长”才可以实现全部执行.

连缀是数据之间对应的方法,这里不做说明.此时,已经将5个门赋予了新的参数,只需按照他们参数值进行排序就可以实现排序目标了.

在排序之前,我们有必要再引入一些概念.

在上一节中我们提到了列表的概念.因为Excel的数据结构就是以列表的形式呈现的.比如列表list_0=[“非天生建筑师”,”数据淘金,100]具有三个元素(Item),而且每个元素还都具有索引(Index).

其中的内容”非天生建筑师”是一个字符串,即String = ““非天生建筑师”,而这个字符串可以看作是一个”序列”,也就是说,它的每一个字符也具有索引(Index).

String[0] = “非”

String[1] = “天”

String[2] = “生”

……

如果Str_0 = “非天生”, Str_1= “建筑师”

那么Str_0 + Str_1---------“非天生建筑师”

也就是说字符串(或者说序列)可以进行多种加减\切片等等多种操作.

因此编码”M-AA-001”是由”M-AA-”+”001”组成,其中,”M-AA-”是固定字符串,”001”是排序1,前面补充了两个0而已(3位数的排序写法).

(3) 根据参数排序

再次回归Dynamo,上述5个门已经被赋予新的参数,按照新参数对其进行排序,如下:

那么如何将这些序号传给门呢?有5个门,因此顺序应该是1\2\3\4\5,如果有N个门,则应该是1\2\3……N,而N便是列表中元素的个数.可以用List.Count节点来计算出列表中元素的数量.再用1..N..1的写法创建序号列表,最后用Set Parameters By Name节点将序号分别传给门标记.

排序后编码如下:

(3) 统一编码格式

1\2\3\4\5的编码表达并不符合要求,最后就需要字符串(序列)的相关方法来统一编码标准.

最终结果如下图:

好啦,大功告成!对于窗编码、房间编码等相关编码的操作就完全一样的啦,那么,今天你学废了吗?

Dynamo数据淘金——03//批量修改编码并排序的评论 (共 条)

分享到微博请遵守国家法律