优化:Dynamo根据构件坐标XY值排序
木生设计
2022年05月12日 09:05:52
只看楼主

      前一阵群里有个小伙伴咨询如何按XY坐标给桩编码,当时呢也没过多思考,就把常规的逻辑告诉他了,利用Dynamo自带的List.SortByKey节点,根据族放置坐标的XY值进行两次排序,就能实现这个需求,于是就简单写了个程序扔到了群里。


 

    前一阵群里有个小伙伴咨询如何按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.Location).X) >1000: a,a[j]=a[j],a      if ((a.Location).Y - (a[j].Location).Y) >1000: a,a[j]=a[j],a 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.Location).X) > D: a,a[j]=a[j],a if x == False: if ((a.Location).X - (a[j].Location).X) > D: a,a[j]=a[j],a if y == True: if ((a.Location).Y - (a[j].Location).Y) > D: a,a[j]=a[j],a if y == False: if ((a[j].Location).Y - (a.Location).Y) > D: a,a[j]=a[j],a for k in range(len(a)): b.append(a[k]) return b

    这里是通过输入两个布尔值来确定XY的排序方向,然后给一个可控的误差变量,就满足了现在排序需求。

 
 

当然,我这段代码是以房间为例的,如果你是想对别的图元按坐标排序,需要自己调整下获取Location的代码,这里就不过多赘述了~

 



东方远方
2022年05月12日 14:32:24
2楼

感谢,学习一下。

回复

相关推荐

APP内打开