1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#!/bin/sh
nawk '
BEGIN {
xmarksize = ymarksize = .3
marktype = "circle"
vfont = "Times-Roman"
vfontsize = 8
efont = "Times-Roman"
efontsize = 8
fill = 1.
xs = ys = 1.
xmin = ymin = 999999.
xmax = ymax = -999999.
n = 0
m = 0
mode = 0
NOLABEL = "_NOLABEL"
pi = 3.141593
deg90 = pi / 2.
elabdist = .1
vlab = elab = 1
larrows = rarrows = 0
}
NF == 0 || substr($1, 1, 1) == "#" { next }
$1 == "xmarksize" { xmarksize = $2 ; next }
$1 == "ymarksize" { ymarksize = $2 ; next }
$1 == "marksize" { xmarksize = ymarksize = $2 ; next }
$1 == "marktype" { marktype = $2 ; next }
$1 == "vfont" { vfont = $2 ; next }
$1 == "vfontsize" { vfontsize = $2 ; next }
$1 == "efont" { efont = $2 ; next }
$1 == "efontsize" { efontsize = $2 ; next }
$1 == "font" { vfont = efont = $2 ; next }
$1 == "fontsize" { vfontsize = efontsize = $2 ; next }
$1 == "fill" { fill = $2 ; next }
$1 == "xs" { xs = $2 ; next }
$1 == "ys" { ys = $2 ; next }
$1 == "scale" { xs = ys = $2 ; next }
$1 == "elabdist" { elabdist = $2 ; next }
$1 == "vlab" { vlab = $2 ; next }
$1 == "elab" { elab = $2 ; next }
$1 == "lab" { vlab = elab = $2 ; next }
$1 == "larrows" { larrows = $2 ; next }
$1 == "rarrows" { rarrows = $2 ; next }
$1 == "arrows" { larrows = rarrows = $2 ; next }
$1 == "edges" {
mode = 1
printf "newgraph\n"
printf "xaxis min %f max %f size %f nodraw\n", xmin, xmax, (xmax - xmin) * xs
printf "yaxis min %f max %f size %f nodraw\n\n", ymin, ymax, (ymax - ymin) * ys
next
}
$1 == "raw" { mode = 2 ; next }
{
if (!mode) {
x[n] = $1
y[n] = $2
vlabel[n] = (NF == 3 ? $3 : n)
if (x[n] < xmin) xmin = x[n]
else if (x[n] > xmax) xmax = x[n]
if (y[n] < ymin) ymin = y[n]
else if (y[n] > ymax) ymax = y[n]
n++
}
else if (mode == 1) {
src[m] = label_to_node($1)
dst[m] = label_to_node($2)
elabel[m] = (NF == 3 ? $3 : NOLABEL)
m++
}
else
print $0
}
END {
printf "\n"
for (i = 0; i < n; i++) {
printf "newline marktype %s marksize %f %f fill %f pts %f %f\n", marktype, xmarksize, ymarksize, fill, x[i], y[i]
if (vlab)
printf "newstring x %f y %f vjc hjc font %s fontsize %d : %s\n", x[i], y[i], vfont, vfontsize, vlabel[i]
}
printf "\n"
for (i = 0; i < m; i++) {
printf "newline marktype %s marksize %f %f fill %f pts %f %f %f %f ", marktype, xmarksize, ymarksize, fill, x[src[i]], y[src[i]], x[dst[i]], y[dst[i]]
if (larrows) printf "larrows "
if (rarrows) printf "rarrows "
printf "\n"
if (elab && elabel[i] != NOLABEL) {
midx = (x[src[i]] + x[dst[i]]) / 2.
midy = (y[src[i]] + y[dst[i]]) / 2.
ang = atan2(y[dst[i]] - y[src[i]], x[dst[i]] - x[src[i]])
nang = ang - deg90
px = midx + elabdist * cos(nang)
py = midy + elabdist * sin(nang)
rot = ang * 180. / pi
rot = (rot < 0. ? rot + 360. : rot)
rot = (rot >= 90. && rot <= 270. ? rot + 180. : rot);
printf "newstring x %f y %f vjc hjc rotate %f font %s fontsize %d : %s\n", px, py, rot, efont, efontsize, elabel[i]
}
}
}
function label_to_node(label) {
for (i = 0; i < n; i++)
if (vlabel[i] == label)
return(i)
return(-1)
}
'
|