2012-01-16 50 views
2

我正在編寫一個繪製有限狀態系統的eclipse插件。因爲它可能很大,我想附加一些自動優化系統可視化的現有圖形佈局算法(例如分層佈局,基於力的佈局等)。eclipse插件(gef)和圖形可視化(zest)

有沒有一種方法可以整合我正在編寫的插件(使用GEF編寫),以便生成的編輯部分可以放在編輯器區域,遵循一些常用的圖形佈局算法?

我發現這個interesting article,但不是優化編輯部件可視化,而是專注於繪製一個全新的圖形。

到目前爲止,我在做什麼是添加以下代碼(基於激爽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來源: - [我看來我不能用熱情圖形庫來做好這項工作。我錯了嗎?有沒有其他的選擇?

任何幫助將不勝感激:)

回答

3

總之,Zest不直接支持這種情況。

但是,您可以使用Zest構建可編輯部件的內存表示形式。在Zest 1.0中,您必須提供圖表節點和圖形的轉換弧形手動關係;在Zest 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,並且節點之間每個弧都有一個Connection。您可以將它們收集到兩個不同的陣列中;例如SimpleNode[] nodes; SimpleRelationship[] relationships;
  2. 實例化算法類,並根據需要設置可選參數。
  3. 致電algorithm.applyLayout(nodes, relationships, 0, 0, diagram.width, diagram.height, false, false) - 對不起,沒有可用的Zest 1.0安裝來檢查參數的確切含義;前兩個是使用的節點和關係;然後接下來的四個設置繪圖板;我真的不知道最後兩個是什麼。:d

進一步澄清:激爽使用節點和關係作爲一個術語 - 替換我以前的弧關係。

+0

我編輯我的問題,並添加了一些代碼,做你的建議。我的問題是,我不知道如何從'Graph'對象中提取計算出的座標: - /另外,我想知道我是否可以直接將一個算法從zest庫應用到我的對象... – FSp 2012-01-18 12:05:21

+0

你必須保持一個GraphNodes和模型對象之間的鏈接(例如,通過使用散列表或使用GraphNode對象模型對象存儲)。然後你可以遍歷所有節點,得到它們的座標(如果我沒有記錯的話,你可以使用GraphNodes上的getPosition或getX方法)。關於直接應用程序:由於Zest佈局算法需要特定輸入,因此您必須進行翻譯。 Zest 2.0中的輸入限制較少,所以翻譯起來會更容易,但在Zest 1.0中仍然可以。 – 2012-01-18 12:44:11

+0

你好,我再次編輯我的問題,使其更加精確。不過,對我來說,似乎我不能使用zest爲我的圖形計算佈局,而沒有實際顯示它:[ – FSp 2012-01-18 23:16:53