外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。
gawkでH形鋼断面を描く
:gawkでH形鋼断面を描く
@echo off
set s=%*
if defined s (
echo ^%*> %~dpn0.txt
) else (
if exist %~dpn0.txt (
for /f "tokens=*" %%a in (%~dpn0.txt) do set s=%%a
)
)
if not defined s set s=400 200 8 13 16
for /f %%n in ('gawk "/^#!/ { print NR }" %0') do (
copy jwc_temp.txt myfiles > nul
more +%%n %0 | gawk -f - myfiles > jwc_temp.txt
)
goto:eof
REM #jww
REM #1%d 位置を指示して下さい
REM #99#
REM #c H B T1 T2 R =
REM #e
#!ここから more +n %0 の n 行目:最初の行は 0 行
function offset(w, h, pt, opt) {
opt = 5
return w * ( (9 - pt) % 3 - (9 - opt) % 3) / 2 FS h * (int( (9 - pt) / 3) - int( (9 - opt) / 3)) / 2
}
function jish(A, B, Tw, Tf, r, hk, pt, pk, i, j, k, u, a, x0, y0, p0, p, xc, yc) {
$0 = pk; x0 = $1; y0 = $2
p0 = offset(B, A, pt)
p[0] = Tw/2 FS A/2-Tf-r
p[1] = Tw/2+r FS A/2-Tf-r
p[2] = Tw/2+r FS A/2-Tf
p[3] = B/2 FS A/2-Tf
p[4] = B/2 FS A/2
u = 5
co = cos(d = hk * PI / 180); si = sin(d)
for (j = 0; j <= 3; j++) {
a = ((u - j) % 4) * 90 + hk
for (i = (j == 0 ? 1 : 0); i < u; i++) {
k = (j % 2 == 0 ? i : u - i - 1)
$0 = p[k] FS p0
$1 = (j % 3 != 0 ? -$1 : $1)
$2 = (j > 1 ? -$2 : $2)
xc = ($1 + $3) * co - ($2 + $4) * si
yc = ($1 + $3) * si + ($2 + $4) * co
pc = xc + x0 FS yc + y0
if (k == 1) {
pc = "ci" FS pc FS r FS 0 FS 90 FS 1 FS a
}
print pc # No = i + j * u
}
}
$0 = p[0] FS p0
xc = ($1 + $3) * co - ($2 + $4) * si
yc = ($1 + $3) * si + ($2 + $4) * co
pc = xc + x0 FS yc + y0
print pc RS "#"
}
BEGIN { CONVFMT = OFMT = "%.15g"; PI = atan2(1, 1) * 4 }
/^hk/ { hk = $2 }
/^hp[1-9][0-9]?/ {
gsub(/(ln|ci|ch|-)$/, "", $1)
hp[substr($1, 3)] = $2 FS $3; n++
}
END {
$0 = ENVIRON["s"]
H = $1; B = $2; T1 = $3; T2 = $4; r = $5 ? $5 : 0
for (i = 1; i <= n; i++) {
jish(H, B, T1, T2, r, hk, pt = 5, hp[i])
}
}