@REM 楕円→内接円作図 @echo off goto do%1 rem rem ---------------------------------------------------------------- rem ※このファイルを編集した場合は上書き保存して閉じてください。 rem ---------------------------------------------------------------- rem REM #jww REM #cd REM #hm |曲率円作図|内接円作図|BAT編集| REM #:1 REM #h0 REM #1ci 楕円を指示して下さい。(曲線属性の楕円は対象外) REM #zw 線幅 REM #hr REM #e REM #:3 REM #h0 REM #hr REM #e REM #:2 REM #h0 REM #1ci 楕円を指示して下さい。(曲線属性の楕円は対象外) REM #c 内接円半径入力 (無指定:楕円の短径*1/2) : /_/r REM #zw 線幅 REM #hr REM #e :do1 :do2 copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt %1 %2 > jwc_temp.txt rem del temp.txt rem pause exit goto END :do3 start notepad.exe 楕円内接円2.bat echo # > jwc_temp.txt goto END :END EXIT #!ruby ##### 注意点 ############################################################# # #1.レイヤグループ、レイヤ、線色、線種、線幅は対応する楕円の属性を引継ぎます。 # #2.ブロック図形化および曲線属性化された楕円は対象外です。 # #3.扁平率が1.0以上の楕円は対象外です。(楕円長軸角により対応してください。) # #4.図面軸角 0 で使用して下さい。 # ############################################################################ def main ##### 実点作図設定 ########################### @ci_pn="pn2" #楕円、内接円中心 点種初期設定 @cp_pn="pn8" #楕円、内接円接点 点種初期設定 ############################################################################ include Math require 'matrix' $stderr=open("error.log","w") @koumoku=ARGV[1].to_s if ARGV.grep(/^\/r/)[0] @er=ARGV.grep(/^\/r/)[0].sub(/^\/r/,"").to_f else @er=" " end while gets if $_ =~ /^hq/ #puts "hd" elsif $_ =~ /^l[gyctw]/ #楕円のグループ、レイヤ、線属性継承 puts $_ elsif $_ =~ /^ci/ #円データの場合 data = split #半角スペース分割 if data.size == 8 && data[4].to_f == data[5].to_f #楕円の時 data.collect!{ |item| item.to_f } pt=Vector[data[1],data[2]] #楕円の中心座標 hr=data[6] #楕円の扁平率 if hr<1 da=data[3] #楕円の長径*1/2 db=data[3]*hr #楕円の短径*1/2 dk0=data[7] #楕円長軸角(度) else da=data[3]*hr #楕円の長径*1/2 db=data[3] #楕円の短径*1/2 dk0=data[7]+90 #楕円長軸角(度) end dk=dk0*PI/180 #楕円長軸角(ラジアン) kr=db**2/da #曲率円半径 @er=kr if @koumoku=="1" #無指定の時は楕円の短径*1/2を内接円の半径とする @er = db if @er == " " if @er < 0 || @er > db || @er < kr puts "he 内接円半径入力エラー。 #{kr}<= r <=#{db}" exit end hanbetu = (da**2-db**2)*(db**2-@er**2) hanbetu = sprintf("%0.10f",hanbetu).to_f #誤差調整 if hanbetu < 0 puts "he 作図できません。" exit end ################### en_p=pt+Vector[(hanbetu**0.5/db)*cos(dk),(hanbetu**0.5/db)*sin(dk)] en_p=en_p.collect{|e| sprintf("%0.9f",e).to_f} pt=pt.collect{|e| sprintf("%0.9f",e).to_f} hr=sprintf("%0.9f",hr).to_f #誤差調整 da=sprintf("%0.9f",da).to_f #誤差調整 db=sprintf("%0.9f",db).to_f #誤差調整 dk0=sprintf("%0.9f",dk0).to_f #誤差調整 #puts ["ci",pt.to_a,da,0,360,hr,dk0].join("\s") #楕円書き戻し puts ["ci",en_p.to_a,@er].join("\s") #右方向内接円書出し puts @ci_pn puts ["pt",pt.to_a].join("\s") #楕円中心実点書出し if hanbetu == 0 #内接円の半径が楕円の短径*1/2と等しい時 p0U1=Vector[0,db] p0D1=Vector[0,-db] pKU1=kaku_henkan(p0U1,dk) #長軸角による上接点座標変換 pKD1=kaku_henkan(p0D1,dk) #長軸角による下接点座標変換 pU1=pt+pKU1 #変換後の原点からの上接点座標 pD1=pt+pKD1 #変換後の原点からの下接点座標 puts @cp_pn #接点作図 puts ["pt",pU1.to_a].join("\s") puts ["pt",pD1.to_a].join("\s") if @koumoku=="2" else #hanbetu != 0 oc=hanbetu**0.5/db #水平の時楕円中心と内接円中心の距離 if @er == kr #内接円の半径が曲率円の時 p0R1=Vector[da,0] else p0R1=Vector[(db**2-@er**2+oc**2)/oc, #水平の時右上接点X座標 (db**2-((db**2-@er**2+oc**2)/oc*db/da)**2)**0.5] end p0R2=Matrix[[1,0],[0,-1]]*p0R1 #水平の時右下接点 pKR1=kaku_henkan(p0R1,dk) #長軸角による右上接点座標変換 pKR2=kaku_henkan(p0R2,dk) #長軸角による右下接点座標変換 pR1=pt+pKR1 #変換後の原点からの右上接点座標 pR2=pt+pKR2 #変換後の原点からの右下接点座標 en_m=pt-Vector[(hanbetu**0.5/db)*cos(dk), #左方向内接円 (hanbetu**0.5/db)*sin(dk)] en_m=en_m.collect{|e| sprintf("%0.9f",e).to_f} #誤差調整 p0L1=Matrix[[-1,0],[0,1]]*p0R1 #水平の時左上接点 p0L2=Matrix[[1,0],[0,-1]]*p0L1 #水平の時左下接点 pKL1=kaku_henkan(p0L1,dk) #長軸角による左上接点座標変換 pKL2=kaku_henkan(p0L2,dk) #長軸角による左下接点座標変換 pL1=pt+pKL1 #変換後の原点からの左上接点座標 pL2=pt+pKL2 #変換後の原点からの左下接点座標 puts ["pt",en_p.to_a].join("\s") #右方向内接円中心点書出し puts ["ci",en_m.to_a,@er].join("\s") #左方向内接円書出し puts ["pt",en_m.to_a].join("\s") #左方向接円中心点書出し puts @cp_pn puts ["pt",pR1.to_a].join("\s") #右内接円接点作図 puts ["pt",pL1.to_a].join("\s") #左内接円接点作図 puts ["pt",pR2.to_a].join("\s") if @koumoku=="2" puts ["pt",pL2.to_a].join("\s") if @koumoku=="2" end end end end end ### 楕円長軸角による座標変換 ### def kaku_henkan(p0,dk) pK=Matrix[[cos(dk),-sin(dk)],[sin(dk),cos(dk)]]*p0 pK=pK.collect{|e| sprintf("%0.9f",e).to_f} return pK end main()