研究開発

「はじめてのVectorScript」と題して連載を始めるわけですが、本連載は「Vectorworksは持っているけどVectorScriptって何?」、「プログラミングって難しいんでしょ?」「アイデアはあるんだけど...」という人が「それ、VectorScriptでやれば簡単だよね」と言えるくらいになるのが目標です。

VectorworksはMacintosh版とWindows版とのマルチプラットホーム環境でありながらも、VectorScriptはOSを意識することのなくプログラミングが可能で、どちらでプログラミングしてもソースコードの変更なしでMacintosh、Windowsどちらでも実行が可能です。そしてVectorworksを持っていればいますぐにでも始められます。

ゲーム機の場合、DQ7(ソフト)で遊びたいという理由で3DS(ハード)を選ぶと思います。「このソフト(あなたが書いたスクリプト)を使いたいためにVectorworksを選びました」と言わせるようなプログラムを目指してがんばりましょう。自分のアイデアをプログラム化しブログで公開なんてことも夢ではありません。

第6章 ワークシート


・ワークシートを作る

PROCEDURE Example601;
VAR
	WSHandle : HANDLE;
BEGIN
	WSHandle := CreateWS( '名称未設定-1', 10, 5 );
	ShowWS( WSHandle, TRUE );

END;
Run( Example601 );

ワークシートを作るには、

CreateWS(name : STRING; rows, columns : INTEGER):HANDLE;

を使います。
同じ名前のワークシートが存在する場合、勝手に-1、-2とか付きでできてしまいますが、エラーになります。場合によっては作成前に名前チェックすることをお勧めします。
引数はワークシートの列数、行数になります。あとから追加する事も可能です。

PROCEDURE Example602;
VAR
	WSHandle : HANDLE;
BEGIN
	IF GetObject( '名称未設定-1' ) = NIL THEN
	BEGIN
		WSHandle := CreateWS( '名称未設定-1', 10, 5 );
		ShowWS( WSHandle, TRUE );
	END
	ELSE
	BEGIN
		AlrtDialog( 'この名前は既に使われています。別の名前にしてください。' );
	END;

END;
Run( Example602 );

・ワークシートにデータを書き込む

PROCEDURE Example603;
VAR
	WSHandle : HANDLE;
BEGIN
	IF GetObject( '名称未設定-1' ) = NIL THEN
	BEGIN
		WSHandle := CreateWS( '名称未設定-1', 10, 5 );

		SetWSCellAlignment( WSHandle, 1, 1, 1, 1, 2 );
		SetWSCellFormulaN( WSHandle, 1, 1, 1, 1, '5' );

		SetWSCellAlignment( WSHandle, 1, 2, 1, 2, 2 );
		SetWSCellFormulaN( WSHandle, 1, 2, 1, 2, '×' );

		SetWSCellAlignment( WSHandle, 1, 3, 1, 3, 2 );
		SetWSCellFormulaN( WSHandle, 1, 3, 1, 3, '2' );

		SetWSCellAlignment( WSHandle, 1, 4, 1, 4, 2 );
		SetWSCellFormulaN( WSHandle, 1, 4, 1, 4, '=' );

		SetWSCellAlignment( WSHandle, 1, 5, 1, 5, 2 );
		SetWSCellFormulaN( WSHandle, 1, 5, 1, 5, '=A1*C1' );

		ShowWS( WSHandle, TRUE );
	END
	ELSE
	BEGIN
		AlrtDialog( 'この名前は既に使われています。別の名前にしてください。' );
	END;

END;
Run( Example603 );

セルにデータを入れるには、

SetWSCellFormulaN(worksheet : HANDLE; topRow, leftColumn, bottomRow, rightColumn : INTEGER; formula : DYNARRAY of CHAR);

を使います。
このサンプルでは、5(数字)、×(文字)、2(数字)、=(文字)、=A1*C1(数式)を入れています。

中央揃えをするには、

SetWSCellAlignment(worksheet : HANDLE; topRow, leftColumn, bottomRow, rightColumn, cellAlignment : INTEGER);

を使います。
cellAlignmentに2とすることで中央揃えになります。

・ワークシートを削除する
PROCEDURE Example604;
VAR
	WSHandle : HANDLE;
BEGIN
	WSHandle := GetObject( '名称未設定-1' );
	IF ( WSHandle <> NIL ) AND ( GetTypeN( WSHandle ) = 18 ) THEN
	BEGIN
		DelObject( WSHandle );
	END
	ELSE
	BEGIN
		AlrtDialog( 'ワークシートがありません。' );
	END;
END;
Run( Example604 );

ワークシートを削除するには、

DelObject(h : HANDLE);

を使います。
ただし、ワークシート以外の図形も消す事ができてしまうので、予め図形種別の確認もしておきましょう。

GetTypeN(h : HANDLE):INTEGER;

を使います。
ワークシートは、18ですので、ハンドルが存在し、且つワークシートのときに消すようにします。

・図形の座標を書き込む

PROCEDURE Example605;
VAR
	num : LONGINT;
	WSHandle, objH : HANDLE;
	p1, p2 : POINT;
	p3 : POINT3D;
BEGIN
	num := NumObj( ActLayer );
	WSHandle := GetObject( '名称未設定-1' );
	IF ( WSHandle <> NIL ) AND ( GetTypeN( WSHandle ) = 18 ) THEN
	BEGIN
		DelObject( WSHandle );
	END;
	WSHandle := CreateWS( '名称未設定-1', num, 5 );

	num := 1;
	objH := FActLayer;
	WHILE objH <> NIL DO
	BEGIN
		IF GetTypeN( objH ) = 2 THEN
		BEGIN
			GetSegPt1( objH, p1.x, p1.y );
			GetSegPt2( objH, p2.x, p2.y );
			SetWSCellFormulaN( WSHandle, num, 1, num, 1, 'LINE' );
			SetWSCellFormulaN( WSHandle, num, 2, num, 2, Num2Str( 9, p1.x ) );
			SetWSCellFormulaN( WSHandle, num, 3, num, 3, Num2Str( 9, p1.y ) );
			SetWSCellFormulaN( WSHandle, num, 4, num, 4, Num2Str( 9, p2.x ) );
			SetWSCellFormulaN( WSHandle, num, 5, num, 5, Num2Str( 9, p2.y ) );
			num := num + 1;
		END
		ELSE IF GetTypeN( objH ) = 9 THEN
		BEGIN
			GetLocus3D( objH, p3.x, p3.y, p3.z );
			SetWSCellFormulaN( WSHandle, num, 1, num, 1, 'LOCUS3D' );
			SetWSCellFormulaN( WSHandle, num, 2, num, 2, Num2Str( 9, p3.x ) );
			SetWSCellFormulaN( WSHandle, num, 3, num, 3, Num2Str( 9, p3.y ) );
			SetWSCellFormulaN( WSHandle, num, 4, num, 4, Num2Str( 9, p3.z ) );
			num := num + 1;
		END;
		objH := NextObj( objH );
	END;

	ShowWS( WSHandle, TRUE );
END;
Run( Example605 );

アクティブなレイヤ上の直線と3D基準点のそれぞれの座標をワークシートに書いてみましょう。図形の方は予め描いておいてください。
セルの大きさを決めるのに、図形の数を数えます。レイヤ上の図形数を数えるには、

NumObj(h : HANDLE):LONGINT;

を使います。引数にレイヤのハンドルを与えることで、そのレイヤ上の図形数を返します。アクティブなレイヤのハンドルは、

ActLayer:HANDLE;

を使います。直接引数に入れるとActLayerから戻ってきたハンドルが、NumObjに渡り、図形数を返します。この場合、直線や3D基準点以外の数も足されてしまいます。厳密にやりたい場合には頑張ってください。

列方向は図形タイプ、直線の始点終点のx,y座標で5列作ります。
図形の探し方として、アクティブレイヤの先頭図形のハンドルから、WHILE文を使って処理を繰り返します。次々(NextObj)に確認していき、図形のタイプが2(直線)、9(3D基準点)のときにワークシートの行に書き込みます。最後まで(NIL)いったら終了です。厳密にはグループ内やシンボル、オブジェクト内も探ったりするのですが、ここでは端折っています。
直線だった場合、始点座標は、

GetSegPt1(h : HANDLE; VAR pX, pY : REAL);

を使います。
終点座標は、

GetSegPt2(h : HANDLE; VAR pX, pY : REAL);

を使います。
3D基準点だった場合は、座標値は

GetLocus3D(h : HANDLE; VAR pX, pY, pZ : REAL);

を使います。

セルに入れるときにSetWSCellFormulaNを使いますが、文字列に変換しないと数値は入れられません。

Num2Str(decPlace : INTEGER; v : REAL):STRING;

を使って文字列に変換します。このとき小数点以下を何桁にするかをdecPlaceで決められます。


・ワークシートの座標から図形を生成する。

PROCEDURE Example606;
VAR
	WSHandle : HANDLE;
	numRows, numColumns, ii : INTEGER;
	pp : POINT3D;
BEGIN
	WSHandle := GetObject( '名称未設定-1' );
	IF ( WSHandle <> NIL ) AND ( GetTypeN( WSHandle ) = 18 ) THEN
	BEGIN
		GetWSRowColumnCount( WSHandle, numRows, numColumns );
		FOR ii := 1 TO numRows DO
		BEGIN
			GetWSCellValue( WSHandle, ii, 1, pp.z );
			GetWSCellValue( WSHandle, ii, 3, pp.x );
			GetWSCellValue( WSHandle, ii, 5, pp.y );
			Locus3D( pp.x, pp.y, pp.z );
		END;
	END
	ELSE
	BEGIN
		AlrtDialog( 'ワークシートがありません。' );
	END;
END;
Run( Example606 );

予めワークシートにあるデータ(独自のフォーマット)を元に、図形を生成してみましょう。
ワークシートにはA列にz座標、C列にx座標、E列にy座標の複数行のデータがあるとします。
まずはワークシートの大きさを求めるのに、

GetWSRowColumnCount(worksheet : HANDLE; VAR numRows, numColumns : INTEGER);

を使います。FOR文をnumRows回分繰り返すことでワークシートをすべて読み込めます。
数値データを読むには、

GetWSCellValue(worksheet : HANDLE; row, column : INTEGER; VAR cellValue : REAL);

を使います。3D基準点を描くには、

Locus3D(pX, pY, pZ : REAL);

を使って描きます。


VectorScriptに関するお問い合わせ

VectorScriptに関するお問合せは、以下からお問い合せください。

エーアンドエー株式会社 研究開発室

email:develop@aanda.co.jp