Surface3d討論版

Rhino專家 -- 曲面實業
Google  
現在的時間是 週六 11月 25, 2017 6:27 am

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 6 篇文章 ] 
發表人 內容
 文章主題 : 用python執行布林運算的問題
文章發表於 : 週三 6月 07, 2017 5:20 pm 
離線
user

註冊時間: 週一 4月 24, 2017 4:21 pm
文章: 3
各位好,我想用python執行物件的大量複製,用布林聯集將物件合併。但是會發生錯誤,請問該如何處理。例如下圖產生第三顆球時,無法合併。
附加檔案:
布林聯集的問題.png
布林聯集的問題.png [ 159.52 KiB | 被瀏覽 12 次 ]


回頂端
 個人資料  
 
 文章主題 : Re: 用python執行布林運算的問題
文章發表於 : 週三 6月 14, 2017 9:12 pm 
離線
user

註冊時間: 週一 6月 12, 2017 7:57 pm
文章: 3
需要把所有要做布尔运算的都放进去,然后再做布尔运算就可以了,例如,用下面的方法就可以,而且代码要比之前的简洁


附加檔案:
p.jpg
p.jpg [ 21.48 KiB | 被瀏覽 278 次 ]
回頂端
 個人資料  
 
 文章主題 : Re: 用python執行布林運算的問題
文章發表於 : 週四 6月 15, 2017 10:50 am 
離線
user

註冊時間: 週一 4月 24, 2017 4:21 pm
文章: 3
我是想做複雜的結構,大量複製與合併,但在合併時失敗。
附加檔案:
2017-06-15_104240.png
2017-06-15_104240.png [ 54.32 KiB | 被瀏覽 14 次 ]

附加檔案:
2017-06-15_104005.png
2017-06-15_104005.png [ 141.72 KiB | 被瀏覽 272 次 ]

這裡不能上傳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


回頂端
 個人資料  
 
 文章主題 : Re: 用python執行布林運算的問題
文章發表於 : 週二 6月 20, 2017 3:10 pm 
離線
user

註冊時間: 週一 6月 12, 2017 7:57 pm
文章: 3
布尔运算并不是每次都能算出结果来的,所以要尽量避免重复大量做布尔运算,把做过布尔运算的物件又拿去叠加做很多次布尔运算就很容易出错。所以尽可能把所有要做布尔运算的几何体都方到一个列表下,然后再去运算。


回頂端
 個人資料  
 
 文章主題 : Re: 用python執行布林運算的問題
文章發表於 : 週五 6月 23, 2017 9:47 am 
離線
user

註冊時間: 週一 4月 24, 2017 4:21 pm
文章: 3
我也嘗試在for迴圈內作布林運算,但算到一個數量就會卡住。


附加檔案:
2017-06-23_093650.png
2017-06-23_093650.png [ 3.69 KiB | 被瀏覽 239 次 ]
2017-06-23_093633.png
2017-06-23_093633.png [ 8.63 KiB | 被瀏覽 242 次 ]
回頂端
 個人資料  
 
 文章主題 : Re: 用python執行布林運算的問題
文章發表於 : 週三 6月 28, 2017 2:59 pm 
離線
user

註冊時間: 週一 6月 12, 2017 7:57 pm
文章: 3
错误信息提示的意思是,布尔运算没有得到结果。

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

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

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


回頂端
 個人資料  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 6 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯文章
不能 在這個版面刪除文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作