Page 617 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼不要な極小線の削除について sato 20/3/29(日) 20:52 ┣Re:不要な極小線の削除について 96saka 20/3/29(日) 23:22 ┃ ┗Re:不要な極小線の削除について sato 20/3/30(月) 1:11 ┃ ┗Re:不要な極小線の削除について 96saka 20/3/30(月) 2:19 ┃ ┗Re:不要な極小線の削除について sato 20/3/30(月) 19:27 ┗Re:不要な極小線の削除について 卯之介 20/3/30(月) 9:29 ┗Re:不要な極小線の削除について sato 20/3/30(月) 19:44 ─────────────────────────────────────── ■題名 : 不要な極小線の削除について ■名前 : sato ■日付 : 20/3/29(日) 20:52 -------------------------------------------------------------------------
satoと申します。 よろしくお願いします 先方から変換していただいたdxfデータをjwwに入れたところ 5万本以上の極小線データがあり、実寸で1mm以下の線が存在するようなのですが、これを一括で消す方法がありましたら教えていただけないでしょうか。 10年以上前にあった、Ruby 外部変形スクリプト集 自在消去(sugiさん作)でできるらしいのですが、リンク先きが見つからず確認できないです。 リンク先もしくは別の方法でも方法があればお願いします。 |
▼satoさん: 下記は如何でしょう。 過去ログ http://www.jwcad.net/log/consult2/consult2-0701-03/title.htm#19040 注意点 スクリプトの98行目に当たる部分ですが 過去ログへ移る際にどうも改行が上手くいかないのだそうで、書き換えを要します。 この行 ↓ の記述を ika3(y2_2) ika3(y2_1) ika3(y2_2)>=ika3(y1_1) 次の3行 ↓ に置き換える ika3(y2_2)<ika3(y1_1) or ika3(y2_1)<ika3(y1_1) && ika3(y2_2)>=ika3(y1_1) これでいけると思います。 |
96sakaさん 早速の返事ありがとうございました 98行目を変更してやってみたのですがうまくいかず batにpause入れたところ 線消.rb:130: void value expression 線消.rb:131: syntax error が出てきてしまい行き詰ってしまいました。 長文で申し訳ないのですが 線消.rbはこれでよろしいでしょうか (130行目131行目は最終行から3行目と2行目のendです) include Math;$max_l=50;$min_l=0 while ARGV.size>1 case argument=ARGV.pop when /\/a/ $max_l=argument[2..-1].to_f when /\/b/ $min_l=argument[2..-1].to_f end end def main hp=[];zukei=[] while ARGF.gets xy=split if xy[0]=~/^hp/ hp<<[xy[1].to_f,xy[2].to_f] end end hp<0 && hp[0] != hp[-1] 0.upto(hp.size-2){|i|zukei<<[hp[i][0],hp[i][1],hp[i+1][0],hp[i+1][1]]} puts "hd" open("temp.txt","r"){|f| while line=f.gets xy=split if xy[0]=~/^hq/ elsif xy[0]=~/^\d/ xy.collect!{|item|item.to_f} x,y=xy[2]-xy[0],xy[3]-xy[1] l=sqrt(x**2+y**2) if zukei.size>0 if area(zukei,[xy[0],xy[1]]) && area(zukei,[xy[2],xy[3]]) if $min_l==0 if l<$max_l else print $_ end else if l<$max_l && l>$min_l else print $_ end end else print $_ end else if $min_l ==0 if l<$max_l else print $_ end else if l<$max_l && l>$min_l else print $_ end end end else print $_ end end } end #線と線の交点を返す(延長線上は含まない) def sen_sen_kouten(sen1,sen2) sen1x=sen1[2]-sen1[0] sen1y=sen1[3]-sen1[1] sen1xy=sqrt(sen1x**2+sen1y**2) sen1_arg=atan2(sen1y,sen1x) x1_1=sen1[0] x1_2=sen1[0]+sen1xy y1_1=sen1[1] y1_2=sen1[1] x=sen2[0]-sen1[0] y=sen2[1]-sen1[1] xy=sqrt(x**2+y**2) arg=atan2(y,x) henkaku=arg-sen1_arg x2_1=sen1[0]+xy*cos(henkaku) y2_1=sen1[1]+xy*sin(henkaku) x=sen2[2]-sen1[0] y=sen2[3]-sen1[1] xy=sqrt(x**2+y**2) arg=atan2(y,x) henkaku=arg-sen1_arg x2_2=sen1[0]+xy*cos(henkaku) y2_2=sen1[1]+xy*sin(henkaku) x=x2_2-x2_1 y=y2_2-y2_1 delta=y/x if ika3(y2_1)>=ika3(y1_1) && ika3(y2_2)<ika3(y1_1) or ika3(y2_1)<ika3(y1_1) && ika3(y2_2)>=ika3(y1_1) y=y1_1-y2_1 dx=y/delta kouten_x=x2_1+dx kouten_y=y1_1 if kouten_x>=x1_1 && kouten_xkouten_x>x1_1 && kouten_x<=x1_2 x=kouten_x-x1_1 y=kouten_y-y1_1 xy=sqrt(x**2+y**2) kouten_xt=x1_1+xy*cos(sen1_arg) kouten_yt=y1_1+xy*sin(sen1_arg) return [kouten_xt,kouten_yt] else nil end end end def ika3(x) a=(((x.to_f)*1000).to_i/1000.to_f) return a end #tenの位置がzukei(閉鎖図形)の内(true)か、外(false)かを判定 def area(zukei,ten) zahyo=[] zukei.each{|item|zahyo< if zahyo.size==1 or zahyo.size>1 && zahyo.size%2==1 return true else return false end end main |
▼satoさん: すみません、検証不足でした。 過去ログでは他に 18行目、105行目、126行目もおかしくなっていたようです。 当時の記事からのオリジナルスクリプトを下記に記述します。 include Math;$max_l=50;$min_l=0 while ARGV.size>1 case argument=ARGV.pop when /\/a/ $max_l=argument[2..-1].to_f when /\/b/ $min_l=argument[2..-1].to_f end end def main hp=[];zukei=[] while ARGF.gets xy=split if xy[0]=~/^hp/ hp<<[xy[1].to_f,xy[2].to_f] end end hp<<hp[0] if hp.size>0 && hp[0] != hp[-1] 0.upto(hp.size-2){|i|zukei<<[hp[i][0],hp[i][1],hp[i+1][0],hp[i+1][1]]} puts "hd" open("temp.txt","r"){|f| while line=f.gets xy=split if xy[0]=~/^hq/ elsif xy[0]=~/^\d/ xy.collect!{|item|item.to_f} x,y=xy[2]-xy[0],xy[3]-xy[1] l=sqrt(x**2+y**2) if zukei.size>0 if area(zukei,[xy[0],xy[1]]) && area(zukei,[xy[2],xy[3]]) if $min_l==0 if l<$max_l else print $_ end else if l<$max_l && l>$min_l else print $_ end end else print $_ end else if $min_l ==0 if l<$max_l else print $_ end else if l<$max_l && l>$min_l else print $_ end end end else print $_ end end } end #線と線の交点を返す(延長線上は含まない) def sen_sen_kouten(sen1,sen2) sen1x=sen1[2]-sen1[0] sen1y=sen1[3]-sen1[1] sen1xy=sqrt(sen1x**2+sen1y**2) sen1_arg=atan2(sen1y,sen1x) x1_1=sen1[0] x1_2=sen1[0]+sen1xy y1_1=sen1[1] y1_2=sen1[1] x=sen2[0]-sen1[0] y=sen2[1]-sen1[1] xy=sqrt(x**2+y**2) arg=atan2(y,x) henkaku=arg-sen1_arg x2_1=sen1[0]+xy*cos(henkaku) y2_1=sen1[1]+xy*sin(henkaku) x=sen2[2]-sen1[0] y=sen2[3]-sen1[1] xy=sqrt(x**2+y**2) arg=atan2(y,x) henkaku=arg-sen1_arg x2_2=sen1[0]+xy*cos(henkaku) y2_2=sen1[1]+xy*sin(henkaku) x=x2_2-x2_1 y=y2_2-y2_1 delta=y/x if ika3(y2_1)>=ika3(y1_1) && ika3(y2_2)<ika3(y1_1) or ika3(y2_1)<ika3(y1_1) && ika3(y2_2)>=ika3(y1_1) y=y1_1-y2_1 dx=y/delta kouten_x=x2_1+dx kouten_y=y1_1 if kouten_x>=x1_1 && kouten_x<x1_2 or kouten_x>x1_1 && kouten_x<=x1_2 x=kouten_x-x1_1 y=kouten_y-y1_1 xy=sqrt(x**2+y**2) kouten_xt=x1_1+xy*cos(sen1_arg) kouten_yt=y1_1+xy*sin(sen1_arg) return [kouten_xt,kouten_yt] else nil end end end def ika3(x) a=(((x.to_f)*1000).to_i/1000.to_f) return a end #tenの位置がzukei(閉鎖図形)の内(true)か、外(false)かを判定 def area(zukei,ten) zahyo=[] zukei.each{|item|zahyo<<sen_sen_kouten(item,[0,0,ten].flatten) if sen_sen_kouten(item,[0,0,ten].flatten)} if zahyo.size==1 or zahyo.size>1 && zahyo.size%2==1 return true else return false end end main |
96sakaさん ありがとうございました。 深夜なのに返事いただいていて恐縮しました。 昨夜は力尽きて寝てしまい今職場に戻ってきたところです。 結論から申し上げますと完璧に5万本の線が消えてくれました。 96sakaさんにご多幸がありますことを・・・ 本当にありがとうございました。 |
当時、コジマさんのに倣ってjgawkで自在じゃない線消を作ったのが出てきました。 http://www.kct.ne.jp/~unosuke/senkesi.zip 範囲選択は矩形ですが同じような事ができると思います。 |
卯之介さん お返事ありがとうございました。 早速使わせて頂いたところ、見事に5万本きえました jgawkで作れる方とは・・・。 先週はどうにかならないものかとネットで探していたのですが かなり調べても存在していないと思います。 この掲示板にいるエキスパートの方々のすごさが改めて感じました。 これからもよろしくお願いします。 ありがとうございました。 |