Hello 大家好!我是九哥~
前一阵群里有个小伙伴咨询如何按 XY 坐标给桩编码,当时呢也没过多思考,就把常规的逻辑告诉他了,利用 Dynamo 自带的 List.SortByKey 节点,根据族放置坐标的 XY 值进行两次排序,就能实现这个需求,于是就简单写了个程序扔到了群里。
不过正好最近自己有个类似的需求,发现这个方法逻辑上虽然通,但是用起来并不完美,总有个别位置编码错误。
反复查看了编号错误的族,发现是因为族的坐标不论是 X 值还是 Y 值,是有一定偏差的,但是当按 XY 分别排序以后,这细小的偏差就会影响构件的编码顺序。
如果遇到个别族偏移距离过大了,而我又想让这个族按照相对的顺序去编码该怎么办呢?(如下图:)
没办法,只能自己重新写下程序了。
本来想简单的连几个节点,发现还没没搞定,没办法只能寄希望于代码了,但是如果用代码,这个事反而就简单了,因为我们在学 Python 的时候,最基本的一个 “冒泡法” 相信大家都会,就是经常用来处理排序问题的,简单套用下 ,就能搞定这个问题。
通过冒泡法,写一个自定义函数,如下:
def zuobiaopaixu(a):
b=[]
l=len(a)
for i in range(l):
j=i
for j in range(l):
if ((a[j].Location).X - (a[i].Location).X) >1000:
a[i],a[j]=a[j],a[i]
if ((a[i].Location).Y - (a[j].Location).Y) >1000:
a[i],a[j]=a[j],a[i]
for k in range(len(a)):
b.append(a[k])
return b
上面这个函数,我们先解决了简单的按坐标排序问题,而且给了一个误差值。然后如果我们想要控制从上到下还是从左到右呢,可以对自定义函数进行优化,如下:
def zuobiaopaixu(a,x,y,D):
b=[]
l=len(a)
for i in range(l):
j=i
for j in range(l):
if x == True:
if ((a[j].Location).X - (a[i].Location).X) > D:
a[i],a[j]=a[j],a[i]
if x == False:
if ((a[i].Location).X - (a[j].Location).X) > D:
a[i],a[j]=a[j],a[i]
if y == True:
if ((a[i].Location).Y - (a[j].Location).Y) > D:
a[i],a[j]=a[j],a[i]
if y == False:
if ((a[j].Location).Y - (a[i].Location).Y) > D:
a[i],a[j]=a[j],a[i]
for k in range(len(a)):
b.append(a[k])
return b
这里是通过输入两个布尔值来确定 XY 的排序方向,然后给一个可控的误差变量,就满足了现在排序需求。
当然,我这段代码是以房间为例的,如果你是想对别的图元按坐标排序,需要自己调整下获取 Location 的代码,这里就不过多赘述了~
好了,今天的教程就到这里,小伙伴们快去尝试吧~