Проблема в отображении узлов через библиотеку PREFUSE для Java? - PullRequest
2 голосов
/ 16 февраля 2010

Я разрабатываю графическое представление данных с использованием библиотеки 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. БАЗА ДАННЫХ по пользовательской форме (форма цилиндра, обычно используемая для обозначения базы данных)
  3. ИНТЕРФЕЙС по кругу

Сначала я прочитал XML-файл в

График г

Q1. Теперь, как я могу различить эти 3 вида узлов в группе данных. Я думаю, что я должен написать предикаты. Я прочитал целые руководства по предикатам и выражениям для префузии, но не смог написать предикат, чтобы различать их. Так что же будет предикатом для этого?

Q2. Как указать мою пользовательскую форму и как настроить средство визуализации, которое может отображать пользовательскую форму, разработанную мной?

Ответы [ 2 ]

1 голос
/ 07 мая 2011

Парадигма для назначения различных форм узлам с помощью DataShapeAction

например. в демонстрации «Конгресс» (то же самое относится к узлам, как таблицы):

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

Это назначает различные формы точкам данных на основе значения в поле данных «Сенат», то есть сенаторы - это одна форма, а конгрессмены - это другая форма, в некотором порядке (для этого в API есть различные элементы управления, см. Константы .ORDINAL для примера).

Таким образом, другими словами, вы, вероятно, использовали бы свое поле данных «type», чтобы указать, каким типом узла был узел, а затем использовали бы DataShapeAction для назначения различных фигур.

Определение новой фигуры, безусловно, возможно, но потребует дополнительных усилий. Я постараюсь вернуться к вам с лучшим ответом, но я предполагаю, что самым простым способом было бы написать свой собственный подкласс noderenderer, который мог бы рисовать желаемую форму, а затем, возможно, расширить DataShapeAction для обработки некоторых пометка для вашего нового типа данных. Впрочем, об этом позже, надеюсь.

0 голосов
/ 07 ноября 2011

Вам не нужны предикаты для назначения фигур. Фактически, для того, чтобы рисовать пользовательские фигуры, вы должны создать подкласс средства визуализации фигур ShapeRenderer. ShapeRenderer различает фигуры по номеру идентификатора (int). Эти целые имеют структуру Constants для всех стандартных фигур, как, например, написал bcr, например, Constants.SHAPE_RECTANGLE.

Внутренняя префузия вызывает функцию protected Shape getRawShape(VisualItem item) ShapeRenderer. В свою очередь, эта функция вызывает другие внутренние элементы из ShapeRenderer, чтобы получить форму для рисования. Например:

  • для получения идентификатора формы, getRawShape вызывает int stype = item.getShape() (, установленный действием формы DataShapeAction)
  • тогда, имея под рукой идентификатор формы, есть 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 и предоставляете собственную реализацию формы для рисования и переопределения getRawShape.
Если вы распознаете идентификатор формы как свой собственный, вы возвращаете свою форму, в противном случае вы вызываете super (item) в своей реализации getRawShape, чтобы вызвать стандартную.

...