選択図形内の最上位のクラスでグループ化

グループ化はカレントクラスで行われるが、そうするとカレントクラスが描画クラスと関係ない場合、都合が悪いことが多い。例えば建具の断面を描いたクラスをグループ化した際に、構造の見掛りのクラスでグループ化されたりしていると、編集・訂正の際にどのクラスに描かれているのがわからずイラつくことがある。デフォルトでは、そのオブジェクトの属するクラスでグループ化される方が自然だと思う。このスクリプトは、選択図形内の(名前順で)最上位のクラスでグループ化します。


{*******************************************************************************
            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 );

流れ

  1. 選択図形の数を調べる
  2. 選択図形内で最上位のクラス名を取得(ループ)
  3. 取得した最上位のクラスをアクティブにする
  4. 選択図形をグループ化

覚書き

選択図形をカウントする際に、Count(SEL=True)を使うとカウント数が明らかに異なることがあるので、ハンドルを移動しながら選択図形をカウントすることにした。よって、クラス名を得る際にもう一度ハンドルを繰り返し処理する部分が無駄になっている。
根拠>http://www.aanda.co.jp/Support/12support.html

最下位のクラスでグループ化したい場合は、56行目を下記のようにすれば良い。


{選択図形の中で、最上位のクラスへ移動する}{>最下位のクラスへ移動}
	NameClass(objClName[NumOfObj]);