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のキーの値が用いられる
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