jw_cad 外部変形 - (749) 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, v) {
  $0 = pk; x0 = $1; y0 = $2
  p0 = offset(B, A, pt)
  red = 0
  green = 128
  blue = 128
  print "lc10", red + 256 * green + 256 * 256 * blue
  print "pl"
  p[0] = Tw/2   FS A/2-Tf
  p[1] = Tw/2+r FS A/2-Tf-r
  p[2] = B/2    FS A/2-Tf
  p[3] = B/2    FS A/2
  u = 4; v = 5
  co = cos(d = hk * PI / 180); si = sin(d)
  for (j = 0; j <= 3; j++) {
    for (i = 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)
      pc =($1 + $3) * co - ($2 + $4) * si + x0 FS ($1 + $3) * si + ($2 + $4) * co + y0
      if (k == 1) {
        a = (v-- % 4) * 90
        print "sc", pc, r, 1, hk * PI / 180, a * PI / 180, PI / 2, -1
      }
      pp[i + j * u] = pc
    }
  }
  print "sl", pp[0], pp[7], pp[8], pp[15]
  print "sl", pp[2], pp[3], pp[4], pp[5]
  print "sl", pp[10],pp[11],pp[12],pp[13]
  print "#"
}
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])
  }
}