質問

私は有限状態システムを描画する 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. 各ノードに 1 つの GraphNode を持ち、ノード間の各アークに 1 つの Connection を持ちます。それらを 2 つの異なる配列に収集できます。例えば SimpleNode[] nodes; SimpleRelationship[] relationships;
  2. アルゴリズム クラスをインスタンス化し、必要に応じてオプションのパラメーターを設定します。
  3. 電話 algorithm.applyLayout(nodes, relationships, 0, 0, diagram.width, diagram.height, false, false) - 申し訳ありませんが、パラメータの正確な意味を確認するために利用可能な Zest 1.0 インストールがありません。最初の 2 つは使用されるノードと関係です。次の 4 つは製図板を設定します。正直、最後の 2 つは何のためにあるのか分かりません。:D

さらなる解明:Zest はノードとリレーションを用語として使用します。前のアークをリレーションに置き換えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top