CCL Home Page
Up Directory CCL gui-2.lsp
;;   gui-2.lsp - Implementation-dependent GUI code, CLISP and Tcl
;;   Copyright (C) 1996,1997 Will Ware
;;   
;;   This program is free software; you can redistribute it and/or
;;   modify it under the terms of the GNU General Public License
;;   as published by the Free Software Foundation; either version 2
;;   of the License, or (at your option) any later version.
;;   
;;   This program is distributed in the hope that it will be useful,
;;   but WITHOUT ANY WARRANTY; without even the implied warranty of
;;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;   GNU General Public License for more details.
;;   
;;   You should have received a copy of the GNU General Public License
;;   along with this program; if not, write to the Free Software
;;   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;;
;;   I can be reached via email at .

(define (atom-color name)
  (cond ((equal? name "C") (tellwish "{set_color black}"))
	((equal? name "H") (tellwish "{set_color white}"))
	((equal? name "O") (tellwish "{set_color red}"))
	(else              (tellwish "{set_color blue}"))))

(defun re-center () '())

(defun select-pen (c)
  (case c
	(normal
	 (tellwish "{set_pen black 1}"))
	(double-bond
	 (tellwish "{set_pen black 3}"))
	(triple-bond
	 (tellwish "{set_pen black 5}"))
	(force-vector
	 (tellwish "{set_pen red 1}"))
	(else
	 (format t "??: (select-pen ~c)~%" c))))

(define (set-bondorder b)
  (case b
	(single (setf current-bond-order 1))
	(double (setf current-bond-order 2))
	(triple (setf current-bond-order 3))))

(define (set-element e)
  (case e
	(c (setf current-element "C"))
	(n (setf current-element "N"))
	(o (setf current-element "O"))
	(h (setf current-element "H"))))

(define (set-eminspeed s)
  (case s
	(coarse (setf emin-factor coarse-emin-factor))
	(fine (setf emin-factor fine-emin-factor))))



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Routines for handling Lisp-to-Wish communication
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(in-package 'user)

;; Variable to hold stream used to communicate with Wish
(defvar *lisp-to-wish-stream*)

(defun start-wish-process ()
  (setq *lisp-to-wish-stream*  (run-shell-command
				"wish -f gui-2.tcl"
				:input :stream
				:output :stream)))

;; Send "format"-type string to Wish

(defmacro tellwish (&rest args)
  `(progn
     (format *lisp-to-wish-stream* ,(car args) ,@(cdr args))
     (terpri *lisp-to-wish-stream*)
     (force-output *lisp-to-wish-stream*)))

;; Send end-of-transmission symbol, giving control back to Wish
(defmacro finish-lisp-broadcast ()
  '(tellwish "@"))

;; Close the stream to Wish
(defun close-wish-stream ()
  (finish-lisp-broadcast)  ;; When we're done shutting down
  (close *lisp-to-wish-stream*))





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Handle interaction between program and Wish
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun delete-all ()
  (tellwish "delete_erasable"))

(defun draw-line (x1 y1 x2 y2)
  (tellwish "{create_line ~a ~a ~a ~a}" x1 y1 x2 y2))

(defun draw-ellipse (x1 y1 d)
  (tellwish "{create_ellipse ~a ~a ~a ~a}" x1 y1 (+ x1 d) (+ y1 d)))

(defun get-file-name ()
  (format t "~%Please type the file name in double-quotes: ")
  (read *standard-input*))

(defun show-gui ()
  (start-wish-process)
  (do ((wish-read (read-line *lisp-to-wish-stream*)
		  (read-line *lisp-to-wish-stream*)))
      ;; Let user exit without closing connection
      ((equal wish-read "exit") (close-wish-stream))
      (let ((from-tcl (read-from-string wish-read)))
	(case (car from-tcl)
	      (startup (update-display true))
	      (clear (clear-structure)
		     (update-display false))
	      (emin (emin-step)
		    (update-display true))
	      (options
	       (setf draw-force-vectors (= 1 (nth 1 from-tcl)))
	       (setf use-torsion-forces (= 2 (nth 1 from-tcl)))
	       (setf use-vdw-forces     (= 3 (nth 1 from-tcl)))
	       (update-display true))
	      (controls
	       (set-action     (nth 1 from-tcl))
	       (set-bondorder  (nth 2 from-tcl))
	       (set-element    (nth 3 from-tcl))
	       (set-zoomfactor (nth 4 from-tcl))
	       (set-eminspeed  (nth 5 from-tcl)))
	      (load
	       (load-structure (get-file-name)))
	      (save
	       (save-structure (get-file-name)))
	      (savexyz
	       (save-structure-xyz (get-file-name)))
	      (press-1
	       (funcall press-function (nth 1 from-tcl) (nth 2 from-tcl)))
	      (move-1
	       (funcall drag-function (nth 1 from-tcl) (nth 2 from-tcl)))
	      (release-1
	       (funcall release-function (nth 1 from-tcl) (nth 2 from-tcl)))))
      (finish-lisp-broadcast)))
Modified: Sun Mar 23 17:00:00 1997 GMT
Page accessed 4150 times since Sat Apr 17 22:31:47 1999 GMT