--
------------------------------------------------------------------------------
Mr Andrew Dorrell
School of Electrical Engineering *
University of Technology, Sydney *
PO Box 123 *
Broadway NSW 2007 .
AUSTRALIA
* /---\ Whoo?
Phone: 61 2 330 2395 (o o) /
Fax: 61 2 330 2435 ( : )
email: andrewd_at_ee.uts.edu.au ^ ^
OR dorrell_at_ihf.uts.edu.au
------------------------------------------------------------------------------
begin gnuplot.stklos:
(define-class <gnuplot> ()
((stk-process)
(data-file)
(valid-terms)
(valid-styles)
(terminal :allocation :virtual
:slot-ref (lambda(o)
(let ((in-port (process-input
(slot-ref o 'stk-process)))
(out-port (process-error
(slot-ref o 'stk-process))))
(flush out-port)
(format in-port "show term~A" #\newline)
(flush in-port)
(do ((s (string->symbol "")))
((memq s (slot-ref o 'valid-terms)) s)
(set! s (read out-port)))))
:slot-set! (lambda(o t)
(let ((in-port (process-input
(slot-ref o 'stk-process)))
(out-port (process-error
(slot-ref o 'stk-process))))
(if (not (memq t (slot-ref o 'valid-terms)))
(error "invalid term type"))
(format in-port "set term ~A~A"
(symbol->string t) #\newline)
(format in-port "replot~A" #\newline)
(flush in-port))))
(data-style :allocation :virtual
:slot-ref (lambda(o)
(let ((in-port (process-input
(slot-ref o 'stk-process)))
(out-port (process-error
(slot-ref o 'stk-process))))
(flush out-port)
(format in-port "show data style")
(newline in-port)
(flush in-port)
(do ((s (string->symbol "")))
((memq s (slot-ref o 'valid-syles)) s)
(set! s (read out-port)))))
:slot-set! (lambda(o s)
(let ((in-port (process-input
(slot-ref o 'stk-process)))
(out-port (process-output
(slot-ref o 'stk-process))))
(if (not (memq s (slot-ref o 'valid-styles)))
(error "invalid data style"))
(format in-port "set data style ~A~A"
(symbol->string s) #\newline)
(format in-port "replot~A" #\newline)
(flush in-port))))
))
(define-method initialize ((self <gnuplot>) initargs)
(slot-set! self 'stk-process (run-process "gnuplot"
:input :pipe
:output :pipe
:error :pipe))
(slot-set! self 'valid-terms '(aifm
atari
dumb
epson
gpic
hpljii
latex
iris4d
mf
mif
nec-cp6
pbm
pcl5
postscript
regis
table
x11))
(slot-set! self 'valid-styles '(lines
points
linespoints
dots
steps
impulses
errorbars
boxes
boxerrorbars))
(slot-set! self 'data-file
(format #f ".plot-data~A"
(number->string
(process-pid
(slot-ref self 'stk-process)))))
(let ((data-style (get-keyword :data-style initargs 'lines))
(term (get-keyword :terminal initargs 'x11)))
(slot-set! self 'data-style data-style)
(slot-set! self 'terminal term)))
;;
;; define a method for plotting
;; the plot-args is a list of things to plot where each thing takes the
;; form of a list wih at least one item --- the data to be ploted (an narray)
;; The optional second item is a string to use as a legend:
;;
;; plot item format: (data title)
;;
(define-method gnuplot ((self <gnuplot>) plot-args)
(let* ((port (process-input (slot-ref self 'stk-process)))
(plot-no 1)
(plot-command (case (narray-dimension (caar plot-args))
((1) "plot ")
((2) "splot ")))
(write-1d (lambda(data port)
(narray-map-elements
(lambda(x)
(format port "~A~A" x #\newline) 0)
data)))
(write-2d (lambda(data port)
(narray-map-blocks
(lambda(row)
(write-1d row port)
(newline port)
0)
(list (car (narray-shape data)) 1)
(list (car (narray-shape data)) 1)
data)))
(compose-plot
(lambda(plot-item)
(let* ((tmp-file (format #f "~A~A"
(slot-ref self 'data-file) plot-no))
(tmp-port (open-output-file tmp-file))
(plot-data (car plot-item))
(plot-legend (if (> (length plot-item) 1) (cadr plot-item)
(format #f "~A" plot-no))))
(case (narray-dimension plot-data)
((1) (write-1d plot-data tmp-port))
((2) (write-2d plot-data tmp-port)))
(close-output-port tmp-port)
(set! plot-no (+ 1 plot-no))
(set! plot-command
(string-append plot-command
(format #f "'~A' title '~A' "
tmp-file plot-legend)))))))
(compose-plot (car plot-args))
(for-each
(lambda(plot-item)
(set! plot-command
(string-append plot-command
(format #f ", ")))
(compose-plot plot-item))
(cdr plot-args))
(format port plot-command)
(newline port)
(flush port)
(after 100 (lambda()
(system (format #f "rm ~A*" (slot-ref self 'data-file)))))))
(define-method eps ((self <gnuplot>) file)
(let ((in-port (process-input (slot-ref self 'stk-process))))
(format in-port "set terminal postscript eps~A" #\newline)
(flush in-port)
(format in-port "set output ~A~A~A~Areplot~A"
#\" file #\" #\newline #\newline)
(flush in-port)
(format in-port "set terminal ~A~Areplot~A"
'x11 #\newline #\newline)
(flush in-port)))
end gnuplot.stklos
Received on Thu Jun 27 1996 - 05:58:08 CEST
This archive was generated by hypermail 2.3.0 : Mon Jul 21 2014 - 19:38:59 CEST