選択図形内の最上位のクラスでグループ化
グループ化はカレントクラスで行われるが、そうするとカレントクラスが描画クラスと関係ない場合、都合が悪いことが多い。例えば建具の断面を描いたクラスをグループ化した際に、構造の見掛りのクラスでグループ化されたりしていると、編集・訂正の際にどのクラスに描かれているのがわからずイラつくことがある。デフォルトでは、そのオブジェクトの属するクラスでグループ化される方が自然だと思う。このスクリプトは、選択図形内の(名前順で)最上位のクラスでグループ化します。
{*******************************************************************************
TopClassGrouping
選択図形の中の最上位のクラス名でグループ化する
Copyright 2010 兵藤善紀建築設計事務所
www.hyodo-arch.com
2010.06.07 Ver 0.11 Count(SEL=True)が上手く働かないときがあるので、使わない方法を模索
2010.06.07 Ver 0.10 まず最初のバージョン
*******************************************************************************}
PROCEDURE TopClassGrouping;
CONST
tmpClassName ='tmpClassForSort';{ソート用テンポラリクラス}
VAR
currentClName,topClName :String; {カレントクラス名、最上位のクラス名}
NumOfObj :Longint; {選択図形の数}
objClName:DYNARRAY[] OF String; {選択図形ひとつひとつのクラス名を格納する配列}
ii :integer; {カウンタ}
hh :Handle; {ハンドル, hh:選択図形}
BEGIN
currentClName:= ActiveClass; {カレントクラス名を取得}
{選択図形の数を調べる。Count(SEL=True)にはバグがあるため使わない}
hh:=FSActLayer;
ii:=0;
While hh<>nil Do Begin
hh:=NextSObj(hh);
ii:=ii+1;
End;
NumOfObj:=ii; {選択図形の数 = ii+1}
Allocate objClName [0..NumOfObj];
{選択図形各々のクラス名を格納}
hh:=FSActLayer;
FOR ii:=0 TO NumOfObj DO
Begin
objClName[ii]:=GetClass(hh);
hh:=NextSObj(hh);
End;
{一番IDが新しいクラスは、SortArrayでソートされないことが判明
対処として、新しいクラスを作成し、消去することで解決を図る}
NameClass(tmpClassName);
{クラス名順に選択図形を格納}
SortArray(objClName,NumOfObj,1);
DelClass(tmpClassName); {ソート用テンポラリクラスを削除}
{選択図形の中で、最上位のクラスへ移動する}
NameClass(objClName[0]);
{選択図形をグループ化}
Group;
NameClass(currentClName); {元のカレントクラスに戻す}
{Message('選択図形の数:',NumOfObj,' Top3のクラス名:',objClName[0],' ',objClName[1],' ',objClName[2],' 以下省略');}
END;
RUN ( TopClassGrouping );
流れ
- 選択図形の数を調べる
- 選択図形内で最上位のクラス名を取得(ループ)
- 取得した最上位のクラスをアクティブにする
- 選択図形をグループ化
覚書き
選択図形をカウントする際に、Count(SEL=True)を使うとカウント数が明らかに異なることがあるので、ハンドルを移動しながら選択図形をカウントすることにした。よって、クラス名を得る際にもう一度ハンドルを繰り返し処理する部分が無駄になっている。
根拠>http://www.aanda.co.jp/Support/12support.html
最下位のクラスでグループ化したい場合は、56行目を下記のようにすれば良い。
{選択図形の中で、最上位のクラスへ移動する}{>最下位のクラスへ移動}
NameClass(objClName[NumOfObj]);