diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d91d0ecb7ceb1563b0117622e5e50b8e08559af..9de489f6e968bcb57a736e345fb26da8a04929da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased (14.0.2)] +### Added + +- Added option `neato -n3` for fit ends of edges to nodes' borders when edge + trajectory is set. #2736 + ### Changed - Quartz plugin code paths to support older macOS and iOS versions have been diff --git a/cmd/dot/dot.1 b/cmd/dot/dot.1 index b5ab4fae89de2002de978b6275621d254e684d73..1f66dfda0807dd76314bfa06dbc9e1865c7ad1ef 100644 --- a/cmd/dot/dot.1 +++ b/cmd/dot/dot.1 @@ -623,6 +623,10 @@ with no adjustment to remove node\(hynode overlaps, and use any edge layouts already specified by the pos attribute. neato computes an edge layout for any edge that does not have a \fBpos\fP attribute. As usual, edge layout is guided by the \fBsplines\fR attribute. +.nf + num = 3 +.fi +Also fit ends of edges to nodes' borders. .PP \fB\-K\fIlayout\fR override the default layout engine implied by the command name. .PP diff --git a/lib/neatogen/neatoinit.c b/lib/neatogen/neatoinit.c index f5847e93360b62d43987c7fecf2c0d8ac8997e90..e6c365339f8b82a034d7eb565f4c1be0d0e9b5d4 100644 --- a/lib/neatogen/neatoinit.c +++ b/lib/neatogen/neatoinit.c @@ -591,7 +591,7 @@ int init_nop(Agraph_t * g, int adjust) freeEdgeInfo (g); posEdges = NoEdges; } - if (posEdges != AllEdges) + if (posEdges != AllEdges || Nop == 3) spline_edges0(g, false); /* add edges */ else State = GVSPLINES; diff --git a/lib/neatogen/neatosplines.c b/lib/neatogen/neatosplines.c index 7a23a0f6c5c4e062d75555bcc1e4136ad12f1dd9..5d478ae06098f0df65c94978348de00276c7f8ed 100644 --- a/lib/neatogen/neatosplines.c +++ b/lib/neatogen/neatosplines.c @@ -658,6 +658,20 @@ static int spline_edges_(graph_t *g, expand_t *pmargin, int edgetype) { node_t *head = aghead(e); if (useEdges && ED_spl(e)) { addEdgeLabels(e); + if (Nop == 3 && ED_spl(e)->size > 0) { + // use first bezier, start point and end point will lost + if (ED_spl(e)->size > 1) { + agwarningf("edge %s -> %s : set more than one spline. First used, other dropped.\n", agnameof(n), agnameof(head)); + } + bezier *bez = ED_spl(e)->list; + size_t sz = bez->size; + bez->size = 0; + pointf *pb = bez->list; + bez->list = NULL; + gv_free_splines(e); + clip_and_install(e, head, pb, sz, &sinfo); + free(pb); + } } else if (ED_count(e) == 0) continue; /* only do representative */ else if (n == head) { /* self arc */