過去ログ

                                Page    1503
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼曲線上に等間隔の点  初心者ちゃん 21/7/23(金) 15:14
   ┣Re:曲線上に等間隔の点  N.Misumi 21/7/23(金) 17:08
   ┃  ┗Re:曲線上に等間隔の点  初心者ちゃん 21/7/24(土) 17:57
   ┣Re:曲線上に等間隔の点  通りすがりの後期高齢者 21/7/24(土) 15:37
   ┃  ┗Re:曲線上に等間隔の点  Keiichi 21/7/24(土) 17:45
   ┃     ┗Re:曲線上に等間隔の点  通りすがりの後期高齢者 21/7/24(土) 18:42
   ┗その1  kojima 21/8/1(日) 0:30
      ┣続き  kojima 21/8/1(日) 0:31
      ┣Re:外変  R.N 21/8/1(日) 10:10
      ┃  ┗Re:外変  kojima 21/8/1(日) 10:21
      ┃     ┗Re:外変  R.N 21/8/1(日) 10:29
      ┗Re:外変(確認依頼)  R.N 21/8/3(火) 19:09
         ┣[投稿者削除]   
         ┗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

 ───────────────────────────────────────
 ■題名 : 曲線上に等間隔の点
 ■名前 : 初心者ちゃん
 ■日付 : 21/7/23(金) 15:14
 -------------------------------------------------------------------------
   こんにちは。jwcab初心者です。
スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。
楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。
(円の扁平率設定で描けるきれいな楕円ではありません)

分割ツールで試してみましたがうまくいかず。。
どなたかお分かりでしたらご教示いただけますと幸いです。

 ───────────────────────────────────────  ■題名 : Re:曲線上に等間隔の点  ■名前 : N.Misumi  ■日付 : 21/7/23(金) 17:08  ■Web : http://yakushima-tonbo.com  -------------------------------------------------------------------------
   ▼初心者ちゃんさん:
>こんにちは。jwcab初心者です。
>スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。
>楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。
>(円の扁平率設定で描けるきれいな楕円ではありません)
>
>分割ツールで試してみましたがうまくいかず。。
>どなたかお分かりでしたらご教示いただけますと幸いです。

こちらで可能だと思います。

外部変形−円弧直線連続線分割 07
( VisualBasic6.0ランタイムの動作する環境 )
http://siegel.cocolog-nifty.com/siegels_blog/2011/02/07-2b86.html

Visual Basic 6.0 SP6 ランタイムファイル
https://www.vector.co.jp/soft/dl/win95/util/se342080.html

 ───────────────────────────────────────  ■題名 : Re:曲線上に等間隔の点  ■名前 : 初心者ちゃん  ■日付 : 21/7/24(土) 17:57  -------------------------------------------------------------------------
   ▼N.Misumiさん:
>こちらで可能だと思います。
>
>外部変形−円弧直線連続線分割 07
>( VisualBasic6.0ランタイムの動作する環境 )
>http://siegel.cocolog-nifty.com/siegels_blog/2011/02/07-2b86.html
>
>Visual Basic 6.0 SP6 ランタイムファイル
>https://www.vector.co.jp/soft/dl/win95/util/se342080.html

こちらの外部変形で思い通りに分割することができました。
ご回答いただきありがとうございます!

 ───────────────────────────────────────  ■題名 : Re:曲線上に等間隔の点  ■名前 : 通りすがりの後期高齢者  ■日付 : 21/7/24(土) 15:37  -------------------------------------------------------------------------
   ▼初心者ちゃんさん:
>こんにちは。jwcab初心者です。
>スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。
>楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。
>(円の扁平率設定で描けるきれいな楕円ではありません)
>
>分割ツールで試してみましたがうまくいかず。。
>どなたかお分かりでしたらご教示いただけますと幸いです。


こんにちは。

※円弧を含まない開放連続線の場合
Jw_cad[分割]コマンド可能です。

分割、割付方法を設定
Shift+Ctrlで始点をクリック(R)
終点指示(R)終了または次点指示で継続〜

※円弧を含む開放連続線の場合の例

N.Misumiさん紹介の"円弧直線連続線分割07"

※任意の分割、割付方法による円弧を含む
開放図形及び閉鎖図形については
私の知る限り公開されていないようです。

私も昔、挑戦してみましたが円弧を含む
閉鎖図形の場合が分割方式によっては上手く
いかず頓挫した覚えがあります。

 ───────────────────────────────────────  ■題名 : Re:曲線上に等間隔の点  ■名前 : Keiichi  ■日付 : 21/7/24(土) 17:45  -------------------------------------------------------------------------
   ▼通りすがりの後期高齢者さん:
>※円弧を含まない開放連続線の場合
>Jw_cad[分割]コマンド可能です。
>
>分割、割付方法を設定
>Shift+Ctrlで始点をクリック(R)
>終点指示(R)終了または次点指示で継続〜

ヘルプファイルより
・[Shift]キーを押しながら右クリック(R)で連続線を指示すると、その連続線の端点が連続点なる。

Ctrlキーは要らないのでは?

 ───────────────────────────────────────  ■題名 : Re:曲線上に等間隔の点  ■名前 : 通りすがりの後期高齢者  ■日付 : 21/7/24(土) 18:42  -------------------------------------------------------------------------
   ▼Keiichiさん:
>▼通りすがりの後期高齢者さん:
>>※円弧を含まない開放連続線の場合
>>Jw_cad[分割]コマンド可能です。
>>
>>分割、割付方法を設定
>>Shift+Ctrlで始点をクリック(R)
>>終点指示(R)終了または次点指示で継続〜
>
>ヘルプファイルより
>・[Shift]キーを押しながら右クリック(R)で連続線を指示すると、その連続線の端点が連続点なる。
>
>Ctrlキーは要らないのでは?

ご指摘の通りでした。

 ───────────────────────────────────────  ■題名 : その1  ■名前 : kojima  ■日付 : 21/8/1(日) 0:30  -------------------------------------------------------------------------
   @REM 連続線(円弧含)上に等間隔で実点を描く
@echo off
REM #jww
REM #cd
goto %1
REM #hm|距離指定(L)|分割数指定(R)|
REM #:1
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c間隔 無指定:200/_/a
REM #k|1)線端起点(L)|2)両端均等(R)|/_/b
REM #hp
REM #e
REM #:2
REM #h1
REM #1連続線の始点を順に右クリックしてください
REM #99#
REM #c分割数 無指定:10/_/c
REM #hp
REM #e
:1
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt %1 %2 %3> 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
return renzoku
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
#円弧上に間隔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

 ───────────────────────────────────────  ■題名 : 続き  ■名前 : kojima  ■日付 : 21/8/1(日) 0:31  -------------------------------------------------------------------------
   #楕円弧上に間隔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]
0.upto(item.size-1){|i|xy<<item[i]}
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!
0.upto(sen_a.size-1){|i|
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
0.upto(sen_a.size-1){|i|
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])
argatan2(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

0.upto(n-2){|i2|
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)
}
elsif l2==l
yo_tyo=0
end
else
yo_tyo += l
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
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
#コマンドライン引数
pitch=200;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/
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==8
if(xy[4]>xy[5])
xy[4] -= 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
end
0.upto(hp_a.size-1){|i|
ten=hp_a[i]
rensen=loop_renzoku_seach(sen_a,ten)
if rensen.size>0
t_l=rensen_total_l(rensen)
if sitei==1
if kiten==2
n=(t_l/pitch).to_i
l2=pitch-((t_l-n*pitch)+pitch)/2
yo_tyo=l2
else
yo_tyo=0
end
else
pitch=t_l/nn
yo_tyo=0
end
rensen_ten_draw(rensen,pitch,yo_tyo)
end
}
__END__
:end

 ───────────────────────────────────────  ■題名 : Re:外変  ■名前 : R.N  ■日付 : 21/8/1(日) 10:10  -------------------------------------------------------------------------
   ▼kojimaさん:こんにちは、

外変提供して頂き、感謝です。☆⌒(*^∇゜)v !!

batファイル名を、"連続線(円弧含)上に等間隔で実点を描く.bat" とすると、
エラーは出ないのですが、実行できず終了。

フォルダー名を、"連続線(円弧含)上に等間隔で実点を描く" にすると、
同じく、実行できず終了。

()記号を取り除くと、問題なく動作します。
kojimaさんの環境では、問題なく実行できる、ということでは、
私の環境の問題かも知れませんが---
(Windows 10 Home(21H1)19043.1151、Ruby1.8.7-p374)

ありがとうございます。

 ───────────────────────────────────────  ■題名 : Re:外変  ■名前 : kojima  ■日付 : 21/8/1(日) 10:21  -------------------------------------------------------------------------
   ▼R.Nさん:
>▼kojimaさん:こんにちは、
>
>外変提供して頂き、感謝です。☆⌒(*^∇゜)v !!
>
>batファイル名を、"連続線(円弧含)上に等間隔で実点を描く.bat" とすると、
>エラーは出ないのですが、実行できず終了。
>
>フォルダー名を、"連続線(円弧含)上に等間隔で実点を描く" にすると、
>同じく、実行できず終了。
>
>()記号を取り除くと、問題なく動作します。
>kojimaさんの環境では、問題なく実行できる、ということでは、
>私の環境の問題かも知れませんが---

>(Windows 10 Home(21H1)19043.1151、Ruby1.8.7-p374)
>
>ありがとうございます。

@REM 連続線(円弧含)上に等間隔で実点を描く
は、外変選択画面のメモ欄に表示される文字です。

batファイル名ではありません。
ファイル名は、適当に付けてください。
(batファイル名で()や半角スペースは、区切り文字になってしまいます。)

 ───────────────────────────────────────  ■題名 : Re:外変  ■名前 : R.N  ■日付 : 21/8/1(日) 10:29  -------------------------------------------------------------------------
   ▼kojimaさん:

レス、ありがとうございます。

理解していましたが、
使用される方の参考として---

すみません。

 ───────────────────────────────────────  ■題名 : Re:外変(確認依頼)  ■名前 : R.N  ■日付 : 21/8/3(火) 19:09  -------------------------------------------------------------------------
   ▼kojimaさん:

こんにちは、
たびたび、すみません。

楕円弧をひとつ描いて実行すると、下記エラーが---
(確認、お願いします)

連続線実点分割.bat:343:in `rensen_total_l’: undefined local variable or method `xy’for main:Object (NameError)
from 連続線実点分割.bat:333:in `upto’
from 連続線実点分割.bat:333:in `rensen_total_l’
from 連続線実点分割.bat:402
from 連続線実点分割.bat:398:in `upto’
from 連続線実点分割.bat:398

 ───────────────────────────────────────  ■題名 : [投稿者削除]  ■名前 :  ■日付 :  -------------------------------------------------------------------------
   この書き込みは投稿者によって削除されました。(21/8/3(火) 23:06)

 ───────────────────────────────────────  ■題名 : 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

 ───────────────────────────────────────  ■題名 : 続き  ■名前 : 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

 ───────────────────────────────────────  ■題名 : 続々  ■名前 : 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

 ───────────────────────────────────────  ■題名 : Re:外変(確認依頼)  ■名前 : R.N  ■日付 : 21/8/6(金) 5:25  -------------------------------------------------------------------------
   ▼kojimaさん:

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

了解しました。

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

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