※ NC コードの変換 (G90<->G91など 機能豊富です) 以前は、G90<->G91変換、小数点の有無の変換など、別々にスクリプトを 書いていました。でも、バグがあると各々のスクリプトを訂正しなくてはならず、 大変なんですね。 それで、いろんな変換を受け付けるコマンドを作りました。 マニュアルは、出来ていません。(^^;;) でも、とても役に立ちます。 $ cnv -G90 -dd1 -ij0 outputfile.nc とすると、G90 小数点有り、IJ 出力で出力します。 $ cnv -tz0.1 outputfile.nc で、0.1 上げたパスが出来ます。(開始位置はX0Y0Z100.0を想定) $ (for i in 0 90 180 270;do cnv -rz$i outputfile.nc で、90 度ずつ回転したパスをつなぎます。(上の for は bashの機能。編集要) -rx -ry -rz は X軸、Y軸、Z軸 回りの回転(半時計方向正)、 -mpxx -mpyy -mpzz は、X軸、Y軸、Z軸 を法線とする平面で面対称です。 -tx -ty -tz は X方向 Y方向 Z方向の移動です。 スクリプトは awk で書いていますが、DOS や Windows 環境ではメモリ、速度の 点で使えないかも知れません。こういう処理は Linux が最適! ---------^ cnv # # cnv : convert from nc-file to nc-file # cnv [-options] [--] input-file >outputfile # cnv [-options] outputfile # option : # -G9[01] G90,G91 # -dd[01] xxx.xxx xxxxxxx # -md[0-1] 0:modal 1:output XYZIJKR # -ij[ir] 0:IJK 1:R # -r[xyz]n rotate axis(x or y or z) # -mp(xx)|(yy)|(zz) mirror # -t[xyz]n move # Changes: # H13.4.30 # R- # if angle is near to 180 degrees, R cannot be changed to IJ. # H13.5.6 # modal G00,G01,G02,G03 # -t[xyz]n #todo: # G17,18,19 is not good in case of r[xyz] # output both G90 and G91 awk ' BEGIN { allowr=2; ## the allowable limits of IJKR imode["G9"]=0; imode["G1"]=7; imode["ij"]=0; omode["md"]=0 rad=atan2(0,-1)/180 for(i=1;i1 && v[1]-v0[1]==0 && v[2]-v0[2]==0 && v[3]-v0[3]==0 && gmode("ij")==1) errexit("output 360-degrees-circle with R"); s1="" for(i=1;i<=8;i++) { if (i<=3 || i==8 || imode["G0"]>1) if (!((gmode("ij")==1) ? (i~/[4-6]/) : (i==7))) { ## IJK or R if ((omode["md"]!=0 && i!=8) || ((i==7) ? (v[i]!=0) : (v[i]!=v0[i-(i~/[456]/)*3]))) { ## modal? s1=s1 i2p[i] ## address vv=(i~/[456]/)? v[i]-v0[i-3] : v[i]-(i<=3 && gmode("G9")==1)*v0[i] if (i==8) { s1=s1 sprintf("%s",vv) } else if (gmode("dd")==1) { s1=s1 sprintf("%s%01d.%03d",(vv<0)?"-":"",int(abs(vv)/1000),abs(vv)%1000) } else { s1=s1 sprintf("%d",vv) } }} } if (/G0[0-3]/) { if (omode["md"]==0 && G0mode==imode["G0"]) sub(/G0[0-3]/,"",s0) } else { if (omode["md"]==1) s1= "G0" imode["G0"] s1 } $0=s0 s1 s2; G0mode=imode["G0"] } {sub(/G9[0-1]/,"G9" gmode("G9"))} {print} function abs(a) {return (a>=0)?a:-a} function int2(a) {return int(a+(a>0)-0.5)} function errexit(a) {print(a)|"cat >&2";exit 1} function setuijk( x,y,vx,vy,va,vb,hugo) { x=(imode["G1"]==9)?2:1 y=(imode["G1"]==7)?2:3 vx=(u[x]-u0[x])/2; vy=(u[y]-u0[y])/2 if ((va=vx*vx+vy*vy)==0) errexit("R is 0.") vb=u[7]*u[7]-va; va=sqrt(va); if (abs(u[7])-va<-allowr) { errexit(sf"wrong R (input R without " allowr "/1000,the allowable limits of IJKR)") } else if (vb<0) {vb=0} vb=sqrt(vb); if (u[7]<0) vb=-vb; if (imode["G0"]==2) vb=-vb u[x+3]=int2(u0[x]+vx-vy/va*vb); u[y+3]=int2(u0[y]+vy+vx/va*vb) } function gmode(a) {return (a in omode)?omode[a]:imode[a]} function do_r(a ,x,y,c,s) { x=index("xyz",substr(a,3,1))+1; if (x>3) x=1; y=x+1;if (y>3) y=1 a=substr(a,4); c=cos(a*rad); s=sin(a*rad) a=int2(c*v[x ]-s*v[y ]); v[y ]=int2(s*v[x ]+c*v[y ]); v[x ]=a a=int2(c*v[x+3]-s*v[y+3]); v[y+3]=int2(s*v[x+3]+c*v[y+3]); v[x+3]=a } function do_t(a) { x=index("xyz",substr(a,3,1)) # v[x ]=v[x ]+((a~/\./)?substr(a,4)*1000:substr(a,4)) v[x ]=v[x ]+substr(a,4)*1000 v[x+3]=v[x+3]+substr(a,4)*1000 } function do_mp(a) { x=index("xyz",substr(a,4,1)) v[x ]=-v[x ]; v[x+3]=-v[x+3] imode["G0"]=(imode["G0"]==2)?3:(imode["G0"]==3)?2:imode["G0"] if (sub(/G02/,"G03",s0)==0) sub(/G03/,"G02",s0) } ' $* ---------$ cnv