2

我正在使用PREFUSE库开发数据的图形视图。

我的图中有 3 种节点:

  1. 应用
  2. 数据库
  3. 界面

以下是我的 .xml 文件中的一些摘录,其中包含图表

<node id="AP-1">
<data key="name">Application1</data>
<data key="type">APPLICATION</data>
</node>

<node id="DB-1">
<data key="name">Database1</data>
<data key="type">DATABASE</data>
</node>

<node id="IT-1">
<data key="name">Interface1</data>
<data key="type">INTERFACE</data>
</node>

我想展示上面的 3 个差异。具有 3 个差异的节点类型。各种形状如下:

  1. 矩形应用
  2. DATABASE by custom shape(圆柱形状,通常用来表示数据库)
  3. 圆圈接口

我首先阅读了 .xml 文件

图 g

Q1。现在如何区分数据组中的这三种节点。我想我应该写谓词。我已经阅读了 prefuse 的整个谓词和表达式手册,但无法编写谓词来区分它们。那么它的谓词是什么?

Q2。如何指定我的自定义形状以及如何设置可以渲染我开发的自定义形状的渲染器?

4

2 回答 2

1

为节点分配不同形状的范例是使用 DataShapeAction

例如在“Congress”演示中(同样适用于 Nodes as Tables):

int[] shapes = new int[]
            { Constants.SHAPE_RECTANGLE, Constants.SHAPE_DIAMOND };
DataShapeAction shape = new DataShapeAction(group, "Senate", shapes);

这会根据“参议院”数据字段中的值为数据点分配不同的形状,即参议员是一种形状,国会议员是另一种形状,按某种顺序(API 中有各种控件,请参阅 Constants.ORDINAL for一个例子)。

因此,换句话说,您可能会使用“类型”数据字段来指示节点的类型,然后使用 DataShapeAction 分配不同的形状。

定义一个新的形状当然是可能的,但需要更多的修补。我会尝试给你一个更好的答案,但我猜最直接的方法是编写你自己的节点渲染器子类,它能够绘制你想要的形状,然后可能扩展 DataShapeAction 来处理一些新数据类型的标志。不过,希望稍后再谈。

于 2011-05-06T21:00:36.770 回答
0

您不需要谓词来分配形状。事实上,为了绘制自定义形状,您必须将形状绘制渲染器子类化ShapeRenderer。ShapeRenderer 使用 id 号 ( ) 区分形状int。这些整数的结构Constants适用于所有标准形状 - 例如 bcr 写的Constants.SHAPE_RECTANGLE

在内部 prefuse 调用 ShapeRenderer 的protected Shape getRawShape(VisualItem item)函数。反过来,该函数调用其他内部函数ShapeRenderer以获取要绘制的形状。例如:

  • 要获取形状 id,getRawShape调用int stype = item.getShape()由形状操作设置DataShapeAction
  • 然后,手边的形状 id,有switch选择合适的形状来绘制的语句

    switch ( stype )  
    {  
    case Constants.SHAPE_NONE:  
        return null;  
    case Constants.SHAPE_RECTANGLE:  
        return rectangle(x, y, width, width);  
    case Constants.SHAPE_ELLIPSE:  
        return ellipse(x, y, width, width);  
    case Constants.SHAPE_TRIANGLE_UP:  
        return triangle_up((float)x, (float)y, (float)width);  
    ...  
    

为了绘制一些其他形状(自定义形状),您可以子类化ShapeRenderer并提供您自己的 shape 实现来绘制和覆盖getRawShape
如果您将形状 id 识别为您自己的形状,则返回您的形状,否则您在实现中调用 super(item)getRawShape以调用标准形状。

于 2011-11-07T06:43:29.837 回答