2012-01-16 140 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