« Re: Re: Pythonのジェネレータで四角いらせんを書いた |Main| 寒い日記 »

« テスト重要 | log | legacyFormatの短いサンプル »

YAMLベースの新しいフォーマット

beta2.0で標準のフォーマットとして位置づける予定のYAMLベースの新しいフォーマットが一応できました。

GRINEditの中の頂点・辺・物理演算などのオブジェクト(以下GRINEditオブジェクト)はIGRINEditインターフェイスをimplementsすることになっています。このインターフェイスではgetIDというStringを返すメソッドが宣言されています。GRINEditオブジェクトはXML-RPCやYAMLなどの参照(ポインタ)を直接扱えない方法で操作できるように、一意なID文字列を持っています。med.getObject(ID)でそのID文字列からオブジェクトを取得できます。

またGRINEditオブジェクトは、そのIDをキーとするハッシュで管理されています。そのハッシュ自体も文字列をキーとするハッシュ(以下namedDict)で管理されています。例えば"Vertex"というキーに対応するハッシュには、各頂点がID文字列をキーとして入っています。この大元のHashtableはGraphのnamedDictionariesというフィールドに入っています。

基本的には、このnamedDictionariesをシリアライズすればよいのですが、プラグインなどでユーザが任意のクラスをつっこむ関係上、それぞれのオブジェクトがどういうクラスなのかは不特定です。そこで全てのGRINEditオブジェクトをclassnameとparamsという二つのキーを持つハッシュによって表現します。IGRINEditインターフェイスはgetParamsというメソッドも宣言しているので、全てのGRINEditオブジェクトはgetParamsメソッドを持つことになります。XML-RPC経由でオブジェクトを作成する際にはクラス名とパラメータを与えますが、YAMLで保存されたデータもそのルーチンを利用しています。

YAMLで保存したデータをここに載せようかと思ったのですけど、長いので末尾に。2つの頂点を1本の辺でつないであるシンプルなグラフでも、単純にgtParamsの内容で保存すると、全ての属性を保存してしまうので長くなります。そこで、他のソフトウェアなどから出力する際に楽なようにいくつか省略ルールを追加しました。

  • namedDict"Law"は丸ごと省略できる。省略した際はデフォルトの「頂点が反発」「辺がバネ」「アンカー」の3つが指定される。
  • 頂点のクラスがBoxVertexの場合、classnameを省略できる。頂点オブジェクトがキー"classname"を持たない場合、そのハッシュがparamsであると判断される
  • 辺のクラスがLinearEdgeの場合、classnameを省略できる。辺オブジェクトがキー"classname"を持たない場合、paramsであると判断される
  • 辺のparamsがハッシュでない場合、{"v1": params[0], "v2": params[1]}と指定されたものと見なす
  • paramsのうち、idの値は指定されていようがいまいが、namedDictのキーの値が用いられる
この一連の省略記法を使うことで、2頂点のグラフはこう書けます。
Vertex: 
  v1: 
    label: Hello
  v2: 
    label: GRINEdit
Edge: 
  e1: [v1, v2]
ここでは頂点にラベルを指定していますが、それも必要ない場合は以下のようになります。
Vertex: 
  v1: {}
  v2: {}
Edge: 
  e1: [v1, v2]
以下、機械的に出力したYAML。
--- 
Law: 
  Anchor: 
    classname: org.nishiohirokazu.layout.PL_Anchor
    params: 
      target: 
      id: Anchor
  Repulsion: 
    classname: org.nishiohirokazu.layout.PL_Repulsion
    params: 
      repulsionK: !java.lang.Double 0.02
      repulsionRadius: !java.lang.Double 3.0
      id: Repulsion
  SpringEdge: 
    classname: org.nishiohirokazu.layout.PL_SpringEdge
    params: 
      defaultSpringStrength: !java.lang.Double 0.1
      defaultNormalLength: !java.lang.Double 1.0
      id: SpringEdge
version: alpha0.20
Edge: 
  e1: 
    classname: org.nishiohirokazu.graph.LinearEdge
    params: 
      color: 
        - 0
        - 0
        - 0
      v2: v2
      id: e1
      v1: v1
Vertex: 
  v2: 
    classname: org.nishiohirokazu.graph.BoxVertex
    params: 
      id: v2
      velocity: 
        - !java.lang.Double 0.0
        - !java.lang.Double 0.0
      bound: 
        - 57
        - 22
      selfLink: &1 false
      position: 
        - !java.lang.Double -0.8146433605417978
        - !java.lang.Double 0.36293197932640203
      letterColor: 
        - 0
        - 0
        - 0
      label: GRINEdit
      frameColor: 
        - 0
        - 0
        - 0
      bgcolor: 
        - 100
        - 200
        - 100
  v1: 
    classname: org.nishiohirokazu.graph.BoxVertex
    params: 
      id: v1
      velocity: 
        - !java.lang.Double 6.938893903907228E-18
        - !java.lang.Double 0.0
      bound: 
        - 35
        - 22
      selfLink: *1
      position: 
        - !java.lang.Double 0.0381343095012234
        - !java.lang.Double -0.43752799872355813
      letterColor: 
        - 0
        - 0
        - 0
      label: Hello
      frameColor: 
        - 0
        - 0
        - 0
      bgcolor: 
        - 100
        - 200
        - 100

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/410

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.