Eclipse プラグイン (gef) とグラフ視覚化 (zest)
質問
私は有限状態システムを描画する Eclipse プラグインを書いています。サイズが大きい可能性があるため、既存のグラフ レイアウト アルゴリズム (例:階層レイアウト、強制ベースのレイアウトなど)、システムの視覚化を自動的に最適化します。
私が作成しているプラグイン (GEF を使用して作成) を統合して、生成された編集パーツを一般的なグラフ レイアウト アルゴリズムのいくつかに従ってエディター領域に配置できるようにする方法はありますか?
これを見つけました 興味深い記事 ただし、編集部分の視覚化を最適化するのではなく、まったく新しいグラフを描画することに重点を置いています。
これまでのところ、私がやっていることは次のコードを追加することです(Zest 1に基づいています)
private static void createNewGraph(String autName) {
Shell tmpShell = new Shell();
currGraph = new Graph(tmpShell, SWT.NONE);
mapStateAndNodes = new HashMap<State, GraphNode>();
}
private static void addGraphNode(State currState)
{
GraphNode newNode = new GraphNode(currGraph, SWT.NONE, currState.getName());
mapStateAndNodes.put(currState, newNode);
}
private static void addGraphConnection(Transition currTrans)
{
GraphNode source = mapStateAndNodes.get(currTrans.getOrigState());
GraphNode dest = mapStateAndNodes.get(currTrans.getDestState());
GraphConnection newConn = new GraphConnection(currGraph, SWT.NONE, source, dest);
}
private static void completeGraph()
{
currGraph.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
}
モデルを構築しているときに、次の呼び出しも行います。 createNewGraph(...)
, addGraphNode(...)
, addGraphConnection(...)
そして completeGraph(...)
. 。問題は:後 currGraph.setLayoutAlgorithm(..., true)
それ true
アルゴリズムを適用し、オブジェクトを「正しい」順序で配置する必要があることを意味します。この時点で (一部の読者からの提案のように)、次の方法で計算された座標を抽出することが可能です。 GraphNode.getLocation()
方法。残念ながら、レイアウトを設定して適用した後、すべての状態が Point(0,0)
彼らの場所として。こんなコメントも見つけました:
/**
* Runs the layout on this graph. It uses the reveal listener to run the
* layout only if the view is visible. Otherwise it will be deferred until
* after the view is available.
*/
public void applyLayout() {
...
}
で org.eclipse.zest.core.widgets.Graph
ソース :-[ 私にとって、この仕事を行うために zest Graph ライブラリを使用することはできないようです。私が間違っている?代替手段はありますか?
助けていただければ幸いです:)
解決
つまり、Zest はこのシナリオを直接サポートしていません。
ただし、Zest を使用してレイアウトできる編集パーツのメモリ内表現を構築できます。Zest 1.0 では、グラフ ノードとグラフへの変換を提供する必要があります。 円弧 関係を手動で;で ゼスト2.0 LayoutContext を指定するだけで済みます。Zest 2.0 はまだリリースされていませんが、私にとってはこのシナリオの方が扱いやすいようです。
追加のアイデア:オープン ソース プロジェクト Spray は、Graphiti グラフの Zest レイアウトをサポートします (Graphiti は GEF を拡張します - 再利用できるアイデアがいくつかあるかもしれません)。次のコード ファイルを参照してください。 http://code.google.com/a/eclipselabs.org/p/spray/source/browse/plugins/org.eclipselabs.spray.runtime.graphiti.zest/src/org/eclipselabs/spray/runtime/graphiti/ zest/features/ZestLayoutDiagramFeature.java いくつかのアイデアのために。
編集: 私はコンピューター内の関連コードを調べました。次の方法で、このようなレイアウトを Zest 1.0 で機能させることができました。
- 各ノードに 1 つの GraphNode を持ち、ノード間の各アークに 1 つの Connection を持ちます。それらを 2 つの異なる配列に収集できます。例えば
SimpleNode[] nodes; SimpleRelationship[] relationships;
- アルゴリズム クラスをインスタンス化し、必要に応じてオプションのパラメーターを設定します。
- 電話
algorithm.applyLayout(nodes, relationships, 0, 0, diagram.width, diagram.height, false, false)
- 申し訳ありませんが、パラメータの正確な意味を確認するために利用可能な Zest 1.0 インストールがありません。最初の 2 つは使用されるノードと関係です。次の 4 つは製図板を設定します。正直、最後の 2 つは何のためにあるのか分かりません。:D
さらなる解明:Zest はノードとリレーションを用語として使用します。前のアークをリレーションに置き換えます。