Skip to main content

Layout

Create a new Layout​

This HowTo shows how to create a new layout algorithm in Gephi.

Please look at How to add a new module first. When you have your plugin module, that we will call MyLayout, you can start this tutorial.

Set Dependencies​

Add layout-api, graph-api and org-openide-util-lookup modules as dependencies for your plugin module MyLayout. See How to configure module dependencies.

Create LayoutBuilder​

  • Layout Builder provides information about the layout algorithm and is responsible for creating your Layout algorithm instances. All Layout algorithms should have their own builder.
  • Create a new builder class, for instance MyLayoutBuilder that implements LayoutBuilder.
  • The builder interface is requesting a LayoutUI object. Create an inner or anonymous class that implements LayoutUI.
  • Add @ServiceProvider annotation to your builder class. Add the following line before MyLayoutBuilder class definition, as shown below:
import org.openide.util.lookup.ServiceProvider;

@ServiceProvider(service = LayoutBuilder.class)
public class MyLayoutBuilder implements LayoutBuilder {
...

Create Layout​

Create a new class that implements Layout. This is the place the algorithm belongs.

Methods canAlgo(), initAlgo(), goAlgo() and endAlgo() are the logic of the algorithm. But the algorithm is manipulating a graph, so where is this graph? The graph can be get from the GraphModel, which is injected through the setGraphModel() method (fill setGraphModel() with this.graphModel = graphModel;). The system always sets this graph model before initAlgo() is called.

Add the graph model as a new private field of your class. In your goAlgo() method, add the following code to get the current visible graph:

graph = graphModel.getGraphVisible();

Properties​

Your algorithm may have settings and properties that users may control. To be visible and editable in the Layout UI, properties need to be properly defined.

Let's say you have a float speed parameter that you want to expose. That is how to create the appropriate LayoutPropery:

LayoutProperty mySpeedProperty = LayoutProperty.createProperty(
this,
Float.class,
"Speed"
"Category",
"A short description what is this propery doing and how users may modify it",
"getSpeed",
"setSpeed");

Note that you need to create proper getter and setter for each property you want to expose.

Advanced concepts​

Layout Data​

A special mechanism is available if you need to store temporary objects in nodes. In the following example, we will create a new type of layout data which stores a dx and dy value.

Create a new MyLayoutData class that implements LayoutData and add two floats dx and dy. How to init? Place the following code at the beginning of goAlgo():

for (Node n : nodes) {
MyLayoutData layoutData = n.getLayoutData();
n.setLayoutData(layoutData);
}

That ensure you have a layout data object for each of your nodes.

Custom properties​

Properties can be basic types like Boolean, Float etc. If you want to expose custom types, for instance date, you can provide a PropertyEditor class when building the property.