jw_cad 外部変形 - (748) gawkでH形鋼断面を描く -

外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。

 

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])
  }
}