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

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

 

jscriptでH形鋼断面を描く

/* jscriptでH形鋼断面を描く
@cls & 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
copy jwc_temp.txt myfiles > nul
cscript //nologo //e:jscript %0 < myfiles > jwc_temp.txt
goto:eof

REM #jww
REM #1%d 位置を指示して下さい
REM #99#
REM #c H B T1 T2 R =
REM #e
*/

function int(a) {
  return a < 0 ? Math.ceil(a) : Math.floor(a)
}

function mov(p1, p2) {
  x1 = p1[0]*1.0
  y1 = p1[1]*1.0
  x2 = p2[0]*1.0
  y2 = p2[1]*1.0
  return [x1 + x2, y1 + y2]
}

function rot(x1, y1, d) {
  co = Math.cos(d)
  si = Math.sin(d)
  return [x1 * co - y1 * si, x1 * si + y1 * co]
}

function offset(w, h, pt) {
  opt = 5
  i1 = int( (9 - pt) / 3)
  i2 = int( (9 - opt) / 3)
  i = i1 - i2
  return [w * ( (9 - pt) % 3 - (9 - opt) % 3) / 2, h * i / 2]
}

function jish(hp, a, b, tw, tf, r, pt, hk) {
  var i, j, k //ローカル変数
  p0 = offset(b, a, pt)
  d = hk * Math.PI / 180
  p = [
      [tw / 2     ,a / 2 - tf - r],
      [tw / 2 + r ,a / 2 - tf - r],
      [tw / 2 + r ,a / 2 - tf],
      [b / 2  ,a / 2 - tf],
      [b / 2  ,a / 2]
      ]
  u = p.length
  for (j = 0; j <= 3; j++) {
    a = 90 * ( (1 - j) % 4) + hk
    for (i = j == 0 ? 1 : 0; i < u; i++) {
      k = j % 2 == 0 ? i : u - i - 1
      x = j % 3 > 0 ? -p[k][0] : p[k][0]
      y = j > 1 ? -p[k][1] : p[k][1]
      pc = mov(rot(x + p0[0], y + p0[1], d), hp)
      if (k == 1 && r > 0) {
        pc = ["ci", pc[0], pc[1], r, 0, 90, 1, a]
      }
      WScript.Echo(pc.join(" "))
    }
  }
  WScript.Echo(mov(rot(p[0][0] + p0[0], p[0][1] + p0[1], d), hp).join(" "))
}

hp = []

f = WScript.StdIn
while (! f.AtEndOfStream) {
  F = ($_ = f.ReadLine()).split(/\s+/)
  if (/^hk/i .test($_)) { hk = F[1] * 1.0 } //hk 軸角
  if (/^hp[1-9][0-9]?/i .test($_)) { //hp 指示点
    hp[ F[0].match(/[0-9]+/) ] = [ F[1] * 1.0, F[2] * 1.0 ]
  }
}

ENV = new ActiveXObject("WScript.Shell").Environment("Process")
s = ENV('s').split(/\s+/)
h = s[0]*1.0
b = s[1]*1.0
t1 = s[2]*1.0
t2 = s[3]*1.0
r = s[4]*1.0

for (i in hp) {
  jish(hp[i], h, b, t1, t2, r, pt = 5, hk)
}

 

 

jscript の変数は宣言しなくても使えます。そのとき変数はグローバル変数となるようです。例えば 本文と関数に for (i in ~) { … } があれば変数 i の値が関数で置き換えられてしまうため無限ループに陥る危険があります。要するに、関数はきちんとローカル変数であることを宣言( var i )しておかないと思いもよらない結果になるということです。