6.2 Arrows and Lines

You can use various arrow symbols (as in other languages) to impact the appearance of the arrow. like >> or =>. You can even use symbols without arrowheads (--, .., ++ and ==) to get a simple line.. In addition, you can specify additional attributes in square brackets after the arrow. These include line, arrowhead and text attributes.

exD0_cshexD0

You can add labels to arrows simply using the colon label syntax. You can also add further labels after the arrow, specifying their position along the arrow as percentage of length. By default the labels are placed above the arrow, you can influence it via the label.pos attribute. If you indicated the mark keyword before the label, a small mark will be added to the arrow. This mark is an arrowhead defaulting to gvstyle=tick.

exC9_cshexC9

Now, it might be that you would like to route the long connection below the container block. In such cases you can use the via attribute for an arrow. You can name a block and any of top, left, right or bottom after it. The arrow will try to go that way.

exD2_cshexD2

Arrows are routed around blocks in-between the two ends of the arrow. This can be prevented by setting the allow_arrows attribute.

exD1_cshexD1

Arrows can start and end not only at blocks. Based on the block layout, you can specify 2D coordinates on the diagram, which can serve as start, end and waypoints for arrows.

To specify a coordinate, use two block sides, separated by a comma and enclosed in parenthesis, for example: (a@top, b@right). You can also add offsets in pixels, like (a@top+10, b@right-5).

exG1

Arrows can be laid out using several algorithms. Use the routing attribute and choose one between horizontal, vertical, straight, manhattan, polygon or curvy. In case of polygon and manhattan, you can set line.corner to influence the appearance and make the vertices smoother via line.corner=round. The default is curvy.

exE1

In case of vertical and horizontal the line will be drawn in the middle of the vertical or horizontal overlap of the two blocks, respectively.

exG2_cshexG2

You can govern where arrows end via ports, similar to graphviz. These should be specified after the block name and the at symbol (@). Boxes have one port on each side and vertex. You can also use a compass point as port. Each of these also influence the direction in which the arrow shall leave or arrive at the block. With the distance attribute you can govern, how wide a certain block (or all blocks) are routed around or - in case of starting and ending blocks - how wide an arc the arrow makes at its start or end. The default is 5 pixels for the former and 10 pixels for the latter.

exH9_cshexH9

Each shape may define its own ports (besides the compass points, which are valid for all shapes). For example, the shape actor has one compass point for each hand and leg, plus its head. In the below example, we also use a direction marker in addition to the port to explicitly govern the direction the arrow start in or ends from. (The attribute label.align determines where on the arrow the label is placed with 0 being its start and 100 being its end (default is 50). label.pos on the other hand specifies which side of the arrow the label is (default is above).)

exI0_cshexI0

If two arrows would overlap at their start or end, they are automatically shifted a bit to show up as separate arrows. (Note, as well, that the arrowheads follow the curvature of the arrow. The xmul attribute simply makes them longer.)

exI7_cshexI7

You can use a syntax similar to arrows to specify separator lines. Note that the default routing for lines is straight, which does not go around blocks in the way, but just crosses them. If you set routing=curvy, the line will route around blocks in the way arrows do, see the red line on the example below.

exG4_cshexG4

Finally, a more elaborate version of lines, labels and markers. Note that the plain numbers used in the coordinates are interpreted relative to the inner margin of their container block. (If there is no outer block then to the diagram canvas.) The numbers after the mark commands are not followed by a percentage sign, so they are interpreted as pixels from the beginning of the line.

exH8_cshexH8