Jw_cad 相談室−その2 New

 Jw_cad についての相談の場としてお使いください
情報の交換には Jw_cad 情報交換室 をご利用ください
なお、情報交換室と相談室の両方に同じ内容を投稿するのはご遠慮ください

2009年9月以前の発言過去ログのページからご覧ください。

それ以降の過去ログは消失しています。
申し訳ありませんが、復活の予定はありません。


  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム  
186 / 411 ツリー    ←次へ | 前へ→

外部変形の円・円弧内 消去 snackpan 17/3/12(日) 16:06

外部変形の円・円弧内 消去 その1 kojima 17/3/13(月) 8:52
Re:外部変形の円・円弧内 消去 R.N 17/3/15(水) 16:07
Re:外部変形の円・円弧内 消去 P 17/3/15(水) 18:44
外部変形の円・円弧内 消去 修正その1 kojima 17/3/15(水) 21:03
外部変形の円・円弧内 消去 修正その2 kojima 17/3/15(水) 21:04
Re:外部変形の円・円弧内 消去 修正その2 R.N 17/3/16(木) 18:42

外部変形の円・円弧内 消去 その1
 kojima  - 17/3/13(月) 8:52 -
バッチファイルにrubyスクリプトを記述するタイプの外部変形です。
(Rubyのインストールが必要)


@REM 円内の直線を消去
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #zz
REM #zw
REM #zc
REM #h2
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt > jwc_temp.txt
pause
goto end
#!ruby -Ks
include Math
#3線と円の交点角度の配列を返す(扁平率は考慮しない)
def sen_en_kakudo(sen,en)
kakudo=[]
if en.size==4
x=en[1]
y=en[2]
r=en[3]
en[4]=0
en[5]=0
en[6]=1
en[7]=0
else
x=en[1]
y=en[2]
r=en[3]
end
hen=en[6]
ziku=en[7]
ziku_arg=ziku*2*PI/360
sen_x=sen[2]-sen[0]
sen_y=sen[3]-sen[1]
sen_kakudo1=atan2(sen_y,sen_x)
en_x1=x-sen[0]
en_y1=y-sen[1]
en_x2=sen[2]-x
en_y2=sen[3]-y
en_xy1=sqrt(en_x1**2+en_y1**2)
en_xy2=sqrt(en_x2**2+en_y2**2)
en_kakudo1=atan2(en_y1,en_x1)
en_kakudo2=atan2(en_y2,en_x2)
if hen==1 && ziku==0
sen_x1=sen[0]
sen_y1=sen[1]
sen_x2=sen[2]
sen_y2=sen[3]
else
sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg)
sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen
sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg)
sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen
end
if sen_x1>sen_x2
sen_x1,sen_x2=sen_x2,sen_x1
sen_y1,sen_y2=sen_y2,sen_y1
elsif sen_x1==sen_x2
if sen_y1>sen_y2
sen_y1,sen_y2=sen_y2,sen_y1
end
end
senx=(sen_x2-sen_x1)
seny=(sen_y2-sen_y1)
sen_kakudo2=atan2(seny,senx)
en_kakudo2_1=atan2((y-sen_y1),x-sen_x1)
en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2)
en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2)
henkaku=sen_kakudo2-en_kakudo2_1
y1=en_xy2_1*sin(henkaku)
if r>y1.abs
x1=sqrt(r**2-y1**2)
kakudo1=atan2(y1,-x1)
kakudo2=atan2(y1,x1)
if en_xy2_1>r && (sen_x1<en[1]+r*
cos(kakudo1+sen_kakudo2) && sen_x2>en[1]+r*
cos(kakudo1+sen_kakudo2) or
sen_y1<en[2]+r*
sin(kakudo1+sen_kakudo2) && sen_y2>en[2]+r*
sin(kakudo1+sen_kakudo2))
kakudo<<(kakudo1+sen_kakudo2)*360/(2*PI)+ziku
end
if en_xy2_2>r && (sen_x2>en[1]+r*
cos(kakudo2+sen_kakudo2) && sen_x1<en[1]+r*
cos(kakudo2+sen_kakudo2) or
sen_y2>en[2]+r*
sin(kakudo2+sen_kakudo2) &&
sen_y1<en[2]+r*sin(kakudo2+sen_kakudo2))
kakudo<<(kakudo2+sen_kakudo2)*360/(2*PI)+ziku
end
end
if kakudo.size!=0
kakudo.collect!{|item|
if item<0
360+item
else
item
end
}
return kakudo
else
return nil
end
end
#5線と円の交点座標の配列を返す(扁平率・軸角考慮)
def sen_en_zahyo(sen,en)
zahyo=[]
if en.size==4
x=en[1]
y=en[2]
r=en[3]
en[4]=0
en[5]=0
en[6]=1
en[7]=0
else
x=en[1]
y=en[2]
r=en[3]
end
hen=en[6]
ziku=en[7]
kakudo=sen_en_kakudo(sen,en) if sen_en_kakudo(sen,en)
if kakudo
kakudo.each{|item| rajian=item*2*PI/360
ziku_arg=ziku*2*PI/360
ax=r*cos(rajian-ziku_arg)
ay=r*sin(rajian-ziku_arg)*hen
axy=sqrt(ax**2+ay**2)
arg=atan2(ay,ax)
axt=x+axy*cos(arg+ziku_arg)
ayt=y+axy*sin(arg+ziku_arg)
zahyo<<[axt,ayt]
}
end
if zahyo.size>0
return zahyo
else
return nil
end
end
#tenの位置がenの内(true)か、外(false)かを判定
def area(en,ten)
zahyo=[]
zahyo<<sen_en_zahyo([0,0,ten[0],ten[1]],en) if sen_en_zahyo([0,0,ten[0],ten[1]],en)
if(zahyo.flatten).size==2
return true
else
return false
end
end
#点が円上にあるか?
def ten_en_kouten?(ten,en)
if en.size==4
en[4]=0
en[5]=360
en[6]=1
en[7]=0
end
en[5]+=360 if en[4]==en[5]
ten_arg=atan2(ten[1],ten[0])
tenx=ten[0]-en[1]
teny=ten[1]-en[2]
tenxy=sqrt(tenx**2+teny**2)
x=en[3]*cos(ten_arg-en[7]*2*PI/360)
y=en[3]*sin(ten_arg-en[7]*2*PI/360)*en[6]
xy=sqrt(x**2+y**2)
if ika3(tenxy)==ika3(xy)
return true
else
return false
end
end
#数値の小数点3桁以下を切り捨て
def ika3(x)
a=(((x.to_f)*1000000).to_i/1000000.to_f)
return a
end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko@ai126250014234.11.tss.access-internet.ne.jp>
・ツリー全体表示

Re:外部変形の円・円弧内 消去
 R.N  - 17/3/15(水) 16:07 -
▼kojimaさん:

外変公開、感謝いたします。
試用させて頂きました。

その1・2を結合して、BATとして保存したのですが---
実行しても、エラー等は表示されないのですが、現状のままで、円内を消去することができません?
何か不手際があるでしょうか?

win10-64,Ruby-186,jww7.11

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0@p651066-ipngn4001fukuhanazo.fukushima.ocn.ne.jp>
・ツリー全体表示

Re:外部変形の円・円弧内 消去
 P  - 17/3/15(水) 18:44 -
▼R.Nさん:

>その1・2を結合して、BATとして保存したのですが---
>実行しても、エラー等は表示されないのですが、現状のままで、円内を消去することができません?
>何か不手際があるでしょうか?
>
>win10-64,Ruby-186,jww7.11

消去したい線と円が同一レイヤグループにありますか?
違う場合はR.Nさんと同じ症状になりました

▼kojimaさん
公開有り難うございます
円弧でも消去出来るのですね

引用なし

パスワード


<Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)@scgn-b6ec0c83.sec.ppp.nifty.com>
・ツリー全体表示

外部変形の円・円弧内 消去 修正その1
 kojima  - 17/3/15(水) 21:03 -
@REM 円内の直線を消去
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht30
REM #zz
REM #zw
REM #zc
REM #h2
REM #hp
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt > jwc_temp.txt
pause
goto end
#!ruby -Ks
include Math
#3線と円の交点角度の配列を返す(扁平率は考慮しない)
def sen_en_kakudo(sen,en)
kakudo=[]
if en.size==4
x=en[1]
y=en[2]
r=en[3]
en[4]=0
en[5]=0
en[6]=1
en[7]=0
else
x=en[1]
y=en[2]
r=en[3]
end
hen=en[6]
ziku=en[7]
ziku_arg=ziku*2*PI/360
sen_x=sen[2]-sen[0]
sen_y=sen[3]-sen[1]
sen_kakudo1=atan2(sen_y,sen_x)
en_x1=x-sen[0]
en_y1=y-sen[1]
en_x2=sen[2]-x
en_y2=sen[3]-y
en_xy1=sqrt(en_x1**2+en_y1**2)
en_xy2=sqrt(en_x2**2+en_y2**2)
en_kakudo1=atan2(en_y1,en_x1)
en_kakudo2=atan2(en_y2,en_x2)
if hen==1 && ziku==0
sen_x1=sen[0]
sen_y1=sen[1]
sen_x2=sen[2]
sen_y2=sen[3]
else
sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg)
sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen
sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg)
sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen
end
if sen_x1>sen_x2
sen_x1,sen_x2=sen_x2,sen_x1
sen_y1,sen_y2=sen_y2,sen_y1
elsif sen_x1==sen_x2
if sen_y1>sen_y2
sen_y1,sen_y2=sen_y2,sen_y1
end
end
senx=(sen_x2-sen_x1)
seny=(sen_y2-sen_y1)
sen_kakudo2=atan2(seny,senx)
en_kakudo2_1=atan2((y-sen_y1),x-sen_x1)
en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2)
en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2)
henkaku=sen_kakudo2-en_kakudo2_1
y1=en_xy2_1*sin(henkaku)
if r>y1.abs
x1=sqrt(r**2-y1**2)
kakudo1=atan2(y1,-x1)
kakudo2=atan2(y1,x1)
if en_xy2_1>r && (sen_x1<en[1]+r*
cos(kakudo1+sen_kakudo2) && sen_x2>en[1]+r*
cos(kakudo1+sen_kakudo2) or
sen_y1<en[2]+r*
sin(kakudo1+sen_kakudo2) && sen_y2>en[2]+r*
sin(kakudo1+sen_kakudo2))
kakudo<<(kakudo1+sen_kakudo2)*360/(2*PI)+ziku
end
if en_xy2_2>r && (sen_x2>en[1]+r*
cos(kakudo2+sen_kakudo2) && sen_x1<en[1]+r*
cos(kakudo2+sen_kakudo2) or
sen_y2>en[2]+r*
sin(kakudo2+sen_kakudo2) &&
sen_y1<en[2]+r*sin(kakudo2+sen_kakudo2))
kakudo<<(kakudo2+sen_kakudo2)*360/(2*PI)+ziku
end
end
if kakudo.size!=0
kakudo.collect!{|item|
if item<0
360+item
else
item
end
}
return kakudo
else
return nil
end
end
#5線と円の交点座標の配列を返す(扁平率・軸角考慮)
def sen_en_zahyo(sen,en)
zahyo=[]
if en.size==4
x=en[1]
y=en[2]
r=en[3]
en[4]=0
en[5]=0
en[6]=1
en[7]=0
else
x=en[1]
y=en[2]
r=en[3]
end
hen=en[6]
ziku=en[7]
kakudo=sen_en_kakudo(sen,en) if sen_en_kakudo(sen,en)
if kakudo
kakudo.each{|item| rajian=item*2*PI/360
ziku_arg=ziku*2*PI/360
ax=r*cos(rajian-ziku_arg)
ay=r*sin(rajian-ziku_arg)*hen
axy=sqrt(ax**2+ay**2)
arg=atan2(ay,ax)
axt=x+axy*cos(arg+ziku_arg)
ayt=y+axy*sin(arg+ziku_arg)
zahyo<<[axt,ayt]
}
end
if zahyo.size>0
return zahyo
else
return nil
end
end
#tenの位置がenの内(true)か、外(false)かを判定
def area(en,ten)
zahyo=[]
zahyo<<sen_en_zahyo([0,0,ten[0],ten[1]],en) if sen_en_zahyo([0,0,ten[0],ten[1]],en)
if(zahyo.flatten).size==2
return true
else
return false
end
end
#点が円上にあるか?
def ten_en_kouten?(ten,en)
if en.size==4
en[4]=0
en[5]=360
en[6]=1
en[7]=0
end
en[5]+=360 if en[4]==en[5]
ten_arg=atan2(ten[1],ten[0])
tenx=ten[0]-en[1]
teny=ten[1]-en[2]
tenxy=sqrt(tenx**2+teny**2)
x=en[3]*cos(ten_arg-en[7]*2*PI/360)
y=en[3]*sin(ten_arg-en[7]*2*PI/360)*en[6]
xy=sqrt(x**2+y**2)
if ika3(tenxy)==ika3(xy)
return true
else
return false
end
end
#数値の小数点3桁以下を切り捨て
def ika3(x)
a=(((x.to_f)*1000000).to_i/1000000.to_f)
return a
end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko@ai126146114147.53.access-internet.ne.jp>
・ツリー全体表示

外部変形の円・円弧内 消去 修正その2
 kojima  - 17/3/15(水) 21:04 -
en=[];naigai=[]
while ARGF.gets
xy=$_.split
if xy[0]=~/^ci/
xy.collect!{|item|item.to_f}
en<<xy
end
end
puts "hd"
open("temp.txt","r"){|f|
while line=f.gets
xy=line.split
if xy[0]=~/^hq/
elsif xy[0]=~/^\d|^-/
xy.collect!{|item|item.to_f}
if xy[0]>xy[2]
xy[0],xy[2],xy[1],xy[3]=xy[2],xy[0],xy[3],xy[1]
elsif xy[0]==xy[2]
if xy[1]>xy[3]
xy[1],xy[3]=xy[3],xy[1]
end
end
xy2=xy.collect{|item|ika3(item)}
arg=atan2(xy2[3]-xy2[1],xy2[2]-xy2[0])
kouten=[];area1=0;area2=0
en.each{|item|
if sen_en_zahyo(xy2,item)!=nil
if sen_en_zahyo(xy2,item).size==2
kouten<<[sen_en_zahyo(xy2,item)[0][0],sen_en_zahyo(xy2,item)[0][1]]
kouten<<[sen_en_zahyo(xy2,item)[1][0],sen_en_zahyo(xy2,item)[1][1]]
elsif sen_en_zahyo(xy2,item).size==1
kouten<<[sen_en_zahyo(xy2,item)[0][0],sen_en_zahyo(xy2,item)[0][1]]
end
end
if area(item,[xy2[0],xy2[1]])==true
area1+=1
end
if area(item,[xy2[2],xy2[3]])==true
area2+=1
end
}
if xy[0]==xy[2]
kouten2=kouten.sort{|a,b|a[1]<=>b[1]}
else
kouten2=kouten.sort{|a,b|a[0]<=>b[0]}
end
if area1==0 && kouten2.size>0
printf("%.11f %.11f %.11f %.11f\n",xy[0],xy[1],kouten2[0][0],kouten2[0][1])
end
if area2==0 && kouten2.size>0
printf("%.11f %.11f %.11f %.11f\n",xy[2],xy[3],kouten2[-1][0],kouten2[-1][1])
end
if kouten2.size>=2
area1==0 ? n1=1 : n1=0
area2==0 ? n2=kouten2.size-3 : n2=kouten2.size-2
n1.step(n2,2){|i|printf("%.11f %.11f %.11f %.11f\n",kouten2[i][0],kouten2[i][1],kouten2[i+1][0],kouten2[i+1][1])}
end
if kouten.size==0 && area1==0 && area2==0
print line
end
naigai<<area2
elsif xy[0]=~/^pt/
area1=0
en.each{|item|
if area(item,[xy[1].to_f,xy[2].to_f])==true
area1+=1
end
}
print line if area1==0
else
print line
end
end
}
__END__
:end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko@ai126146114147.53.access-internet.ne.jp>
・ツリー全体表示

Re:外部変形の円・円弧内 消去 修正その2
 R.N  - 17/3/16(木) 18:42 -
▼kojimaさん:

修正ありがとうございます。
消去できました。

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0@p651066-ipngn4001fukuhanazo.fukushima.ocn.ne.jp>
・ツリー全体表示

186 / 411 ツリー    ←次へ | 前へ→
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃過去ログ ┃ホーム  
 443143
ページ:  ┃  記事番号:  

C-BOARD Moyuku v1.03b3
Jw_cad Copyright (C)1997-2016 Jiro Shimizu & Yoshifumi Tanaka