jw_cad 外部変形 - (924) jscriptで線の端点に矢印を描く -

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

 

jscriptで線の端点に矢印を描く

/* jscriptで線の端点に矢印を描く
@cls & echo off
copy jwc_temp.txt myfiles > nul
cscript //nologo //e:jscript %0 < myfiles > jwc_temp.txt
goto:eof

REM #jww
REM #1ln 線を指示してください
REM #bz
REM #e
*/

function lnlength(x) { //線長を返す
  return Math.sqrt(Math.pow(x[3] - x[1], 2) + Math.pow(x[2] - x[0], 2))
}

function lnslope(x) { //線の角度を返す
  return Math.atan2(x[3] - x[1], x[2] - x[0])
}

function lnpoint(x, pm) { //線データの値を返す ( Draw.rb と 異なる )
  //始点 pm=-1,  終点 pm=1 の座標を返す
  return pm == 0 ? [(x[0] + x[2]) / 2, (x[1] + x[3]) / 2] : ( pm < 0 ? [x[0], x[1]] : [x[2], x[3]] )
}

function ln_hpends(ln, hp) {
  l1 = lnlength(hp.concat(lnpoint(ln,-1)))
  l2 = lnlength(hp.concat(lnpoint(ln, 1)))
  pm = l1 < l2 ? -1 : 1
  return pm
}

function ln_hpsnap(x, p) { //線の吸着点を返す
  t = ln_hpdist(x, p)
  d = lnslope(x)
  return p ? [p[0] * 1.0 - t * Math.sin(d), p[1] * 1.0 + t * Math.cos(d)] : p
}

function ln_hpdist(x, p) { //線と点の最短距離を返す
  y = p.concat(x.slice(0, 2))
  return lnlength(y) * Math.sin(lnslope(x) - lnslope(y))
}

function polarto(p, r, d) {
  return [p[0] * 1.0 + r * Math.cos(d), p[1] * 1.0 + r * Math.sin(d)]
}

function deg(x) { return x / Math.PI * 180 }

function arrow(pt1, d, size, xang, xan2){
  with (Math) {
    l = size
    d *= PI / 180
    a = xang * PI / 180 / 2.0
    pt2 = polarto(pt1, l, d - a)
    pt4 = polarto(pt1, l, d + a)
    if (xan2 == 180) {
      sl = ["sl", pt1, pt2, pt4].join(" ").replace(/,/g, " ")
    } else {
      c = cos(a) - sin(a) * tan( (90.0 - xan2 / 2.0) * PI / 180)
      pt3 = polarto(pt1, l * c, d)
      sl = ["sl", pt1, pt2, pt3, pt4].join(" ").replace(/,/g, " ")
    }
  }
  return sl
}

size = 5   //矢印の長さ( 図寸 )
xang = 45  //矢印の交角( ゚ )
xan2 = 120 //矢尻の交角( ゚ )

f = WScript.StdIn
while (! f.AtEndOfStream) {
  F = ($_ = f.ReadLine()).split(/\s+/)
  if (/^hp1/i .test($_)) { p1 = F.slice(1, 3) }
  if (/^\s+/i .test($_)) { ln1 = F } //ln 指示線
}
g = WScript.StdOut
g.WriteLine("bz")
g.WriteLine(
  arrow(
    pt = lnpoint(ln1, ln_hpends(ln1, p1)),
    d = deg(lnslope(pt.concat(lnpoint(ln1,-ln_hpends(ln1, p1))))),
    size, //矢印の長さ( 図寸 )
    xang, //矢印の交角( ゚ )
    xan2  //矢尻の交角( ゚ )
  )
)