研究開発

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

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

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

第7章 データベース

ここでいうデータベースとは、レコードを図形に付加し、条件を元に検索したりデータを集計するVectorworksの機能のことです。
普段手動でやっている、レコードフォーマットの作成や、図形へのレコードの付加、データの入力などをスクリプトでやってみましょう。

・新規レコードの作成

PROCEDURE Example701;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );
END;
Run( Example701 );

リソースパレットをダブルクリックしてレコードフォーマットを作る作業は

NewField(recName, fieldName : STRING; fieldValue : DYNARRAY of CHAR; fType, fFlag : INTEGER);

を使います。
すでにレコードが存在する場合には、フィールドが追加されます。


・図形にレコードを連結する

PROCEDURE Example702;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );
END;
Run( Example702 );

図形にレコードを連結するには、

SetRecord(h : HANDLE; record : STRING);

を使います。

・レコードフィールドにデータを入力する

PROCEDURE Example703;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );
END;
Run( Example703 );

レコードフィールドにデータを入力するには、

SetRField(h : HANDLE; record, field : STRING; value : DYNARRAY of CHAR);

を使います。

・レコードフィールドのデータを取得する
PROCEDURE Example704;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );

	Message( GetRField( LNewObj, 'フォーマット-1', '型番' ) );
END;
Run( Example704 );

レコードフィールドのデータを取得するには、

GetRField(h : HANDLE; record, field : STRING):DYNARRAY of CHAR;

を使います。


・図形のレコードを削除する
PROCEDURE Example705;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );

	DelRecord( LNewObj, 'フォーマット-1' );
END;
Run( Example705 );

図形のレコードを削除するには、

DelRecord(h : HANDLE; name : STRING);

を使います。

・ワークシートのデータベース機能と連動させる

PROCEDURE Example706;
VAR
	fieldNum, ii : INTEGER;
	WSHandle : HANDLE;
	theStr, fieldNameStr : STRING;
BEGIN
	fieldNum := NumFields( GetObject( 'フォーマット-1' ) );
	WSHandle := CreateWS( 'WSフォーマット-1', 2, fieldNum );

	theStr := '=DATABASE((R IN [''フォーマット-1'']))';
	SetWSCellFormulaN( WSHandle, 2, 0, 2, 0, theStr );

	FOR ii := 1 TO fieldNum DO
	BEGIN
		fieldNameStr := GetFldName( GetObject( 'フォーマット-1' ), ii );
		SetWSCellFormulaN( WSHandle, 1, ii, 1, ii, fieldNameStr );
		theStr := Concat( '=''フォーマット-1''.''', fieldNameStr, '''' );
		SetWSCellFormulaN( WSHandle, 2, ii, 2, ii, theStr );
	END;

	RecalculateWS( WSHandle );
	ShowWS( WSHandle, TRUE );

END;
Run( Example706 );

レコードを作ったあとは、集計用のワークシートを作りましょう。
手動でデータベース用ワークシートを作る手順と似ていますが、レコードフィールドの登録は同じことの繰り返しなのでFOR文で行います。

まず、ワークシートをデータベース化するには、手動の場合に一番左の列で右ボタンを押して「データベース」を選びますよね?アレをします。
SetWSCellFormulaNを使って、0列目に検索条件を入れます。そのためには、ワークシート関数DATABASEを使います。
=DATABASE()のかっこの中に、レコードの名前を指す(R IN ['レコード名'])を入れるとデータベースとしての検索機能が働きます。
1行目にはレコード内のレコードフィールド名を列ごとに入れますが、

NumFields(h : HANDLE):INTEGER;

を使ってレコード内のフィールドレコード数を数えておきます。そして、FOR文にてfieldNum回繰り返します。
レコード名は、

GetFldName(h : HANDLE; index : INTEGER):STRING;

を使ってレコードに付いているフィールド名をとってきて、ii列目に入れます。
データベース行には、='フォーマット-1'.'フィールド名'を列ごとに入れます。
最後にワークシートの再計算をするために、

RecalculateWS(worksheet : HANDLE);

を使います。

VectorScriptに関するお問い合わせ

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

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

email:develop@aanda.co.jp