敷地図作成
最小限、座標値は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)
}
----------------------------------------------------------------