Annotation of researchv10dc/vol2/cip/cip.ms, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.