目次

全ソースコード

 設計内容をまとめて、ソースコードにすると、以下。

#!/usr/local/bin/wish

. configure -width 350 -height 250

wm title . "Profiler Controller <COSMO Technical Laboratry>"
wm resizable . 0 0

# initialize file name
set theFileName "unknown"
set tFileName   $theFileName
set cTimeV      0:00
set cTempV      ""

set xexe_temp(P0)  20
set xexe_temp(P1) 120
set xexe_temp(P2) 120
set xexe_temp(P3) 210
set xexe_temp(P4) 210
set xexe_temp(P5)  20

set xexe_time(P0) 0:00
set xexe_time(P1) 1:00
set xexe_time(P2) 2:00
set xexe_time(P3) 3:00
set xexe_time(P4) 4:00
set xexe_time(P5) 5:00

set eflag 0
set elast 0
set ecnt  0

# temperature difference
set xdif ""

# time interval
set tdif ""

# displacement
set ddif ""

# boundary (teparature)
set bdif ""

# path
set cPathV ""

#**************
# define label
#**************
label .lblTTemp -font {{MS ゴシック} 16} -width 16 -text "Temperature"
label .lblTTime -font {{MS ゴシック} 16} -width 16 -text "Time"
label .lblTTempUnit -font {{MS ゴシック} 16} -width 10 -text "celcius(C)"
label .lblTTimeUnit -font {{MS ゴシック} 16} -width 10 -text "(mm:ss)"

label .lblP0 -font {{MS ゴシック} 14 italic} -width 10 -text "P0"
label .lblP1 -font {{MS ゴシック} 14 italic} -width 10 -text "P1"
label .lblP2 -font {{MS ゴシック} 14 italic} -width 10 -text "P2"
label .lblP3 -font {{MS ゴシック} 14 italic} -width 10 -text "P3"
label .lblP4 -font {{MS ゴシック} 14 italic} -width 10 -text "P4"
label .lblP5 -font {{MS ゴシック} 14 italic} -width 10 -text "P5"
label .lblFileName -font {{MS ゴシック} 16} -width 10 -text "FileName"

label .lblHandling -font {{MS ゴシック} 14 bold} -width 10 -text "HANDLING"
label .lblPath     -font {{MS ゴシック} 14 bold} -width 10 -text "PATH"
label .lblCTime    -font {{MS ゴシック} 14 bold} -width 16 -text "Time"
label .lblCTemp    -font {{MS ゴシック} 14 bold} -width 16 -text "Temperature"
label .lblCPathV   -font {{MS ゴシック} 14 bold} -width 16 -textvariable cPathV
label .lblCTimeV   -font {{MS ゴシック} 14 bold} -width 16 -textvariable cTimeV
label .lblCTempV   -font {{MS ゴシック} 14 bold} -width 16 -textvariable cTempV

#**************
# define entry
#**************
entry .edtP0Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P0) -width 10 -bg cyan
entry .edtP1Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P1) -width 10 -bg cyan
entry .edtP2Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P2) -width 10 -bg cyan
entry .edtP3Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P3) -width 10 -bg cyan
entry .edtP4Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P4) -width 10 -bg cyan
entry .edtP5Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P5) -width 10 -bg cyan

entry .edtP0Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P0) -width 10 -bg yellow
entry .edtP1Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P1) -width 10 -bg yellow
entry .edtP2Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P2) -width 10 -bg yellow
entry .edtP3Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P3) -width 10 -bg yellow
entry .edtP4Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P4) -width 10 -bg yellow
entry .edtP5Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P5) -width 10 -bg yellow

entry .edtFileName -font {{MS ゴシック} 14 bold} -width 10 -bg green -textvariable tFileName

#***************
# define button
#***************
button .btnLoad    -font {{MS ゴシック} 16 bold} -bg gray -text "Load"   -width 10 -command "fload" 
button .btnSave    -font {{MS ゴシック} 16 bold} -bg gray -text "Save"   -width 10 -command "fsave"
button .btnExecute -font {{MS ゴシック} 16 bold} -bg gray -text "Exec"   -width 10 -command "fexec"
button .btnCancel  -font {{MS ゴシック} 16 bold} -bg gray -text "Cancel" -width 10 -command "fcancel"
button .btnExit    -font {{MS ゴシック} 16 bold} -bg gray -text "exit"   -width 10 -command "exit"
button .btnClear   -font {{MS ゴシック} 16 bold} -bg gray -text "Clear"  -width 10 -command "clrParameters"

#***************
# sub procedure
#***************
proc fload {} {
  #
  global tFileName xexe_temp xexe_time
  #
  set theFileName [tk_getOpenFile -filetypes {{"profile code file" {.txt}}}]
  # show file name
  set xtmp [split $theFileName /]
  set cFileName [lindex $xtmp end]
  set tFileName [lindex [split $cFileName .] 0]
  # open 
  set fd_in [open $theFileName "r"]
  # read context
  set i 0
  while { [gets $fd_in sbuf] >= 0 } {
      # separate hash item
      set iname [lindex $sbuf 0]
      set itemp [lindex $sbuf 1]
      set itime [lindex $sbuf end]
      # store
      set xexe_temp($iname) $itemp
      set xexe_time($iname) $itime
      # increment
      incr i
  }
  # close
  close $fd_in
}

proc fsave {} {
  #
  global tFileName xexe_temp xexe_time
  # 
  if { $tFileName == "" } {
    tk_messageBox -message "not entry File Name" -type ok
  } else {
    # create file name
    set cFileName "$tFileName.txt"
    # open
    set fd_out [open $cFileName "w"]
    # store
    for {set i 0} {$i < 6} {incr i} {
      # get items
      set xfirst  [format "P%1d" $i]
      set xsecond $xexe_temp($xfirst)
      set xthird  $xexe_time($xfirst)
      # concatenate
      set xtmp "$xfirst $xsecond $xthird"
      # save
      puts $fd_out $xtmp
    }
    # close 
    close $fd_out
  }
}

proc fexec {} {
  #
  global eflag elast ecnt xexe_temp xexe_time xdif tdif ddif bdif
  # judge 
  set xp0 [calc_time $xexe_time(P0)]
  set xp1 [calc_time $xexe_time(P1)]
  set xp2 [calc_time $xexe_time(P2)]
  set xp3 [calc_time $xexe_time(P3)]
  set xp4 [calc_time $xexe_time(P4)]
  set xp5 [calc_time $xexe_time(P5)]
  set xflag 0
  if { $xp0 > $xp1 } {
    incr xflag
  }
  if { $xp1 > $xp2 } {
    incr xflag
  }
  if { $xp2 > $xp3 } {
    incr xflag
  }
  if { $xp3 > $xp4 } {
    incr xflag
  }
  if { $xp4 > $xp5 } {
    incr xflag
  }
  # message 
  if { $xflag > 0 } {
    tk_messageBox -message "Time incorrect !" -type ok
  } else {
    # last count
    set elast $xp5
    # clear counter
    set ecnt  0
    # calculate (temperature)
    set xtmp "$xexe_temp(P0) $xexe_temp(P1)"
    set xtmp "$xtmp $xexe_temp(P2) $xexe_temp(P3)"
    set xtmp "$xtmp $xexe_temp(P4) $xexe_temp(P5)"
    set ytmp "0 $xtmp"
    set result ""
    for {set i 1} {$i < 6} {incr i} {
      set xx [lindex $xtmp $i]
      set yy [lindex $ytmp $i]
      set r  [expr $xx - $yy]
      set result "$result $r"
    }
    set xdif $result
    # calculate (time)
    set xtmp "$xp0 $xp1 $xp2 $xp3 $xp4 $xp5"
    set ytmp "0 $xtmp"
    set result ""
    for {set i 1} {$i < 6} {incr i} {
      set xx [lindex $xtmp $i]
      set yy [lindex $ytmp $i]
      set r [expr $xx - $yy]
      set result "$result $r"
    }
    set tdif $result
    # calculate boundary
    set sum 0
    set bdif "0"
    for {set i 0} {$i < 4} {incr i} {
      set xx  [lindex $tdif $i]
      set sum [expr $sum + $xx]
      set bdif "$bdif $sum"
    }
    # calculate displacement
    set result ""
    for {set i 0} {$i < 5} {incr i} {
      set xx [lindex $xdif $i]
      set yy [lindex $tdif $i]
      set r [format "%0.1f" [expr ($xx * 1.0) / $yy]]
      set result "$result $r"
    }
    set ddif $result
    # enable
    set eflag 1
    set ecnt 0
    # loop
    show_event
  }
}

proc fcancel {} {
  #
  global eflag
  # desable
  set eflag 0
}

proc which_range {x} {
  #
  global bdif
  # separate
  set b0 [lindex $bdif 0]
  set b1 [lindex $bdif 1]
  set b2 [lindex $bdif 2]
  set b3 [lindex $bdif 3]
  set b4 [lindex $bdif 4]
  # judge
  set result 4
  if { $b0 <= $x && $x < $b1 } {
    set result 0
  }
  if { $b1 <= $x && $x < $b2 } {
    set result 1
  }
  if { $b2 <= $x && $x < $b3 } {
    set result 2
  }
  if { $b3 <= $x && $x <= $b4 } {
    set result 3
  }

  return $result
}

proc conv_time {x} {
  # default
  set result "0:00"
  # quotient
  set q [expr $x / 60]
  # residue
  set r [expr $x % 60]
  #
  set result [format "%d:%02d" $q $r]

  return $result
}

proc calc_time {x} {
  # separate
  set stmp [split $x :]
  # calculate
  set result [expr [lindex $stmp 0] * 60 + [lindex $stmp end]]

  return $result
}

proc draw_hand {} {
  #
  global cPathV cTimeV cTempV eflag xexe_temp ecnt ddif bdif
  # show
  if { $eflag == 1 } {
    # judge block
    set bb [which_range $ecnt]
    set bbx [format "P%d" $bb]
    # path
    set cPathV [format "P%d -> P%d" $bb [expr $bb+1]]
    # start value
    set beginv $xexe_temp($bbx)
    # displacement
    set dispx [lindex $ddif $bb]
    set dispy [lindex $bdif $bb]
    # calculate
    set ctemp [expr $beginv + $dispx * ($ecnt - $dispy)]
    set ctemp [expr int($ctemp)]
    set cTempV [format "%d" $ctemp]
    # time
    set cTimeV [conv_time $ecnt]
  } else {
    set cPathV ""
    set cTimeV "0:00"
    set cTempV ""
  }
}

proc show_event {} {
  #
  global ecnt eflag elast
  # show 
  draw_hand
  # handling
  if { $eflag == 1 } {
    incr ecnt
    # ? complete
    if { $ecnt >= $elast } {
      set eflag 0
    }
  }
  after 1000 show_event
}

proc clrParameters {} {
  #
  global tFileName xexe_temp xexe_time
  # file name
  set tFileName "unknown"
  # temperature
  set xexe_temp(P0) 20
  set xexe_temp(P1) 20
  set xexe_temp(P2) 20
  set xexe_temp(P3) 20
  set xexe_temp(P4) 20
  set xexe_temp(P5) 20
  # time
  set xexe_time(P0) 0:00
  set xexe_time(P1) 0:00
  set xexe_time(P2) 0:00
  set xexe_time(P3) 0:00
  set xexe_time(P4) 0:00
  set xexe_time(P5) 0:00
}

#*********************
# window area placing
#*********************
grid .lblTTemp     -column 1 -row 0
grid .lblTTime     -column 2 -row 0
grid .lblTTempUnit -column 1 -row 1
grid .lblTTimeUnit -column 2 -row 1

grid .lblP0 -column 0 -row 3
grid .lblP1 -column 0 -row 4
grid .lblP2 -column 0 -row 5
grid .lblP3 -column 0 -row 6
grid .lblP4 -column 0 -row 7
grid .lblP5 -column 0 -row 8

grid .lblHandling -column 1 -row 11
grid .lblPath     -column 1 -row 12
grid .lblCTime    -column 1 -row 13
grid .lblCTemp    -column 1 -row 14

grid .lblCPathV   -column 2 -row 12
grid .lblCTimeV   -column 2 -row 13
grid .lblCTempV   -column 2 -row 14

grid .edtP0Temp -column 1 -row 3
grid .edtP1Temp -column 1 -row 4
grid .edtP2Temp -column 1 -row 5
grid .edtP3Temp -column 1 -row 6
grid .edtP4Temp -column 1 -row 7
grid .edtP5Temp -column 1 -row 8

grid .edtP0Time -column 2 -row 3
grid .edtP1Time -column 2 -row 4
grid .edtP2Time -column 2 -row 5
grid .edtP3Time -column 2 -row 6
grid .edtP4Time -column 2 -row 7
grid .edtP5Time -column 2 -row 8

grid .lblFileName -column 3 -row 0
grid .edtFileName -column 3 -row 1

grid .btnLoad    -column 5 -row 0
grid .btnSave    -column 5 -row 1
grid .btnClear   -column 0 -row 9
grid .btnExecute -column 0 -row 11
grid .btnCancel  -column 0 -row 13
grid .btnExit    -column 5 -row 20


目次

inserted by FC2 system