Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "GEF/GEF4/DOT"

< GEF‎ | GEF4
(DotAttributes)
 
(62 intermediate revisions by 4 users not shown)
Line 1: Line 1:
''Note to non-wiki readers: This documentation is generated from the Eclipse wiki - if you have corrections or additions it would be awesome if you added them in [http://wiki.eclipse.org/GEF/GEF4/DOT the original wiki page]''.
+
''Note to non-wiki readers: This documentation is generated from the Eclipse wiki - if you have corrections or additions it would be awesome if you added them in [http://wiki.eclipse.org/GEF/GEF4/DOT/User_Guide the original wiki page]''.
  
 
__NOTOC__
 
__NOTOC__
  
 
== Introduction ==
 
== Introduction ==
 
+
The <span style="color:#561D8E">[[GEF/GEF4/DOT|GEF4 DOT]]</span> component provides support for [http://www.graphviz.org/ Graphviz] [http://www.graphviz.org/doc/info/lang.html DOT], in terms of
The [[GEF/GEF4/DOT |<span style="color:#561D8E">GEF4 DOT</span>]] component provides support for the [http://www.graphviz.org/ Graphviz] [http://www.graphviz.org/doc/info/lang.html DOT language], in terms of
+
* an Xtext-based .dot file editor
* API to import/export DOT files to/from [[GEF/GEF4/Graph | GEF4 Graph]] representations (which can be visualized with [[GEF/GEF4/Zest | GEF4 Zest]])
+
* support for Graphviz-based generation of PDF-output for .dot files
* an Xtext-based DOT file editor
+
* support for Graphviz-based generating of PDF-output for DOT files
+
 
* a [[GEF/GEF4/Zest | GEF4 Zest]]-based DOT Graph Viewer  
 
* a [[GEF/GEF4/Zest | GEF4 Zest]]-based DOT Graph Viewer  
 
   
 
   
This component was started as a [http://socghop.appspot.com/student_project/show/google/gsoc2009/eclipse/t124022230869 project] in the [[Google Summer of Code 2009]] by [[User:Steeg.netcologne.de|Fabian Steeg]], mentored by Ian Bull, for [[GEF Zest Visualization|Zest]]. It was initially included in [[Zest#Zest_2.x|Zest 2]] and has finally been migrated to [[GEF/GEF4/DOT | GEF4 DOT]], being now based on [[GEF/GEF4/Graph | GEF4 Graph]], [[GEF/GEF4/Layout | GEF4 Layout]], and [[GEF/GEF4/Zest | GEF4 Zest]]. The component is internally decomposed into two modules, namely [[#DOT|DOT]] and [[#DOT.UI|DOT.UI]].
+
It is internally decomposed into two modules, namely [[#DOT|DOT]] and [[#DOT.UI|DOT.UI]]. There are also a couple of undeployed [[GEF/GEF4/DOT/Examples#Examples (undeployed)|DOT Examples]] that demonstrate usage of the (still internal) API. The user documentation is provided in terms of the [[GEF/GEF4/DOT/User Guide|GEF4 DOT User Guide]].
  
 
[[Image:GEF4-Components-DOT.png|600px]]
 
[[Image:GEF4-Components-DOT.png|600px]]
  
== User Documentation ==
+
----
 
+
This component adds a DOT editor and a ''DOT Graph'' view to the UI. The DOT editor can be used to edit *.dot files, while the DOT Graph view allows to render them within Eclipse using [[GEF/GEF4/Zest | GEF4 Zest]], as well as to export them as PDF using the Graphviz native executable.
+
 
+
Please note that the DOT editor and the [[GEF/GEF4/Zest | GEF4 Zest]]-based rendering of the DOT Graph view are currently still limited to support only a subset of the DOT language (see [https://bugs.eclipse.org/bugs/show_bug.cgi?id=454629 #454629], [https://bugs.eclipse.org/bugs/show_bug.cgi?id=321775 #321775], and [https://bugs.eclipse.org/bugs/show_bug.cgi?id=441352 #441352] for details).
+
 
+
=== DOT editor ===
+
 
+
The DOT editor is registered for *.dot files within the Eclipse Workbench UI. It is based on [https://www.eclipse.org/Xtext/ Xtext] and thus provides support for syntax coloring, content assist, and integrated validation, as well as a customized Outline view integration.
+
 
+
[[Image:DotEditor.png|600px]]
+
 
+
=== DOT Graph view ===
+
 
+
The DOT Graph view ('Window -> Show View -> Other... -> Visualization -> DOT Graph') can visualize DOT graphs in *.dot files or embedded in other files in the workspace. The view draws the DOT graphs using [[GEF/GEF4/Zest | GEF4 Zest]] and allows for image export of the currently visualized Zest graph. When automatic updating is enabled (see below), and a *.dot file or embedded DOT content is added to the workspace or altered in an editor, the DOT Graph view is updated with the graph created from the DOT input. For instance, consider a file with the .dot extension, containing the following DOT graph definition:
+
 
+
digraph s{
+
  n1[label="Node 1"]; n2[label="Node 2"];
+
  n1 -> n2[style=dotted label="A dotted edge"]
+
}
+
 
+
The view will display:
+
 
+
[[Image:DotZestGraphView.png|200px]]
+
 
+
The view contains buttons to toggle automatic updates, to load a specific file containing a DOT graph, and to layout the current graph. To export the current Zest graph as an image file by calling the ''dot'' executable, the view contains buttons to re-select the directory containing the ''dot'' executable, to enable export of the original DOT input, and to export as an image file (from left to right). When the image export button is selected, a PDF for the current graph is saved in the directory containing the file with the DOT input, and opened with the associated external editor, if one is available. In this example, the export looks like this:
+
 
+
[[Image:DotZestM2Rendered.png]]
+
 
+
This provides a Zest-based DOT authoring environment. If a *.dot file or embedded DOT is edited, it will be visualized in the DOT Graph view (e.g. during editing), and can be exported as a PDF with Graphviz.
+
 
+
At the same time the view provides a simple way to visualize *.dot file output of any kind of program, e.g. to visualize and debug internal data structures, results, etc: if a program running in Eclipse outputs any *.dot file in the workspace and the workspace is refreshed, the view will be updated with the corresponding Zest graph (if automatic updating is enabled, see above).
+
 
+
The DOT Graph view can be used with the included DOT editor to visualize a DOT file:
+
 
+
[[Image:DotZestEditor.png|400px]]
+
 
+
Additionally, the Zest view also displays embedded DOT in other files, e.g. [http://fsteeg.wordpress.com/2010/01/07/visual-textual-documentation-with-dot-and-zest-in-eclipse/ in source code comments] or [http://fsteeg.wordpress.com/2010/02/07/diagrams-in-wiki-markup-with-mylyn-wikitext-dot-and-zest/ in wiki markup]:
+
 
+
[[Image:DotZestWikiText.png|400px]]
+
  
 
== DOT ==
 
== DOT ==
  
 +
*'''feature: org.eclipse.gef4.dot'''
 
*'''bundle: org.eclipse.gef4.dot'''
 
*'''bundle: org.eclipse.gef4.dot'''
  
=== DOT ===
+
The [[#DOT|DOT]] module of [[GEF/GEF4/DOT|GEF4 DOT]] realizes the serializer and parser for the 'DOT Editor' as well as import/export functionality used by the 'DOT Graph View' and the 'Sync Graphviz Export' end-user features, as outlined in the [[GEF/GEF4/DOT/User Guide | GEF4 DOT User Guide]]. It does not provide any public API (yet), but exposes its internal API (guarded by an x-friends directive).
  
*'''package: org.eclipse.gef4.dot'''
+
<div id="DOT:Root"></div>
 +
=== {Root} ===
  
Via the API, DOT can be imported to GEF4 Graph graph instances, and GEF4 Graph graph instances can be exported to DOT. To use the API, create a new Plug-in project, add GEF4 DOT and GEF4 Graph to the MANIFEST.MF dependencies, paste the code below into the source folder of the created project, and select ''Run As > Java Application''.
+
*'''package: org.eclipse.gef4.dot.internal'''
  
Dot-Export example:
+
The [[#DOT:Root|{Root}]] package provides an importer ([[#DotImport|DotImport]]) and exporter ([[#DotExport|DotExport]]) between a Graphviz DOT and a related [[GEF/GEF4/Graph|GEF4 Graph]] representation. The imported or to be exported graph has to make use of the attributes defined in [[#DotAttributes|DotAttributes]].
  
import org.eclipse.gef4.dot.DotExport;
+
==== DotImport ====
import org.eclipse.gef4.graph.Edge;
+
<code>DotImport</code> provides support for importing a Graphviz DOT into a [[GEF/GEF4/Graph|GEF4 Graph]] data model, using the attributes defined in [[#DotAttributes|DotAttributes]].
import org.eclipse.gef4.graph.Graph;
+
import org.eclipse.gef4.graph.Graph.Attr;
+
import org.eclipse.gef4.graph.Node;
+
+
public final class DotExportExample {
+
+
public static void main(final String[] args) {
+
/* Set up a directed graph with a single connection: */
+
Graph.Builder graph = new Graph.Builder();
+
Node node1 = new Node.Builder().attr(Attr.Key.ID.toString(), "1")
+
.attr(Attr.Key.LABEL.toString(), "Node 1").build();
+
Node node2 = new Node.Builder().attr(Attr.Key.ID.toString(), "2")
+
.attr(Attr.Key.LABEL.toString(), "Node 2").build();
+
Edge edge = new Edge.Builder(node1, node2)
+
.attr(Attr.Key.LABEL.toString(), "A dotted edge")
+
.attr(Attr.Key.EDGE_STYLE.toString(), Graph.Attr.Value.LINE_DOT)
+
.build();
+
graph.attr(Graph.Attr.Key.EDGE_STYLE.toString(),
+
Graph.Attr.Value.CONNECTIONS_DIRECTED).nodes(node1, node2)
+
.edges(edge);
+
+
/* Export the graph to a DOT string or a DOT file: */
+
DotExport dotExport = new DotExport(graph.build());
+
System.out.println(dotExport.toDotString());
+
}
+
+
}
+
  
Dot-Import example:
+
<source lang="java" style="border-style:solid;border-color:#f2f2f2;border-width:1px;padding:10px;margin-bottom:10px">
 +
/* We can create Graphs based on Graphviz Dot files and strings */
 +
DotImport dotImport = new DotImport();
 +
Graph graph = dotImport.importDot("graph { 1--2 ; 1--3 }");
 +
Graph digraph = dotImport.importDot("digraph { 1->2 ; 1->3 }");
 +
</source>
  
import org.eclipse.gef4.dot.DotImport;
+
Internally, <code>DotImport</code> is based on an [http://wiki.eclipse.org/Xtext Xtext]-based parser. It uses the generated Xtext switch API to dynamically create [[GEF/GEF4/Graph | GEF4 Graph]] graphs from the DOT abstract syntax tree (represented as an EMF model).
import org.eclipse.gef4.graph.Graph;
+
+
public final class DotImportExample {
+
+
public static void main(final String[] args) {
+
/* We can create Graphs based on Graphviz Dot files/string */
+
Graph graph = new DotImport("graph { 1--2 ; 1--3 }").newGraphInstance();
+
Graph digraph = new DotImport("digraph { 1->2 ; 1->3 }")
+
.newGraphInstance();
+
+
/* We can also import Graphviz Dot files/string into an existing graph */
+
Graph.Builder graph2 = new Graph.Builder();
+
new DotImport("digraph{1->2}").into(graph2);
+
new DotImport("node[label=zested]; 2->3; 2->4").into(graph2); //$NON-NLS-1$
+
new DotImport("edge[style=dashed]; 3->5; 4->6").into(graph2); //$NON-NLS-1$
+
}
+
+
}
+
  
The complete sample usage is [http://git.eclipse.org/c/gef/org.eclipse.gef4.git/tree/org.eclipse.gef4.dot.examples/src/org/eclipse/gef4/dot/examples/ available in the repository], as well as working [http://git.eclipse.org/c/gef/org.eclipse.gef4.git/tree/org.eclipse.gef4.dot.tests/resources/ DOT input samples].
+
==== DotExport ====
 +
<code>DotExport</code> can be used to serialize a [[GEF/GEF4/Graph|GEF4 Graph]]-model, which uses the attributes defined in [[#DotAttributes|DotAttributes]] to a Graphviz DOT as follows:
  
During import and exports of DOT graphs to/rom GEF4 Graph graphs, the DOT layout specified in the input is mapped to the most suitable GEF4 Layout layout algorithm - e.g. for the following DOT graph:
+
<source lang="java" style="border-style:solid;border-color:#f2f2f2;border-width:1px;padding:10px;margin-bottom:10px">
 +
/* Set up a directed graph with a single connection: */
 +
Graph graph = new Graph.Builder()
 +
.attr(DotAttributes._TYPE__G, DotAttributes._TYPE__G__GRAPH)
 +
.node("n1")
 +
.attr(DotAttributes._NAME__GNE, "1")
 +
.attr(DotAttributes.LABEL__GNE, "Node 1")
 +
.node("n2")
 +
.attr(DotAttributes._NAME__GNE, "2")
 +
.attr(DotAttributes.LABEL__GNE, "Node 2")
 +
.edge("n1", "n2")
 +
.attr(DotAttributes.LABEL__GNE, "A dotted edge")
 +
.attr(DotAttributes.STYLE__GNE, EdgeStyle.DOTTED.toString())
 +
.build();
  
graph { 1--2--3; 2--4--5 }
+
/* Export the graph to a DOT string or a DOT file: */
 +
System.out.println(new DotExport().exportDot(graph));
 +
</source>
  
If the graph defines a Graphviz layout, it is mapped to a GEF4 Layout layout as below:
+
Internally, <code>DotExport</code> is based on [https://www.eclipse.org/xtend/ Xtend] to keep its runtime dependencies minimal.
  
graph[layout=dot];
+
==== DotAttributes ====
 +
<code>DotAttributes</code> defines the (currently) supported [http://www.graphviz.org/doc/info/attrs.html Graphviz attributes]. It supports validation and parsing of all attribute values, using a dedicated attribute parser and validator where the attributes follow a specific grammar.
  
[[Image:Zest2-dot-zest.png|150px]]
+
==== DotExecutableUtils ====
 +
<code>DotExecutableUtils</code> is a utility class that can be used to execute the native Graphviz DOT executable, which is internally used by the 'DOT Graph View'.
  
graph[layout=fdp];
+
In combination with [[#DotAttributes|DotAttributes]], <code>DotExecutableUtils</code> can e.g. be used to use the native Graphviz DOT executable for layout, as depicted in the [[GEF/GEF4/DOT/Examples#DotLayoutExample|DotLayoutExample]]:
  
[[Image:Zest2-fdp-zest.png|150px]]
+
<source lang="java" style="border-style:solid;border-color:#f2f2f2;border-width:1px;padding:10px;margin-bottom:10px">
 +
@Override
 +
public void applyLayout(boolean clean) {
 +
  // convert a Graph with LayoutAttributes (input model to ILayoutAlgorithm) into one with DotAttributes, which can be
 +
  // exported to a DOT string; keep track of converted nodes (as a side-effect)
 +
  final Map<Node, String> nodesToNameMap = new HashMap<>();
 +
  IAttributeCopier layout2DotAttributesConverter = new IAttributeCopier() {
 +
    int nodeIndex = 0;
  
graph[layout=twopi];
+
    @Override
 +
    public void copy(IAttributeStore source, IAttributeStore target) {
 +
      if (source instanceof Node && target instanceof Node) {
 +
        // convert LayoutProperties#location to DotAttributes#pos (both refer to center locations)
 +
        Point location = LayoutProperties.getLocation((Node) source);
 +
        org.eclipse.gef4.dot.internal.parser.point.Point posParsed = PointFactory.eINSTANCE.createPoint();
 +
        posParsed.setX(location.x);
 +
        posParsed.setY(location.y);
 +
        DotAttributes.setPosParsed((Node) target, posParsed);
 +
        // provide unique names and keep track of the mapped nodes
 +
        DotAttributes._setName((Node) target, Integer.toString(++nodeIndex));
 +
        nodesToNameMap.put((Node) source, DotAttributes._getName((Node) target));
 +
      }
 +
    }
 +
  };
 +
  Graph dotGraph = new GraphCopier(layout2DotAttributesConverter).copy(context.getGraph());
  
[[Image:Zest2-twopi-zest.png|150px]]
+
  // set graph type
 +
  DotAttributes._setType(dotGraph, DotAttributes._TYPE__G__DIGRAPH);
  
graph[layout=osage];
+
  // specify layout algorithm
 +
  DotAttributes.setLayout(dotGraph, Layout.CIRCO.toString());
  
[[Image:Zest2-osage-zest.png|150px]]
+
  // export the dot string and call the dot executable to add layout info to it.
 +
  DotExport dotExport = new DotExport();
 +
  String dot = dotExport.exportDot(dotGraph);
 +
  File tmpFile = DotFileUtils.write(dot);
 +
  String[] dotResult = DotExecutableUtils.executeDot(new File(dotExecutablePath), true, tmpFile, null, null);
 +
  if (!dotResult[1].isEmpty()) {
 +
    System.err.println(dotResult[1]);
 +
  }
 +
  tmpFile.delete();
 +
  Graph layoutedDotGraph = new DotImport().importDot(dotResult[0]);
  
===Implementation===
+
  // transfer the DOT provided position information back to the input Graph
 +
  for (Node target : context.getGraph().getNodes()) {
 +
    String nodeName = nodesToNameMap.get(target);
 +
    for (Node source : layoutedDotGraph.getNodes()) {
 +
      if (nodeName.equals(DotAttributes._getName(source))) {
 +
        // convert back DotAttributes#pos to LayoutProperties#location
 +
        org.eclipse.gef4.dot.internal.parser.point.Point posParsed = DotAttributes.getPosParsed(source);
 +
        LayoutProperties.setLocation(target, new Point(posParsed.getX(), posParsed.getY()));
 +
break;
 +
      }
 +
    }
 +
  }
 +
}
 +
</source>
  
The import/export functionality is implemented based on [http://www.eclipse.org/modeling/ Eclipse Modeling] technologies, in particular [http://wiki.eclipse.org/Xtext Xtext] (part of [http://www.eclipse.org/modeling/tmf TMF]) for the input part (parse DOT, generate Zest) and [http://wiki.eclipse.org/M2T-JET JET] for the output (see details below).
+
----
  
[[Image:DotZestOverview.png|thumb|175px|right|Implementation of Graphviz DOT input and output for Zest using Eclipse modeling technology]]
+
== DOT.UI ==
  
====Graphviz DOT to Graph/Zest====
+
*'''feature: org.eclipse.gef4.dot.internal.ui'''
 +
*'''bundle: org.eclipse.gef4.dot.internal.ui'''
  
Based on an Xtext grammar, GEF4 DOT interprets the parsed DOT EMF model using the generated Xtext switch API to dynamically create [[GEF/GEF4/Graph | GEF4 Graph]] graphs. The Dot Graph view uses this to display DOT with [[GEF/GEF4/Zest | GEF4 Zest]] (see above).
+
The [[#DOT.UI|DOT.UI]] module of [[GEF/GEF4/DOT|GEF4 DOT]] realizes the DOT editor as well as the DOT Graph View as end-user features, as outlined in the [[GEF/GEF4/DOT/User Guide | GEF4 DOT User Guide]]. It does not provide any public API (yet), but exposes its internal API (guarded by an x-friends directive).
  
====Graph/Zest to Graphviz DOT====
+
<div id="DOT.UI:Root"></div>
 +
=== {Root} ===  
  
To transform [[GEF/GEF4/Graph | GEF4 Graph]] graph instances to the Graphviz DOT language, GEF4 DOT uses [http://wiki.eclipse.org/M2T-JET JET].  
+
*'''package: org.eclipse.gef4.dot.internal.ui'''
  
There are two reasons to use JET instead of Xpand here. First, this allows us to transform any GEF4 Graph graph instance to DOT directly (not only those for which we have a DOT meta model instance that could act as the input to Xpand).  
+
The [[#DOT.UI:Root|{Root}]] package provides [[GEF/GEF4/Common#IAttributeCopier|org.eclipse.gef4.common.attributes.IAttributeCopier]] implementations that can be used to transfer attributes defined by [[#DotAttributes|DotAttributes]] into those defined by [[GEF/GEF4/Zest#ZestProperties|org.eclipse.gef4.zest.fx.ZestProperties]].
  
Second, even if we had a DOT meta model instance (which we could create from the [[GEF/GEF4/Graph | GEF4 Graph]] graph), using Xpand would introduce a runtime dependency on the [http://wiki.eclipse.org/Modeling_Workflow_Engine_(MWE) Modeling Workflow Engine], whereas with JET we only introduce a dependency on a single class (the generator class JET created from the template).
+
==== Dot2ZestAttributesConverter, Zest2DotAttributesConverter ====
 
+
<code>Dot2ZestAttributesConverter</code> and <code>Zest2DotAttributesConverter</code> are [[GEF/GEF4/Common#IAttributeCopier|org.eclipse.gef4.common.attributes.IAttributeCopier]] implementations that allow to convert between attributes defined by [[#DotAttributes|DotAttributes]] and [[GEF/GEF4/Zest#ZestProperties|org.eclipse.gef4.zest.fx.ZestProperties]]. This is internally used by the 'DOT Graph View' to render a DOT input based on [[GEF/GEF4/Zest|Zest]].
== DOT.UI ==
+
  
*'''bundle: org.eclipse.gef4.dot.ui'''
+
==== DotBSplineInterpolator ====
 +
The <code>DotBSplineInterpolator</code> is a specific [[GEF/GEF4/FX#IConnectionInterpolator|IConnectionInterpolator]] that can be used to properly render B-Splines as DOT specifies them for edge positions.
  
 +
==== DotArrowShapeDecorations ====
 +
The <code>DotArrowShapeDecorations</code> utility class provides implementations for the different arrow shape edge decorations supported by DOT.
  
 
[[Category:GEF]]
 
[[Category:GEF]]

Latest revision as of 08:58, 28 May 2016

Note to non-wiki readers: This documentation is generated from the Eclipse wiki - if you have corrections or additions it would be awesome if you added them in the original wiki page.


Introduction

The GEF4 DOT component provides support for Graphviz DOT, in terms of

  • an Xtext-based .dot file editor
  • support for Graphviz-based generation of PDF-output for .dot files
  • a GEF4 Zest-based DOT Graph Viewer

It is internally decomposed into two modules, namely DOT and DOT.UI. There are also a couple of undeployed DOT Examples that demonstrate usage of the (still internal) API. The user documentation is provided in terms of the GEF4 DOT User Guide.

GEF4-Components-DOT.png


DOT

  • feature: org.eclipse.gef4.dot
  • bundle: org.eclipse.gef4.dot

The DOT module of GEF4 DOT realizes the serializer and parser for the 'DOT Editor' as well as import/export functionality used by the 'DOT Graph View' and the 'Sync Graphviz Export' end-user features, as outlined in the GEF4 DOT User Guide. It does not provide any public API (yet), but exposes its internal API (guarded by an x-friends directive).

{Root}

  • package: org.eclipse.gef4.dot.internal

The {Root} package provides an importer (DotImport) and exporter (DotExport) between a Graphviz DOT and a related GEF4 Graph representation. The imported or to be exported graph has to make use of the attributes defined in DotAttributes.

DotImport

DotImport provides support for importing a Graphviz DOT into a GEF4 Graph data model, using the attributes defined in DotAttributes.

/* We can create Graphs based on Graphviz Dot files and strings */
DotImport dotImport = new DotImport();
Graph graph = dotImport.importDot("graph { 1--2 ; 1--3 }");
Graph digraph = dotImport.importDot("digraph { 1->2 ; 1->3 }");

Internally, DotImport is based on an Xtext-based parser. It uses the generated Xtext switch API to dynamically create GEF4 Graph graphs from the DOT abstract syntax tree (represented as an EMF model).

DotExport

DotExport can be used to serialize a GEF4 Graph-model, which uses the attributes defined in DotAttributes to a Graphviz DOT as follows:

/* Set up a directed graph with a single connection: */
Graph graph = new Graph.Builder()
.attr(DotAttributes._TYPE__G, DotAttributes._TYPE__G__GRAPH)
.node("n1")
.attr(DotAttributes._NAME__GNE, "1")
.attr(DotAttributes.LABEL__GNE, "Node 1")
.node("n2")
.attr(DotAttributes._NAME__GNE, "2")
.attr(DotAttributes.LABEL__GNE, "Node 2")
.edge("n1", "n2")
.attr(DotAttributes.LABEL__GNE, "A dotted edge")
.attr(DotAttributes.STYLE__GNE, EdgeStyle.DOTTED.toString())
.build();
 
/* Export the graph to a DOT string or a DOT file: */
System.out.println(new DotExport().exportDot(graph));

Internally, DotExport is based on Xtend to keep its runtime dependencies minimal.

DotAttributes

DotAttributes defines the (currently) supported Graphviz attributes. It supports validation and parsing of all attribute values, using a dedicated attribute parser and validator where the attributes follow a specific grammar.

DotExecutableUtils

DotExecutableUtils is a utility class that can be used to execute the native Graphviz DOT executable, which is internally used by the 'DOT Graph View'.

In combination with DotAttributes, DotExecutableUtils can e.g. be used to use the native Graphviz DOT executable for layout, as depicted in the DotLayoutExample:

@Override
public void applyLayout(boolean clean) {
  // convert a Graph with LayoutAttributes (input model to ILayoutAlgorithm) into one with DotAttributes, which can be
  // exported to a DOT string; keep track of converted nodes (as a side-effect)
  final Map<Node, String> nodesToNameMap = new HashMap<>();
  IAttributeCopier layout2DotAttributesConverter = new IAttributeCopier() {
    int nodeIndex = 0;
 
    @Override
    public void copy(IAttributeStore source, IAttributeStore target) {
      if (source instanceof Node && target instanceof Node) {
        // convert LayoutProperties#location to DotAttributes#pos (both refer to center locations)
        Point location = LayoutProperties.getLocation((Node) source);
        org.eclipse.gef4.dot.internal.parser.point.Point posParsed = PointFactory.eINSTANCE.createPoint();
        posParsed.setX(location.x);
        posParsed.setY(location.y);
        DotAttributes.setPosParsed((Node) target, posParsed);
        // provide unique names and keep track of the mapped nodes
        DotAttributes._setName((Node) target, Integer.toString(++nodeIndex));
        nodesToNameMap.put((Node) source, DotAttributes._getName((Node) target));
      }
    }			
  };			 
  Graph dotGraph = new GraphCopier(layout2DotAttributesConverter).copy(context.getGraph());
 
  // set graph type
  DotAttributes._setType(dotGraph, DotAttributes._TYPE__G__DIGRAPH);
 
  // specify layout algorithm
  DotAttributes.setLayout(dotGraph, Layout.CIRCO.toString());
 
  // export the dot string and call the dot executable to add layout info to it.
  DotExport dotExport = new DotExport();
  String dot = dotExport.exportDot(dotGraph);
  File tmpFile = DotFileUtils.write(dot);
  String[] dotResult = DotExecutableUtils.executeDot(new File(dotExecutablePath), true, tmpFile, null, null);
  if (!dotResult[1].isEmpty()) {
    System.err.println(dotResult[1]);
  }
  tmpFile.delete();
  Graph layoutedDotGraph = new DotImport().importDot(dotResult[0]);
 
  // transfer the DOT provided position information back to the input Graph
  for (Node target : context.getGraph().getNodes()) {
    String nodeName = nodesToNameMap.get(target);
    for (Node source : layoutedDotGraph.getNodes()) {
      if (nodeName.equals(DotAttributes._getName(source))) {
        // convert back DotAttributes#pos to LayoutProperties#location
        org.eclipse.gef4.dot.internal.parser.point.Point posParsed = DotAttributes.getPosParsed(source);
        LayoutProperties.setLocation(target, new Point(posParsed.getX(), posParsed.getY()));
	break;
      }
    }
  }
}

DOT.UI

  • feature: org.eclipse.gef4.dot.internal.ui
  • bundle: org.eclipse.gef4.dot.internal.ui

The DOT.UI module of GEF4 DOT realizes the DOT editor as well as the DOT Graph View as end-user features, as outlined in the GEF4 DOT User Guide. It does not provide any public API (yet), but exposes its internal API (guarded by an x-friends directive).

{Root}

  • package: org.eclipse.gef4.dot.internal.ui

The {Root} package provides org.eclipse.gef4.common.attributes.IAttributeCopier implementations that can be used to transfer attributes defined by DotAttributes into those defined by org.eclipse.gef4.zest.fx.ZestProperties.

Dot2ZestAttributesConverter, Zest2DotAttributesConverter

Dot2ZestAttributesConverter and Zest2DotAttributesConverter are org.eclipse.gef4.common.attributes.IAttributeCopier implementations that allow to convert between attributes defined by DotAttributes and org.eclipse.gef4.zest.fx.ZestProperties. This is internally used by the 'DOT Graph View' to render a DOT input based on Zest.

DotBSplineInterpolator

The DotBSplineInterpolator is a specific IConnectionInterpolator that can be used to properly render B-Splines as DOT specifies them for edge positions.

DotArrowShapeDecorations

The DotArrowShapeDecorations utility class provides implementations for the different arrow shape edge decorations supported by DOT.

Back to the top