Jw_cad 相談室−その2 New

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

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

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


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

曲線上に等間隔の点 初心者ちゃん 21/7/23(金) 15:14

Re:外変(確認依頼) kojima 21/8/3(火) 23:13
続き kojima 21/8/4(水) 0:35
続々 kojima 21/8/4(水) 0:36
Re:外変(確認依頼) R.N 21/8/6(金) 5:25

Re:外変(確認依頼)
 kojima  - 21/8/3(火) 23:13 -
楕円・楕円弧は誤差を含みます。
拡大すると実点は楕円上からズレています。

楕円・楕円弧については、標準機能で作図したほうが正確です。


@REM 連続線・閉鎖連続線(円弧含)上に等間隔で実点を描く
@echo off
goto %1
REM #jww
REM #cd
REM #hm|距離指定(L)|分割数指定(R)|
REM #:1
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c間隔 無指定:200/_/a
REM #k|1)線端起点(L)|2)両端均等(R)|指定間隔以下|/_/b
REM #k閉鎖図形の時の作図方向|1)時計廻(L)|2)反時計廻(R)|/_/c
REM #hp
REM #e
REM #:2
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c分割数 無指定:10/_/d
REM #hp
REM #e
:1
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2 %3 %4> jwc_temp.txt
pause
goto end
:2
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2> jwc_temp.txt
pause
goto end
#!ruby -Ks
include Math
#楕円弧の始点座標を返す
def daenko_siten(zahyo)
if zahyo.size==7
x=zahyo[0]
y=zahyo[1]
r=zahyo[2]
siten=zahyo[3]
hen=zahyo[5]
ziku=zahyo[6]
rajian=siten*PI/180
ziku_arg=ziku*PI/180
zahyo_x=r*cos(rajian)
zahyo_y=r*sin(rajian)*hen
zahyo_xy=hypot(zahyo_y,zahyo_x)
zahyo_arg=atan2(zahyo_y,zahyo_x)
zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg)
zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg)

return zahyo_xt,zahyo_yt
end
end
#楕円弧の終点座標を返す
def daenko_syuten(zahyo)
if zahyo.size==7
x=zahyo[0]
y=zahyo[1]
r=zahyo[2]
syuten=zahyo[4]
hen=zahyo[5]
ziku=zahyo[6]
rajian=syuten*PI/180
ziku_arg=ziku*PI/180
zahyo_x=r*cos(rajian)
zahyo_y=r*sin(rajian)*hen
zahyo_xy=hypot(zahyo_y,zahyo_x)
zahyo_arg=atan2(zahyo_y,zahyo_x)
zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg)
zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg)

return zahyo_xt,zahyo_yt
end
end
#線の配列senから閉鎖図形・連続線を区分けする
def loop_renzoku_seach(sen,ten)
cl=1;flg=0;i=0
x=ten[0];y=ten[1]
0.upto(sen.size-1){|i|
if (sen[i][0]-x).abs<cl && (sen[i][1]-y).abs<cl or (sen[i][2]-x).abs<cl && (sen[i][3]-y).abs<cl
flg=1;break;
end
}
if flg==1
b=sen[i];sen.delete(sen[i])
end
if(b[2]-x).abs<cl && (b[3]-y).abs<cl
if b.size==4
a=[b[2],b[3],b[0],b[1]]
else
a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]
end
else
if b.size==4
a=[b[0],b[1],b[2],b[3]]
else
a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]
end
end
renzoku=[a];flg=1
while flg==1
flg=0
0.upto(sen.size-1){|i|
if (sen[i][0]-a[2]).abs<cl && (sen[i][1]-a[3]).abs<cl or (sen[i][2]-a[2]).abs<cl && (sen[i][3]-a[3]).abs<cl
flg=1;break;
end
}
if flg==1
b=sen[i];size=renzoku.size
if (renzoku[size-1][2]-b[0]).abs<cl && (renzoku[size-1][3]-b[1]).abs<cl
if b.size==4
a=[b[0],b[1],b[2],b[3]]#線データ
else
a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ
end
elsif (renzoku[size-1][2]-b[2]).abs<cl && (renzoku[size-1][3]-b[3]).abs<cl
if b.size==4
a=[b[2],b[3],b[0],b[1]]#線データ
else
a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ
end
end
renzoku<<a
sen.delete(sen[i])
end
end
dx=(renzoku[0][0]-renzoku[-1][2]).abs
dy=(renzoku[0][1]-renzoku[-1][3]).abs
if dx<cl && dy<cl
return 1,renzoku
else
return 0,renzoku
end
#return renzoku
end
#連続線を点の配列にする
def rensen_point_array(rensen)
array=[[rensen[0][0],rensen[0][1]],[rensen[0][2],rensen[0][3]]]
rensen[1..-1].each{|item|array<<[item[2],item[3]]}
return array.uniq
end
#座標面積を返す
def zahyo_s(array)
s=0
0.upto(array.size-1){|i|
if i==0
x1=array[-1][0]
else
x1=array[i-1][0]
end
if i==array.size-1
x2=array[0][0]
else
x2=array[i+1][0]
end
s += (x2-x1)*array[i][1]
}
return s
end
#線上に間隔pitchで実点を描く
def ln_ten_draw(item,pitch,yo_tyo)
x1=item[0];y1=item[1];
l=sqrt((item[3]-item[1])*(item[3]-item[1])+(item[2]-item[0])*(item[2]-item[0]))
arg=atan2(item[3]-item[1],item[2]-item[0])
l2=pitch-yo_tyo
if l2<=l
printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg))
if l2<l
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg))
}
elsif l2==l
yo_tyo=0
end
else
yo_tyo += l
end
return yo_tyo
end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62@ai126160107004.39.access-internet.ne.jp>
・ツリー全体表示

続き
 kojima  - 21/8/4(水) 0:35 -
#円弧上に間隔pitchで実点を描く
def arc_ten_draw(item,pitch,yo_tyo)
cl=1
x1=item[0];y1=item[1];x2=item[2];y2=item[3]
r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8]
arg=(syukaku-sikaku)*PI/180
l=r*arg
l2=pitch-yo_tyo
d_arg=l2/r
zahyo=[]
4.upto(item.size-1){|i|zahyo<<item[i]}
ten=daenko_siten(zahyo)
x=ten[0];y=ten[1];
if (x-x1).abs<cl && (y-y1).abs<cl
#円弧の始角が連続線の始点
if l2<=l
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
d_arg=l2/r
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
}
elsif l2==l
pt_x=r_x+r*cos(sikaku*PI/180+d_arg)
pt_y=r_y+r*sin(sikaku*PI/180+d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
yo_tyo=0
else
yo_tyo += l
end
else
#円弧の終角が連続線の始点
if l2<l
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
0.upto(n-2){|i|
l2 += pitch
d_arg=l2/r
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
}
elsif l2==l
pt_x=r_x+r*cos(syukaku*PI/180-d_arg)
pt_y=r_y+r*sin(syukaku*PI/180-d_arg)
printf("pt %.11f %.11f\n",pt_x,pt_y)
yo_tyo=0
else
yo_tyo += l
end
end
return yo_tyo
end
#楕円弧上に間隔pitchで実点を描く
def arc_ten_draw2(item,pitch,yo_tyo)

cl=1
x1=item[0];y1=item[1];x2=item[2];y2=item[3]
r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8]
ziku_arg=item[10]*PI/180

xy=[0]
for i in 4..item.size-1
xy<<item[i]
end

sen_a=[];bunkaku=1
daen_rensen_array(sen_a,xy,bunkaku)
if((x1-sen_a[0][0]).abs<cl && (y1-sen_a[0][1]).abs<cl)
else
sen_a.reverse!
for i in 0..sen_a.size-1
x1=sen_a[i][0]
y1=sen_a[i][1]
x2=sen_a[i][2]
y2=sen_a[i][3]
sen_a[i][0]=x2
sen_a[i][1]=y2
sen_a[i][2]=x1
sen_a[i][3]=y1
end
end

for i in 0..sen_a.size-1
x1=sen_a[i][0];
y1=sen_a[i][1];
l=hypot(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0])
arg=atan2(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0])
l2=pitch-yo_tyo
if l2<=l
x3=x1+l2*cos(arg);y3=y1+l2*sin(arg)
arg2=atan2(y3-r_y,x3-r_x)
rx=r*cos(arg2-ziku_arg);
ry=r*sin(arg2-ziku_arg)/item[9]
arg3=atan2(ry,rx)
rx=r*cos(arg3);ry=r*sin(arg3)*item[9]
rl=hypot(ry,rx)
x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2)
printf("pt %.11f %.11f\n",x4,y4)
if l2<l
n=((l+yo_tyo)/pitch).to_i
yo_tyo=(l+yo_tyo)-pitch*n
for i2 in 0..n-2
l2 += pitch
x3=x1+l2*cos(arg);y3=y1+l2*sin(arg)
arg2=atan2(y3-r_y,x3-r_x)
rx=r*cos(arg2-ziku_arg);ry=r*sin(arg2-ziku_arg)/item[9]
arg3=atan2(ry,rx)
rx=r*cos(arg3);ry=r*sin(arg3)*item[9]
rl=hypot(ry,rx)
x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2)
printf("pt %.11f %.11f\n",x4,y4)
end
elsif l2==l
yo_tyo=0
end
else
yo_tyo += l
end
end

return yo_tyo
end
#連続線上に間隔pitchで実点を描く
def rensen_ten_draw(rensen,pitch,yo_tyo)
0.upto(rensen.size-1){|i|
if rensen[i].size==4#線データ
yo_tyo=ln_ten_draw(rensen[i],pitch,yo_tyo)
else#円弧データ
if rensen[i][9]==1
yo_tyo=arc_ten_draw(rensen[i],pitch,yo_tyo)
else
yo_tyo=arc_ten_draw2(rensen[i],pitch,yo_tyo)
end
end
}
end
#楕円弧を連続線に変更してsen_aに格納する
def daen_rensen_array(sen_a,xy,bunkaku)
cl=1
ten=daenko_siten(xy[1..-1]);x1=ten[0];y1=ten[1];
ten=daenko_syuten(xy[1..-1]);x2=ten[0];y2=ten[1];
x=xy[1];y=xy[2];r=xy[3];sikaku=xy[4];syukaku=xy[5];hen=xy[6];ziku=xy[7]
enko_kaku=syukaku-sikaku
n=(enko_kaku/bunkaku).to_i
if n==0
sen_a<<[x1,y1,x2,y2]
return 1
end
s_arg=sikaku*PI/180
ziku_arg=ziku*PI/180
bun_arg=bunkaku*PI/180
x2_2=0;y2_2=0
0.upto(n-2){|i|
rx=r*cos(s_arg)
ry=r*sin(s_arg)*hen
l=hypot(ry,rx)
arg=atan2(ry,rx)
x1_2=x+l*cos(arg+ziku_arg)
y1_2=y+l*sin(arg+ziku_arg)

rx=r*cos(s_arg+bun_arg)
ry=r*sin(s_arg+bun_arg)*hen
l=hypot(ry,rx)
arg=atan2(ry,rx)
x2_2=x+l*cos(arg+ziku_arg)
y2_2=y+l*sin(arg+ziku_arg)
sen_a<<[x1_2,y1_2,x2_2,y2_2]

s_arg += bun_arg
}
if (x2-x2_2).abs<cl && (y2-y2_2).abs<cl
else
sen_a<<[x2_2,y2_2,x2,y2]
end
return 0
end
#連続線の総延長を返す
def rensen_total_l(rensen)
t_l=0
0.upto(rensen.size-1){|i|
if rensen[i].size==4#線データ
l=hypot(rensen[i][3]-rensen[i][1],rensen[i][2]-rensen[i][0])
else
if rensen[i][9]==1
r=rensen[i][6]
arg=(rensen[i][8]-rensen[i][7])*PI/180
l=r*arg
else
sen_a=[];bunkaku=1
xy=rensen[i][3..-1]
daen_rensen_array(sen_a,xy,bunkaku)
l=0
0.upto(sen_a.size-1){|i2|
l += hypot(sen_a[i2][3]-sen_a[i2][1],sen_a[i2][2]-sen_a[i2][0])
}
end
end
t_l += l
}
return t_l
end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62@ai126170232220.41.access-internet.ne.jp>
・ツリー全体表示

続々
 kojima  - 21/8/4(水) 0:36 -
#rensenの並べ替え
def rev_array(rensen)
rensen2=[]
rensen.each{|item|
item[0],item[1],item[2],item[3]=item[2],item[3],item[0],item[1]
rensen2<<item
}
return rensen2.reverse
end
#コマンドライン引数
pitch=200.0;nn=10
sitei=ARGV[1].to_i
while ARGV.size>1
case argument=ARGV.pop
when /\/a/
pitch=argument[2..-1].to_f
when /\/b/
kiten=argument[2..-1].to_i
when /\/c/
houkou=argument[2..-1].to_i
when /\/d/
nn=argument[2..-1].to_i
end
end
#メインルーチン
sen_a=[];hp_a=[]
while ARGF.gets
xy=$_.split
if xy[0]=~/^hp/
hp_a<<[xy[1].to_f,xy[2].to_f]
end
if xy[0]=~/^\d|^-/
xy.collect!{|item|item.to_f}
sen_a<<xy
end
if xy[0]=~/^ci/
xy.collect!{|item|item.to_f}
if xy.size==4
xy<<0<<360<<1<<0
end
if(xy[4]>xy[5])
xy[4] -= 360
elsif xy[4]==xy[5]
xy[4]=0
xy[5]=360
end
zahyo=xy[1..-1]
ten=daenko_siten(zahyo);
x1=ten[0];y1=ten[1];
ten=daenko_syuten(zahyo);
x2=ten[0];y2=ten[1];
if(xy[7] != 0 && xy[6]==1)
xy[4] += xy[7]
xy[5] += xy[7]
xy[7]=0
end
sen_a<<[x1,y1,x2,y2,xy[1],xy[2],xy[3],xy[4],xy[5],xy[6],xy[7]]
end
end
0.upto(hp_a.size-1){|i|
ten=hp_a[i]
j,rensen=loop_renzoku_seach(sen_a,ten)
if rensen.size>0
if j==1
array=rensen_point_array(rensen)
s=zahyo_s(array)
if houkou ==1
if s<0
rensen=rev_array(rensen)
end
else
if s>0
rensen=rev_array(rensen)
end
end
end

t_l=rensen_total_l(rensen)
n=(t_l/pitch).to_i
if sitei==1
if kiten==2
l2=pitch-((t_l-n*pitch)+pitch)/2
yo_tyo=l2

elsif kiten==3
pitch=t_l/(n+1)
yo_tyo=0
printf("h#(#{n+1}分割) %.3fmm\n",pitch)
else
yo_tyo=0
end
printf("h#(#{n+1}分割)\n") unless kiten==3
else
pitch=t_l/nn
yo_tyo=0
printf("h#%.3fmm\n",pitch)
end
rensen_ten_draw(rensen,pitch,yo_tyo)
end
}
__END__
:end

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62@ai126170232220.41.access-internet.ne.jp>
・ツリー全体表示

Re:外変(確認依頼)
 R.N  - 21/8/6(金) 5:25 -
▼kojimaさん:

>楕円・楕円弧については、標準機能で作図したほうが正確です。

了解しました。

実行確認も、取り敢えず作図できるかの確認だけですが、問題ないようです。
編集頂き、感謝です!!

引用なし

パスワード


<Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0@pl105170.ag2001.nttpc.ne.jp>
・ツリー全体表示

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

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