階層構造
さて、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];
- }
- [/as]
- ↓
- [as]
- 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);
- [/as]
- depthはルート直下を0として深くなるごとに1ずつ増えていくので、一覧にあるパース済みのObjectと自分のdepthの関連は以下のようになるはず。
- <ol>
- <li>depthが自分より1小さい ⇒ 自分の親Objectである</li>
- <li>depthが自分と同じ ⇒ 自分の兄弟Objectである</li>
- <li>depthが自分より大きい ⇒ 自分の兄弟Objectの子である</li>
- また、rootとなる、ファイル読み込みを行うMetasequoiaインスタンスのdepthは、ルート直下(0)よりも1少ない<em>-1</em>として初期化することにする。
- [as]
- 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の無料版だとまだ階層機能がないので、もしかしたらマイナーな機能なのかもしれない。