こちらの続きで、引き続きテストです。
Sirenテスト-Filler - C#ATIA
以前、CATIAで
"周辺部品からクリアランスを設けた状態で、一定以上の体積を確保した
Bodyがマクロ等を利用し自動で作れないか?
周辺部品は、CATIA以外のIges等のデータも含まれている"
と言ったような話をされた事があります。が、当時難しく断念しました。
(要は、周辺部品全てにクリアランス分のラフオフセットすれば良いわけです)
sirenには要素の大まかなサイズを取得できる、BndBoxクラスが有り
比較的短時間で類似した事が出来るかな? と思い試してみました。
#SirenScript expName = "/SirenTest" $expIges = ARGV[0] + expName + ".igs" $expBrep = ARGV[0] + expName + ".brep" $expDump = ARGV[0] + expName + "_dump.txt" def wDump(i) if i.kind_of?(String) open($expDump, "a") {|f| f.write "\r\n" + i} end end open($expDump, "w") {|f| f.write "start"} ########### #クリアランス $clearance=10.0 #クリアランスボックス def initClrBox(bb) clrVec = Vec::new [$clearance,$clearance,$clearance] clrOri = (bb.min.to_v - clrVec).to_a clrSiz = ((bb.max.to_v - bb.min.to_v) + (clrVec * 2)).to_a return Prim::box(clrSiz , pos=clrOri) end #空のボックス def initNilBox() b1=Prim::box([1,1,1]) b2=b1.translate(Vec.zero) return b1.cut(b2) end inpath=ARGV[0]+"/Part1.igs" faces = IGES.load(inpath, one_shape=false) sumbox=initNilBox faces.each do |face| sumbox=sumbox.fuse(initClrBox(face.bndbox)) end com = Build::compound [sumbox] ########### IGES.save [com] , $expIges BRepIO::save com , $expBrep wDump("end")
同一フォルダ内にある "Part1.igs" ファイルを読み込み、
全てのサーフェスに対し、BndBoxを取得。
クリアランス分サイズを大きくしたものを、ひたすらブール演算(和)
を行い、最後にIgesファイルとしてエクスポートしています。
ブール演算する際の最初に空っぽのソリッドを作成したかったの
ですが、
#これはNGです sumbox = Prim::box([0,0,0])
は、許されなかった(サイズ0のBox)ので、initNilBox関数の様に
ダミーのBoxを作成し同じもので差を取り、空のソリッドを作りました。
(やっと関数が作れるようになりました・・・)
あるデータを元に、10mmクリアランスで実行した結果はこちら
訳がわからないと思います。
恐らく、天面部分は複数のBoxがブール演算を行った結果複数の面に
なっているのだろうと思っているのですが、微妙な同一面の
ブール演算があったにも関わらず、エラーにはならなかったと言う事だと
思います。(すごいです)
元データと重ね合わせてみると
いつものあの子です。
但し、6方向の距離を測定してみると
下側の距離だけが13.7mm程。
リファレンスマニュアルにも "おおよその位置と大きさを取得することが可能です"
と記載されているので、このような使い方には向いてないのだろう。