C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

siren v0.14 線の情報を取得する

既にタイトルがあやふやですが、こちらの続きです。
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にはクラスを拡張する方法があるんじゃないかな?
と思いやってみました。
結果はこんな感じです。
f:id:kandennti:20170809200145p:plain
これ自体は使わないのですが、手法は勉強になりました。

本当はチマチマ書かずに、各クラスのメソッドを列挙して文字列としてメソッド呼び出し
出来るんじゃないのかな? とも思ったのですがよくわかりませんでした。
僕のような凡人で思い付く様なコードは、mrubyで可能なんじゃないかと
思うのですが。