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