Inkpodのマップは、ネットワーク構造のデータとしてみることができます。関連線には向きがあるため、有向グラフとして扱えます。
ネットワーク構造のデータとして扱う場合、ノード・オブジェクト(PNodeObject)と対になる、jp.carabiner.inkpod.pi.model.PNetworkNodeオブジェクト、関連・オブジェクト(PRelationObject)と対になる、jp.carabiner.inkpod.pi.model.PNetworkEdgeオブジェクトを使用します。PNetworkNodeオブジェクトは、PNodeObjectオブジェクトのnodeプロパティから、PNetworkEdgeオブジェクトは、PRelationObjectのedgeプロパティから得られます。
次のような、ノード・オブジェクトと、関連・オブジェクトが合った場合、
PNodeObjectオブジェクト、PRelationObjectオブジェクト、PNetworkNodeオブジェクト、PNetworkEdgeオブジェクトの関係は以下の図のようになります。
「オブジェクト」メニューに、「次のノードの値を表示」を追加します。オブジェクトを選択して、「次のノードの値を表示」を選ぶと、矢印でつながった次のノードの値を表示します。
function extendUI(event) { inkpod.ui.actions.addAction({ id : "SAMPLE_NEXT_NODE", text : "次のノードの値を表示", action : function(frame, event) { var model = frame.model; var object = model.singleSelectedObject; if(!object) { frame.alert("オブジェクトを選択してください"); return; } if(!(object instanceof Packages.jp.carabiner.inkpod.pi.model.PNodeObject)) { frame.alert("ノードを選択してください"); return; } var node = object.node; // ノードの取得 var nodes = node.nextNodes; // 次のノードの取得 if(nodes.length == 0) { frame.showInfo("次のノードはありません"); } else { frame.showInfo("次のノード:" + nodes[0].value); } } }); inkpod.ui.menuBar.objectMenu.addMenuItem("SAMPLE_NEXT_NODE"); } function init() { inkpod.ui.addUIExtensionListener(extendUI); } function dispose() { } plugin = { init : init, dispose : dispose }
まず、ユーザーが選択してるマップ・オブジェクトを、modelのsingleSelectedObjectプロパティで得ます。このマップ・オブジェクトがノード・オブジェクト(PNodeObject)で無い場合は、処理を中断します。PNodeObjectの、nodeプロパティで、オブジェクトと対応するノード(PNetworkNode)を取得します。これで、ユーザーが選択してるノードが得られます。
次に、PNetworkNodeオブジェクトのnextNodesプロパティで、矢印の順方向に隣接しているノードの配列を得ます。このサンプルでは、隣接しているノードのうち、最初のノードのvalueプロパティの内容を表示します。PNetworkNodeのvalueプロパティは、ノードの値です。オブジェクトに書かれているテキストに対応してます。