Ngraph - for science and engineering -
 Home  Feature Download User's Manual FAQ Addin Script Link BBS

伊東さんの Ngraph script 活用法 もご覧下さい。

アドイン・スクリプト
メイルや会議室等で頂いた質問や要望に答える時に、ちょこちょこっと作ったアドイン・スクリプトを紹介します。 汎用性があまり無かったりしますが、アドイン・スクリプト作成の参考などにしてください。

このページのアドイン・スクリプトの使用方法
  • スクリプトをカット&ペーストするなどしてファイルにセーブします。
  • Ngraph を起動して、[設定]-[アドインスクリプト] メニューで、スクリプトを保存したファイルを登録します。
  • [設定]-[初期状態としてセーブ(各種設定)] メニューを実行し、「スクリプト設定」をチェックして OK してください。
  • [アドイン]-[実行] メニューで実行します。

目次

【課題】 Ngraphには無いマークでプロットしたい。
【方法】 マークを合成ファイル(GRAファイル)として用意しておいて、合成ファイルをデータの座標位置に配置して行きます。
【説明】 標準で配布している text-in.nsc とほとんど同じです。 マークを合成ファイルとして用意しておいて、合成ファイルをデータの座標位置に配置して行きます。 軸の設定などを変えたら再度実行する必要があります。 また、巨大なデータに対しては実用的ではありません(インスタンス数の制限より 10,000点以上のプロットはできません)。
##########
FILE="circle.gra" #合成するGRAファイル名
SHIFTX=0          #マーク幅/2
SHIFTY=0          #マーク高/2
ZOOM=10000
##########

# 以前の実行で生成された merge インスタンスを削除
NAME=originalmark
if exist merge:$NAME 
then
  del merge:$NAME
fi

file:0:opendatac
while file:0:getdata
do
  new merge name=$NAME
  merge::left_margin=${file:0:coord_x}-$SHIFTX
  merge::top_margin=${file:0:coord_y}-$SHIFTY
  merge::zoom=$ZOOM
  merge::file="$FILE"
done
file:0:closedata


【課題】 U軸に、X軸の任意変換[u=f(x)]を施した値の目盛りを振りたい。
【方法】 NUM に指定した値を FUNC で(逆)変換して、対応する座標位置を計算し、目盛数字、目盛線をU軸に付加します。
【説明】 NUM には振りたい目盛数字を羅列します。FUNC には u=f(x) の逆関数を指定します。その際、u は $u、( は \( 等とします。 X軸の設定を変えたら再度実行する必要があります。
##########
LEN=400               #付加する目盛線の長さ
WIDTH=40              #付加する目盛線の幅
SHIFTX=200            
SHIFTY=200
PT=2000               #目盛数字の文字ポイント
NUM="2 4 6 8"         #付加する目盛数字
FUNC='1/SQRT\($u\)'   #逆関数
##########

# 以前の実行で生成されたインスタンスを削除
NAME=originalaxis
if exist line:$NAME 
then
  del line:$NAME
fi
if exist text:$NAME 
then
  del text:$NAME
fi

MIN=${axis:fX1:min}
MAX=${axis:fX1:max}
AXISX=${axis:fU1:x}
AXISY=${axis:fU1:y}
AXISL=${axis:fU1:length}

for u in $NUM
do
  PX=`iexpr "$AXISX+(\`eval echo $FUNC\`-$MIN)/($MAX-$MIN)*$AXISL"`
  PY=`iexpr "$AXISY+$LEN"`
  new line name=$NAME
  line::points="$PX $AXISY $PX $PY"
  line::width=$WIDTH
  new text name=$NAME
  text::x="$PX-$SHIFTX"
  text::y="$AXISY-$SHIFTY"
  text::text="$u"
done


【課題】 開いてあるファイル全てのデータをまとめてフィットしたい。
【方法】 全てのデータをまとめた中間ファイルを生成し、それをプロットタイプ"fit"として開きます。
【説明】 FILE に中間ファイル名を指定します。消されても問題無いファイル名にしてください。
##########
FILE='c:\FIT.DAT'  #中間ファイル名
##########

# 以前の実行で生成された file インスタンスを削除
NAME=totalfit
if exist file:$NAME 
then
  del file:$NAME
fi
# 以前の実行で生成された fit インスタンスを削除
if exist fit:$NAME 
then
  del fit:$NAME
fi

NUM=`object file -instance`                   #データファイル数
echo 'temp. file for totalfit' > "$FILE"      #中間ファイルのクリア

i=0
while [ $i -lt $NUM ]
do
 file:$i:opendata           #ファイルのオープン
 while file::getdata
 do
   if [ \( ${file::stat_x} = "noerr" \) -a \( ${file::stat_y} = "noerr" \) ]
   then
     echo ${file::data_x} ${file::data_y} >> "$FILE"
   fi
 done
 file::closedata            #ファイルのクローズ
 i=`iexpr $i+1`
done

new file name=$NAME         #新たにファイルを開く
file::file="$FILE"          #ファイル名設定
file::head_skip=1           #先頭行読み飛ばし
file::type=fit              #プロットタイプはfit

new fit name=$NAME
FITID=${fit::id}
if exist fit:0              #すでに fit が有れば設定をコピーする
then
  cpy fit:0,$FITID
else
  fit::type=poly
fi
file::fit=fit:$FITID


【課題】 英文フォントのコード表を見たい。
【方法】 現在のグラフを退避し、フォントのコード表を表示して(10秒間)、退避したグラフを元に戻します。
【説明】 実行するとダイアログボックスが開くので、コード表を表示させたいフォント名(Symbol, Times等)を入力します。
new dialog
FONT=${dialog::input:'font name'}
del dialog

# hide all exsisting instances
system:0:hide_instance `derive draw`

for i in -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
do
  new line
  line::points="3000 6000+1000*$i+200 19000 6000+1000*$i+200"
done
for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
do
  new line
  line::points="3000+1000*$i 5200 3000+1000*$i 21200"
done

new text
text::pt=2000
text::font="Courier"
text::text="Encoding table ($FONT)"
text::x=3000
text::y=3000

X=3250
Y=5000
for j in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
  new text
  text::pt=1200
  text::font="Courier"
  text::text="0${j}"
  text::x=$X
  text::y=$Y
  X=`iexpr $X + 1000`
done

X=2250
Y=5850
for j in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
  new text
  text::pt=1200
  text::font="Courier"
  text::text="${j}0"
  text::x=$X
  text::y=$Y
  Y=`iexpr $Y + 1000`
done


Y=6000
for j in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
  X=3250
  for i in 0 1 2 3 4 5 6 7 8 9 A B C D E F
  do
    new text
    text::pt=2000
    text::font="$FONT"
    text::text="\\x${j}${i}"
    text::x=$X
    text::y=$Y
    X=`iexpr $X + 1000`
  done
  Y=`iexpr $Y + 1000`
done

gra::clear
gra::draw

sleep 10

for i in `derive -instance draw`
do
  del ${i}:0-!
done
gra::clear

# recover hidden instances
system:0:recover_instance `derive draw`


【課題】 PRMファイルからNGPファイルへ、まとめて変換したい。
【方法】 prmオブジェクトを使ってPRMファイルを読みこみ、NGPファイルを生成します。
【説明】 実行すると「ファイルを開く」ダイアログボックスがでますので、NGPファイルに変換したいPRMファイルを(複数)選択します。 demo1.prmだとすると、同じディレクトリに demo1.prm.ngp が生成されます。 データファイル込みのNGPファイルを生成するには、以下のスクリプトで INCLUDEDATA=True としてください。
#
new dialog
PRMS=${dialog::get_open_files:'PRM_File(*.prm) *.prm'}
del dialog
#
# load-option settings.
#
INCLUDEDATA=False
new prm
prm::symbol_greek=True
prm::ignore_path=False
#
for file in $PRMS
do
  #
  #  clear current graph.
  #
  for drawable in `derive -instance draw fit`
  do
    del $drawable:0-!
  done
  #
  #  load PRM file.
  #
  prm::file="$file"
  prm::load
  #
  #  make filename
  #
  NGP=${file}.ngp
  #
  #  save header
  #
  echo "#!ngraph" > "$NGP"
  echo "#%%creator: "${system:0:name}" for Windows" >> "$NGP"
  echo "#%%version: "${system:0:version} >> "$NGP"
  #
  #  save graph to NGP file.
  #
  for drawable in `derive -instance draw`
  do
    if [ \( "$drawable" = "file" \) -o \( "$drawable" = "merge" \) ]
    then
      i=0
      while exist $drawable:$i
      do
        get $drawable:$i -id -field save >> "$NGP"
        if [ "$INCLUDEDATA" = "True" ]
        then
          SAVE=False
          j=`iexpr $i - 1`
          while exist $drawable:$j
          do
            if [ `get $drawable:$i file` = `get $drawable:$j file` ]
            then
              while get $drawable:$i -id -field store_dummy >> "$NGP"
              do
                SAVE=True
              done
              break
            fi
            j=`iexpr $j - 1`
          done
          if [ "$SAVE" = "False" ]
          then
            while get $drawable:$i -id -field store_data >> "$NGP"
            do
              SAVE=True
            done
          fi
        fi
        i=`iexpr $i + 1`
      done
    else
      get $drawable:0-! -id -field save >> "$NGP"
    fi
  done
  get gra: -id -field save:device >> "$NGP"
  del gra
done
del prm


Copyright © Satoshi ISHIZAKA, 2002. All rights reserved.
http://www2e.biglobe.ne.jp/~isizaka/