● アドイン・スクリプト
メイルや会議室等で頂いた質問や要望に答える時に、ちょこちょこっと作ったアドイン・スクリプトを紹介します。
汎用性があまり無かったりしますが、アドイン・スクリプト作成の参考などにしてください。
● このページのアドイン・スクリプトの使用方法
- スクリプトをカット&ペーストするなどしてファイルにセーブします。
- 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
|
|