2015年4月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 世代別 JSON ?, JSON 階層化 ? | トップページ | peperJSON/strokeJSON の罠? 謎? 仕様? バグ? »

2014年4月15日 (火)

新規 strokes データの正式な追加登録手続きが分からない

自作シールの MOONPhase ver.2.9.0 対応を進めるために、あれこれ探っています。その中で、やはり、新しい strokes データフォーマット、あるいは新しい info.json, strokeX.json の操作方法で詰まっています。

MOONPhase ver.2.8.0 以前では、info.json の内容は以下の構造でした。

{
  version:"0.2",
  x:0, y:0,
  width:768, height:1024,
  scale:1.0,
  color ":-1,
  transparent:false,
  strokes:[
    {
      width:2.5,
      color:-16777216,
      type:"pen",
      data:[
        x0, y0, p0, x1, y1, p1, ...
      ]
    },
    {
      width:2.5,
      color:-16777216,
      type:"pen",
      data:[
        x0, y0, p0, x1, y1, p1, ...
      ]
    },
    {...}, {...}, ...
  ]
}

MOONPhase ver.2.9.0 以降では、info.json は以下のようになっています。

{
  version:"1.0",
  x:0, y:0,
  width:768, height:1024,
  scale:1.0,
  color:-1,
  externalStrokes:[
    {
      name:"stroke1.json",
      x:126, y:147,
      width:438, height:170,
      size:3399
    }
  ],
  clip:{
    width:1.0,
    color:-1,
    type:"pen",
    subtype:"",
    data:[
      x0, y0, p0, x1, y1, p1, ...
    ]
  }
}

strokeX.json の内容は、

{
  strokes:[
    {
      width:3.0,
      color:-16777216,
      type:"pen",
      subtype:"",
      data:[
        x0, y0, p0, x1, y1, p1, ...
      ]
    },
    {
      width:3.0,
      color:-16777216,
      type:"pen",
      subtype:"",
      data:[
        x0, y0, p0, x1, y1, p1, ...
      ]
    },
    {...}, {...}, ...
  ]
}

古い version の strokes 以下が外に出された形ですね。

参考にするのは、やっぱり「暗号化シール」

この、新しい形式の info.json, strokeX.json の扱い方については、プレインストールの「暗号化シール」が非常に参考になります。

旧バージョンの MOON.getPaperJSON( backingID ).strokes に相当する情報は、新バージョンでは MOON.getStrokeJSON( backingID ) で得られますが、微妙に違います。

[
  {
    strokes:[.....]
  },
  {
    strokes:[.....]
  },
  ...
]

stroke1.json, stroke2.json, stroke3.json, .... の内容を単純に並べた配列のようです。中身を全部読もうとすると、従来より一段深いループを回す必要があります。

書き込み方を知りたい

で、strokes データの読み取り方はわかったのですが、書き込み方が分かりません。暗号化シールでも strokes データの書き込みはあるのですが、「新規に」ではなくて、「既存の strokes データをいじって書き戻す」処理です。具体的には、var extStrokes = MOON.getStrokeJSON( backingID ); として、extStrokes[0].strokes.data[...] を全部書き変えて、最後に MOON.setStrokeJSON( backingID, extStrokes ); で書き戻す。

この書き戻し処理がどうして参考にならないかというと、「もし、既存のストロークがなかったらどうすればよいのか」「複数の strokeX.json があったとして、どの strokeX.json に storkes データを追加しても問題ないのか、先頭の strokeX.json に追加すべきなのか、あるいは最後の strokeX.json にすべきなのか」。指針となる情報がありません。

旧バージョンのシールと互換性保持を考えると、info.json の内容に strokes データを組み込んで、MOON.setPaperJSON( backingID, paperJSON ) で書き込むと、内部で strokes データを分離して、新フォーマットの info.json と stroke1.json に書き込んでくれるだろう、と、まず最初に、strokes:[] の追加 (つまり、全 stroke の消去ですね) を試してみました。

すると、半ば予想通り、半ば予想を超える結果になりました。

info.json については予想通りでした。strokes:[...] という属性はファイルには保存されず、代わりに、externalStrokes:[] として、外部 json ファイルへのリンクが消失していました。

で、stroke1.json 自体がなくなるか、というと、stroke1.json は存在している。では、stroke1.json の中身は空かというと、実は全く変化していませんでした。stroke1.json には手を付けずに、externalStrokes のみを操作していたわけです。リンク情報の操作と、strokes データ自体の書き変えを柔軟に組み合わせて、実作業量の削減を図っているようです。

このように、既存のストロークがなかった場合、stroke1.json に相当するデータをでっち上げて、それを要素に持つ配列を MOON.setStringJSON( backingID, extStrokes ) に渡すのが正式な手続きなのか、それとも、「たまたまうまく動作する」が、本来想定されている手続きではないのか。

正式な情報がない時点では、内部処理のオーバーヘッドはあるかもしれませんが、従来同様に MOON.setPaperJSON() を使って書き込むのが無難だろうかと考えています。

strokes だけなら逃げられるんですが

ところが・・・、これでもまだ解決しないんですねぇ。

先週からあれこれ調べているのは、当然、自作シールのバージョンアップの為です。最初に ver.2.9.0 対応したいのは (自分が使いたいこともあって) コピペシールです。

コピペシールでは、カット/コピー操作の際に、背景のストロークをシールのストロークに取り込むと同時に、取り込んだストロークに合わせてシールの clip:{} を変更しています。

ところが、この操作をしている部分のコードが動作しません。いろいろ探ってみると、info.json には clip:{} という属性が存在するのに、ver.2.9.0 で MOON.getPaperJSON() すると、返り値の属性には clip が含まれていません !!!

「なんということでしょう」

これって、MOON.getPaperJSON() の返り値に、旧バージョンと同じフォーマットで clip:{} を追加して、無理やり MOON.setPaperJSON() していいんでしょうか。シールの clip 情報を加工するには、別の正式な手順があるんでしょうか。

とりあえず動く、無理やりバージョンアップなら数日でできそうですが、本当にそれでよいのか、やはり正式な tutorial が欲しいところです。

MOONPhase 開発チームの皆さん、体を壊さない範囲で、早めに資料を準備してもらえるとうれしいです。よろしくお願いします。

というか、strokes データを書き込むサンプルシールを作ってくれれば、とりあえずそれでなんとかします。 :-)

#でも、ver.2.9.1 のリリースが優先ですかね。

« 世代別 JSON ?, JSON 階層化 ? | トップページ | peperJSON/strokeJSON の罠? 謎? 仕様? バグ? »

enchantMOON」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1527616/55783748

この記事へのトラックバック一覧です: 新規 strokes データの正式な追加登録手続きが分からない:

« 世代別 JSON ?, JSON 階層化 ? | トップページ | peperJSON/strokeJSON の罠? 謎? 仕様? バグ? »