外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。
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, h, b, tw, tf, r, pt, hk) {
var i, j, k //ローカル変数
p0 = offset(b, h, pt)
red = 0
green = 128
blue = 128
WScript.Echo( "lc10 " + (red + 256 * green + 256 * 256 * blue) )
WScript.Echo( "pl" )
d = hk * Math.PI / 180
pp =
p = [
[tw / 2 , h / 2 - tf - r*0],
[tw / 2 + r, h / 2 - tf - r],
[tw / 2 + r, h / 2 - tf],
[ b / 2 , h / 2 - tf],
[ b / 2 , h / 2]
]
u = p.length
for (j = 0; j <= 3; j++) {
a = 90 * ((1 - j) % 4)
for (i = 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) {
WScript.Echo( "sc " + pc.concat(r, 1, d, a * Math.PI / 180, Math.PI / 2, -1).join(" ") )
}
pp[i + j * u] = pc
}
}
WScript.Echo( ["sl", pp[0], pp[9], pp[10], pp[19]].join(" ").replace(/,/g," ") )
WScript.Echo( ["sl", pp[3], pp[4], pp[5], pp[6]].join(" ").replace(/,/g," ") )
WScript.Echo( ["sl", pp[13], pp[14], pp[15], pp[16]].join(" ").replace(/,/g," ") )
WScript.Echo( "#" )
}
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)
}