研究開発

通り芯オブジェクト(2)

第2章

このプログラムはデータパレットから数値入力することで直線を任意の間隔で配置していくプログラムです。

横方向と縦方向にそれぞれ任意の長さと間隔を設定することができます。

パラメータのそれぞれの意味は以下のようになっています。
角度を設定することで挿入点(ピンク色の点)を中心に回転します。

横方向の長さはプログラム内では Pwidth を使います。
縦方向の長さはプログラム内では Pheight を使います。
横方向の間隔はプログラム内では PxDirection を使います。
横方向の間隔はプログラム内では PyDirection を使います。

StrAnalysisは文字列を先頭から分析して、数値を返す関数です。
基本はカンマが出てくるまでを数値として返します。
アスタリスクの場合には数値を回数分返します。

{
名称  通り芯オブジェクト(baseline2.vso)
2009年 5月 7日-1.0
著作・製作 エーアンドエー株式会社
}
PROCEDURE baselineobj;
LABEL
	4444, 9999;
VAR
	objXH, objYH : HANDLE;
	theStr : STRING;
	p1X, p1Y, p2X, p2Y : REAL;
	vect : VECTOR;
	ang, leng : REAL;

	FUNCTION StrAnalysis : REAL;
	LABEL
		666;
	VAR
		sDummy : STRING;
		comma, asterisk, num : INTEGER;
		fraction, display : LONGINT;
		format : INTEGER;
		upi : REAL;
		name, squareName : STRING;
		leng : REAL;
	BEGIN
666:
		comma := Pos ( ',', theStr );
		IF comma = 0 THEN
		BEGIN
			comma := Len ( theStr );
		END
		ELSE IF comma = 1 THEN
		BEGIN
			Delete ( theStr, 1, 1 );
			GOTO 666;
		END;
		asterisk := Pos ( '*', theStr );
		IF asterisk = 0 THEN
		BEGIN
			asterisk := Len ( theStr );
		END;
		IF comma = asterisk THEN
		BEGIN
			leng := Str2Num ( theStr );
			theStr := '';
		END
		ELSE IF comma > asterisk THEN
		BEGIN
			leng := Str2Num ( Copy ( theStr, 1, Pos ( '*', theStr ) - 1 ) );
			num := Str2Num ( Copy ( theStr, Pos ( '*', theStr ) + 1,1 ));
			IF num > 1 THEN
			BEGIN
					Delete ( theStr, Pos ( '*', theStr )+1, 1 );
					sDummy := Num2Str ( 0, num-1 );
					Insert ( sDummy,theStr, Pos ( '*', theStr )+1 );
			END
			ELSE
			BEGIN
					Delete ( theStr, 1, Pos ( '*', theStr )+1 );
			END;
		END
		ELSE
		BEGIN
			leng := Str2Num ( Copy ( theStr, 1, Pos ( ',', theStr ) - 1 ) );
			Delete ( theStr, 1, Pos ( ',', theStr ) );
		END;

		GetUnits( fraction, display, format, upi, name, squareName );
		StrAnalysis := leng * upi / 25.4;

	END;

ここからメインルーチンです。
横方向の長さが0以上のときに原点を通る横線を引きます。
はみ出す部分を全体の1/10としています。
あとで、複製するためにハンドルを取っておきます。

BEGIN

	IF PWidth > 0.0 THEN
	BEGIN
		MoveTo( -PWidth/10, 0 );
		LineTo( PWidth-PWidth/10, 0 );
		objYH := LNewObj;
	END;

縦方向の長さが0以上のときに原点を通る縦線を引きます。
はみ出す部分を全体の1/10としています。
あとで、複製するためにハンドルを取っておきます。


	IF PHeight > 0.0 THEN
	BEGIN
		MoveTo( 0, -PHeight/10.0 );
		LineTo( 0, PHeight-PHeight/10.0 );
		objXH := LNewObj;
	END;

横方向の間隔に入っている文字列を変数にコピーします。
その文字列がなくなるまで縦線の描画を繰り返します。
StrAnalysis関数から数値をもらい、最初に引いた縦線からオフセットする位置を計算します。
引いた線を元に次の線を引くことになるので、ハンドルを変数に入れ替えます。


	theStr := PxDirection; 
	WHILE Len( theStr ) > 0 DO
	BEGIN
		leng := StrAnalysis;
		IF leng <= 0.0 THEN
		BEGIN
			GOTO 4444;
		END;
		GetSegPt1( objXH, p1X, p1Y );
		GetSegPt2( objXH, p2X, p2Y );
		vect.x := p2X - p1X;
		vect.y := p2Y - p1Y;
		vect.z := 0.0;
		ang := Vec2Ang( vect );
		vect := Ang2Vec( ang-90, leng );
		objXH := HDuplicate( objXH, vect.x, vect.y );
	END;

4444:

縦方向の間隔に入っている文字列を変数にコピーします。
その文字列がなくなるまで横線の描画を繰り返します。
StrAnalysis関数から数値をもらい、最初に引いた横線からオフセットする位置を計算します。
引いた線を元に次の線を引くことになるので、ハンドルを変数に入れ替えます。


	theStr := PyDirection; 
	WHILE Len( theStr ) > 0 DO
	BEGIN
		leng := StrAnalysis;
		IF leng <= 0.0 THEN
		BEGIN
			GOTO 9999;
		END;
		GetSegPt1( objYH, p1X, p1Y );
		GetSegPt2( objYH, p2X, p2Y );
		vect.x := p2X - p1X;
		vect.y := p2Y - p1Y;
		vect.z := 0.0;
		ang := Vec2Ang( vect );
		vect := Ang2Vec( ang+90, leng );
		objYH := HDuplicate( objYH, vect.x, vect.y );
	END;

9999:END;
Run( baselineobj );