2024-06-19 10:50 PM - 編集済み 2024-06-21 12:20 AM
※本記事は、旧サイト「How to use Archicad」より、Yutaro Kijimaさん の2018年3月15日の記事を転載しています。
初級編で作成したカラーボックスに縦横の段数設定を加えてみましょう。
はじめに、知っておくと便利なプログラム制御について紹介します。
1.プログラム制御
1)コメント
「!」をスクリプトの前に記述すると、プログラムはその行のスクリプトの実行を無視します。第三者が見ても理解できるように、スクリプトや計算式のコメントを自由に記述することが出来ます。
2)フロー制御
例えば、棚板を5分割したい場合は、座標変換とblockコマンドを4回繰り返す必要があります。スクリプトは以下のようになります。
add 0,0,高さ/5
block 幅,奥行,厚さ
add 0,0,高さ/5
block 幅,奥行,厚さ
add 0,0,高さ/5
block 幅,奥行,厚さ
add 0,0,高さ/5
block 幅,奥行,厚さ
しかし、段数を固定しない場合はどのようにスクリプトを書けばよいでしょうか?
このような場合にフロー制御を使います。まずは、段数を固定値としてフロー制御を使って書くと以下のようになります。
for i=1 to 4
add 0,0,高さ/5
block 幅,奥行,厚さ
next i
更に、分割数を変数に入れ替えると
何回でも実行を繰り返すことが可能になります。
for i=1 to 分割数の変数
add 0,0,高さ/分割数の変数-1
block 幅,奥行,厚さ
next i
3)サブルーチン制御
スクリプトは複雑になっていくと、動作が重たくなるだけでなく、不具合(バグ)も発生しやすくなります。使用するコマンドをサブルーチン化することで、繰り返し記述するスクリプトを単純化でき、不具合が発見しやすくなります。
例えば、2種類のblockを書く場合(座標変換は記述していません)
block 幅A,奥行A,高さA
block 幅B,奥行B,高さB
となりますが、サブルーチンで書くと
gosub 10
gosub 20
end
10:
block 幅A,奥行A,高さA
return
20:
block 幅B,奥行B,高さB
return
となります。
※gosubとはラベル番号のついたサブルーチンに行くという宣言です。
※10:や20:はラベルといいます。サブルーチンの場所を差します。
※一番最初のサブルーチンの行の前には必ずendを付けて、本文の終了を宣言します。
※サブルーチンは必ずreturnを付けて元に戻るようにします。
更に、パラメータをコマンド毎に定義すると
幅=幅A
奥行=奥行A
高さ=高さA
gosub 10
幅=幅B
奥行=奥行B
高さ=高さB
gosub 10
end
10:
block 幅,奥行,高さ
return
となり、blockコマンドは1行のみ、コマンド実行時前にパラメータを宣言するだけなので、間違いを発見しやすくなります。
4)条件ステートメント制御
パラメータの変数に、ある条件の数値が代入された場合、変数を指定したり、ラベルの行先を変えたりします。
例えば、変数が0の場合は100:を実行、変数が1の場合は200:を実行させたい場合は
以下のようになります。
if 変数=0 then 100:
if 変数=1 then 200:
end
100:
コマンド
return
200:
コマンド
return
2.カラーボックスのスクリプト(参考)
1)パラメータ
分割に関するパラメータを設定します。「タイプ」は整数に設定します。
2)3Dスクリプト(全文)
!パラメータの定義————–
!t_Side:側板サイズ
!t_Tana:棚板サイズ
!m_Side:側板材質
!m_Tana:側板材質
!y_step:縦分割数
!x_step:横分割数
!tateyoko:分割方法 横0 縦1 縦横2
!_x:サブルーチンに代入する変数
!_z:サブルーチンに代入する変数
!左板——————–
material m_side
_x=t_side
_z=zzyzx
gosub 10
!右板——————–
add a-t_side,0,0
_x=t_side
_z=zzyzx
gosub 10
del 1
!下板——————–
material m_tana
add t_side,0,0
_x=a-t_side*2
_z=t_tana
gosub 10
del 1
!上板——————–
add t_side,0,zzyzx-t_tana
_x=a-t_side*2
_z=t_tana
gosub 10
del 1
!条件式——————
if tateyoko=0 then 100
if tateyoko=1 then 200
!2の場合は横板内の条件式へ
!横板——————–
100:
add t_side,0,t_tana/2
y_span=(zzyzx-t_tana*2)/y_step
for i=1 to y_step-1
add 0,0,y_span
_x=a-t_side*2
_z=t_tana
gosub 10
next i
del y_step
!条件式——————
if tateyoko=2 then 200
end
!縦板——————–
200:
add t_side/2,0,t_tana
x_span=(a-t_tana*2)/x_step
for i=1 to x_step-1
add x_span,0,0
_x=t_side
_z=zzyzx-t_tana*2
gosub 10
next i
del x_step
end
!サブルーチン—————–
10:
block _x,b,_z
return