過去ログ

                                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さん作)でできるらしいのですが、リンク先きが見つからず確認できないです。
リンク先もしくは別の方法でも方法があればお願いします。

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : 96saka  ■日付 : 20/3/29(日) 23:22  -------------------------------------------------------------------------
   ▼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)


これでいけると思います。

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : sato  ■日付 : 20/3/30(月) 1:11  -------------------------------------------------------------------------
   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

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : 96saka  ■日付 : 20/3/30(月) 2:19  -------------------------------------------------------------------------
   ▼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

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : sato  ■日付 : 20/3/30(月) 19:27  -------------------------------------------------------------------------
   96sakaさん

ありがとうございました。
深夜なのに返事いただいていて恐縮しました。
昨夜は力尽きて寝てしまい今職場に戻ってきたところです。
結論から申し上げますと完璧に5万本の線が消えてくれました。
96sakaさんにご多幸がありますことを・・・
本当にありがとうございました。

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : 卯之介  ■日付 : 20/3/30(月) 9:29  -------------------------------------------------------------------------
   当時、コジマさんのに倣ってjgawkで自在じゃない線消を作ったのが出てきました。

http://www.kct.ne.jp/~unosuke/senkesi.zip
範囲選択は矩形ですが同じような事ができると思います。

 ───────────────────────────────────────  ■題名 : Re:不要な極小線の削除について  ■名前 : sato  ■日付 : 20/3/30(月) 19:44  -------------------------------------------------------------------------
   卯之介さん

お返事ありがとうございました。
早速使わせて頂いたところ、見事に5万本きえました
jgawkで作れる方とは・・・。
先週はどうにかならないものかとネットで探していたのですが
かなり調べても存在していないと思います。
この掲示板にいるエキスパートの方々のすごさが改めて感じました。
これからもよろしくお願いします。
ありがとうございました。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 617