use of org.eclipse.elk.alg.graphviz.dot.dot.Attribute in project elk by eclipse.
the class DotImporter method applyLayout.
/*---------- Layout Transfer KGraph to Dot ----------*/
/**
* Apply layout to a parent node and its children.
*
* @param parent a parent node
* @param offset the node's offset in the graph
* @param graph the Graphviz graph
*/
private void applyLayout(final ElkNode parent, final KVector offset, final Graph graph) {
for (ElkNode elknode : parent.getChildren()) {
Statement statement = elknode.getProperty(PROP_STATEMENT);
if (statement == null) {
// the node was only declared implicitly - create an explicit declaration
NodeStatement stm = DotFactory.eINSTANCE.createNodeStatement();
Node node = DotFactory.eINSTANCE.createNode();
node.setName(elknode.getProperty(PROP_ID));
stm.setNode(node);
graph.getStatements().add(stm);
statement = stm;
}
if (statement instanceof NodeStatement) {
List<Attribute> attributes = ((NodeStatement) statement).getAttributes();
// transfer node position
removeAttributes(attributes, Attributes.POS);
double xpos = elknode.getX() + elknode.getWidth() / 2 + offset.x;
double ypos = elknode.getY() + elknode.getHeight() / 2 + offset.y;
String posString = "\"" + Double.toString(xpos) + "," + Double.toString(ypos) + "\"";
attributes.add(DotExporter.createAttribute(Attributes.POS, posString));
// transfer node size
removeAttributes(attributes, Attributes.WIDTH);
attributes.add(DotExporter.createAttribute(Attributes.WIDTH, elknode.getWidth() / DotExporter.DPI));
removeAttributes(attributes, Attributes.HEIGHT);
attributes.add(DotExporter.createAttribute(Attributes.HEIGHT, elknode.getHeight() / DotExporter.DPI));
} else if (statement instanceof Subgraph) {
applyLayout(elknode, new KVector(offset).add(elknode.getX(), elknode.getY()), graph);
}
for (ElkEdge elkedge : ElkGraphUtil.allOutgoingEdges(elknode)) {
applyLayout(elkedge, offset, graph);
}
}
// transfer graph size to bounding box
List<Statement> statements;
Statement graphStm = parent.getProperty(PROP_STATEMENT);
if (graphStm instanceof Subgraph) {
statements = ((Subgraph) graphStm).getStatements();
} else {
statements = graph.getStatements();
}
removeGraphAttributes(statements, Attributes.BOUNDINGBOX);
String bbString = "\"0,0," + Double.toString(parent.getWidth()) + "," + Double.toString(parent.getHeight()) + "\"";
statements.add(DotExporter.createAttribute(Attributes.BOUNDINGBOX, bbString));
}
use of org.eclipse.elk.alg.graphviz.dot.dot.Attribute in project elk by eclipse.
the class DotImporter method transform.
/*---------- Transformation Dot to KGraph ----------*/
/**
* Transform a Dot graph to a KNode.
*
* @param statements
* a list of Dot statements
* @param parent
* a KNode
* @param transData
* transformation data instance
* @param nodeProps
* properties that are applied to all nodes
* @param edgeProps
* properties that are applied to all edges
*/
private void transform(final List<Statement> statements, final ElkNode parent, final IDotTransformationData<GraphvizModel, ElkNode> transData, final IPropertyHolder nodeProps, final IPropertyHolder edgeProps) {
DotSwitch<Object> statementSwitch = new DotSwitch<Object>() {
public Object caseNodeStatement(final NodeStatement statement) {
transformNode(statement, parent, transData, nodeProps);
return null;
}
public Object caseEdgeStatement(final EdgeStatement statement) {
transformEdge(statement, parent, transData, edgeProps);
return null;
}
public Object caseSubgraph(final Subgraph subgraph) {
ElkNode subElkNode = parent;
if (subgraph.getName() != null && subgraph.getName().startsWith("cluster")) {
subElkNode = transformNode(subgraph.getName(), parent, transData);
if (subElkNode.getProperty(PROP_STATEMENT) != null) {
transData.log("Discarding cluster subgraph \"" + subgraph.getName() + "\" since its id is already used.");
return null;
} else {
// the subgraph inherits all settings of its parent
subElkNode.copyProperties(parent);
subElkNode.setProperty(PROP_STATEMENT, subgraph);
}
}
MapPropertyHolder subNodeProps = new MapPropertyHolder();
subNodeProps.copyProperties(nodeProps);
MapPropertyHolder subEdgeProps = new MapPropertyHolder();
subEdgeProps.copyProperties(edgeProps);
transform(subgraph.getStatements(), subElkNode, transData, subNodeProps, subEdgeProps);
return null;
}
public Object caseAttributeStatement(final AttributeStatement statement) {
switch(statement.getType()) {
case GRAPH:
for (Attribute attr : statement.getAttributes()) {
caseAttribute(attr);
}
break;
case NODE:
for (Attribute attr : statement.getAttributes()) {
transformAttribute(nodeProps, attr, transData);
}
break;
case EDGE:
for (Attribute attr : statement.getAttributes()) {
transformAttribute(edgeProps, attr, transData);
}
break;
}
return null;
}
public Object caseAttribute(final Attribute attribute) {
if (Attributes.MARGIN.equals(attribute.getName())) {
ElkPadding padding = parent.getProperty(CoreOptions.PADDING);
if (attribute.getValue().indexOf(',') >= 0) {
KVector value = new KVector();
try {
value.parse(attribute.getValue());
padding.setLeft((float) value.x);
padding.setRight((float) value.x);
padding.setTop((float) value.y);
padding.setBottom((float) value.y);
} catch (IllegalArgumentException exception) {
transData.log("Discarding attribute \"" + attribute.getName() + "\" since its value could not be parsed correctly.");
}
} else {
try {
float value = Float.parseFloat(trimValue(attribute));
padding.setLeft(value);
padding.setRight(value);
padding.setTop(value);
padding.setBottom(value);
} catch (NumberFormatException exception) {
transData.log("Discarding attribute \"" + attribute.getName() + "\" since its value could not be parsed correctly.");
}
}
} else {
transformAttribute(parent, attribute, transData);
}
return null;
}
};
for (Statement statement : statements) {
statementSwitch.doSwitch(statement);
}
}
use of org.eclipse.elk.alg.graphviz.dot.dot.Attribute in project elk by eclipse.
the class AbstractGraphvizDotSemanticSequencer method sequence.
@Override
public void sequence(ISerializationContext context, EObject semanticObject) {
EPackage epackage = semanticObject.eClass().getEPackage();
ParserRule rule = context.getParserRule();
Action action = context.getAssignedAction();
Set<Parameter> parameters = context.getEnabledBooleanParameters();
if (epackage == DotPackage.eINSTANCE)
switch(semanticObject.eClass().getClassifierID()) {
case DotPackage.ATTRIBUTE:
if (rule == grammarAccess.getStatementRule() || rule == grammarAccess.getAttributeRule()) {
sequence_Attribute(context, (Attribute) semanticObject);
return;
} else if (rule == grammarAccess.getListAttributeRule()) {
sequence_ListAttribute(context, (Attribute) semanticObject);
return;
} else
break;
case DotPackage.ATTRIBUTE_STATEMENT:
sequence_AttributeStatement(context, (AttributeStatement) semanticObject);
return;
case DotPackage.EDGE_STATEMENT:
sequence_EdgeStatement(context, (EdgeStatement) semanticObject);
return;
case DotPackage.EDGE_TARGET:
sequence_EdgeTarget(context, (EdgeTarget) semanticObject);
return;
case DotPackage.GRAPH:
sequence_Graph(context, (Graph) semanticObject);
return;
case DotPackage.GRAPHVIZ_MODEL:
sequence_GraphvizModel(context, (GraphvizModel) semanticObject);
return;
case DotPackage.NODE:
sequence_Node(context, (Node) semanticObject);
return;
case DotPackage.NODE_STATEMENT:
sequence_NodeStatement(context, (NodeStatement) semanticObject);
return;
case DotPackage.PORT:
sequence_Port(context, (Port) semanticObject);
return;
case DotPackage.SUBGRAPH:
sequence_Subgraph(context, (Subgraph) semanticObject);
return;
}
if (errorAcceptor != null)
errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
}
use of org.eclipse.elk.alg.graphviz.dot.dot.Attribute in project elk by eclipse.
the class LayoutDotExporter method setGraphAttributes.
@Override
protected void setGraphAttributes(final List<Statement> statements, final ElkNode parentNode, final IDotTransformationData<ElkNode, GraphvizModel> transData) {
Command command = transData.getProperty(COMMAND);
AttributeStatement graphAttrStatement = DotFactory.eINSTANCE.createAttributeStatement();
graphAttrStatement.setType(AttributeType.GRAPH);
List<Attribute> graphAttrs = graphAttrStatement.getAttributes();
statements.add(graphAttrStatement);
setGeneralNodeAttributes(statements);
List<Attribute> edgeAttrs = setGeneralEdgeAttributes(statements);
// set minimal spacing
Double spacing = parentNode.getProperty(CoreOptions.SPACING_NODE_NODE);
if (spacing == null || spacing < 0) {
switch(command) {
case CIRCO:
case FDP:
case NEATO:
spacing = DEF_SPACING_LARGE;
break;
case TWOPI:
spacing = DEF_SPACING_XLARGE;
break;
default:
spacing = DEF_SPACING_SMALL;
}
}
switch(command) {
case DOT:
graphAttrs.add(createAttribute(Attributes.NODESEP, spacing / DPI));
double rankSepFactor = parentNode.getProperty(GraphvizMetaDataProvider.LAYER_SPACING_FACTOR);
graphAttrs.add(createAttribute(Attributes.RANKSEP, rankSepFactor * spacing / DPI));
// set layout direction
switch(parentNode.getProperty(CoreOptions.DIRECTION)) {
case UP:
graphAttrs.add(createAttribute(Attributes.RANKDIR, "BT"));
break;
case LEFT:
graphAttrs.add(createAttribute(Attributes.RANKDIR, "RL"));
break;
case RIGHT:
graphAttrs.add(createAttribute(Attributes.RANKDIR, "LR"));
break;
default:
// DOWN
graphAttrs.add(createAttribute(Attributes.RANKDIR, "TB"));
}
// set iterations limit
Double iterationsFactor = parentNode.getProperty(GraphvizMetaDataProvider.ITERATIONS_FACTOR);
if (iterationsFactor != null && iterationsFactor > 0) {
graphAttrs.add(createAttribute(Attributes.CROSSMIN_LIMIT, iterationsFactor));
if (iterationsFactor < 1) {
double simplexLimit = iterationsFactor * NSLIMIT_BASE;
graphAttrs.add(createAttribute(Attributes.SIMPLEX_LIMIT, simplexLimit));
}
}
// enable compound mode
if (parentNode.getProperty(CoreOptions.HIERARCHY_HANDLING) == HierarchyHandling.INCLUDE_CHILDREN) {
graphAttrs.add(createAttribute(Attributes.COMPOUND, "true"));
}
break;
case TWOPI:
graphAttrs.add(createAttribute(Attributes.RANKSEP, spacing / DPI));
break;
case CIRCO:
graphAttrs.add(createAttribute(Attributes.MINDIST, spacing / DPI));
break;
case NEATO:
edgeAttrs.add(createAttribute(Attributes.EDGELEN, spacing / DPI));
// configure initial placement of nodes
Integer seed = parentNode.getProperty(CoreOptions.RANDOM_SEED);
if (seed == null) {
seed = 1;
} else if (seed == 0) {
seed = -1;
} else if (seed < 0) {
seed = -seed;
}
graphAttrs.add(createAttribute(Attributes.START, "random" + seed));
// set epsilon value
Double epsilon = parentNode.getProperty(GraphvizMetaDataProvider.EPSILON);
if (epsilon != null && epsilon > 0) {
graphAttrs.add(createAttribute(Attributes.EPSILON, epsilon));
}
// set distance model
NeatoModel model = parentNode.getProperty(GraphvizMetaDataProvider.NEATO_MODEL);
if (model != NeatoModel.SHORTPATH) {
graphAttrs.add(createAttribute(Attributes.NEATO_MODEL, model.literal()));
}
break;
case FDP:
graphAttrs.add(createAttribute(Attributes.SPRING_CONSTANT, spacing / DPI));
break;
}
if (command == Command.NEATO || command == Command.FDP) {
// set maximum number of iterations
Integer maxiter = parentNode.getProperty(GraphvizMetaDataProvider.MAXITER);
if (maxiter != null && maxiter > 0) {
graphAttrs.add(createAttribute(Attributes.MAXITER, maxiter));
}
}
if (command != Command.DOT) {
// enable or disable node overlap avoidance
OverlapMode mode = parentNode.getProperty(GraphvizMetaDataProvider.OVERLAP_MODE);
if (mode != OverlapMode.NONE) {
graphAttrs.add(createAttribute(Attributes.OVERLAP, mode.literal()));
graphAttrs.add(createAttribute(Attributes.SEP, "\"+" + Math.round(spacing / 2) + "\""));
}
// enable or disable connected component packing
Boolean pack = parentNode.getProperty(CoreOptions.SEPARATE_CONNECTED_COMPONENTS);
if (command == Command.TWOPI || pack != null && pack.booleanValue()) {
graphAttrs.add(createAttribute(Attributes.PACK, spacing.intValue()));
}
}
// configure edge routing
EdgeRouting edgeRouting = parentNode.getProperty(CoreOptions.EDGE_ROUTING);
String splineMode;
switch(edgeRouting) {
case POLYLINE:
splineMode = "polyline";
break;
case ORTHOGONAL:
splineMode = "ortho";
break;
default:
splineMode = "spline";
transData.setProperty(USE_SPLINES, true);
}
graphAttrs.add(createAttribute(Attributes.SPLINES, splineMode));
// enable edge concentration
if (parentNode.getProperty(GraphvizMetaDataProvider.CONCENTRATE)) {
graphAttrs.add(createAttribute(Attributes.CONCENTRATE, "true"));
}
}
use of org.eclipse.elk.alg.graphviz.dot.dot.Attribute in project elk by eclipse.
the class DotExporter method applyNodeLayout.
/**
* Set the position of a node.
*
* @param nodeStatement a node statement
* @param offset the offset to be added to node coordinates
* @param spacing additional border spacing
* @param transData transformation data
*/
private void applyNodeLayout(final NodeStatement nodeStatement, final KVector offset, final ElkPadding padding, final IDotTransformationData<ElkNode, GraphvizModel> transData) {
ElkNode elknode = (ElkNode) transData.getProperty(GRAPH_ELEMS).get(nodeStatement.getNode().getName());
if (elknode == null) {
return;
}
double xpos = 0.0;
double ypos = 0.0;
double width = 0.0;
double height = 0.0f;
for (Attribute attribute : nodeStatement.getAttributes()) {
try {
if (attribute.getName().equals(Attributes.POS)) {
KVector pos = new KVector();
pos.parse((attribute.getValue()));
xpos = pos.x + offset.x + padding.getLeft();
ypos = pos.y + offset.y + padding.getTop();
} else if (attribute.getName().equals(Attributes.WIDTH)) {
StringTokenizer tokenizer = new StringTokenizer(attribute.getValue(), ATTRIBUTE_DELIM);
width = Double.parseDouble(tokenizer.nextToken()) * DPI;
} else if (attribute.getName().equals(Attributes.HEIGHT)) {
StringTokenizer tokenizer = new StringTokenizer(attribute.getValue(), ATTRIBUTE_DELIM);
height = Double.parseDouble(tokenizer.nextToken()) * DPI;
}
} catch (NumberFormatException exception) {
// ignore exception
} catch (IllegalArgumentException exception) {
// ignore exception
} catch (NoSuchElementException exception) {
// ignore exception
}
}
elknode.setX(xpos - width / 2);
elknode.setY(ypos - height / 2);
}
Aggregations