クラスの重なる順序を名前順にする

Vectorworks では、クラスというレイヤのような概念があります。開発元は、このクラスを、他の多くのCADではレイヤと呼ばれている機能のように使うことを推奨しています。しかし、クラスはレイヤのように重なる順番が無く、レイヤに慣れている人はそれが不便です。このコマンドは、クラスの重なる順序を名前順にします。

実は、エーアンドエーが配布している「作図・編集キット2」の中に、「クラス順設定コマンド」という非常に素晴らしいプラグインがあるのですが、ダイアログが出るのがちょっと煩わしく、クラスメニューの順番と重なる順番は一致しないので直観的にわかりにくいという欠点があります。

そこで、私は下図のように“数字_+任意のクラス名”というようにクラス名を付けて管理しています。クラス名は、Vectorworks 内でシンプルに名前順にソートされ管理されています。よって、クラスの名前順に重なる順序を整理するプラグインのコードも非常に短く、高速に動作します。プリント前に、自動的に作動するようにしておいたり、ショートカットキーを割り当てると大変便利です。

数字_+任意のクラス名


{*******************************************************************************
                ClassOrderArrange
                
                クラスの前後関係をリストの順番と同じにする
                
                Copyright 2010 兵藤善紀建築設計事務所
                www.hyodo-arch.com      2010.04.12

    2010.04.14  Ver 0.13    一番IDが新しいクラスは、SortArrayでソートされないことが判明
                            対処として、新しいクラスを作成し、消去することで解決を図る。
    2010.04.13  Ver 0.12    SortArrayをつかって、ID順を名前順に並び変える。
    2010.04.12  Ver 0.11    クラスの固有IDは上から順番ではなく、作成順のようなので、
                            そのあたりから研究する。
    2010.04.12  Ver 0.10    まず最初のバージョン
 *******************************************************************************}

PROCEDURE ClassOrderArrange;
CONST
    tmpClassName        ='tmpClassForSort';{ソート用テンポラリクラス}

VAR
    currentClName               :String;    {カレントクラス名}
    NumOfClasses                :Longint;   {ドキュメント内のクラス数}
    iiClassName                 :String;    {ii番目のクラス名}
    OrderByID:ARRAY[0..30] OF STRING;       {クラスID 用配列、30以上のときは数値を変更するか動的配列に書き換える}
    ii                          :integer;   {カウンタ}


BEGIN
    DSelectAll;
    currentClName:= ActiveClass;    {カレントクラス名を取得}
    NameClass(tmpClassName);        {ソート用テンポラリクラスを作成}
    NumOfClasses:=ClassNum;

{ID 順にクラス名を格納}
    FOR ii:=1 TO NumOfClasses DO OrderByID[ii]:=ClassList(ii);

{クラス名順にクラス名を格納}
    SortArray(OrderByID,NumOfClasses,1);


    FOR ii:=1 TO NumOfClasses DO
    Begin
        iiClassName:=OrderByID[ii];
        SelectObj(C=iiClassName);
        MoveBack;
        DSelectObj(C=iiClassName);
    End;

    DelClass(tmpClassName);         {ソート用テンポラリクラスを削除}
    NameClass(currentClName);       {カレントクラスに戻す}
    {Message('SelectObjLayer=',SelectObjLayer,' SelectObjClass=',SelectObjClass);}

END;
RUN ( ClassOrderArrange );