I don’t consider this elegant, but …
The improved pin2pin is modified again to add point-shaped nodes at the ends of marked edges.
/*******************************************************************
see https://forum.graphviz.org/t/straitening-one-line-throu-a-table/2196
input must include pos values (must be output from one of the engines w/ -Tdot)
*******************************************************************/
BEG_G{
double x1,y1,x2,y2,x3,y3,x4,y4;
string ptSize, tok[int], pt[];
int cnt, circ, i;
node_t aNode;
circ=0;
}
/********************************************************
it would be better to mark every target edge with a new attribute and test for that attribute
*********************************************************/
E{
if (hasAttr($, "addPTS") && $.addPTS!="") { // explicitly marked edges
cnt=tokens($.pos,tok," ");
$.oldpos=$.pos;
x1 = xOf(tok[0]);
y1 = yOf(tok[0]);
x4 = xOf(tok[cnt-1]);
y4 = yOf(tok[cnt-1]);
x2 = x1 + (x4-x1)/3.;
y2 = y1 + (y4-y1)/3.;
x3 = x1 + 2.*(x4-x1)/3.;
y3 = y1 + 2.*(y4-y1)/3.;
pos=sprintf("%.3f,%.3f %.3f,%.3f %.3f,%.3f %.3f,%.3f", x1,y1, x2,y2, x3,y3, x4,y4);
// now we place point nodes at the edge ends
pt[1]=tok[0];
pt[2]=tok[cnt-1];
ptSize=".13";
for (pt[i]) {
if (i==2 && pt[1]==pt[2])
continue;
aNode=node($G, "__CIRCLE__" + (string)++circ);
aNode.pos=pt[i];
aNode.shape="point";
aNode.width=ptSize;
aNode.height=ptSize;
aNode.style="filled";
aNode.fillcolor="green"; // just for fun
}
}
}
And the input looks like this:
graph {
// Graph generated by WireViz 0.3.2
// https://github.com/formatc1702/WireViz
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold label=" "]
X2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">P1</td>
<td balign="left">9-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>+28VDC</td>
<td width="38" port="p1I"></td>
<td width="38" port="p1J"></td>
<td width="38" port="p1K"></td>
</tr>
<tr>
<td port="p2l">2</td>
<td>+28VDC RTN</td>
<td width="38" port="p2I"></td>
<td width="38" port="p2J"></td>
<td width="38" port="p2K"></td>
</tr>
<tr>
<td port="p3l">3</td>
<td>Token-In REF</td>
<td width="38" port="p3I"></td>
<td width="38" port="p3J"></td>
<td width="38" port="p3K"></td>
</tr>
<tr>
<td port="p4l">4</td>
<td>Token-In</td>
<td width="38" port="p4I"></td>
<td width="38" port="p4J"></td>
<td width="38" port="p4K"></td>
</tr>
<tr>
<td port="p5l">5</td>
<td>NC</td>
<td width="38" port="p5I"></td>
<td width="38" port="p5J"></td>
<td width="38" port="p5K"></td>
</tr>
<tr>
<td port="p6l">6</td>
<td>NC</td>
<td width="38" port="p6I"></td>
<td width="38" port="p6J"></td>
<td width="38" port="p6K"></td>
</tr>
<tr>
<td port="p7l">7</td>
<td>RS-485+</td>
<td width="38" port="p7I"></td>
<td width="38" port="p7J"></td>
<td width="38" port="p7K"></td>
</tr>
<tr>
<td port="p8l">8</td>
<td>RS-485-</td>
<td width="38" port="p8I"></td>
<td width="38" port="p8J"></td>
<td width="38" port="p8K"></td>
</tr>
<tr>
<td port="p9l">9</td>
<td>RS-485 Shield</td>
<td width="38" port="p9I"></td>
<td width="38" port="p9J"></td>
<td width="38" port="p9K"></td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ff0000:#000000" label=" "]
W1:w1:e -- X2:p1l:w
edge [color="#000000:#000000:#000000" label=" "]
W1:w2:e -- X2:p2l:w
edge [color="#000000:#f5f0d0:#000000" label=" "]
W1:w3:e -- X2:p7l:w
edge [color="#000000:#0066ff:#000000" label=" "]
W1:w4:e -- X2:p8l:w
edge [color="#000000:#00ff00:#000000" label=" "]
W1:w5:e -- X2:p9l:w
{ // keep edge attributes contained within subgraph
edge [color="#000000" addPTS=1 headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p2I:c -- X2:p2I:c
X2:p1J:c -- X2:p5J:c
X2:p8J:c -- X2:p8J:c
X2:p9J:c -- X2:p9J:c
X2:p3K:c -- X2:p4K:c
X2:p6K:c -- X2:p9K:c [color=red] // for fun
X2:p4I:c -- X2:p5I:c
X2:p5I:c -- X2:p8I:c
}
W1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">5x</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td> </td></tr>
<tr>
<td><!-- 1_in --></td>
<td>
1:RD
</td>
<td>X2:1:+28VDC</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ff0000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 2_in --></td>
<td>
2:BK
</td>
<td>X2:2:+28VDC RTN</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 3_in --></td>
<td>
3:IV
</td>
<td>X2:7:RS-485+</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#f5f0d0" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 4_in --></td>
<td>
4:BU
</td>
<td>X2:8:RS-485-</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#0066ff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 5_in --></td>
<td>
5:GN
</td>
<td>X2:9:RS-485 Shield</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w5" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td> </td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
}