CLIM mail archive


Re: Dragging nodes of a formatting graph

   Date: Thu, 12 Nov 92 10:23:38 PST
   From: Brian Anderson <>
   | somewhat different.  Mine uses format-graph-from-root, which you
   | didn't want. 
   Even when you redraw things at specific coordinates (as a result of
   the user having moved stuff around)?
No, in my version (unlike Bill's, I think), I maintain the
parent-child realtionships, which are changed when nodes are moved to
different parents, but then format-graph from root is used to redraw
the whole tree.  
   | position, allowing the user to drag it in the window.
   Animation would be cool.
   I hope that I have stated my requirements correctly.  I think that you
   understand but from some of the responses on the mail-list, I'm not
   sure that everyone does.  Let me try again just to make sure:

     1.  I want to perform an initial layout of a graph.
	 I would guess that format-graph-from-root would be a likely
	 candidate for doing this.
     2.  Once I have the layout, I want the user to be able to reposition
	 graph nodes.  The idea would be a drag and drop with animation
	 technique.  Of course, arcs would be repositioned also.
1. As with what I described, you CAN use FORMAT-GRAPH to begin with, and
you can implement a drag routine such that nodes can be dragged to a
different parent.  In redrawing using F-G-F-R, new arcs would of
course be drawn between new parent-child relationships.  I DON'T know,
however, how to use updating-output to do this.  I've been working on
it and still can't get that to work.

     3.  Now that I have a user modified layout, I want to gather the
	 coordinates of the nodes and arcs.  Maybe this should be done in
	 some unitless and/or normalized coordinate system?
2. When the nodes are drawn, a) save the output record produced by a
CLIM:PRESENT call, or produce an output record explicitly using
with-new-output-record or some similar function; b) you can convert
the coordinates of the output record to the coordinate-system of the
could save these output records either in the node structures
themselves or in a separate data structure.

     4.  Next, I want to "checkpoint" the current state of the layout in
	 some external representation.  This would involve gathering the
	 set of nodes, their coordinates and the application object that
	 these nodes represent and the set of arcs that comprise the
	 graph and writing some sexp to a file.
You've already got the nodes, I just talked  about how to acquire and
save the coordinates, and I'm assuming the arcs are part of the nodes'

     5.  Finally, I want to reinstantiate the graph from the external
	 representation.  This involves recreating the application
	 objects and drawing the graph at the coordinates specified
	 (rather than automagically doing the layout).  Now, a user
	 should be able to further modify the layout and repeat steps 3-5.

   The questions are:

     1.  Is format-graph-from-root the best starting point for the
	 initial layout of the graph?
Probably, at least to avoid having to do your own graph space-layout
routine, except that as I mentioned, I can't get UPDATING-OUTPUT to work.

     2.  How do I drag and drop nodes, have them redrawn and their
	 respective arcs redrawn?  This is what Bill's and your code
I use something like the following:

(let ((rec (with-new-output-record (win) (draw node win startx starty)))
      (old-win win)
      (old-x startx)
      (old-y starty)
       (win :multiple-window nil)
	;;; null the target because we've moved off, and redraw
       (:pointer-motion (window x y)
			(setq target nil)
                        ;;; if it's moved enough to matter...
			(when (or (not (eql old-win window))
				  (> (abs (- x old-x)) 5)
				  (< (abs (- y old-y)) 5))
	                  ;;; draw the new picture
			  (setq new-rec (clim:with-new-output-record (window)
					  (draw node window x y)))
                          ;;; erase the old one
			  (when rec
			    (clim:erase-output-record rec old-win))
			  (setq rec new-rec)
			  (setq old-win window old-x x old-y y)
If you don't want to do so much of this yourself you should use

     3.  How do I gather coordinates?  How should they be "normalized."
Paragraph 2 above.  I don't know how you want them normalized, so I
can't really answer that.  Using CONVERT- will give you coordinates
with respect to the window origin if you use the window top-level
the second argument.

     4.  What do I use to redraw the graph from a specification of node
	 and arc coordinates?  Can I get formatting-graph-from-root to
	 redraw from a specific set of coordinates rather than computing
	 the "best" coordinates for me as is its typical behavior?
I don't believe F-G-F-R can be used to do this.  However, it shouldn't
be difficult to write a drawing routine if you know where the nodes
belong.  The hard part is figuring out where to put them.

     5.  I presume that I can grab the application object behind the
	 scenes of each node in the graph.  I just haven't looked into
	 this but I presume its straight forward.
The object can be gotten from the presentation with

     6.  I eventually need to deal with directed cyclic graphs.
Then you can't use F-G-F-R and you may have to write your own routine.

     7.  Should I wait for CLIM 2.0.  I am on the queue to get 2.0beta
	 from Franz "real soon now."  Would 2.0's
	 formatting-graph-from-roots be better?
I don't know.  Bill?  Scott?

   Brian H. Anderson
   Boeing Commercial Airplane
   (206) 234-0881

----------------------------------------------------------------------------- ADS BA&H/1953 Gallows Rd #600/Vienna, VA 22182 703-902-7150

Anarchists don't believe in rules.  Surrealists make up their own.


Main Index | Thread Index