既にタイトルがあやふやですが、こちらの続きです。
siren v0.14 線の種類を判断する - C#ATIA
実際には使わない事になりそうな・・・ あぁ後々の為の練習です。
#Siren_script include Siren fName = "/curves" $inPath = ARGV[0] + fName + ".igs" $exPath = ARGV[0] + fName + "-res.igs" def Pause() str = gets end class Siren::Edge def info() crv = self.curve arr = ["class : " + crv.class.name] arr << ["length : " + self.length.to_s] case crv.class.name when "Siren::Line" then arr << ["dir : " + crv.dir.to_s] when "Siren::Circle" then arr << ["length : " + crv.length.to_s] arr << ["radius : " + crv.radius.to_s] arr << ["center : " + crv.center.to_s] arr << ["area : " + crv.area.to_s] arr << ["normal : " + crv.normal.to_s] arr << ["dir : " + crv.dir.to_s] when "Siren::BSCurve" then arr << ["degree : " + crv.degree.to_s] arr << ["knots : " + crv.knots.to_s] arr << ["mults : " + crv.mults.to_s] arr << ["poles : " + crv.poles.to_s] arr << ["weights : " + crv.weights.to_s] else #arr = ["non"] end return arr.join("\n ") + "\n " end end ########### comp = Siren.load_model $inPath p "total_edges : " + comp.edges().size.to_s edgelst = comp.to_a.select { |x| x.edge? == true } edgelst.concat(comp.to_a.select { |x| x.wire? == true }.edges ).flatten p "**************" edgelst.each{|x| puts x.info } begin Siren.save_model edgelst.to_comp , $exPath rescue p "export errer!" end ########### puts "done." Pause()
読み込んだIgesファイルの線を列挙して、取得できる情報を出力するだけです。
VBA脳の僕ならループさせて線種を判断して、線種毎に処理を分ける事を
真っ先に考えるのですが、mrubyにはクラスを拡張する方法があるんじゃないかな?
と思いやってみました。
結果はこんな感じです。
これ自体は使わないのですが、手法は勉強になりました。
本当はチマチマ書かずに、各クラスのメソッドを列挙して文字列としてメソッド呼び出し
出来るんじゃないのかな? とも思ったのですがよくわかりませんでした。
僕のような凡人で思い付く様なコードは、mrubyで可能なんじゃないかと
思うのですが。