Metasequoiaクラス改造論(1) 階層構造の再現

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2008年2月2日 土曜日16:59:11

階層構造

さて、Objectチャンクごとに別インスタンスが生成されるようになったので、これを階層構造に持っていく。まず、階層構造を表すdepthチャンクを保持する必要があるので、メンバとして定義する。

/**
* モデルの階層
*/

private var _depth:Number;

で、Metasequoia#parseObjectChunkでObjectチャンク内の各チャンクを読み込んだ後、取り出してコピーする。

var properties:Dictionary = new Dictionary();
for (; l <vline; ++l) {
    line = lines[l];
    var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
    properties[props[1]] = props[2];
}

var properties:Dictionary = new Dictionary();
for (; l <vline; ++l) {
    line = lines[l];
    var props:Array = RegExp(/^\s*([\w]+)\s+(.*)$/).exec(line);
    properties[props[1]] = props[2];
}
obj._depth = parseInt(properties["depth"] , 10);

depthはルート直下を0として深くなるごとに1ずつ増えていくので、一覧にあるパース済みのObjectと自分のdepthの関連は以下のようになるはず。

  1. depthが自分より1小さい ⇒ 自分の親Objectである
  2. depthが自分と同じ ⇒ 自分の兄弟Objectである
  3. depthが自分より大きい ⇒ 自分の兄弟Objectの子である
  4. また、rootとなる、ファイル読み込みを行うMetasequoiaインスタンスのdepthは、ルート直下(0)よりも1少ない-1として初期化することにする。

    this._depth = -1;

    これで準備完了。親オブジェクトを探す処理を実装する。位置は、Metasequoia#parseObjectChunk内の、プロパティ読み込み処理の後くらいがいいかと。

    //親オブジェクトを探す
    for(var i:Number = this._objectlist.length -1 ; i>= 0 ; i--) {
        var parentCandidate:Metasequoia = this._objectlist[i] as Metasequoia;
        if (parentCandidate) {
            //_depthが自分より1少ない→親オブジェクト
            if (parentCandidate._depth == (obj._depth - 1)) {
                //親に自分をaddChildさせる
                parentCandidate.addChild(obj);
                break;
            }
        }
    }

    これでMetasequoiaクラスに、mqoファイルと同様の階層構造を与えられる。ただしMetasequoiaの無料版だとまだ階層機能がないので、もしかしたらマイナーな機能なのかもしれない。

  • ページ:
  • 1
  • 2
  • 3

TrackBack URL :

HTML convert time: 1.042 sec.