C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

Sirenテスト-BndBox

こちらの続きで、引き続きテストです。
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クリアランスで実行した結果はこちら
f:id:kandennti:20160311190451p:plain
訳がわからないと思います。
恐らく、天面部分は複数のBoxがブール演算を行った結果複数の面に
なっているのだろうと思っているのですが、微妙な同一面の
ブール演算があったにも関わらず、エラーにはならなかったと言う事だと
思います。(すごいです)

元データと重ね合わせてみると
f:id:kandennti:20160311190459p:plain
いつものあの子です。

但し、6方向の距離を測定してみると
f:id:kandennti:20160311190510p:plain
下側の距離だけが13.7mm程。
リファレンスマニュアルにも "おおよその位置と大きさを取得することが可能です"
と記載されているので、このような使い方には向いてないのだろう。