【Rhino建?!炕贕rasshopper與Rhinocommmon用C#實(shí)現(xiàn)批量Closed Breps布爾的小實(shí)踐。

問題來源:
用grasshopper自帶的Soild Intersection電池總是有部分實(shí)體運(yùn)算不出來。
解決方式:
去查了下Rhinocommom的布爾運(yùn)算方法,發(fā)現(xiàn)帶有個(gè)tolerance參數(shù),允許我們自行調(diào)整布爾運(yùn)算的容差,調(diào)用這個(gè)函數(shù)就把問題解決了。
簡(jiǎn)述下我寫這個(gè)電池的思路。
采用的是Rhinocommom自帶的CreateBooleanIntersection Method。

有兩個(gè)需要注意的點(diǎn):
1·由于布爾運(yùn)算有可能產(chǎn)生多個(gè)實(shí)體,所以返回的是一組值,return的是一個(gè)array,不是gh常用的List。
2·當(dāng)兩個(gè)Brep沒有相交時(shí)或者運(yùn)算錯(cuò)誤時(shí),return值是NULL。但要做的是批量運(yùn)算,這可能會(huì)卡住其它Brep的運(yùn)算。

Brep.CreateBooleanIntersection Method 的返回值
處理方式:
1·遍歷一遍返回的Brep array的所有Brep,賦值給輸出端的List。
2.增加判斷語句,只有返回的Brep array為非NULL時(shí),才會(huì)進(jìn)行賦值。
?private void RunScript(Brep brep, List<Brep> breps, int t, ref object BREPS)
? {
? ?//聲明一個(gè)BrepList,用來儲(chǔ)存運(yùn)算結(jié)果
? ? List <Brep> inters = new List<Brep>();
? ? //遍歷輸入的所有Brep
? ? foreach(Brep b in breps)
? ? {
? ? ? Brep[] inter1 = Brep.CreateBooleanIntersection(brep, b, t);
? ? ? //判斷array為非NULL
? ? ? if(inter1 != null)
? ? ? {
? ? ? ? //遍歷布爾返回的array中所有Brep
? ? ? ? foreach(Brep bb in inter1)
? ? ? ? {
? ? ? ? ? inters.Add(bb);
? ? ? ? }
? ? ? }
? ? }
? ? BREPS = inters;
調(diào)整了下tolerance,實(shí)現(xiàn)的很完美。
想換成其他布爾運(yùn)算只需要改下Method名就好
