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

階層構造

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

ActionScript

  1. /**
  2. * モデルの階層
  3. */
  4. private var _depth:Number;

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

ActionScript

  1. var properties:Dictionary = new Dictionary();
  2. for (; l < vline; ++l) {
  3.     line = lines&#91;l];
  4.     var props:Array = RegExp(/^\s*(&#91;\w]+)\s+(.*)$/).exec(line);
  5.     properties&#91;props[1]] = props[2];
  6. }
  7. &#91;/as]
  8. &#91;as]
  9. var properties:Dictionary = new Dictionary();
  10. for (; l < vline; ++l) {
  11.     line = lines&#91;l];
  12.     var props:Array = RegExp(/^\s*(&#91;\w]+)\s+(.*)$/).exec(line);
  13.     properties&#91;props[1]] = props[2];
  14. }
  15. obj._depth = parseInt(properties&#91;"depth"] , 10);
  16. &#91;/as]
  17. depthはルート直下を0として深くなるごとに1ずつ増えていくので、一覧にあるパース済みのObjectと自分のdepthの関連は以下のようになるはず。
  18. <ol>
  19. <li>depthが自分より1小さい ⇒ 自分の親Objectである</li>
  20. <li>depthが自分と同じ ⇒ 自分の兄弟Objectである</li>
  21. <li>depthが自分より大きい ⇒ 自分の兄弟Objectの子である</li>
  22.  
  23. また、rootとなる、ファイル読み込みを行うMetasequoiaインスタンスのdepthは、ルート直下(0)よりも1少ない<em>-1</em>として初期化することにする。
  24. [as]
  25.             this._depth = -1;

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

ActionScript

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

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

タイトルとURLをコピーしました