Rhino專家 -- 曲面實業

用python執行布林運算的問題

RhinoScript, Monkey, RhinoSDK程式語言相關運用
各位好,我想用python執行物件的大量複製,用布林聯集將物件合併。但是會發生錯誤,請問該如何處理。例如下圖產生第三顆球時,無法合併。
布林聯集的問題.png
需要把所有要做布尔运算的都放进去,然后再做布尔运算就可以了,例如,用下面的方法就可以,而且代码要比之前的简洁

附加檔案

我是想做複雜的結構,大量複製與合併,但在合併時失敗。
2017-06-15_104240.png

2017-06-15_104005.png
2017-06-15_104005.png (141.72 KiB) 已瀏覽 1742 次

這裡不能上傳python檔案,我只好貼上程式碼
import rhinoscriptsyntax as rs
import math
rs.DeleteObjects(rs.AllObjects()) # delete all objects last builded
rs.EnableRedraw(False) # don't display building model for saving memory
len=5
rad=0.5

def lattice(shift_x, shift_y, shift_z):
hei=rs.Distance([0,0,len/2],[len/2,len/2,0])
angle=math.atan(math.sqrt(2))/math.pi*180
poiA=[0,0,len/2]
poiB=[0,0,-len/2]
lat=[]
cyl00=rs.AddCylinder([0,0,len/2],-hei,rad)
cyl01=rs.RotateObject(cyl00,poiA,angle,[1/math.sqrt(2),1/math.sqrt(2),0],True)
cyl02=rs.RotateObject(cyl00,poiA,angle,[-1/math.sqrt(2),1/math.sqrt(2),0],True)
lat=rs.BooleanUnion([cyl01,cyl02])
cyl03=rs.RotateObject(cyl00,poiA,angle,[-1/math.sqrt(2),-1/math.sqrt(2),0],True)
lat=rs.BooleanUnion([lat,cyl03])
cyl04=rs.RotateObject(cyl00,poiA,angle,[1/math.sqrt(2),-1/math.sqrt(2),0],False)
lat=rs.BooleanUnion([lat,cyl04])
cyl00=rs.AddCylinder([0,0,-len/2],hei,rad)
cyl05=rs.RotateObject(cyl00,poiB,angle,[1/math.sqrt(2),1/math.sqrt(2),0],True)
lat=rs.BooleanUnion([lat,cyl05])
cyl06=rs.RotateObject(cyl00,poiB,angle,[-1/math.sqrt(2),1/math.sqrt(2),0],True)
lat=rs.BooleanUnion([lat,cyl06])
cyl07=rs.RotateObject(cyl00,poiB,angle,[-1/math.sqrt(2),-1/math.sqrt(2),0],True)
lat=rs.BooleanUnion([lat,cyl07])
cyl08=rs.RotateObject(cyl00,poiB,angle,[1/math.sqrt(2),-1/math.sqrt(2),0],False)
lat=rs.BooleanUnion([lat,cyl08])
lat=rs.BooleanUnion([lat,rs.AddSphere(poiA,rad)])
lat=rs.BooleanUnion([lat,rs.AddSphere(poiB,rad)])
lat=rs.BooleanUnion([lat,rs.AddSphere([len/2,len/2,0],rad)])
lat=rs.BooleanUnion([lat,rs.AddSphere([-len/2,len/2,0],rad)])
lat=rs.BooleanUnion([lat,rs.AddSphere([len/2,-len/2,0],rad)])
lat=rs.BooleanUnion([lat,rs.AddSphere([-len/2,-len/2,0],rad)]) # type is list
return rs.MoveObjects(lat,[shift_x,shift_y,shift_z])
nx=5
ny=5
nz=5
lat_list=[]
for k in range (0,nz):
for j in range (0,ny):
for i in range (0,nx):
move_x=i*len
move_y=j*len
move_z=k*len
lat_list.append(lattice(i*len,j*len,k*len))
lat_list=rs.BooleanUnion(lat_list)
rs.EnableRedraw(True) # display builded model
布尔运算并不是每次都能算出结果来的,所以要尽量避免重复大量做布尔运算,把做过布尔运算的物件又拿去叠加做很多次布尔运算就很容易出错。所以尽可能把所有要做布尔运算的几何体都方到一个列表下,然后再去运算。
我也嘗試在for迴圈內作布林運算,但算到一個數量就會卡住。

附加檔案

错误信息提示的意思是,布尔运算没有得到结果。

还是之前说的,请不要大量叠加做布尔运算,不要把每次布尔运算的结果再拿去做 N 次布尔运算,否则系统就算不出来了。

你这里用了三个嵌套循环,而且每次循环都做了布尔运算,这种做法不但降低了运算效率,还会导致无法计算。

如果有相同的单元,把每个单元放进一个列表,最后再做一次布尔运算就可以了,切记,一次就可以了,布尔运算次数越少越不容易出错。