ここでは、実際に私が頻繁に使っているマクロをお見せしましょう。
; 通常のビル (Normal building macro) ; build.scm Lat Lon Rot Height Width1 Width2 Type Altitude (wallflag) ; 1 2 3 4 5 6 7 8 9 Area( 5 %1 %2 10 ) PerspectiveCall( :Sub ) Jump( : ) :Sub Perspective mif( %8 ) Refpoint( 2 :No_object 1 %1 %2 E= %8 V1= 3000 ) melse Refpoint( 7 :No_object 1 %1 %2 V1= 3000 ) mifend mif( %3 ) RotatedCall( :Object 0 0 %3 ) melse Call( :Object ) mifend :No_object Return :Object mif( %9 ) Building( 0 0 0 %4 %5 %6 %7 %9 ) melse Building( 0 0 0 %4 %5 %6 %7 1F ) mifend Return EndA以上の内容を "build.scm" というファイルに書き込んでおきます。これは 標準のビルを作るマクロです。このマクロを使うのは簡単です。シーナリ ファイルの中で以下のように記述すれば良いのです。
Macro( build.scm N35:09:12.0 E136:58:02.4 20 12 30 30 03 0 1F )たったこの1行でビルができてしまいます。Macro という命令がマクロを 呼び出す命令です。ここでは、build.scm というファイルに入っている マクロを使い、N35:09:12.0 以下の引数をマクロに渡します。
マクロに渡された引数は順に %1, %2, %3,... という部分に挿入して解釈 されます。たとえば、マクロの最初の行の
Area( 5 %1 %2 10 )という部分は
Area( 5 N35:09:12.0 E136:58:02.4 10 )に解釈されます。ですから、引数を変えることでビルの位置や大きさ、高さ、 色などを簡単に指定できるわけです。これならたった1行でビルを作れるので、 シーナリ作成がとても簡単になります。
次に、マクロの中の mif, melse, mend ですが、これは条件によって コンパイルする範囲を変えるものです。たとえば、mif( %3 ) という行が ありますね。これは、3番目の引数が真(0でない)場合に以下の melse までの行を解釈し、偽(0)の場合は melse から mifend までの行を解釈 します。ここでは、回転角度が 0 の場合は RotatedCall を実行しない ようにしているわけです。
Airport のマクロで使用する引数は以下のようになっています。 なお、これは私が独自に解析したものですので、保証はしません。
%1 緯度 %2 経度 %3 視程(2nm単位, Area() の第4引数) %4 スケーリングファクタ %5 回転角 %6 色1 (couleur の第1引数) %7 色2 (couleur の第2引数) %8 色3 (couleur の第3引数) %9 色4 (couleur の第4引数) %10 RefPoint からの視程(v1=パラメータ) %11 高度(RefPoint E=パラメータ) %12 シーナリ density がこの値以上の時のみ表示 %13,%14 RefPoint の最後の2引数。内容は不明
インクルードの使い方は簡単で、メインのシーナリファイルなどから、
Include( sub.scm )とすれば、この位置に sub.scm の内容が挿入されたのと同じ効果になります。
メインのシーナリファイルには Header と LatRange と Include だけ を書いておいて、その他のシーナリは全部サブシーナリファイルに分けてしまうと きれいになります。
ただし、残念ながら Include したファイルの中からさらに 他のファイルを Include することはできません。