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

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

 

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

:mshtaで線の端点に矢印を描く
@echo off
if exist jwc_temp.txt (
  copy jwc_temp.txt myfiles > nul
  mshta %~f0 < myfiles > jwc_temp.txt
)
goto:eof

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

<script>
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) { //線データの値を返す
  //始点 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) { //線と点の最短距離を返す
  d = lnslope(x)
  y = lnpoint(x, -1).concat(p)
  return lnlength(y) * Math.sin( d - 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) {
  l = size
  d *= Math.PI / 180
  a = xang * Math.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 = Math.cos(a) - Math.sin(a) * Math.tan( (90.0 - xan2 / 2.0) * Math.PI / 180)
    pt3 = polarto(pt1, l * c, d)
    sl = ["sl", pt1, pt2, pt3, pt4].join(" ").replace(/,/g, " ")
  }
  return sl
}

with (new ActiveXObject("Scripting.FileSystemObject")) {
  f = GetStandardStream(0) //stdin
  g = GetStandardStream(1) //stdout
  while (! f.AtEndOfStream) {
    F = ($_ = f.ReadLine()).split(/\s+/)
    if (/^hp1/i .test($_)) { p1 = F.slice(1, 3) }
    if (/^\s+/i .test($_)) { ln1 = F } //ln 指示線
  }
  f.close()
  g.WriteLine("bz")
  g.WriteLine(
    arrow(
      pt = lnpoint(ln1, ln_hpends(ln1, p1)), 
      deg(lnslope(pt.concat(ln_hpsnap(ln1, p1)))), 
      size = 5, //矢印の長さ( 図寸 )
      xang = 45, //矢印の交角( ゚ )
      xan2 = 135 //矢尻の交角( ゚ )
    )
  )
}
close()
</script>

 

 

スクリプト言語jscript を使用しています。