研究開発

「はじめての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に関するお問合せは、以下からお問い合せください。

Vectorworks Japan 研究開発室

email:develop@vectorworks.co.jp