|
|
1.1 root 1: .so ../ADM/mac
2: .XX cip 175 "Cip User's Manual"
3: ....TM 82-11276-1 11173 39199-11
4: ....ND March 19, 1982
5: .EQ
6: delim $$
7: .EN
8: .TL
9: Cip User's Manual:
10: .br
11: One Picture is Worth a Thousand Words
12: .AU "MH 2C-510" 7448
13: Sally A. Browning
14: .AI
15: .MH
16: .AB
17: .I Cip
18: is an interactive drawing system for the Blit
19: |reference(locanthi spe blit)
20: bitmap display terminal designed by Bart Locanthi and Robert Pike.
21: It provides a pallette of
22: .I pic
23: |reference(latest pic)
24: shapes (box, circle, ellipse, line, arc, spline, and text)
25: for drawing and editing pictures on a screen. There is a macro
26: facility for treating a collection of drawn shapes as a single entity.
27: The principal
28: input device is a
29: .I mouse
30: that provides positional information. It has three buttons that invoke
31: drawing, editing, and command functions.
32: The keyboard is used only for typing in text
33: strings and filenames. The pictures are saved as
34: .I pic
35: descriptions, and can be included with text,
36: tables, and equations as input to
37: .I troff |reference(latest reference troff).
38: Existing
39: .I pic
40: descriptions of pictures can be displayed and edited as well. The picture
41: below was drawn with
42: .I cip.
43: .PS <blit.pic
44: .AE
45: .2C
46: .NH
47: The Screen
48: .PP
49: The screen is divided into three areas. The pallette of
50: .I pic
51: shapes is shown at the top of the screen. The middle and major part of
52: the screen is the drawing arena. At the bottom of the screen, there is room
53: for typing text strings and error messages, and a
54: box describing the mouse button functions. There may be a
55: box showing edit depth: it appears only when you are editing a macro.
56: Figure 1 shows the screen immediately after
57: .I cip
58: has been loaded into the Blit.
59: (Figure 1 was drawn with
60: .I cip,
61: of course.)
62: .1C
63: .KF
64: .PS <screen.pic
65: .SP 0.2 exactly
66: .ce
67: \f3Figure 1.\fR The \fIcip\fP screen
68: .KE
69: .2C
70: .PP
71: The drawing area is about 8 inches square. In the spirit of "what you
72: see is what you get",
73: .I cip
74: scales the picture to appear on paper as it does on the screen.
75: The exception is text: the
76: font selection on the Blit
77: is meager compared to the typesetter, and I make
78: no attempt to understand
79: .I troff .*
80: .FS
81: *This paper describes early versions of
82: .I cip .
83: The latest version (3.0) of
84: .I cip ,
85: widely known as
86: .I xcip ,
87: does display and edit text in its
88: correct size and font.
89: .FE
90: Thus,
91: .I eqn
92: and
93: .I troff
94: commands appear
95: literally instead of as they will appear on paper, and all text appears
96: in the same boring font and size. If you want to shrink the picture after
97: drawing it to fill the screen, you need only change one number in the
98: .I pic
99: description. This, and other advantages of having a textual description of
100: the picture, are discussed later.
101: ........
102: .NH
103: Using the Mouse
104: .PP
105: The mouse is the primary input device to
106: .I cip.
107: It is a red hemispheric device that fits comfortably into the
108: palm of your hand, with three fingers positioned on the function
109: buttons. The cursor displayed on the screen will move as you move the mouse.
110: The mouse reports
111: .I relative
112: positions based on the movements of the steel ball in the bottom that moves
113: along the table surface. If you pick up the mouse and put it down somewhere
114: else without causing the ball to rotate, the cursor won't move. This feature
115: is handy if you don't have much clear space on your desk.
116: In addition to providing positional information, the mouse has three buttons
117: that represent command functions. In general, the first (left) button is
118: used for selection, the second (middle) for drawing and editing shapes,
119: and the third (right) for menu selection. In each case, both the down and up
120: motions of the button are significant. When I describe button motions, I will
121: use
122: .I push
123: to describe the press and hold action and
124: .I release
125: to mean letting go of the button.
126: .I Clicking
127: a button means pushing and releasing the button in quick succession.
128: .PP
129: At the bottom of the screen is a box labeled "Mouse Buttons". It contains
130: three smaller boxes that represent the three buttons on the mouse. The boxes
131: are labeled to reflect the
132: .I current
133: set of functions associated with the mouse buttons. For example, Figure 1
134: shows the initial set: (select,,menu). Notice that the second button is
135: meaningless in this state. The second button invokes actions on a selected
136: object, and thus is meaningful only when something (either a template
137: from the top row of the display or a previously drawn object) has been selected.
138: There are other occasions when the right and left buttons are meaningless, and
139: even occasions when all of the buttons are ignored. Table 1 shows the
140: possible button function triples and what states they are associated with.
141: Figure 2 shows the possible transitions between triples of mouse button
142: functions.
143: .PP
144: The mouse button functions are displayed for at least two reasons. First, they
145: make it easier to get acclimated to
146: .I cip
147: and to using a pointing device as the primary input device. Second, they
148: help the more experienced user determine the current state.
149: .1C
150: .KF
151: .PS <mouse.pic
152: .RT
153: .SP 0.2 exactly
154: .ce
155: \fBFigure 2.\fR Transition graph for mouse button functions
156: .TS
157: center box;
158: c | l | l | c | l.
159: State Button Functions Menu Next State How to Get to Next State
160: =
161: 1 (select,,menu) command 4 select drawn object (not text or macro)
162: \^ \^ \^ _ _
163: \^ \^ \^ 5 select a template
164: \^ \^ \^ _ _
165: \^ \^ \^ 6 choose \fBdefine macro\fR
166: \^ \^ \^ _ _
167: \^ \^ \^ 7 choose \fBget file\fR or \fBput file\fR
168: _
169: 2 (select,copy,menu) object 1 select nothing
170: \^ \^ \^ _ _
171: \^ \^ \^ 3 select a text string or a macro instance
172: \^ \^ \^ _ _
173: \^ \^ \^ 4 select an object (not text or macro)
174: \^ \^ \^ _ _
175: \^ \^ \^ 5 select a template
176: _
177: 3 (select,move,menu) object 1 select nothing
178: \^ \^ \^ _ _
179: \^ \^ \^ 2 choose \fBcopy\fR
180: \^ \^ \^ _ _
181: \^ \^ \^ 4 select an object (not text or macro)
182: \^ \^ \^ _ _
183: \^ \^ \^ 5 select a template
184: _
185: 4 (select,edit,menu) object 1 select nothing
186: \^ \^ \^ _ _
187: \^ \^ \^ 2 choose \fBcopy\fR
188: \^ \^ \^ _ _
189: \^ \^ \^ 3 select a text string or a macro instance
190: \^ \^ \^ _ _
191: \^ \^ \^ 5 select a template
192: _
193: 5 (select,draw,menu) command 3 select a text string or a macro instance
194: \^ \^ \^ _ _
195: \^ \^ \^ 4 select a drawn object (not text or macro)
196: \^ \^ \^ _ _
197: \^ \^ \^ 6 choose \fBget file\fR or \fBput file\fR
198: \^ \^ \^ _ _
199: \^ \^ \^ 7 choose \fBget file\fR or \fBput file\fR
200: \^ \^ \^ _ _
201: \^ \^ \^ 8 start drawing a spline
202: _
203: 6 (,draw box,) 1 finish drawing box around macro
204: _
205: 7 (,,,) 1 finish reading or writing file
206: \^ \^ \^ _ _
207: \^ \^ \^ 5 finish reading or writing file
208: _
209: 8 (,draw,end spline) 5 finish drawing a spline
210: _
211: .TE
212: .SP 0.2 exactly
213: .ce
214: \fBTable 1.\fR Mouse button functions
215: .KE
216: .2C
217: .NH
218: Selection
219: .PP
220: The leftmost button on the mouse selects either a template from the
221: row at the top of the screen or an object in the drawing arena. Templates are
222: selected by positioning the cursor inside the box surrounding the desired
223: shape, and clicking button 1. The selected shape will be
224: displayed in reverse video (light on black background) until something
225: else is selected. Drawn objects are selected by positioning the cursor within
226: the bounding box of the desired object, and pushing button 1. The selected
227: object will vanish as long as the button is held down, reappearing when the
228: button is released. This vanishing act alerts the user to which object has
229: been selected. If it is not the desired one, reposition the mouse and try
230: again. It may require several attempts to select an object,
231: particularly in an area of the screen that is congested. An object stays
232: selected until either another object or a template is selected.
233: .PP
234: To "unselect" an object, either select a template or move to a blank area of the
235: screen, push button 1 and select nothing. The unselect was successful if the
236: middle mouse button function is either "draw" or null and the third button
237: function is "menu". A selected object must be unselected
238: (by selecting either nothing or a template) to invoke the command
239: menu rather than an object menu. Menus are described next.
240: .NH
241: Menus
242: .PP
243: The right button on the mouse displays menus of commands and
244: refinements. Before describing the contents of the menus, let me describe
245: how they work.
246: .PP
247: A menu is displayed at the location of the cursor when button 3 is pushed down.
248: The display is visible as long as the button is held down. The menu is a list
249: of words, each representing a command or transformation. When the menu appears
250: on the screen, one of the entries is highlighted in reverse video. If button
251: 3 were released, this is the menu item that would be selected. As the cursor
252: moves up and down in the menu, the highlighted entry changes. If the cursor
253: moves outside the menu, nothing is highlighted. The entry that is highlighted
254: when the third button is released is the chosen one. (If no item is chosen,
255: nothing happens. This allows you to leave a menu without choosing an entry.)
256: .PP
257: There are two classes of menus. The
258: .I
259: command menu
260: .R
261: appears whenever no drawn object is selected and button 3 is pushed. It
262: contains commands that affect the whole screen or some part of it, but not
263: a specific single object. For example,
264: .B
265: reverse video
266: .R
267: flips the sense of
268: the screen. If the screen showed black objects on a light background (the
269: initial state), it will be flipped to show light objects on black. This
270: entry is a flip flop: selecting it an even number of times is equivalent
271: to not selecting it at all. Another entry in the command menu is
272: .B grid.
273: Selecting this entry causes a grid of dots to be displayed on the screen,
274: and future drawing is constrained to the grid points. The command is also
275: a flip flop: to turn it off, select it again. Other commands are
276: .B
277: clear screen, redraw screen, define macro, get file, put file,
278: .R
279: and
280: .B
281: quit.
282: .R
283: The macro and file
284: commands are described later; the others are self-explanatory.
285: .PP
286: If a drawn object is selected when the menu button is pushed, a menu with
287: entries that in some way transform the selected object is displayed. The
288: contents of this menu are tailored to the class of object selected. For
289: example, instances of circles, ellipses, and text can be copied or deleted.
290: Arcs and splines can be copied, deleted, or reflected around either the
291: x or y axis of their bounding box. Boxes can be copied, deleted,
292: or have their boundary be dotted, dashed, or solid. Lines can be copied,
293: deleted, reflected, dotted, dashed, solid, or have an arrowhead attached to
294: the endpoint closest to the cursor. The arrow
295: option is a flip flop: if
296: the nearer endpoint already has an arrowhead, selecting
297: .B arrow
298: again will remove it. Splines can also have arrowheads attached to either or
299: both ends.
300: .PP
301: Remember, if the menu button is depressed accidentally, leave it down long enough
302: to move the cursor outside the menu!
303: .PP
304: Figure 3 shows both command and object menus being used. In the first three
305: frames, the menu associated with splines is displayed and the spline is reflected
306: around the y-axis. The command menu is invoked in the remaining five frames to
307: get a new file. The menu is initially displayed with
308: .B
309: define macro
310: .R
311: highlighted; the mouse is moved up to select
312: .B
313: get file
314: .R
315: before the third button is released.
316: .1C
317: .KF
318: .sp 1
319: .PS <menus.pic
320: .SP 0.2 exactly
321: .ce
322: \fBFigure 3.\fR Using menus
323: .KE
324: .2C
325: .NH
326: Drawing
327: .PP
328: The
329: .I pic
330: language can describe and position
331: circles, boxes (solid, dotted, and dashed), ellipses,
332: lines (solid, dotted, dashed, with or without arrowheads), circular arcs,
333: splines, and text. In addition, there is a mechanism for treating a
334: .I collection
335: of objects as a single entity, hereafter called a
336: .B macro.
337: .NH 2
338: Drawing New Shapes
339: .PP
340: There are two ways to draw shapes on the screen. First, select a template with
341: button 1.
342: Button 2 can be used
343: to draw objects of the selected shape on the screen. The location and size of
344: the drawn object is determined by the down and up motions of the button. For
345: example, to draw a circle, select the circle template, move the cursor to the desired position for
346: the
347: .I center
348: of the circle, and push down on the middle button. As long the button is
349: depressed, the trial radius of the circle will track the mouse movement:
350: as the mouse moves away from the origin, the circle will expand and
351: vise versa. When button 2 is released, the circle radius is fixed as
352: the distance between the origin and mouse position.
353: Table 2 defines the points fixed by button 2 motions for all the
354: shapes.
355: .KF
356: .SP 1
357: .ps -1
358: .vs -1p
359: .TS
360: box center ;
361: c | l | l.
362: Object Push Release
363: _
364: _
365: circle center radius = distance(push,release)
366: _
367: box a corner opposite corner
368: _
369: ellipse center height = $| roman "push" .y - roman "release" .y|$
370: width = $| roman "push" .x - roman "release" .x|$
371: _
372: line endpoint endpoint
373: _
374: arc endpoint endpoint
375: center
376: _
377: spline endpoint point
378: (subsequent releases define
379: another point, until button 3)
380: _
381: text center of
382: baseline
383: .TE
384: .ps +1
385: .vs +1p
386: .SP 0.2 exactly
387: .ce
388: \fBTable 2.\fR Using button 2 for drawing shapes
389: .KE
390: .PP
391: Arcs are drawn counter-clockwise. When an arc is drawn, it will be
392: either one quarter or three quarters of a circle (in imitation of
393: .I pic
394: defaults). If you want something else, select and edit the arc once it is
395: drawn. The picture below shows the default arcs; the order that the endpoints
396: are entered determines whether one fourth or three fourths of a circle is
397: drawn.
398: .KS
399: .PS <arcs.pic
400: .KE
401: .PP
402: Two of the shapes, splines and text, require a few more words to explain
403: how to draw them. Splines are curves that
404: shape themselves to a framework of line segments and are drawn with repetitive
405: pushes of the middle button.
406: Each click adds a line segment to the framework of the spline.
407: .I Pic ,
408: and thus
409: .I cip ,
410: splines will contain the first and last points entered and will be tangent to
411: the midpoint of
412: each line segment in the framework. The spline will be
413: .I near
414: the endpoints of each line segment.
415: Only the framework is shown on the screen while you are entering the spline.
416: To terminate and draw the spline, push the third button. Figure 4 shows the process
417: of drawing a spline.
418: .1C
419: .KF
420: .PS <spline.pic
421: .SP 0.2 exactly
422: .ce
423: \fBFigure 4.\fR Drawing a spline
424: .KE
425: .2C
426: .PP
427: To add some text to the picture, move to the desired position for the
428: .I center
429: of the text string
430: and push and release button 2. Now type the text. It will
431: appear on the lower left portion of the screen, just below the drawing arena.
432: The backspace key can be used to make minor corrections. As soon as, and
433: not until, you push carriage return, the string will be displayed in the
434: drawing arena, centered at the selected location. Figure 5 pictures the
435: stages of drawing text.*
436: .FS
437: *At least, in older versions of
438: .I cip .
439: In version 3.0, text appears as you type it.
440: .FE
441: .1C
442: .KF
443: .PS <text.pic
444: .SP 0.2 exactly
445: .ce
446: \fBFigure 5.\fR Drawing text
447: .KE
448: .2C
449: .NH 2
450: Copying Existing Shapes
451: .PP
452: The second way to draw shapes on the screen is by copying previously drawn
453: things. First use button 1 to select a specific drawn object
454: rather than a template.
455: Then push button 3 to get a menu pertinent to the selected object.
456: Select the menu entry
457: .B copy.
458: Now, button 2 can be used to position exact copies of
459: the selected object. The
460: .I origin
461: of the object (see Table 3) will be located at the cursor position when
462: button 2 is pushed. In this case, the release of button 2 is necessary but
463: meaningless.
464: .KF
465: .SP
466: .TS
467: center allbox;
468: c l.
469: Object Origin
470: _
471: circle center
472: box upper left corner
473: ellipse center
474: line first drawn point
475: arc first drawn point
476: spline first drawn point
477: text center of baseline
478: macro upper left corner
479: .TE
480: .SP 0.2 exactly
481: .ce
482: \fBTable 3.\fR The origins of objects
483: .KE
484: .NH 2
485: Alignment Aids
486: .PP
487: .I Cip
488: has a few features built in to make positioning objects easier. First, lines
489: that are drawn
490: .I nearly
491: horizontal or vertical will be made exactly so. Also, each of the basic shapes
492: has a number of points designated
493: .I sticky.
494: As you move the cursor near these special points, it will tend to stick to them
495: until you move sufficiently far away. Figure 6 shows the sticky points for
496: each shape. The corners of the
497: .I
498: bounding box
499: .R
500: of a macro instance are sticky as well.
501: The final alignment aid is the grid. When the grid is turned on, drawn
502: objects will rachet from grid point to grid point as you move the cursor.
503: The cursor is prejudiced in favor of sticky points: it will move to the
504: nearest grid point only when there is no close sticky point.
505: .1C
506: .KF
507: .PS <sticky.pic
508: .SP 0.2 exactly
509: .ce
510: \fBFigure 6.\fR Sticky points
511: .KE
512: .2C
513: .NH
514: Editing
515: .PP
516: The editing facilities of
517: .I cip
518: allow both the position and size of previously drawn objects to be changed. The
519: basic mechanism is to
520: .I select
521: the object with button 1, and then use button 2 for the actual editing. The
522: position of the cursor when button 2 is depressed and the shape of the selected
523: object determine the editing action. For example, suppose a circle
524: has been selected. If the cursor is near the origin of the circle when
525: the middle button is pushed, the origin of the circle will track the cursor
526: as long as the button is depressed. Its new location will be the cursor
527: position when the button is released, and the radius will be unchanged.
528: If, instead, the cursor is near the edge of the circle when the middle button
529: is depressed, the center of the circle will remain fixed, and the radius of
530: the circle will track the cursor. The other objects are edited in the same
531: manner: near the center moves the object, near the edge (or corner, or
532: endpoint) changes the size, with the exception of arcs, splines, text, and macros.
533: .PP
534: Arcs have three interesting points: the two endpoints, and the center of
535: the circle that contains the arc. The point nearest the cursor when
536: button 2 is depressed will track the cursor. (There is no way to
537: reposition the arc.) This includes the center of the circle, which is shown
538: with a pair of lines when the arc is selected.
539: .PP
540: Splines have a variable number of
541: .I
542: guiding points
543: .R
544: that can be changed. Lines between the
545: guiding points are drawn to help in locating them when the spline is selected.
546: The point
547: nearest the cursor when the middle button is depressed will track the mouse
548: motions, becoming fixed at the cursor position when the button is released.
549: Again, there is no way to move the whole spline.
550: .PP
551: It doesn't make sense in
552: .I cip's
553: world to change the size of text. Accordingly, it can only be moved. After
554: the text is selected and button 2 is pushed, the text string will track
555: the cursor, coming to rest when the button is released.
556: The
557: .I contents
558: of a text string are changed by deleting the string and re-entering it
559: correctly.*
560: .FS
561: *In version 3.0, the size, font, vertical spacing and adjustment
562: (left justified, right justified or centered) can be changed from the button 3 menu.
563: .FE
564: .PP
565: Macro editing is more complex. An instance of a macro can be repositioned
566: by selecting the instance and pushing the second button. The entire macro
567: will track the mouse movements until the button is released. Changing the
568: .I components
569: of the macro will be discussed in the next section.
570: .PP
571: The editing facilities of
572: .I cip
573: are summarized below. Figure 7 shows the process of editing
574: a spline; the technique is similar for all simple shapes.
575: .KS
576: .PS
577: scale=100
578: box ht 40 wid 60 with .nw at 70,650 dashed
579: box ht 80 wid 120 with .nw at 40,670
580: box ht 40 wid 60 with .nw at 10,610 dotted
581: box ht 40 wid 60 with .nw at 10,690 dotted
582: box ht 40 wid 60 with .nw at 130,690 dotted
583: box ht 40 wid 60 with .nw at 130,610 dotted
584: .PE
585: .KE
586: .de XY
587: .ti 0
588: ..
589: .de XX
590: .br
591: ..
592: .in 5n
593: .XY
594: To edit solid box:
595: .XX
596: a) cursor inside a dotted box: move corner
597: .XX
598: b) cursor inside dashed box: move box
599: .KS
600: .PS
601: scale=100
602: circle rad 29 at 96,458
603: circle rad 65 at 96,458
604: .PE
605: .KE
606: .XY
607: To edit outer circle:
608: .XX
609: a) cursor inside inner circle: move circle
610: .XX
611: b) cursor in ring between circles: change radius
612: .KS
613: .PS
614: scale=100
615: ellipse ht 120 wid 216 at 116,257
616: box ht 51 wid 65 with .nw at 6,283 dotted
617: box ht 51 wid 65 with .nw at 161,283 dotted
618: box ht 36 wid 90 with .nw at 71,232 dashed
619: box ht 36 wid 90 with .nw at 71,319 dashed
620: .PE
621: .KE
622: .XY
623: To edit ellipse:
624: .XX
625: a) cursor in a dashed box: change height
626: .XX
627: b) cursor in a dotted box: change width
628: .XX
629: c) cursor anywhere else in ellipse: move ellipse
630: .KS
631: .PS
632: scale=100
633: line from 104,0 to 0,60 dotted
634: line from 104,119 to 209,60 dotted
635: line from 0,0 to 209,119
636: box ht 119 wid 209 with .nw at 0,119 dotted
637: .PE
638: .KE
639: .XY
640: To edit solid line:
641: .XX
642: a) cursor in the dotted box and between the dotted lines: move line
643: .XX
644: b) cursor in a dotted triangle: move endpoint
645: .KS
646: .PS
647: scale=100
648: box ht 128 wid 128 with .nw at 20,702 dashed
649: line from 84,574 to 84,606 dashed
650: line from 84,670 to 84,702 dashed
651: circle rad 32 at 84,638
652: line from 129,683 to 84,638 dotted
653: line from 39,683 to 84,638 dotted
654: arc from 129,683 to 39,683 at 84,638
655: .PE
656: .KE
657: .XY
658: To edit arc: (dotted lines appear (solid) when arc is selected)
659: .XX
660: a) cursor inside circle: move origin
661: .XX
662: b) cursor outside circle, inside left dashed box: move endpoint
663: .XX
664: c) cursor outside circle, inside right dashed box: move startpoint
665: .XX
666: .KS
667: .PS
668: scale=100
669: box ht 173 wid 179 with .nw at 0,485 dotted
670: line from 179,372 to 104,355 dotted
671: line from 98,338 to 104,355 dotted
672: line from 148,448 to 74,410 dotted
673: line from 179,464 to 148,448 dotted
674: line from 80,453 to 64,428 dotted
675: line from 64,428 to 7,424 dotted
676: line from 93,485 to 80,453 dotted
677: line from 85,391 to 104,355 dotted
678: line from 64,428 to 85,391 dotted
679: line from 85,312 to 98,338 dotted
680: line from 0,485 to 140,475 dashed
681: line from 170,417 to 0,485 dashed
682: line from 13,369 to 179,312 dashed
683: line from 170,417 to 13,369 dashed
684: spline from 140,475\
685: to 0,485\
686: to 170,417\
687: to 13,369\
688: to 179,312
689: "\(bu" at 0,485
690: "\(bu" at 179,312
691: "\(bu" at 13,369
692: "\(bu" at 170,417
693: "\(bu" at 140,475
694: .PE
695: .KE
696: .XY
697: To edit spline: (dashed lines appear (solid) when spline is selected)
698: .XX
699: a) cursor inside a dotted region: move guiding point (large dot)
700: .KS
701: .PS
702: scale=100
703: box ht 18 wid 92 with .nw at 36,254 dotted
704: "Text String" at 79,241
705: .PE
706: .KE
707: .XY
708: To edit text:
709: .XX
710: a) cursor anywhere: move text
711: (To change the contents of the string, delete it
712: and re-type it correctly.)*
713: .FS
714: *In version 3.0, you can change the point size, vertical spacing,
715: font and adjustment of text from the menu.
716: .FE
717: .KS
718: .PS
719: scale=100
720: box ht 130 wid 139 with .nw at 19,130 dotted
721: line from 58,71 to 92,96
722: line from 92,96 to 123,73
723: line from 43,32 to 58,51
724: line from 58,51 to 71,32
725: line from 110,33 to 123,53
726: line from 123,53 to 138,34
727: circle rad 10 at 92,106
728: circle rad 10 at 58,61
729: circle rad 10 at 123,63
730: circle rad 10 at 43,22
731: circle rad 10 at 71,22
732: circle rad 10 at 110,23
733: circle rad 10 at 138,24
734: .PE
735: .KE
736: .XY
737: To move an instance of a macro:
738: .XX
739: a) cursor anywhere: move macro
740: .br
741: (Changing the components of a macro is discussed elsewhere)
742: .in 0
743: .1C
744: .KF
745: .PS <editSpline.pic
746: .SP 0.2 exactly
747: .ce
748: \fBFigure 7.\fR Editing a spline
749: .KE
750: .2C
751: .NH
752: Macros
753: .PP
754: .I Cip
755: has a macro facility that allows objects to be grouped together and treated
756: as a single entity. The aggregate can be moved, reflected, copied, or deleted.
757: In addition, components of the macro can be modified, deleted, or added.
758: Changes made to the components will be reflected in
759: .I all
760: instances of the macro, except those that have been reflected.
761: .PP
762: A group of objects is collected into a macro by selecting the
763: .B
764: define macro
765: .R
766: option in the command menu. A bounding box is drawn around the desired
767: objects using button 2. Any object that is completely contained in the
768: bounding box will be included in the aggregate.
769: .PP
770: Once the definition is complete, the macro instance can be selected in the
771: usual manner.
772: The object menu for macros has entries for deleting, copying, and reflecting
773: the macro instance. It can be repositioned by holding the middle button down.
774: The center of the bounding box will track the cursor until the button is
775: released.
776: .PP
777: The macro object menu has a fifth entry that allows the components of the
778: macro to be modified, deleted, or added. Selection, drawing, editing, and
779: menus work exactly as described before except that they operate within
780: the context of the macro. When editing begins, a small box appears on the
781: screen to the left of the Mouse Buttons box. It shows the current depth of
782: macro editing. (Yes, Virginia, macros can be nested.) To terminate the
783: editing, move the cursor inside the Edit Depth box and click the
784: selection button, decrementing the depth count. When the
785: count goes to zero, the screen will be redrawn to reflect the changes.
786: Modifications to macros affect
787: .I all
788: instances of the macro.
789: .PP
790: Detail can be added to a single instance of a macro by drawing
791: over it. Components of an individual
792: instance cannot be deleted or modified without changing all instances.
793: .PP
794: Suppose you define a macro that contains a circle in a box. After
795: replicating it several times, you decide that one instance should not
796: have the circle. The sixth entry in the macro menu,
797: .B separate,
798: will separate the aggregate back into individual objects. That is, for a
799: .I
800: selected instance
801: .R
802: of a macro, the
803: .B
804: define macro
805: .R
806: operation will be undone. Now you can select the offending circle and
807: delete it without changing the other instances of the macro. However,
808: changes made to the macro will no longer affect the separated objects.
809: .NH
810: Saving Pictures
811: .PP
812: The command menu has two entries that involve file operations.
813: .B
814: Put file
815: .R
816: converts the picture on the screen into
817: .I pic
818: and saves it in a file on the host machine. Similarly,
819: .B
820: get file
821: .R
822: reads a file, presumed to be
823: .I pic,
824: and draws the resulting picture on the screen. Both commands ask for a
825: file name: the prompt
826: .CW FILE?
827: appears in the lower left part of the screen,
828: just below the drawing arena (see Figure 3g).
829: The filename from the previous get or put
830: command will be automatically displayed to reduce the amount of typing
831: necessary. Typing <CR> (carriage return) uses the default filename.
832: .PP
833: There are four error conditions that may arise following a file operation.
834: Attempts to put a file are the least error prone: the only error,
835: besides the host being down, is that you don't have the right to
836: write the file in question. Get file commands are subject to
837: errors involving access rights to the file, problems opening a pipe to
838: parse the pic, and having a picture that is too
839: complicated to fit within the available memory of the Blit.
840: Errors are reported in the lower left portion of the screen, just below
841: the drawing arena.
842: .NH
843: Commentary
844: .PP
845: .I Cip
846: grew out of my experience with
847: .I pic.
848: It is wonderful to be able to describe and draw pictures that can included
849: right along with text in a document. However, words are not always the
850: best form of expression. It is easy to spend an afternoon
851: turning a five minute sketch into a
852: .I pic
853: description.
854: .I Cip
855: allows you to do the sketch online and get the
856: .I pic
857: description as a bonus.
858: .PP
859: I have put most of my efforts into the user interface. There is a minimum of
860: typing: only file names and text strings are entered from the keyboard. There
861: are alignment aids: sticky points, help with vertical and horizontal lines,
862: and a grid option. The current meaning of the mouse buttons is displayed.
863: Only use will tell if these aids are enough.
864: .PP
865: Before going on to a discussion of the limitations of
866: .I cip,
867: let me mention a
868: .I good
869: thing about saving the picture as readable text. The
870: .I pic
871: produced by
872: .I cip
873: is full of numbers, including the line
874: .CW scale=100 .
875: The resolution on the Blit
876: is 100 pixels/inch, and this command is necessary for the picture
877: to be the same size on both the screen and a piece of paper.
878: Thus, the size of the picture can be changed
879: by changing the scale. For example, all of the miniature
880: .I cip
881: screens that appear in this document originated from the big version in
882: Figure 1. The screens in Figures 3, 4, 5, and 7 were created with
883: .CW scale=300
884: and are roughly one ninth the size of the original; the one
885: on the cover page had
886: .CW scale=450 .
887: Ragged edges and small imperfections
888: in the picture can be removed by twiddling the position and size of
889: objects. One common way to use
890: .I cip
891: is to draw a rough version on the screen, and refine it by using a
892: combination of
893: .I cip
894: editing and
895: .I pic
896: editing.
897: .PP
898: .I Cip
899: resides almost entirely in the Blit.
900: (Implementations also exist for the DMD5620 and 630MTG terminals.)
901: The host machine provides
902: the file system and parses
903: .I pic;
904: everything else is done in the terminal. While this approach is
905: not subject to the delays in response time that plague timesharing users,
906: it does require a large program (50K bytes) to be downloaded into the
907: terminal through a serial connection. It should be interesting to compare this
908: approach to one in which the major part of the program runs in the host, with
909: the terminal providing only the graphic support.
910: .PP
911: There are some things that can be expressed in a textual language like
912: .I pic
913: that are difficult to describe graphically. Examples are relationships between
914: objects (text centered in a box that is somehow part of the box and should
915: move with it), shortening a line between two circles by the radius of the
916: circle, naming objects and referring to them. Ivan Sutherland's thesis,
917: Sketchpad|reference(sutherland sketchpad)
918: dealt with the problem of expressing constraints between objects; his techniques
919: will be incorporated into
920: .I cip
921: at some point in the future.
922: .PP
923: Adding functionality to
924: .I cip
925: is constrained by having
926: .I pic
927: as the output form.
928: Potentially interesting extensions like arbitrary rotation of objects,
929: shapes that are solid or shaded rather than outlined, shapes that
930: obscure things that are behind them, and so on, are ruled out
931: because they cannot be described in
932: .I pic.
933: Chris Van Wyk's
934: .I ideal |reference(latest ideal)
935: .I does
936: allow these extensions. It might be interesting to do a drawing system
937: for it.
938: .PP
939: Brian Kernighan, in addition to his role as
940: .I pic
941: oracle, provided the program that runs on the host, parses
942: .I pic
943: files, and sends a simplified form of the picture to the Blit.
944: Bart Locanthi and Rob Pike built the Blit
945: and wrote the graphics support and file system access routines. And finally,
946: my first and most enthusiastic user was Norm Schryer. My thanks to them all.
947: .NH 1
948: References
949: .LP
950: |reference_placement
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.