研究開発

はじめてのVectorScript

第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);

を使って描きます。