...
- Install and set up Eclipse (TODO: describe steps to install and set up Eclipse)
- Import the following KIELER plugins: (TODO: describe steps to access and import the KIELER plugins and update the list)
- de.cau.cs.kieler.core
- de.cau.cs.kieler.core.kgraph
- de.cau.cs.kieler.kiml
- de.cau.cs.kieler.kiml.service
- de.cau.cs.kieler.kiml.ui
- de.cau.cs.kieler.klay.layered
- Create a new plugin
- File → New → Other... → Plug-in Development → Plug-in Project
- Project name: de.cau.cs.rtprak.<login>.tutorial2
- Next → set version to 0.1.0.qualifier, provider to Christian-Albrechts-Universität zu Kiel, and execution environment to J2SE-1.5 (do this for all plugins that you create!)
- The checkboxes in the Options group can be deactivated -> Finish
- Commit the new plugin project (TODO: describe steps to commit plugin projects)
- Open the file META-INF/MANIFEST.MF → Dependencies tab
- Add the plugins de.cau.cs.kieler.core and de.cau.cs.kieler.kiml to the list of dependencies, then save the file.test-drawing.png
- Create a layout provider class with the New → Class wizard
- Package: de.cau.cs.rtprak.<login>.tutorial2
- Name: <Login>LayoutProvider
- Superclass: de.cau.cs.kieler.kiml.AbstractLayoutProvider
- Implement the layout provider class
- Add the following constant to the class:
/** default value for spacing between nodes. */ private static final float DEFAULT_SPACING = 15.0f;
- Write the following lines at the beginning of the
doLayout
method:progressMonitor.begin("<Login> Layouter", 1); KShapeLayout parentLayout = layoutNode.getData(KShapeLayout.class); float objectSpacing = parentLayout.getProperty(LayoutOptions.SPACING); if (objectSpacing < 0) { objectSpacing = DEFAULT_SPACING; } float borderSpacing = parentLayout.getProperty(LayoutOptions.BORDER_SPACING); if (borderSpacing < 0) { borderSpacing = DEFAULT_SPACING; }
- Write the following line at the end of the
doLayout
method:progressMonitor.done();
- Implement the rest of the layouter such that the nodes of the input graph are all put in a row.
- See the KGraph and KLayoutData data structures: the input is a KNode and holds the nodes of the graph in its list of children
- Iterate over the nodes in the
getChildren()
list of thelayoutNode
input - Retrieve the size of a node using the following code:
KShapeLayout nodeLayout = node.getData(KShapeLayout.class); float width = nodeLayout.getWidth(); float height = nodeLayout.getHeight();
- Set the position (x, y) of a node's upper left corner using the following code:
nodeLayout.setXpos(x); nodeLayout.setYpos(y);
- objectSpacing shall
objectSpacing
shall be the spacing to be left between each pair of nodes. - borderSpacing shall
borderSpacing
shall be the spacing to be left to the borders of the drawing: the first node's coordinates shall be (borderSpacing, borderSpacing). - At the end of the method, set the width and height of parentLayout so of
parentLayout
so that it is large enough to hold the whole drawing, including borders. - Edges may be ignored for now.
- Open the file META-INF/MANIFEST.MF -> → Extensions tab
- Add an extension for de.cau.cs.kieler.kiml.layout.layoutProviders
- Right-click the extension -> → New → -> layoutProvider
- Set name to <Login> Test Layouter, class to de.cau.cs.rtprak.<login>.exercise1tutorial2.<Login>LayoutProvider
- Right-click the new layoutProvider -> → New -> → knownOption, set option to de.cau.cs.kieler.layout.options.minSpacingspacing
- Add another knownOption, set to de.cau.cs.kieler.layout.options.borderSpacing
- Run → -> Run Configurations... -> right→ right-click Eclipse Application → -> New
- Name: Layout
- For testing the layouter, a new workspace location will be created; you may configure its destination in Workspace Data → -> Location
- Add the program arguments
-debug -
consoleLog inconsoleLog
in the Arguments tab. - Go to Plug-ins tab, select Launch with: plug-ins selected below only
- Deselect All, activate Workspace checkbox, Add Required Plug-ins, Apply, Run
- Test the layouter in the new Eclipse instance:
- New → -> Project... → -> General → -> Project, name test
- Right-click test project -> → New -> → Other... -> Graphs Diagram→ KEG Diagram (TODO: if graphs shall be created in another way, describe it here)
- Create a graph using the palette on the right.
- Window -> → Show View → -> Other... → -> KIELER → -> Layout
- While the graph diagram is open, set Layout Provider or Type in the Layout view to <Login> Test Layouter.
- Open the additional views Layout Graph and Layout Time.
- Trigger layout with with the KIELER -> Layout or Layout button in the toolbar or Ctrl+R L (first Ctrl+R, then L) or the button in the toolbar.
- See the direct input and output of your algorithm in the Layout Graph view: Pre-Layout is the input, Post-Layout is the output.
- See the execution time analysis in the Layout Time view.
- Implement another class EdgeRouter with superclass de.cau.cs.kieler.core.alg.AbstractAlgorithm
- Add the following method:
/**
* Route the edges that are connected with the children of the given node.
* * @param parentNode the parent node of the input graph
*/
public void routeEdges(final KNode parentNode) {
getMonitor().begin("Edge Routing", 1);
getMonitor().done();
} - Add the following code to the end of the doLayout method the
doLayout
method in your layout provider:EdgeRouter edgeRouter = new EdgeRouter(); edgeRouter.reset(progressMonitor.subTask(1)); edgeRouter.routeEdges(layoutNode);
- Implement the routeEdges methodthe
routeEdges
method:- Each edge shall be drawn with three line segments: one vertical segment starting below the source node, one horizonzal segment, and another vertical segment ending below the target node.
- The horizontal segments of two different edges shall not have the same y-coordinate; for consecutive edges, the distance between their horizontal segments shall equal objectSpacingequal
objectSpacing
. - See the attached image test-drawing.png for an example.
- Find the edges using
getOutgoingEdges()
orgetIncomingEdges()
on a node. - Get the edge layout of an edge to set bend points using this code:
KEdgeLayout edgeLayout = edge.getData(KEdgeLayout.class);
- Create a bend point using this code:
KPoint point = KLayoutDataFactory.eINSTANCE.createKPoint();
- Use the
getBendPoints()
list on the edgeLayout to theedgeLayout
to add bend points (clear the list first to remove points from the previous layout). - Set the values of the points returned by
getSourcePoint()
andgetTargetPoint()
according to the positions where the edge leaves its source node and reches its target node.
- Add the following method:
- Use your previous run configuration to test the edge router.