研究開発

ブロックを積む(8)

第8章 図形属性の変更

Vectorworksの図形には様々な属性があります。線でいえば、色、太さ、破線の種類などがあります。

メッセージウインドウがでたら成功です。

では、四角形に色を付けてみましょう。
色を付ける手続きは
手続きSetFillBack(h : HANDLE; colorR, colorG, colorB : LONGINT);
関数LNewObj:HANDLE;
を使います。

SetFillBackは先頭の引数に図形のハンドルを与え、残りの3つでRGBをセットします。
LNewObjは直前に描かれた図形のハンドルを返す関数です。これを直接SetFillBackのハンドルに直接渡します。

Rect( 10, 20, 60, 50 );
SetFillBack( LNewObj, 39321, 26214, 13107 );{ブラウン}

柱状体で色を付けるどうなるでしょう。

BeginXtrd( 0, 30 );
Rect( 10, 20, 60, 50 );
SetFillBack( LNewObj, 39321, 26214, 13107 );
EndXtrd;

FOR文で繰り返すことで、2次元的に展開するとどうでしょう。

PROCEDURE sample;
VAR
ii, jj : INTEGER;
BEGIN
FOR jj := 0 TO 4 DO
BEGIN
FOR ii := 0 TO 8 DO
BEGIN
BeginXtrd( 0+jj*30, 30+jj*30 );
Rect( 10+ii*50, 20, 60+ii*50, 50 );
SetFillBack( LNewObj, 39321, 26214, 13107 );
EndXtrd;
END;
END;
END;
Run( sample );

さらにここで、ある条件にしたがって色を付けたり付けなかったりしてみましょう。
条件分岐をするにはIF文を使います。

IF 条件 THEN
BEGIN
    {条件に対して真の場合の処理}
END
ELSE
BEGIN
   {条件に対して偽の場合の処理}
END;

では、偶数個目の場合に色を付けてみましょう。

PROCEDURE sample;
VAR
ii, jj : INTEGER;
BEGIN
FOR jj := 0 TO 4 DO
BEGIN
FOR ii := 0 TO 8 DO
BEGIN
BeginXtrd( 0+jj*30, 30+jj*30 );
Rect( 10+ii*50, 20, 60+ii*50, 50 );
IF  ii MOD 2 <> 0 THEN
BEGIN
SetFillBack( LNewObj, 39321, 26214, 13107 );
END;
EndXtrd;
END;
END;
END;
Run( sample );

続いて、段数の方でも偶数段目、奇数段目を条件分けしてみましょう。
条件を追加するには、

IF 条件1 THEN
BEGIN
    {条件1に対して真の場合の処理}
END
ELSE IF 条件2 THEN
BEGIN
    {条件2に対して真の場合の処理}
END
ELSE
BEGIN
   {条件1、2に対して偽の場合の処理}
END;
PROCEDURE sample;
VAR
ii, jj : INTEGER;
BEGIN
FOR jj := 0 TO 4 DO
BEGIN
FOR ii := 0 TO 8 DO
BEGIN
BeginXtrd( 0+jj*30, 30+jj*30 );
Rect( 10+ii*50, 20, 60+ii*50, 50 );
IF ( jj MOD 2 = 0 ) AND ( ii MOD 2 <> 0 ) THEN
BEGIN
SetFillBack( LNewObj, 39321, 26214, 13107 );
END
ELSE IF ( jj MOD 2 <> 0 ) AND ( ii MOD 2 = 0 ) THEN
BEGIN
SetFillBack( LNewObj, 39321, 26214, 13107 );
END;
EndXtrd;
END;
END;
END;
Run( sample );

最後に、何段目かによって個数を変えるにはどうすればよいでしょう。

PROCEDURE sample;
VAR
ii, jj : INTEGER;
BEGIN
FOR jj := 0 TO 4 DO
BEGIN
FOR ii := jj TO 8 DO
BEGIN
BeginXtrd( 0+jj*30, 30+jj*30 );
Rect( 10+ii*50, 20, 60+ii*50, 50 );
IF ( jj MOD 2 = 0 ) AND ( ii MOD 2 <> 0 ) THEN
BEGIN
SetFillBack( LNewObj, 39321, 26214, 13107 );
END
ELSE IF ( jj MOD 2 <> 0 ) AND ( ii MOD 2 = 0 ) THEN
BEGIN
SetFillBack( LNewObj, 39321, 26214, 13107 );
END;
EndXtrd;
END;
END;
END;
Run( sample );