#!/usr/bin/env ruby

##################################################
=begin
=arare3j-basefig-make

  電脳倶楽部 gpview のラッパー. 
  arare3j の基本場に関して, 
    + 図のプロット
    + ps, png ファイルおよびアニメーション gif の作成. 
      - デフォルトでは ps は gzip 形式で圧縮される. 必要ない場合は --notgz


== USAGE
 
  例えば, 以下のように利用する. 

    % ./arare3j-basefig-make.rb  ncfile

  ファイル出力する場合には --dump オプションを指定する

    % ./arare3j-basefig-make.rb --dump ncfile

  その他 gpview にそのまま渡したいオプションは, --opt で指定する

    % ./arare3j-basefig-make.rb  --opt "--itr 4 --noannotate" ncfile


== OPTION

    --aspect          : 図のアスペクト比の設定

    --opt             : gpview にそのまま渡すべきオプションの指定. 

    --delay           : アニメーション gif を作る際の delay. 
                        デフォルトは 40 

    --notgz           : ps を tar で固めて zip しない. 

    --dump            : 図のファイルダンプ

    --nocont          : 2 次元プロットで, コンターを引かない指定


== References

  + http://www.gfd-dennou.org/arch/dcl/dcl-5.3.1/README_pslib
  + http://www.gfd-dennou.org/arch/dcl/dcl-tips/dclpsedit.html


== HISTORY

  2006/01/04   K Sugiyama (created)

=end
##################################################
require "numru/ggraph"
require "getoptlong"
include NumRu

###
### 引数処理
###
parser = GetoptLong.new
parser.set_options(
                   ###    global option   ###
                   ['--aspect',      GetoptLong::REQUIRED_ARGUMENT],
                   ['--delay',       GetoptLong::REQUIRED_ARGUMENT],
                   ['--opt',         GetoptLong::REQUIRED_ARGUMENT],
                   ['--dump',        GetoptLong::NO_ARGUMENT],
                   ['--nocont',      GetoptLong::NO_ARGUMENT],
                   ['--notgz',       GetoptLong::NO_ARGUMENT]
                   )
begin
  parser.each_option do |name, arg|
    eval "$OPT_#{name.sub(/^--/, '').gsub(/-/, '_')} = '#{arg}'" 
  end
rescue
  exit(1)
end


###
### 内部で用いるコマンドおよびオプションの設定
###

#gp コマンド
gpview   = "/usr/bin/gpview"
gpmaxmin = "| /usr/bin/gpmaxmin"  # フィルタとして利用

#dcl 関連 
dclpsrmcm   = "/usr/bin/dclpsrmcm"
dclpsrot    = "/usr/bin/dclpsrot"
dclpsfont   = "/usr/bin/dclpsfont f=H lcntl=1 fact=7000"
dclpsmargin = "/usr/bin/dclpsmargin"
psout       = "dcl.ps"                # dcl の出力する ps ファイル名

# gs 関連. ここで解像度とサイズも設定
gsresolv = "90"
gssize   = "900x600"
gs  = "/usr/bin/gs -sDEVICE=pnmraw -q -dNOPAUSE -dSAFER  -sOutputFile=-" \
      +" -r"+gsresolv+" -g"+gssize

# imagemagic
pnmtopng = "/usr/bin/pnmtopng"
convert  = "/usr/bin/convert"

# tar
tar    = "/bin/tar zcf"
taropt = "--remove-files"

# rm
rm = "/bin/rm"


###
### 変数の設定
###

# 値の初期化
vars = ["ExnerBasicZ", 
        "PotTempBasicZ",
#        "CpBasicZ", 
        "DensBasicZ",   
        "VelSoundBasicZ",
        "TempBasicZ", 
        "PressBasicZ",  
        "MixRtVBasicZ", 
        "EffMolWtBasicZ"]
aspect= ""
wsn   = "--wsn 1"
opt   = "" 
delay = "-delay 40"  
sint  = ""
cint  = ""
fname = ARGV[0].sub(/\.nc/,"").sub(/@/,"_").sub(/=/,"").sub(/\,/,"_")

# アスペクト比
aspect = "--aspect"+" "+$OPT_aspect if $OPT_aspect

# 図のファイル出力
wsn = "--wsn 2"                     if $OPT_dump

# その他オプション
opt = $OPT_opt                      if $OPT_opt

# delay
delay = "-delay"+" "+$OPT_delay     if $OPT_delay


###
### 図の出力, ファイル出力
###
vars.each { |var| 

  # 初期化
  maxmin= []

  # 描画範囲の指定. 
  # gpmaxmin を用いて最小値と最大値を求める
  varmaxmin = gpmaxmin+" "+ARGV[0]+"@"+var
  p varmaxmin
  fil = open(varmaxmin)
  fil.each { |line| 
    /["min"|"max"]=(\S+),\s+/ =~ line  # 出力結果から最大値と最小値を探査
    maxmin << $1.to_f if $1
  }
  p maxmin
  range = "--range"+" "+maxmin[1].to_s+":"+maxmin[0].to_s
  
  # 色塗り, コンターラインの設定
  ## gpmaxmin の結果から最小値と最大値を求める
  del = maxmin[0] - maxmin[1]
  
  ## 色分け, コンターの間隔を求める. 色分けは最大値 100 を用いる. 
  sdel = del / 99.0
#  cdel = del / 10.0
  
  ## sint, cint の設定
  sint = "--sint"+" "+sdel.to_s 
  if ($OPT_nocont) 
    cint = "--nocont"
  else
#    cint = "--cint"+" "+cdel.to_s 
  end

  # 実行コマンドの作成, 実行
  gturl = ARGV[0]+"@"+var
  p gpview, gturl, range, aspect, wsn, sint, cint, opt
  view = gpview+" "+gturl+" "+range+" "+aspect+" "+wsn+" " \
         +sint+opt
#         +sint+" "+cint+" "+opt

  p view
  system (view)
  
  # ps --> png の変換
  if ($OPT_dump)
    psfile  = fname+"_"+var+".ps"
    pngfile = fname+"_"+var+".png"
    
    # dcl 付属コマンドを用いて変換
    dclps = dclpsrmcm+" "+psout+" | "+dclpsrot+" | "+dclpsfont+" | " \
            +dclpsmargin+" > "+psfile
    p dclps
    system (dclps)
    
    # ps ファイルを png ファイルに変換
    pspng = gs+" "+psfile+" -c quit| "+pnmtopng+" > "+pngfile
    p pspng
    system (pspng)

    #掃除
    psrm = rm+" dcl.ps"
    system( psrm )
  end  
}

# ps ファイル圧縮
if ($OPT_dump)
  unless ($OPT_notgz)
    psfiles  = fname+"*.ps"
    tgzfile  = fname+"_basefig.tar.gz"
    
    # tar ファイルに固める
    pstar = tar+" "+tgzfile+" "+psfiles+" "+taropt
    p pstar
    system (pstar)
  end
end
