X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=dev%2Fgraphviz%2Fgraphviz-support.lisp;h=a974d64d10852a322fb178b727ff9d210d3af4aa;hb=bba9034e3ef333735caacda78a76ff4f911ff486;hp=e07e661cbe829be5176ad2f820c40e6fb91e2430;hpb=b621ac7a68fbf0d4ee562c4b2eeb7b6d707efa81;p=cl-graph.git diff --git a/dev/graphviz/graphviz-support.lisp b/dev/graphviz/graphviz-support.lisp index e07e661..a974d64 100644 --- a/dev/graphviz/graphviz-support.lisp +++ b/dev/graphviz/graphviz-support.lisp @@ -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) @@ -243,7 +241,7 @@ B--D [] |# (defparameter *dot-graph-attributes* - '((:size coord) + '((:size coordinate) (:bb bounding-box) (:page text) (:ratio (:fill :compress :auto)) ;; Could actually be a float number too @@ -273,10 +271,12 @@ B--D [] :doublecircle)) (:fontsize integer) (:fontname text) + (:fontcolor text) (:color text) (:fillcolor text) (:style (:filled :solid :dashed :dotted :bold :invis)) - (:layer text))) + (:layer text) + (:url text))) (defparameter *dot-edge-attributes* '((:pos spline) @@ -315,32 +315,33 @@ B--D [] (:export-p t)) (defclass* dot-graph-mixin (dot-attributes-mixin) () - (:export-p t)) + (:export-p t) + (:default-initargs + :vertex-class 'dot-vertex + :directed-edge-class 'dot-directed-edge + :undirected-edge-class 'dot-edge)) (defclass* dot-vertex-mixin (dot-attributes-mixin) () (:export-p t)) (defclass* dot-edge-mixin (dot-attributes-mixin) () (:export-p t)) -(defclass* dot-graph (graph-container dot-graph-mixin) +(defclass* dot-graph (dot-graph-mixin graph-container) () - (:default-initargs - :vertex-class 'dot-vertex - :directed-edge-class 'dot-directed-edge - :undirected-edge-class 'dot-edge) (:export-p t)) -(defclass* dot-vertex (graph-container-vertex dot-vertex-mixin) () +(defclass* dot-vertex (dot-vertex-mixin graph-container-vertex) () (:export-p t)) -(defclass* dot-edge (graph-container-edge dot-edge-mixin) () +(defclass* dot-edge (dot-edge-mixin graph-container-edge) () (:export-p t)) -(defclass* dot-directed-edge (directed-edge-mixin dot-edge) () +(defclass* dot-directed-edge (dot-edge directed-edge-mixin) () (:export-p t)) -(defmethod (setf dot-attribute) :before (value (attr symbol) (thing dot-attributes-mixin)) +(defmethod (setf dot-attribute-value) :before (value (attr symbol) (thing dot-attributes-mixin)) + (declare (ignore value)) (ensure-valid-dot-attribute attr thing)) -(defmethod (setf dot-attribute) (value (attr symbol) (thing dot-attributes-mixin)) +(defmethod (setf dot-attribute-value) (value (attr symbol) (thing dot-attributes-mixin)) (setf (getf (dot-attributes thing) attr) value)) (defmethod dot-attribute-value ((attr symbol) (thing dot-attributes-mixin)) @@ -349,8 +350,7 @@ B--D [] (defmethod graph->dot-properties ((graph dot-graph-mixin) (stream t)) (loop for (name value) on (dot-attributes graph) by #'cddr do - (print-dot-key-value name value *dot-graph-attributes* stream) - (format stream " ;~%"))) + (print-dot-key-value name value *dot-graph-attributes* stream))) (defmethod vertex->dot ((vertex dot-vertex-mixin) (stream t)) (format-dot-attributes vertex *dot-vertex-attributes* stream)) @@ -380,7 +380,8 @@ B--D [] (destructuring-bind (key value-type) (or (assoc key dot-attributes) (error "Invalid attribute ~S" key)) - (format stream "~a=~a" (string-downcase key) + (write-name-for-dot key stream) + (format stream "=~a" (etypecase value-type ((member coordinate) (with-output-to-string (str) @@ -392,7 +393,7 @@ B--D [] (princ el str) (setf first nil))) (princ "\"" str))) - ((member spline bounding-box) + ((member spline) (with-output-to-string (str) (princ "\"" str) (let ((first t)) @@ -404,6 +405,18 @@ B--D [] (princ (second el) str) (setf first nil))) (princ "\"" str))) + ((member bounding-box) + (with-output-to-string (str) + (princ "\"" str) + (let ((first t)) + (dolist (el value) + (unless first + (princ ", " str)) + (princ (first el) str) + (princ "," str) + (princ (second el) str) + (setf first nil))) + (princ "\"" str))) ((member integer) (unless (typep value 'integer) (error "Invalid value for ~S: ~S is not an integer" @@ -425,6 +438,12 @@ B--D [] (string-downcase value) value)))))) +(defmethod write-name-for-dot (attribute stream) + (format stream "~(~A~)" attribute)) + +(defmethod write-name-for-dot ((attribute (eql :url)) stream) + (format stream "URL")) + (defun textify (object) (let ((string (princ-to-string object))) (with-output-to-string (stream)