建築でコンピュータ、する?
2025年4月27日(日) 09:26 JST
第7回となる今回は、GDLのホットスポットという機能を扱います。ホットスポットとは、GDLなどのオブジェクトを実際に図面に配置するときにマウスで掴むポイント(Illustratorでいうアンカー)です。GDLを使って適切にホットスポットを定義しておくと、オブジェクトを並べたり、決まった位置に配置したりする際に便利です。
GDLオブジェクトでは、配置の基準となるホットスポットを記述できます。 以下のGDLを書いて保存し、図面においてみると図のようになります。赤く囲った中の黒い点がホットスポットです。 マウスをかざすと、チェックマークが表示されます。この点をマウスで掴むことで、別のホットスポットなどに合わせて移動することができます。
len=1 !!立方体の一辺の長さ HOTSPOT len/2,len/2,0 !!底面の中心にホットスポットを置く BRICK len,len,len
ホットスポットは上の例のように単にマウス掴むために使われることも多いのですが、グラフィカル編集という特別なオプションを加えることで、オブジェクトをグラフィカルに編集する機能を持たせることもできます。ArchiCADのドア(や窓)オブジェクトではオブジェクトの設定画面(Ctr+T)を開かなくても窓の高さなどを変更することができるものがありますが、このようにグラフィカルにパラメトリックオブジェクトを編集することを実現する機能です。ここでは例として、第1回で作った時計を改良し、半径や針の指す時刻を変えられるようにした物のコードを示します。
!! -------------- 土台部分 ------------ hBack = 0.075 !! 機械部の高さ !rBack = 0.2 !! 機械部の半径 これはパラメータに登録する hFront = 0.025 !! 文字盤の高さ rFront = rBack *1.1 !! 文字盤の半径 !! -------------- 印・針 ------------ hCenter = 0.01 !! 針軸の高さ rCenter = 0.01 !! 針軸の半径 !! 印部分 xNum = 0.01 !! 印の幅 yNum = 0.03 !! 印の長さ zNum = hCenter !! 印の高さ rNum = rFront - ( yNum + 0.02 ) !! 印と文字盤中心との距離 !! 針部分 xHour = xNum * 2 !! 短針の幅 yHour = rBack*0.75/2 !! 短針の長さ zHour = hCenter / 5 !! 短針の高さ !degHour !! 短針の傾き これはパラメータに登録する xMinute = xNum !! 長針の幅 yMinute = rBack*0.75 !! 長針の長さ zMinute = hCenter / 5 !! 長針の高さ !degMinute !! 長針の傾き これはパラメータに登録する unID=1 !!--------------①----------------------------------- HOTSPOT 0,0,hBack+hFront,unID,rBack,1 :unID=unID+1 HOTSPOT 0,rBack,hBack+hFront,unID,rBack,2 :unID=unID+1 HOTSPOT 0,-rBack,hBack+hFront,unID,rBack,3 :unID=unID+1 !!--------------②----------------------------------- HOTSPOT 0,yMinute,hBack+hFront,unID,degMinute,4 :unID=unID+1 HOTSPOT -yMinute*SIN(-degMinute),yMinute*COS(-degMinute),hBack+hFront,unID,degMinute,5:unID=unID+1 HOTSPOT 0,0,hBack+hFront,unID,degMinute,6 :unID=unID+1 HOTSPOT 0,0,0,unID,degMinute,7 :unID=unID+1 !!--------------③----------------------------------- HOTSPOT 0,yHour,hBack+hFront,unID,degHour,4 :unID=unID+1 HOTSPOT -yHour*SIN(-degHour-degMinute/12),yHour*COS(-degHour-degMinute/12),hBack+hFront,unID,degHour,5:unID=unID+1 HOTSPOT 0,0,hBack+hFront,unID,degHour,6 :unID=unID+1 HOTSPOT 0,0,0,unID,degHour,7 :unID=unID+1 !! -------------- 土台部分 ------------ MATERIAL 52 !! 土台の材質 CYLIND hBack, rBack ADDZ hBack CYLIND hFront, rFront !! -------------- 印・針 ------------ MATERIAL 49 !! 印・針の材質 ADDZ hFront CYLIND hCenter, rCenter FOR i = 1 to 12 ROTZ 30 * i !! 30°の倍数で回転 ADDY rNum !! 中心から移動させる ADDX -xNum / 2 !! 印の軸を合わせる BRICK xNum, yNum, zNum DEL 3 NEXT i ROTZ -INT(degHour/30)*30-degMinute/360*30 ADDX -xHour / 2 ADDZ hCenter / 5 BRICK xHour, yHour, zHour DEL 3 ROTZ -degMinute ADDX -xMinute / 2 ADDZ hCenter * 3 / 5 BRICK xMinute, yMinute, zMinute DEL TOP
ホットスポットの部分を解説します。上のスクリプトには、①の部分に3個、②、③の部分に4個のホットスポットがありますが、①の部分は長さ(時計の半径)をグラフィカルに編集するためのホットスポット、②、③は角度(針の指す向き)を編集するためのホットスポットです。説明が前後しますが、長さをグラフィカルに編集する場合は、3個のホットスポットを一つのセット、角度の場合は、4個のホットスポットをセットで用います。 HOTSPOTの使い方は
HOTSPOT x,y,z,unID,paramRef,flag
です。x,y,zはホットスポットの座標、paramRefは、値を格納する変数、つまりグラフィカル編集によって変更したい変数(の名前)をここに書きます。ここで、paramRefに設定する変数は、GDLオブジェクトのパラメータ(図面上から操作できる変数)となっている必要があることに注意してください。unIDはユニークIDで、ホットスポットを特定するためのものです。上のコードでは、ホットスポットの後に「:unID=unID+1」と書くことで、番号が同じにならないようにしています。
flagについては、それぞれの具体例を用いて説明することにします。まず長さを編集するためのホットスポットについてです。コード中の①では時計の半径rBackを変えられるようにしています。 flagには1~3の値を役割に応じて設定します。それぞれの位置関係は下図の通りです。flagに1が設定されたホットスポットがグラフィカル編集するためのホットスポットで、このホットスポットがマウスで掴んだりするためのものになります。このホットスポットと、flagに2が設定されたホットスポットとの「距離」がparamRef(下記ではrBack)に設定されます。「距離」ですので常に正の数となりますが、flagに3が設定されたホットスポットによって、3から1に向かう方向が正方向になるよう正負を決めることができます。flagには非表示にするオプション(+128)や操作可能にするオプション(+256)も設定することもでき、例えばflagに2を設定するところを、2+256とすると、このホットスポットも操作できるようになります。
!!--------------①----------------------------------- HOTSPOT 0,0,hBack+hFront,unID,rBack,1 :unID=unID+1 HOTSPOT 0,rBack,hBack+hFront,unID,rBack,2 :unID=unID+1 HOTSPOT 0,-1,hBack+hFront,unID,rBack,3 :unID=unID+1
次に角度を編集するためのホットスポットです。こちらでは4個のホットスポットを一つのセットとして用います。コード中の②と③では、それぞれ、分針の角度degMinute、時針の角度degHourを設定しています。 角度の場合は、flagは4~7で、それぞれの位置関係は下図の通りです(下図では②について示しています)。flagが6の点を中心に、4の点から5の点の間の角度がdegMinuteに入ります。7の点は角度を測る方向(反時計回りか、時計回りか)を決めるために定義します。
!!--------------②----------------------------------- HOTSPOT 0,yMinute,hBack+hFront,unID,degMinute,4 :unID=unID+1 HOTSPOT -yMinute*SIN(-degMinute),yMinute*COS(-degMinute),hBack+hFront,unID,degMinute,5:unID=unID+1 HOTSPOT 0,0,hBack+hFront,unID,degMinute,6 :unID=unID+1 HOTSPOT 0,0,0,unID,degMinute,7 :unID=unID+1
もう一つ例として、傾きと丸桁(がぎょう)の長さ(垂木の本数)を変えられる垂木をモデリングしてみましょう。ホットスポットを用いてこれらの値を変更できるようにしていることに加え、★の部分ではグラフィカルに編集された丸桁の長さからINTコマンドを使って垂木の本数を決めています。INTコマンドは直後に続く値の整数部を返します。下記スクリプトにて定義したオブジェクトを図面上に配置し、丸桁を伸ばすと自動的に垂木の本数が増えていくことがわかると思います。オブジェクトを定義する際には、グラフィカル編集の対象となる変数(gagyo_len、kobai)をパラメータとして登録するのを忘れないようにしましょう。
!!垂木のパラメータ taruki_h=0.03 taruki_b=0.02 taruki_l=0.5 !!丸桁のパラメータ !gagyo_len=2 !!gagyo_lenはパラメータに登録 gagyo_b=0.05 gagyo_h=0.1 !!屋根勾配のパラメータ !kobai=10 !!kobaiはパラメータに登録 !!ホットスポット定義 unID=1 !!丸桁の長さ HOTSPOT 0,0,0,unID,gagyo_len,1 :unID=unID+1 HOTSPOT gagyo_len,0,0,unID,gagyo_len,2 :unID=unID+1 HOTSPOT -gagyo_len,0,0,unID,gagyo_len,3 :unID=unID+1 !!垂木の傾き HOTSPOT gagyo_len,gagyo_b/2+taruki_l/3,gagyo_h,unID,kobai,4 :unID=unID+1 HOTSPOT gagyo_len,gagyo_b/2+taruki_l/3*COS(kobai),gagyo_h+taruki_l/3*SIN(kobai),unID,kobai,5 :unID=unID+1 HOTSPOT gagyo_len,gagyo_b/2,gagyo_h,unID,kobai,6 :unID=unID+1 HOTSPOT gagyo_len*2,gagyo_b/2,gagyo_h,unID,kobai,7 :unID=unID+1 !!丸桁の長さから垂木の本数を算出 n=INT((gagyo_len+taruki_h)/(taruki_b+taruki_h))-1 !!★ side=(gagyo_len-taruki_b-(taruki_b+taruki_h)*n)/2 GROUP "noki" BRICK gagyo_len,gagyo_b,gagyo_h ENDGROUP GROUP "taruki" ADD 0,gagyo_b/2,gagyo_h ROTX kobai ADD side,-taruki_l/3*2,0 FOR i=0 TO n ADDX i*(taruki_b+taruki_h) BRICK taruki_b,taruki_l,taruki_h DEL 1 NEXT i DEL 3 ENDGROUP !!ソリッド演算で切り欠き gagyo=SUBGROUP("noki","taruki") KILLGROUP "noki" !!配置 PLACEGROUP gagyo PLACEGROUP "taruki" KILLGROUP gagyo KILLGROUP "taruki"