]> granicus.if.org Git - graphviz/commitdiff
Add addranks gvpr script
authorerg <devnull@localhost>
Thu, 14 Jul 2011 15:42:42 +0000 (15:42 +0000)
committererg <devnull@localhost>
Thu, 14 Jul 2011 15:42:42 +0000 (15:42 +0000)
cmd/gvpr/lib/addranks.g [new file with mode: 0644]

diff --git a/cmd/gvpr/lib/addranks.g b/cmd/gvpr/lib/addranks.g
new file mode 100644 (file)
index 0000000..63966be
--- /dev/null
@@ -0,0 +1,36 @@
+/* Assuming nodes have been positioned by dot, this adds a rank
+ * attribute by placing all nodes with the same y value on a specific
+ * integer rank.
+ * If the graph has rankdir=LR, x and y are flipped.
+ */
+BEG_G {
+  double x,y;
+  int lv[double];
+  int r, rk[double];
+  int flip;
+  if (isAttr($,"G","rankdir") && $.rankdir=="LR") flip = 1;
+}
+N {
+  sscanf($.pos,"%f,%f",&x,&y);
+  if (flip) lv[x] = 1;
+  else lv[y] = 1;
+}
+BEG_G {
+  r = 0;
+  if (flip)
+    forr (lv[x]) {
+      rk[x] = r++;
+      /* printf (2, "rk[%f] = %d\n", y, rk[y]); */
+    }
+  else
+    forr (lv[y]) {
+      rk[y] = r++;
+      /* printf (2, "rk[%f] = %d\n", y, rk[y]); */
+    }
+}
+N {
+  sscanf($.pos,"%f,%f",&x,&y);
+  /* printf(2, "node %s y %f rk %d\n", $.name, y, rk[y]); */
+  if (flip) $.rank = sprintf("%d", rk[x]); 
+  else $.rank = sprintf("%d", rk[y]); 
+}