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

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

 

tclshでH形鋼断面を描く

:tclshで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 "delims=:" %%n in ('findstr /n "^#!" %0') do (
  copy jwc_temp.txt myfiles > nul
  more +%%n %0 | tclsh - > jwc_temp.txt
)
goto:eof

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

#!この次の行からプログラムを書いてください
proc moveto {x y} { #点x を 相対距離 y [ a, b ] へ移動
  lassign "$x $y" 1 2 3 4
  return [list [expr $1 + $3] [expr $2 + $4]]
}

proc rot {x d} {
  lassign $x x1 y1
  set co [expr cos($d)]
  set si [expr sin($d)]
  return [list [expr $x1 * $co - $y1 * $si] [expr $x1 * $si + $y1 * $co]]
}

proc offset {w h pt opt} {
  return [list [expr $w * ( (9 - $pt) % 3 - (9 - $opt) % 3) / 2] [expr $h * int( ( (9 - $pt) / 3) - int( (9 - $opt) / 3)) / 2]]
}

proc jish {hp h b tw tf r {d 0} {pt 5} {opt 5}} {
  set p0 [offset $b $h $pt $opt]
  lassign $p0 x0 y0
  set PI [expr acos(-1)]
  set drad [expr $d * $PI / 180]
  set p(0) [list [expr $tw / 2] [expr $h / 2 - $tf - $r]]
  set p(1) [list [expr $tw / 2 + $r] [expr $h / 2 - $tf - $r]]
  set p(2) [list [expr $tw / 2 + $r] [expr $h / 2 - $tf]]
  set p(3) [list [expr $b / 2] [expr $h / 2 - $tf]]
  set p(4) [list [expr $b / 2] [expr $h / 2]]
  set u 5
  for {set j 0} {$j <= 3} {incr j} {
    set a [expr 90 * ( (1 - $j) % 4) + $d]
    for {set i [expr {$j == 0} ? 1 : 0]} {$i < $u} {incr i} {
      set k [expr {[expr $j % 2] == 0} ? $i : {[expr $u - $i - 1]}]
      lassign $p($k) x y
      if {[expr $j % 3] > 0} { set x [expr -$x] }
      if {$j > 1} { set y [expr -$y] }
      set pc [moveto [rot [list [expr $x + $x0] [expr $y + $y0]] $drad] $hp]
      if {$k == 1 && $r > 0} {
        lassign $pc x y
        set pc [list ci $x $y $r 0 90 1 $a]
      }
      puts "$pc"
    }
  }
  lassign $p(0) x y
  puts [join [moveto [rot [list [expr $x + $x0] [expr $y + $y0]] $drad] $hp] " "]
  puts "#"
}

set tcl_precision 16; #文字列を数値演算するとき有効桁数 16 (デフォルト 12)

set f [open myfiles]
foreach 0 [split [read $f] \n] {
  switch -regexp -matchvar n -- $0 {
    ^hk { lassign $0 1 hk }
    {^hp(\d+)} {
      lassign $0 1 2 3
      set hpn [lindex $n 1]
      set hp($hpn) "$2 $3"
    }
  }
}
close $f

lassign $env(s) h b t1 t2 r

for {set i 1} {$i <= $hpn} {incr i} {
  jish $hp($i) $h $b $t1 $t2 $r $hk 5
}