Some more graphviz properties
[cl-graph.git] / dev / graphviz / graphviz-support.lisp
index 63cd048..a27a34b 100644 (file)
@@ -4,10 +4,6 @@
 
 $Id: graphviz-support.lisp,v 1.7 2005/06/21 20:51:51 moody Exp $
 
-Copyright 1992 - 2005 Experimental Knowledge Systems Lab, 
-University of Massachusetts Amherst MA, 01003-4610
-Professor Paul Cohen, Director
-
 Author: Gary King, Levente Mészáros, Attila Lendvai
 
 DISCUSSION
@@ -15,7 +11,7 @@ DISCUSSION
 This file contains the stuff that does not depend on cl-graphviz.
 
 |#
-(in-package metabang.graph)
+(in-package #:metabang.graph)
 
 ;;; ---------------------------------------------------------------------------
 ;
@@ -65,7 +61,7 @@ This file contains the stuff that does not depend on cl-graphviz.
              (princ " [" stream)
              (when (and directed? directed-edge-tag)
                (princ directed-edge-tag stream))
-             (when edge-key
+             (when edge-labeler
                (princ "label=\"" stream)
                (funcall edge-labeler e stream)
                (princ "\"," stream))
@@ -87,9 +83,11 @@ This file contains the stuff that does not depend on cl-graphviz.
         (iterate-vertexes 
          g
          (lambda (v)
+          ;(spy v)
            (iterate-edges
             v
             (lambda (e)
+             ;(spy e (undirected-edge-p e) (item-at-1 edges e))
               (when (and (undirected-edge-p e)
                          (not (item-at-1 edges e)))
                 (setf (item-at-1 edges e) t)
@@ -246,11 +244,13 @@ B--D []
   '((:size coordinate)
     (:bb bounding-box)
     (:page text)
+    (:dpi float)
     (:ratio (:fill :compress :auto)) ;; Could actually be a float number too
     (:margin float)
     (:nodesep float)
     (:ranksep float)
     (:ordering (:out))
+    (:overlap :text)
     (:rankdir ("LR" "RL" "BT"))
     (:pagedir text)
     (:rank (:same :min :max))
@@ -260,12 +260,14 @@ B--D []
     (:mclimit float)
     (:layers text)
     (:color text)
-    (:bgcolor text)))
+    (:bgcolor text)
+    (:fontname text)))
 
 (defparameter *dot-vertex-attributes*
   '((:pos coordinate)
     (:height float)
     (:width float)
+    (:margin float)
     (:fixed-size boolean)
     (:label text)
     (:shape (:record :plaintext :ellipse :circle :egg :triangle :box
@@ -278,7 +280,8 @@ B--D []
     (:fillcolor text)
     (:style (:filled :solid :dashed :dotted :bold :invis))
     (:layer text)
-    (:url text)))
+    (:url text)
+    (:peripheries integer)))
 
 (defparameter *dot-edge-attributes*
   '((:pos spline)
@@ -349,6 +352,22 @@ B--D []
 (defmethod dot-attribute-value ((attr symbol) (thing dot-attributes-mixin))
   (getf (dot-attributes thing) attr))
 
+(defmacro defpixel-inch-accessors (name attr type)
+  (bind ((actual-name (form-symbol name "-IN-PIXELS")))
+    `(progn
+      (export ',actual-name)
+      (defmethod ,actual-name ((thing ,type))
+        "Return the attribute in pixels assuming 72 dpi"
+        (awhen (dot-attribute-value ,attr thing)
+          (* 72 it)))
+      (defmethod (setf ,actual-name) (value (thing ,type))
+        "Set the attribute in pixels assuming 72 dpi"
+        (setf (dot-attribute-value ,attr thing) (coerce (/ value 72) 'double-float))))))
+
+(defpixel-inch-accessors width :width dot-vertex-mixin)
+(defpixel-inch-accessors height :height dot-vertex-mixin)
+
+
 (defmethod graph->dot-properties ((graph dot-graph-mixin) (stream t))
   (loop for (name value) on (dot-attributes graph) by #'cddr
         do
@@ -431,7 +450,9 @@ B--D []
               ((member text)
                (textify value))
               ((member float)
-               (coerce value 'single-float))
+               ;; graphviz does not support the 1.2e-3 format
+               (with-output-to-string (str)
+                 (format str "~,f" (coerce value 'single-float))))
               (list
                (unless (member value value-type :test 'equal)
                  (error "Invalid value for ~S: ~S is not one of ~S"