敷地図作成

最小限、座標値は3行以上、表は3列以上あれば表計算なしで敷地を作図可能です。文字は全て任意ですが測点符号があればそれを使用、なければ連番を付けます。倍面積、辺長、方位角の列と文字があれば数値は自動計算します。但し、列の移動はできません。合計、二除、地積についても同様で座標値間の空行は不可です。

一番目のポイントを基準に作図します。

shikichi.bat—————————————————————-

@REM XY座標から敷地図作成
@REM shikichi.bat 2012/07/06 tincan
@echo off
copy jwc_temp.txt temp.txt > nul
jgawk -f shikichi.awk temp.txt > jwc_temp.txt
goto END
REM
REM #jw
REM #h1
REM #hc 座標求積表を範囲選択
REM #0 作図位置指示 (L)Free (R)Read
REM #g0
REM #e
REM
:END
REM pause

shikichi.awk—————————————————————-

# XY座標から敷地図作成
# shikichi.awk 2012/07/06 tincan
#
BEGIN{
CONVFMT="%.12g"
hd=nx=ny=0
}
/^hq/{next}
/^hk/{next}
/^hs/{for(i=0;i<=15;i++)s[sprintf("lg%x",i)]=$(i+2);next} /^hcw/{for(i=1;i<=10;i++)cw[sprintf("cn%g",i)]=$(i+1);next} /^hch/{next} /^hcd/{for(i=1;i<=10;i++)cd[sprintf("cn%g",i)]=$(i+1);next} /^hcc/{next} /^hn/{next} /^lg/{if(hd)next;sc=s[$1];next} /^ly/{next} /^lc/{next} /^lt/{next} /^cn/{if(hd)next;w=cw[$1]*sc/2;d=cd[$1]*sc/2;next} /^#$/{++hd;next} /^\ /{ if($1==$3){lnx[++nx]=$1;next} if($2==$4){lny[++ny]=$2;next} } /^ch/{ j=k=0 for(i=1;i<=nx;i++)if(0<$2-lnx[i])j++ for(i=1;i<=ny;i++)if(0>$3-lny[i])k++
if(j~/1$/){pn[k]=substr($6,2);yh[k]=$3;p=$2+$4/2;next}
if(j~/2$/){yn[k]=substr($6,2);yh[k]=$3;next}
if(j~/3$/){xn[k]=substr($6,2);next}
if(j~/4$/){a=$2+$4/2;next}
if(j~/5$/){l=$2+$4/2;next}
if(j~/6$/){c=$2+$4/2;next}
}
END{
# 表計算
j=k=to=0
for(i=1;i<ny;i++){
if(yn[i]~/[+-]?[0-9]+\.?[0-9]*/ && xn[i]~/[+-]?[0-9]+\.?[0-9]*/){
k=i;if(!j)j=i
}else{
if(j)break
}
}
xn[j-1]=xn[k];yn[j-1]=yn[k]
xn[k+1]=xn[j];yn[k+1]=yn[j]
for(i=j;i<=k;i++){ to+=area[i]=yn[i]*(xn[i-1]-xn[i+1]) xx=xn[i+1]-xn[i] yy=yn[i+1]-yn[i] len[i]=sprintf("%.3f",sqrt(xx^2+yy^2)) rad[i]=atan2(yy,xx)+atan2(0,-1) if(!pn[i])print_ch(p,yh[i],pn[i]=sprintf("P%03d",++num)) if(a)print_ch(a,yh[i],sprintf("%.6f",area[i])) if(l)print_ch(l,yh[i],len[i]) if(c)print_ch(c,yh[i],degrees(atan2(xx,yy))) } if(a){ print_ch(a,yh[k+1],sprintf("%.6f",to)) print_ch(a,yh[k+2],sprintf("%.6f",to/=2)) print_ch(a,yh[k+3],sprintf("%.2f ㎡",to)) } printf"h#《終了》 %d列 %d行 ポイント数%d %d\n",nx,ny,k-j+1,c # 作図 for(i=j;i<=k;i++){ x1=(xn[i+0]-xn[j])*1000;y1=(yn[i+0]-yn[j])*1000 x2=(xn[i+1]-xn[j])*1000;y2=(yn[i+1]-yn[j])*1000 print_ln(x1,y1,x2,y2) print_ci(x1,y1,sc/2) print_ch(x1,y1,pn[i]) print_ch(x1/2+x2/2,y1/2+y2/2,len[i],rad[i]) } } # ユーザー定義関数 # 境界線作図 function print_ln(x1,y1,x2,y2){ printf"\ %.12g %.12g %.12g %.12g\n",x1,y1,x2,y2 } # ポイント作図 function print_ci(x1,y1,r){ printf"ci %.12g %.12g %.12g\n",x1,y1, r } # 文字列基点(中下) function print_ch(x1,y1,str,ang){ ll=length(str)*(w+d)-d x3=ll*cos(ang) y3=ll*sin(ang) z=index(str,"\.")*(w+d) zx=(z)?z*cos(ang):x3/2 zy=(z)?z*sin(ang):y3/2 printf"ch %.12g %.12g %.12g %.12g \"%s\n",x1-zx,y1-zy,x3,y3,str } # ラジアンを角度に変換 function degrees(radian){ deg=radian/atan2(0,-1)*180 sec=sqrt((deg*3600)^2) return(sprintf("% 4d-%02d-%02d",int(deg),(sec/60)%60,sec%60)) } # 角度をラジアンに変換 function radians(degree){ return(degree*atan2(0,-1)/180) }

----------------------------------------------------------------