我正在编写一个绘制有限状态系统的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
来源: - [我看来我不能用热情图形库来做好这项工作。我错了吗?有没有其他的选择?
任何帮助将不胜感激:)
我编辑我的问题,并添加了一些代码,做你的建议。我的问题是,我不知道如何从'Graph'对象中提取计算出的坐标: - /另外,我想知道我是否可以直接将一个算法从zest库应用到我的对象... – FSp 2012-01-18 12:05:21
你必须保持一个GraphNodes和模型对象之间的链接(例如,通过使用散列表或使用GraphNode对象模型对象存储)。然后你可以遍历所有节点,得到它们的坐标(如果我没有记错的话,你可以使用GraphNodes上的getPosition或getX方法)。关于直接应用程序:由于Zest布局算法需要特定输入,因此您必须进行翻译。 Zest 2.0中的输入限制较少,所以翻译起来会更容易,但在Zest 1.0中仍然可以。 – 2012-01-18 12:44:11
你好,我再次编辑我的问题,使其更加精确。不过,对我来说,似乎我不能使用zest为我的图形计算布局,而没有实际显示它:[ – FSp 2012-01-18 23:16:53