通り芯オブジェクト(2)
データパレットへの数値入力で、通り芯を描画するプログラムです。
第2章 解説
このプログラムはデータパレットから数値入力することで直線を任意の間隔で配置していくプログラムです。
横方向と縦方向にそれぞれ任意の長さと間隔を設定することができます。
パラメータのそれぞれの意味は以下のようになっています。
角度を設定することで挿入点(ピンク色の点)を中心に回転します。
横方向の長さはプログラム内では Pwidth を使います。
縦方向の長さはプログラム内では Pheight を使います。
横方向の間隔はプログラム内では PxDirection を使います。
横方向の間隔はプログラム内では PyDirection を使います。
StrAnalysisは文字列を先頭から分析して、数値を返す関数です。
基本はカンマが出てくるまでを数値として返します。
アスタリスクの場合には数値を回数分返します。
{ 名称 通り芯オブジェクト(baseline2.vso) 2009年 5月 7日-1.0 著作・製作 Vectorworks Japan } 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 );