はじめてのVectorScript(10)
「はじめてのVectorScript」と題して連載を始めるわけですが、本連載は「Vectorworksは持っているけどVectorScriptって何?」、「プログラミングって難しいんでしょ?」「アイデアはあるんだけど...」という人が「それ、VectorScriptでやれば簡単だよね」と言えるくらいになるのが目標です。
VectorworksはMacintosh版とWindows版とのマルチプラットホーム環境でありながらも、VectorScriptはOSを意識することのなくプログラミングが可能で、どちらでプログラミングしてもソースコードの変更なしでMacintosh、Windowsどちらでも実行が可能です。そしてVectorworksを持っていればいますぐにでも始められます。
ゲーム機の場合、DQ7(ソフト)で遊びたいという理由で3DS(ハード)を選ぶと思います。「このソフト(あなたが書いたスクリプト)を使いたいためにVectorworksを選びました」と言わせるようなプログラムを目指してがんばりましょう。自分のアイデアをプログラム化しブログで公開なんてことも夢ではありません。
第10章 マイ関数を作る
VectorScriptには数千近い手続き、関数が用意されています。それらAPIを使う事により、Vectorworksに命令を出す事ができます。あらゆるコンピュータ言語に、自前の関数を作ることができるのと同じように、PascalベースのVectorScriptにも自前の手続き、関数を作ることができます。
同じことを何度も繰り返す場合、その命令群を手続き、関数にしてしまうことで、プログラムが簡潔になります。
また、本体には用意されていない機能を自前で作ることもできます。
尚、ここで言う手続きと関数の違いは、戻り値がある(関数FUNCTION)かない(手続きPROCEDURE)かの違いです。
10.1 手続きと関数の書く場所
手続き、関数を作るには、以下のような場所に書きます。
使われる前に書いておく必要があります。具体的には上の方に書いておく必要があります。
PROCEDURE sub; BEGIN Message( 'sub' ); END; PROCEDURE main; BEGIN sub; END; Run( main );
次のように書くとsubと言う関数が見当たりませんとエラーを起こします。
PROCEDURE main; BEGIN sub; END; Run( main ); PROCEDURE sub; BEGIN Message( 'sub' ); END;
また、プログラムに親子関係がある場合には、子の手続き、関数を親の手続き、関数の後に書いておく必要があります。
PROCEDURE main; PROCEDURE sub; BEGIN Message( 'sub' ); END; BEGIN sub; END; Run( main );親子関係があるという意味は、sub(子)がmain(親)の中でしか使われない場合です。
10.2 手続きと関数の書き方
元々用意されているAPIにも、手続き、関数があるように、自前の手続き、関数も作ることができます。
10.2.1 手続きの書き方
手続きとは、関数から戻り値がないものです。引数もない場合、以下のように書きます。
PROCEDURE sub; BEGIN Message( 'sub' ); END;呼び出し側は以下のように書きます。
PROCEDURE main; BEGIN sub; END;
手続きに引数を渡す場合、以下のように書きます。
PROCEDURE sub( one : INTEGER ); BEGIN Message( one ); END;呼び出し側は以下のように書きます。
PROCEDURE main; BEGIN sub( 1 ); END;
手続きに引数を複数渡す場合、以下のように書きます。
PROCEDURE sub( one : REAL; two : REAL ); BEGIN Message( one + two ); END;呼び出し側は以下のように書きます。
PROCEDURE main; BEGIN sub( 1.0, 2.0 ); END;
10.2.2 関数の書き方
関数とは、戻り値があるものです。引数もない場合、以下のように書きます。
FUNCTION sub : INTEGER; BEGIN sub := 1; END;戻り値の型を関数名の後に:で指定します。
よくある言語の関数は、returnで戻り値を返しますが、VectorScriptは、関数名と同じ名前の変数に値を代入することで、戻り値を返します。
手続きと違って、戻り値があるので、関数を呼び出す際には、以下のように書くこともできます。
PROCEDURE main; FUNCTION sub : INTEGER; BEGIN sub := 2; END; BEGIN Message( sub + 3 ); END; Run( main );普通は引数を渡して、戻り値を返す関数を作ります。
PROCEDURE main; FUNCTION sub( one : REAL; two : REAL ) : REAL; BEGIN sub := one + two; END; BEGIN Message( sub( 1.0, 2.0 ) + 3.0 ); END; Run( main );
10.3 マイ関数を作るその1 VectorScriptはペンプロッタを模したAPIも多く、線を描く命令が、MoveTo、LineToだったりします。
MoveToでペンの書き始め位置を指定し、LineToで線を引くというのが基本です。
そこで、一発で線を引く関数を作ってみましょう。
FUNCTION CreateLine ( startX : REAL; startY : REAL; endX : REAL; endY : REAL; ) : HANDLE;
startX,YからendX,Yまで線を引く関数です。
PROCEDURE main; VAR objH : HANDLE; FUNCTION CreateLine( startX : REAL; startY : REAL; endX : REAL; endY : REAL ) : HANDLE; BEGIN MoveTo( startX, startY ); LineTo( endX, endY ); CreateLine := LNewObj; END; BEGIN objH := CreateLine( 0, 0, 100, 100 ); END; Run( main );
10.4 マイ関数を作るその2
楕円弧を描く関数を作ってみましょう。元々Arcと言う円、楕円弧関数がありますが、改造してみましょう。
PROCEDURE Arc ( p1X : REAL; p1Y : REAL; p2X : REAL; p2Y : REAL; StartAngle : REAL; ArcAngle : REAL; ) ;元々の関数(手続き)は矩形内に円、楕円を描いてアングルに応じて楕円弧を描く関数です。
FUNCTION CreateEllipseArc ( orginX : REAL; orginY : REAL; width : REAL; height : REAL StartAngle : REAL; EndAngle : REAL; ) : HANDLE;
こちらは中心の座標と、幅、高さを指定して、楕円を描きアングルに応じて楕円弧を描かせます。
また、最後にちょっと手を加えることで仕上げを変えます。
PROCEDURE main; VAR objH : HANDLE; FUNCTION CreateEllipseArc( orginX : REAL; orginY : REAL; width : REAL; height : REAL; StartAngle : REAL; EndAngle :REAL ) : HANDLE; BEGIN Arc( orginX - width / 2.0, orginY - height / 2.0, orginX + width / 2.0, orginY + height / 2.0, StartAngle, EndAngle-StartAngle ); DelVertex( LNewObj, 1 ); CreateEllipseArc := LNewObj; END; BEGIN objH := CreateEllipseArc( 0, 0, 100.0, 50.0, 45.0, 315.0 ); Arc( -50.0, 25.0, 50.0, 75.0, 45.0, 270.0 ); END; Run( main );
10.5 マイ関数を作るその3
n角形の多角形を描く関数を作ってみましょう。
FUNCTION CreatePolygon ( orginX : REAL; orginY : REAL; radius : REAL; nn : INTEGER; ) : HANDLE;
中心の座標と、中心からの距離、頂点数からn角形を描かせます。
PROCEDURE main; VAR objH : HANDLE; FUNCTION CreatePolygon( orginX : REAL; orginY : REAL; radius : REAL; nn : INTEGER ) : HANDLE; VAR ii : INTEGER; BEGIN ClosePoly; BeginPoly; FOR ii := 1 TO nn DO BEGIN AddPoint( radius * Cos( Deg2Rad( 360.0 / nn ) * ii + Deg2Rad( 90.0 ) ), radius * Sin( Deg2Rad( 360.0 / nn ) * ii + Deg2Rad( 90.0 ) ) ); END; EndPoly; CreatePolygon := LNewObj; END; BEGIN ArcByCenter( 0.0, 0.0, 50.0, 0.0, 360.0 ); objH := CreatePolygon( 0.0, 0.0, 50.0, 5 ); END; Run( main );本来は入力データのエラーチェック等も必要になりますがここでは省略しています。
VectorScriptに関するお問い合わせ
VectorScriptに関するお問合せは、以下からお問い合せください。