(FILECREATED "16-Oct-84 10:22:50" {ERIS}<LISPCORE>DEMO>MAPSKETCH.;1 91273 changes to: (VARS MAPSKETCHCOMS)) (* Copyright (c) 1984 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT MAPSKETCHCOMS) (RPAQQ MAPSKETCHCOMS ((FNS ADDFIGUREWELT BITMAPFROMFILE DECODEBITMAP FIGURESPECS GETDRAWPOSITION MAPFIGURESPECS MAPFIGURESPECSUNTIL READBRUSHSIZE READSPLINE READCIRCLE READELLIPSE RESHAPEBYREPAINTANDMOVEFN SETFIGUREWBRUSHSHAPE SETFIGUREWBRUSHSIZE SHOWDRAWPOINT SHOWFIGUREKNOTS) (FNS FIGW.DRAWFIGURE FIGW.ERASE.ELT FIGW.DRAWCURVE FIGW.DRAWIMAGE FIGW.DRAWCIRCLE FIGW.DRAWELLIPSE) (FNS FIGW.ADDCLOSEDCURVE FIGW.ADDCIRCLE FIGW.ADDELLIPSE FIGW.ADDOPENCURVE FIGW.DELETE.ELT FIGW.SEL.AND.DELETE FIGW.DELETE.ITEM FIGW.ERASE.AND.DELETE.ITEM CREATE.CIRCLE.ELT LOCAL.CIRCLE.FROM.GLOBAL CREATE.SPLINE.ELT CREATE.ELLIPSE.ELT LOCAL.ELLIPSE.FROM.GLOBAL COMPUTE.ELLIPSE.ORIENTATION) (FNS FIGW.ADD.ELEMENT FIGW.DELETE.ELEMENT MAPW.INSIDE.REGION ELT.INSIDE.MAPWP FIGW.DISPLAY.AND.ADD.ITEM FIGW.DISPLAY.AND.ADD.ITEMS FIGW.MOVE.THING FIGW.MOVE.ELT FIGW.SEL.AND.MOVE FIGW.MOVE.CURVEPART FIGW.MOVE.CIRCLEPART FIGW.MOVE.ELLIPSEPART FIGW.MOVE.IMAGE) (FNS MARKFIGURE FIGW.SHOWMARKS FIGW.MARKSELECTIONSPOTS MARKKNOTS MARKPOINT MARKCIRCLEKNOTS MARKELLIPSEKNOTS MARKIMAGEKNOTS) (FNS ON.CIRCLE.HOT.SPOT FIGW.SELECT.ITEM FIGW.DESELECT.ELT FIGW.MARK.SELECTION FIGW.SELECT.ELT IN.FIGURE.ELT? ON.HOT.SPOT ON.CURVE.HOT.SPOT ON.ELLIPSE.HOT.SPOT ON.IMAGE.HOT.SPOT FIGW.NEARPT) (COMS (* stuff for changing properties of a figure element) (FNS FIGW.CHANGE.ELT FIGW.SEL.AND.CHANGE FIGW.CHANGE.PROPERTY FIGW.UPDATE.ELEMENT LOCAL.ELT.OF.GLOBALPART FIGW.LOCAL.FROM.GLOBAL LOCAL.CURVE.FROM.GLOBAL LOCAL.TEXT.FROM.GLOBAL LOCAL.IMAGE.FROM.GLOBAL FIGW.UPDATE.FIGURE.ELEMENT1 CHANGE.CURVEPART FIGW.DECODE.DASHING CREATE.SPLINE.ELT.USING READDASHING) (VARS (CURVE.PROPERTY.MENU) (TEXT.PROPERTY.MENU) (IMAGE.PROPERTY.MENU) (CIRCLE.PROPERTY.MENU) (ELLIPSE.PROPERTY.MENU) (CHOOSE.FONT.MENU) (MAPW.NUMBERPAD.READER))) (FNS FIGUREW CREATE.FIGUREW.COMMANDMENU INSPECTFIGURESPECS FIGUREW.BUTTON.HANDLER FIGUREW.CLOSEFN FIGUREW.MOVEFN FIGUREW.OPENFN FIGUREW.REPAINTFN FIGUREW.SELECTIONFN CREATE.MAPW.NUMBERPAD.READER) (* functions for dealing with text.) (FNS FIGW.DRAWTEXT FIGW.ADDTEXT READTEXT POSITIONTEXTELT FIGW.MOVE.TEXT MARKTEXTREGION ON.TEXT.HOT.SPOT CREATE.TEXT.ELT.USING CHANGE.TEXTPART READFONT) (FNS GET.BITMAP.POSITION TRACK.BITMAP1) (FNS DISTANCEBETWEEN SQUARE) (FNS GETAISFILEINFO INVISIBLEPARTP UPPERLEFTMENUPOSITION) (EXPORT (RECORDS PELT SCREENELT CURVE TEXT CIRCLE ELLIPSE IMAGE LOCALIMAGE LOCALELLIPSE LOCALCIRCLE LOCALTEXT LOCALCURVE)) (CURSORS POINTREADINGCURSOR) (UGLYVARS POINTMARK FIGW.SELECTEDMARK FIGW.LOCATEMARK CLOSECURVEICON OPENCURVEICON CIRCLEICON ELLIPSEICON) (COMS (* functions needed from NOTEPAD. Copied here so don't need all of notepad.) (FNS MARK.SPOT READ.FROM.PROMPT.WINDOW GETWREGION) (BITMAPS SPOTMARKER) (CURSORS CIRCLE.CENTER CIRCLE.EDGE ELLIPSE.CENTER ELLIPSE.SEMI.MAJOR ELLIPSE.SEMI.MINOR CURVE.KNOT)) (RECORDS BRUSH) (VARS BITMAPDIRECTORIES DRAWBITMAPALIST DRAWCURVESWITHLINESFLG FIGURE.ELEMENT.TYPES ( DRAWCURVEWITHLINESFLG) DEFAULT.VISIBLE.SCALE.FACTOR (CURRENTFIGUREWBRUSH (CREATE BRUSH BRUSHSHAPE ← (QUOTE ROUND) BRUSHSIZE ← 1 BRUSHCOLOR ← WHITECOLOR)) (CURRENTFIGUREWDASHING) (CURRENTFIGWFONT (QUOTE (HELVETICA 12))) (CHARMICONFONT)) (FILES (FROM VALUEOF LISPUSERSDIRECTORIES) READNUMBER) (GLOBALVARS BITMAPDIRECTORIES DRAWBITMAPALIST DRAWCURVEWITHLINESFLG CURRENTFIGUREWBRUSH CURRENTFIGUREWDASHING POINTMARK CLOSECURVEICON OPENCURVEICON ELLIPSEICON CIRCLEICON POINTMARKHALFWIDTH POINTMARKWIDTH DEFAULT.VISIBLE.SCALE.FACTOR FIGURE.ELEMENT.TYPES))) (DEFINEQ (ADDFIGUREWELT [LAMBDA (PELT FIGUREW) (* rrb "13-JAN-83 11:06") (* adds a picture element to a figure window.) (AND PELT (WINDOWADDPROP FIGUREW (QUOTE FIGURESPECS) PELT]) (BITMAPFROMFILE [LAMBDA (FILE) (* rrb "30-NOV-82 18:31") (* reads a bitmap from a file.) (PROG (BM) (SELECTQ (LISTGET (UNPACKFILENAME FILE) (QUOTE EXTENTION)) [AIS (AISBLT FILE NIL NIL (SETQ BM (BITMAPCREATE (GETAISFILEINFO FILE (QUOTE WIDTH)) (GETAISFILEINFO FILE (QUOTE HEIGHT] (ERROR "Unknown bitmap file format." FILE)) (RETURN BM]) (DECODEBITMAP [LAMBDA (BMSPEC) (* rrb "30-NOV-82 18:33") (* decodes a specification of a bitmap into a bitmap. The spec can be a bitmap, the name of a bitmap, a file name or an expression that evaluates into a bitmap.) (PROG (X) (RETURN (COND ((BITMAPP BMSPEC)) ((SETQ X (FASSOC BMSPEC DRAWBITMAPALIST)) (* provides a way of caching specs) (CDR X)) ((AND (LITATOM BMSPEC) (SETQ X (FINDFILE BMSPEC NIL BITMAPDIRECTORIES))) (* maybe its a file name such as an AIS file.) (* if so save it in the cache for future use.) (SETQ DRAWBITMAPALIST (CONS (CONS BMSPEC (SETQ X (BITMAPFROMFILE X))) BITMAPDIRECTORIES)) X) ((BITMAPP (EVAL BMSPEC]) (FIGURESPECS [LAMBDA (FIGUREW) (* returns the figure specs from a figure window.) (WINDOWPROP FIGUREW (QUOTE FIGURESPECS]) (GETDRAWPOSITION [LAMBDA (W CURSOR) (* rrb "13-JAN-83 13:33") (* provides a hook for the inputting of a point via mouse from the user. for now it is just reading a point but later should add features such as yellow button means an existing pt or left means on a grid.) (RESETFORM (CURSOR (OR CURSOR CROSSHAIRS)) (until (MOUSESTATE LEFT) do (UPDATELATLON W)) (until (MOUSESTATE (NOT LEFT)) do (UPDATELATLON W)) (create POSITION XCOORD ←(LASTMOUSEX W) YCOORD ←(LASTMOUSEY W]) (MAPFIGURESPECS [LAMBDA (FIGSPECS SPECFN DATUM DATUM2) (* rrb "24-JAN-83 19:51") (* walks through a figure specification list and applies SPECFN to each of the individual elements.) (AND FIGSPECS (COND ((FMEMB (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGSPECS)) FIGURE.ELEMENT.TYPES) (APPLY* SPECFN FIGSPECS DATUM DATUM2)) ((LISTP FIGSPECS) (for FIGSPEC in FIGSPECS do (MAPFIGURESPECS FIGSPEC SPECFN DATUM DATUM2))) (T (ERROR "unknown figure specification" FIGSPECS]) (MAPFIGURESPECSUNTIL [LAMBDA (FIGSPECS SPECFN DATUM DATUM2) (* rrb "27-JAN-83 11:49") (* walks through a figure specification list and applies SPECFN to each of the individual elements.) (AND FIGSPECS (COND ((FMEMB (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGSPECS)) FIGURE.ELEMENT.TYPES) (APPLY* SPECFN FIGSPECS DATUM DATUM2)) ((LISTP FIGSPECS) (for FIGSPEC in FIGSPECS bind VALUE when (SETQ VALUE (MAPFIGURESPECSUNTIL FIGSPEC SPECFN DATUM DATUM2)) do (RETURN VALUE))) (T (ERROR "unknown figure specification" FIGSPECS]) (READBRUSHSIZE [LAMBDA NIL (* rrb "25-JAN-83 13:54") (* reads a brush size from the user.) (PROMPTPRINT "Enter new brush size. Entering 0 will leave it the same as now.") (PROG [(N (NUMBERPAD.READ (COND (MAPW.NUMBERPAD.READER) (T (SETQ MAPW.NUMBERPAD.READER (CREATE.MAPW.NUMBERPAD.READER] (CLRPROMPT) (RETURN (COND ((EQ N 0) NIL) (T N]) (READSPLINE [LAMBDA (W CLOSEFLG) (* rrb "24-JAN-83 18:42") (* reads a spline {series of points} from the user.) (PROG (PT PTS) (PROMPTPRINT "Enter the points the curve goes through using the left button. Click outside the window to stop.") LP (COND ((INVISIBLEPARTP W (SETQ PT (GETDRAWPOSITION W POINTREADINGCURSOR))) (* add the point to the list and mark it.) (SETQ PTS (NCONC1 PTS PT)) (SHOWDRAWPOINT PT W) (GO LP)) (T (* erase point markers.) (for PT in PTS do (SHOWDRAWPOINT PT W)) (CLRPROMPT) (* return points) (RETURN (AND PTS (CREATE.SPLINE.ELT PTS CLOSEFLG CURRENTFIGUREWBRUSH CURRENTFIGUREWDASHING W]) (READCIRCLE [LAMBDA (WINDOW) (* rrb "25-JAN-83 18:09") (* reads a two points from the user and returns a circle figure element that it represents.) (PROG (P1 P2) (printout PROMPTWINDOW T "Indicate center of circle") (SETQ P1 (GETPOSITION WINDOW CIRCLE.CENTER)) (MARK.SPOT P1 NIL WINDOW) (printout PROMPTWINDOW T "Indicate a point of the circumference of the circle") (SETQ P2 (GETPOSITION WINDOW CIRCLE.EDGE)) (* erase center mark) (MARK.SPOT P1 NIL WINDOW) (RETURN (CREATE.CIRCLE.ELT P1 P2 CURRENTFIGUREWBRUSH CURRENTFIGUREWDASHING WINDOW]) (READELLIPSE [LAMBDA (WINDOW) (* rrb "24-JAN-83 20:33") (* reads three points from the user and returns the ellipse figure element that it represents.) (PROG (CENTER MAJRAD MINRAD ANGLE) (printout PROMPTWINDOW T "Indicate center of ellipse") (SETQ CENTER (GETPOSITION WINDOW ELLIPSE.CENTER)) (MARK.SPOT CENTER NIL WINDOW) (printout PROMPTWINDOW T "Indicate semi-major axis") (SETQ MAJRAD (GETPOSITION WINDOW ELLIPSE.SEMI.MAJOR)) (MARK.SPOT MAJRAD NIL WINDOW) (printout PROMPTWINDOW T "Indicate semi-minor axis") (SETQ MINRAD (GETPOSITION WINDOW ELLIPSE.SEMI.MINOR)) (* erase the point marks.) (MARK.SPOT MAJRAD NIL WINDOW) (MARK.SPOT CENTER NIL WINDOW) (RETURN (CREATE.ELLIPSE.ELT CENTER MINRAD MAJRAD CURRENTFIGUREWBRUSH CURRENTFIGUREWDASHING WINDOW]) (RESHAPEBYREPAINTANDMOVEFN [LAMBDA (WNEW OLDIMAGEBM OLDREGION) (* rrb "30-DEC-82 11:17") (DECLARE (GLOBALVARS LAMBDASPLST)) (* reshapes a figure window. Moves the menu to its upper left corner.) (PROG [WREG NEWPOS (USERMOVEFN (WINDOWPROP WNEW (QUOTE MOVEFN] (* call repaintfn to redisplay the window.) (RESHAPEBYREPAINTFN WNEW OLDIMAGEBM OLDREGION) (* call the move functions if any) (COND (USERMOVEFN (SETQ NEWPOS (create POSITION XCOORD ←[fetch (REGION LEFT) of (SETQ WREG (WINDOWPROP WNEW (QUOTE REGION] YCOORD ←(fetch (REGION BOTTOM) of WREG))) (* can't implement DON'T as stopping reshape because window has already been reshaped but at least don't cause a udf DON'T.) (COND [(AND (LISTP USERMOVEFN) (NOT (FMEMB (CAR USERMOVEFN) LAMBDASPLST))) (for MFN in USERMOVEFN do (OR (EQ MFN (QUOTE DON'T)) (APPLY* MFN WNEW NEWPOS] ((NEQ USERMOVEFN (QUOTE DON'T)) (APPLY* USERMOVEFN WNEW NEWPOS]) (SETFIGUREWBRUSHSHAPE [LAMBDA (W) (* rrb " 1-DEC-82 12:49") (* sets the size of the brush for drawing in a figure window.) (PROG ((NEWSHAPE (PAINTW.READBRUSHSHAPE))) (RETURN (AND NEWSHAPE (SETQ CURRENTFIGUREWBRUSH (create BRUSH using CURRENTFIGUREWBRUSH BRUSHSHAPE ← NEWSHAPE]) (SETFIGUREWBRUSHSIZE [LAMBDA (W) (* rrb " 1-DEC-82 12:45") (* sets the size of the brush for drawing in a figure window.) (PROG ((NEWSIZE (READBRUSHSIZE))) (RETURN (AND NEWSIZE (SETQ CURRENTFIGUREWBRUSH (create BRUSH using CURRENTFIGUREWBRUSH BRUSHSIZE ← NEWSIZE]) (SHOWDRAWPOINT [LAMBDA (PT W) (* rrb "30-NOV-82 17:09") (* puts down the marker for a point.) (BITBLT POINTMARK NIL NIL W (IDIFFERENCE (fetch (POSITION XCOORD) of PT) (LRSH (fetch (BITMAP BITMAPWIDTH) of POINTMARK) 1)) (IDIFFERENCE (fetch (POSITION YCOORD) of PT) (LRSH (fetch (BITMAP BITMAPHEIGHT) of POINTMARK) 1)) NIL NIL (QUOTE INPUT) (QUOTE INVERT]) (SHOWFIGUREKNOTS [LAMBDA (FIGW) (* rrb " 3-JAN-83 11:26") (* puts up knot markers for all of the curves in a figure window.) (MAPFIGURESPECS (WINDOWPROP FIGW (QUOTE FIGURESPECS)) (FUNCTION MARKFIGURE) FIGW]) ) (DEFINEQ (FIGW.DRAWFIGURE [LAMBDA (SCREENELT DS REGION SCALE) (* rrb "25-JAN-83 18:07") (* draws an element of a figure in a window. Makes sure the scale of the current drawing is with in the limits of the element. Assumes SCALE is a small number.) (PROG ([LONGSCALE (COND ((NULL SCALE) (SCALE.FROM.MAPW DS)) ((NUMBERP SCALE)) ((POSITIONP SCALE) (fetch (POSITION YCOORD) of SCALE)) (T (ERROR "illegal SCALE" SCALE] (GLOBALPART (fetch (SCREENELT GLOBALPART) of SCREENELT))) (* use longitude scale for determining what to display.) (RETURN (AND (IGEQ LONGSCALE (fetch (PELT MINSCALE) of GLOBALPART)) (ILEQ LONGSCALE (fetch (PELT MAXSCALE) of GLOBALPART)) (SELECTQ (fetch (PELT PTYPE) of GLOBALPART) (CURVE (FIGW.DRAWCURVE SCREENELT DS REGION)) (TEXT (FIGW.DRAWTEXT SCREENELT DS REGION)) (IMAGE (FIGW.DRAWIMAGE SCREENELT DS REGION)) (CIRCLE (FIGW.DRAWCIRCLE SCREENELT DS REGION)) (ELLIPSE (FIGW.DRAWELLIPSE SCREENELT DS REGION)) (MAPPIECE (FIGW.DRAWMAP SCREENELT DS REGION)) (ERROR "bad figure element" SCREENELT]) (FIGW.ERASE.ELT [LAMBDA (ELT WINDOW KNOTFLAG REGION) (* rrb "24-JAN-83 19:40") (* erases a figure element) (DSPOPERATION (QUOTE ERASE) WINDOW) (FIGW.DRAWFIGURE ELT WINDOW REGION (SCALE.FROM.MAPW WINDOW)) (DSPOPERATION (QUOTE PAINT) WINDOW]) (FIGW.DRAWCURVE [LAMBDA (CURVEELT WINDOW REGION SHOWKNOTSFLG) (* rrb "24-JAN-83 17:47") (* draws a curve figure element.) (PROG ((GCURVE (fetch (SCREENELT GLOBALPART) of CURVEELT)) KNOTS) (DRAWCURVE (SETQ KNOTS (fetch (LOCALCURVE KNOTS) of (fetch (SCREENELT LOCALPART) of CURVEELT))) (fetch (CURVE CLOSE) of GCURVE) (fetch (CURVE BRUSH) of GCURVE) (fetch (CURVE DASHING) of GCURVE) WINDOW) (COND (SHOWKNOTSFLG (for K in KNOTS do (SHOWDRAWPOINT K WINDOW]) (FIGW.DRAWIMAGE [LAMBDA (IMAGEELT WINDOW REGION) (* rrb "24-JAN-83 17:56") (* shows an image element element. If REGION is given, it is a clipping region.) (PROG ((GIMAGE (fetch (SCREENELT GLOBALPART) of IMAGEELT)) (LOCALPOS (fetch (LOCALIMAGE IMAGEPOSITION) of (fetch (SCREENELT LOCALPART) of IMAGEELT))) IMAGECR) (SETQ IMAGECR (fetch (IMAGE SUBREGION) of GIMAGE)) (BITBLT (DECODEBITMAP (fetch (IMAGE BITMAP) of IMAGEELT)) (fetch (REGION LEFT) of IMAGECR) (fetch (REGION BOTTOM) of IMAGECR) WINDOW (fetch XCOORD of LOCALPOS) (fetch YCOORD of LOCALPOS) (fetch (REGION WIDTH) of IMAGECR) (fetch (REGION HEIGHT) of IMAGECR]) (FIGW.DRAWCIRCLE [LAMBDA (CIRCLEELT WINDOW REGION) (* rrb "24-JAN-83 18:35") (* draws a circle from a circle element.) (PROG ((GCIRCLE (fetch (SCREENELT GLOBALPART) of CIRCLEELT)) (LCIRCLE (fetch (SCREENELT LOCALPART) of CIRCLEELT)) CPOS) (SETQ CPOS (fetch (LOCALCIRCLE CENTERPOSITION) of LCIRCLE)) (RETURN (DRAWCIRCLE (fetch (POSITION XCOORD) of CPOS) (fetch (POSITION YCOORD) of CPOS) (fetch (LOCALCIRCLE RADIUS) of LCIRCLE) (fetch (CIRCLE BRUSH) of GCIRCLE) (fetch (CIRCLE DASHING) of GCIRCLE) WINDOW]) (FIGW.DRAWELLIPSE [LAMBDA (ELLIPSEELT WINDOW REGION) (* rrb "24-JAN-83 18:36") (* draws a ellipse from a circle element.) (PROG ((GELLIPSE (fetch (SCREENELT GLOBALPART) of ELLIPSEELT)) (LELLIPSE (fetch (SCREENELT LOCALPART) of ELLIPSEELT)) CPOS) (SETQ CPOS (fetch (LOCALELLIPSE ELLIPSECENTER) of LELLIPSE)) (RETURN (DRAWELLIPSE (fetch (POSITION XCOORD) of CPOS) (fetch (POSITION YCOORD) of CPOS) (fetch (LOCALELLIPSE SEMIMINORRADIUS) of LELLIPSE) (fetch (LOCALELLIPSE SEMIMAJORRADIUS) of LELLIPSE) (fetch (ELLIPSE ORIENTATION) of GELLIPSE) (fetch (ELLIPSE BRUSH) of GELLIPSE) (fetch (ELLIPSE DASHING) of GELLIPSE) WINDOW]) ) (DEFINEQ (FIGW.ADDCLOSEDCURVE [LAMBDA (W) (* rrb "26-JAN-83 17:43") (* reads a closed curve from the user and adds it to the figure associated with W.) (FIGW.ADD.ELEMENT (READSPLINE W T) W]) (FIGW.ADDCIRCLE [LAMBDA (W) (* rrb "26-JAN-83 17:44") (* reads a circle from the user and adds it to the figure associated with W.) (FIGW.ADD.ELEMENT (READCIRCLE W) W]) (FIGW.ADDELLIPSE [LAMBDA (W) (* rrb "26-JAN-83 17:44") (* reads a circle from the user and adds it to the figure associated with W.) (FIGW.ADD.ELEMENT (READELLIPSE W) W]) (FIGW.ADDOPENCURVE [LAMBDA (W) (* rrb "26-JAN-83 17:44") (* reads a closed curve from the user and adds it to the figure associated with W.) (FIGW.ADD.ELEMENT (READSPLINE W NIL) W]) (FIGW.DELETE.ELT [LAMBDA (W) (* lets the user select an element and deletes it.) (EVAL.AS.PROCESS (LIST (QUOTE FIGW.SEL.AND.DELETE) W]) (FIGW.SEL.AND.DELETE [LAMBDA (W) (* rrb "27-JAN-83 09:15") (* lets the user select an element and deletes it.) (PROG ((SELELT (FIGW.SELECT.ITEM W T))) (AND SELELT (FIGW.DELETE.ELEMENT SELELT W)) (RETURN SELELT]) (FIGW.DELETE.ITEM [LAMBDA (ELT FIGUREW) (* deletes an element from a window) (WINDOWDELPROP FIGUREW (QUOTE FIGURESPECS) ELT]) (FIGW.ERASE.AND.DELETE.ITEM [LAMBDA (SELELT FIGW) (* rrb "10-JAN-83 15:34") (COND (SELELT (FIGW.ERASE.ELT SELELT FIGW) (FIGW.DELETE.ITEM SELELT FIGW]) (CREATE.CIRCLE.ELT [LAMBDA (CENTER RADIUSPT BRUSH DASHING MAPW) (* rrb "26-JAN-83 14:34") (* creates a circle element) (PROG ((MAPINFO (MAPDESCFROMFIGUREW MAPW)) SCALE) (SETQ SCALE (SCALE.FROM.MAPINFO MAPINFO)) (RETURN (LOCAL.CIRCLE.FROM.GLOBAL (create CIRCLE MAXSCALE ←(TIMES SCALE DEFAULT.VISIBLE.SCALE.FACTOR) MINSCALE ←(QUOTIENT SCALE DEFAULT.VISIBLE.SCALE.FACTOR) BRUSH ←(OR BRUSH CURRENTFIGUREWBRUSH) DASHING ←(FIGW.DECODE.DASHING DASHING CURRENTFIGUREWDASHING) CENTERLATLON ←(UNSCALE.POSITION.FROM.MAPINFO CENTER MAPINFO) RADIUSLATLON ←(UNSCALE.POSITION.FROM.MAPINFO RADIUSPT MAPINFO)) MAPW]) (LOCAL.CIRCLE.FROM.GLOBAL [LAMBDA (GCIRCLE FIGW) (* rrb "26-JAN-83 14:51") (* returns a screen elt that has a circle screen element calculated from the global part.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW FIGW)) CENTER RADIUSPT) (RETURN (create SCREENELT LOCALPART ←(create LOCALCIRCLE CENTERPOSITION ←(SETQ CENTER ( SCALE.POSITION.FROM.MAPINFO (fetch (CIRCLE CENTERLATLON) of GCIRCLE) MAPINFO)) RADIUSPOSITION ←(SETQ RADIUSPT (SCALE.POSITION.FROM.MAPINFO (fetch (CIRCLE RADIUSLATLON) of GCIRCLE) MAPINFO)) RADIUS ←(DISTANCEBETWEEN CENTER RADIUSPT)) GLOBALPART ← GCIRCLE]) (CREATE.SPLINE.ELT [LAMBDA (KNOTS CLOSEFLG BRUSH DASHING MAPW) (* rrb "26-JAN-83 12:50") (* creates a spline element) (PROG ((MAPINFO (MAPDESCFROMFIGUREW MAPW)) SCALE) (SETQ SCALE (SCALE.FROM.MAPINFO MAPINFO)) (RETURN (create SCREENELT LOCALPART ←(create LOCALCURVE KNOTS ← KNOTS) GLOBALPART ←(create CURVE MINSCALE ←(QUOTIENT SCALE DEFAULT.VISIBLE.SCALE.FACTOR) MAXSCALE ←(TIMES SCALE DEFAULT.VISIBLE.SCALE.FACTOR) BRUSH ← BRUSH CLOSE ← CLOSEFLG DASHING ← DASHING LATLONKNOTS ←(for PT in KNOTS collect ( UNSCALE.POSITION.FROM.MAPINFO PT MAPINFO]) (CREATE.ELLIPSE.ELT [LAMBDA (CENTER MINRAD MAJRAD BRUSH DASHING MAPW) (* rrb "26-JAN-83 14:32") (PROG ((MAPINFO (MAPDESCFROMFIGUREW MAPW)) SCALE) (SETQ SCALE (SCALE.FROM.MAPINFO MAPINFO)) (RETURN (LOCAL.ELLIPSE.FROM.GLOBAL (create ELLIPSE MAXSCALE ←(TIMES SCALE DEFAULT.VISIBLE.SCALE.FACTOR) MINSCALE ←(QUOTIENT SCALE DEFAULT.VISIBLE.SCALE.FACTOR) ORIENTATION ←(COMPUTE.ELLIPSE.ORIENTATION CENTER MINRAD) BRUSH ←(OR BRUSH CURRENTFIGUREWBRUSH) DASHING ←(OR DASHING CURRENTFIGUREWDASHING) ELLIPSECENTERLATLON ←( UNSCALE.POSITION.FROM.MAPINFO CENTER MAPINFO) SEMIMINORLATLON ←(UNSCALE.POSITION.FROM.MAPINFO MINRAD MAPINFO) SEMIMAJORLATLON ←(UNSCALE.POSITION.FROM.MAPINFO MAJRAD MAPINFO)) MAPW]) (LOCAL.ELLIPSE.FROM.GLOBAL [LAMBDA (GELLIPSE FIGW) (* rrb "26-JAN-83 14:51") (* returns a screen elt that has a ellipse screen element calculated from the global part.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW FIGW)) CENTER MINRAD MAJRAD) (RETURN (create SCREENELT LOCALPART ←(create LOCALELLIPSE ELLIPSECENTER ←(SETQ CENTER (SCALE.POSITION.FROM.MAPINFO (fetch (ELLIPSE ELLIPSECENTERLATLON) of GELLIPSE) MAPINFO)) MINORRADIUSPOSITION ←(SETQ MINRAD (SCALE.POSITION.FROM.MAPINFO (fetch (ELLIPSE SEMIMINORLATLON) of GELLIPSE) MAPINFO)) MAJORRADIUSPOSITION ←(SETQ MAJRAD (SCALE.POSITION.FROM.MAPINFO (fetch (ELLIPSE SEMIMAJORLATLON) of GELLIPSE) MAPINFO)) SEMIMINORRADIUS ←(DISTANCEBETWEEN CENTER MINRAD) SEMIMAJORRADIUS ←(DISTANCEBETWEEN CENTER MAJRAD)) GLOBALPART ← GELLIPSE]) (COMPUTE.ELLIPSE.ORIENTATION [LAMBDA (CENTERPT MINRADPT) (* rrb "26-JAN-83 14:08") (FDIFFERENCE (ATAN (IDIFFERENCE (fetch (POSITION XCOORD) of MINRADPT) (fetch (POSITION XCOORD) of CENTERPT)) (IDIFFERENCE (fetch (POSITION YCOORD) of MINRADPT) (fetch (POSITION YCOORD) of CENTERPT))) 90.0]) ) (DEFINEQ (FIGW.ADD.ELEMENT [LAMBDA (NEWELT FIGUREW) (* rrb "27-JAN-83 11:29") (* adds a new element to a figure window and handles propagation to all other figure windows) (AND NEWELT (PROG ((GLOBALPART (fetch (SCREENELT GLOBALPART) of NEWELT))) (* do the window that the interaction occurred in first.) (FIGW.DISPLAY.AND.ADD.ITEM NEWELT FIGUREW) (* propagate to other windows.) (for FIGW in ALL.MAPWS when (AND (NEQ FIGW FIGUREW) (ELT.INSIDE.MAPWP GLOBALPART FIGW)) do (FIGW.DISPLAY.AND.ADD.ITEM (FIGW.LOCAL.FROM.GLOBAL GLOBALPART FIGW) FIGW]) (FIGW.DELETE.ELEMENT [LAMBDA (OLDELT FIGUREW) (* rrb "27-JAN-83 09:15") (* deletes an element to a figure window and handles propagation to all other figure windows) (PROG ((GLOBALPART (fetch (SCREENELT GLOBALPART) of OLDELT)) LOCALELT) (* do the window that the interaction occurred in first.) (FIGW.ERASE.AND.DELETE.ITEM OLDELT FIGUREW) (* propagate to other windows.) (for FIGW in ALL.MAPWS when (AND (NEQ FIGW FIGUREW) (SETQ LOCALELT (LOCAL.ELT.OF.GLOBALPART GLOBALPART FIGW))) do (FIGW.ERASE.AND.DELETE.ITEM LOCALELT FIGW]) (MAPW.INSIDE.REGION [LAMBDA (GLOBALPART WORLDREG) (* rrb "27-JAN-83 08:33") (SELECTQ (fetch (PELT PTYPE) of GLOBALPART) (CURVE (MAPW.INSIDE.CURVE GLOBALPART WORLDREG)) (TEXT (MAPW.INSIDE.TEXT GLOBALPART WORLDREG)) (IMAGE (MAPW.INSIDE.IMAGE GLOBALPART WORLDREG)) (CIRCLE (MAPW.INSIDE.CIRCLE GLOBALPART WORLDREG)) (ELLIPSE (MAPW.INSIDE.ELLIPSE GLOBALPART WORLDREG)) (MAPPIECE (* for now map pieces aren't inside other map pieces.) NIL) (ERROR "bad figure element" GLOBALPART]) (ELT.INSIDE.MAPWP [LAMBDA (GLOBALPART FIGW) (* rrb "26-JAN-83 17:43") (* determines if a global element is in the world region of a map window.) (MAPW.INSIDE.REGION GLOBALPART (fetch (MAPPIECE WORLDREGION) of (MAPDESCFROMFIGUREW FIGW]) (FIGW.DISPLAY.AND.ADD.ITEM [LAMBDA (FIGELT FIGW SCALE) (* rrb "24-JAN-83 15:43") (* displays a figure element and adds it to the window.) (COND (FIGELT (FIGW.DRAWFIGURE FIGELT FIGW NIL SCALE) (ADDFIGUREWELT FIGELT FIGW]) (FIGW.DISPLAY.AND.ADD.ITEMS [LAMBDA (SELITEMS FIGW SCALE) (* adds a list of items to a figure window and displays them.) (for ELT in SELITEMS do (FIGW.DISPLAY.AND.ADD.ITEM ELT FIGW SCALE]) (FIGW.MOVE.THING [LAMBDA (SELPOS NEWPOS W) (* rrb "26-JAN-83 16:16") (* moves the selected point to the new position.) (AND NEWPOS (PROG ((FIGUREELT (IN.FIGURE.ELT? (WINDOWPROP W (QUOTE FIGURESPECS)) SELPOS))) (* moving a piece of an element.) (AND FIGUREELT (FIGW.UPDATE.ELEMENT FIGUREELT (SELECTQ (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGUREELT)) (CURVE (FIGW.MOVE.CURVEPART FIGUREELT SELPOS NEWPOS W)) (TEXT (FIGW.MOVE.TEXT FIGUREELT SELPOS NEWPOS W)) (IMAGE (FIGW.MOVE.IMAGE FIGUREELT SELPOS NEWPOS W)) (CIRCLE (FIGW.MOVE.CIRCLEPART FIGUREELT SELPOS NEWPOS W)) (ELLIPSE (FIGW.MOVE.ELLIPSEPART FIGUREELT SELPOS NEWPOS W)) (ERROR "bad figure element" FIGUREELT)) W]) (FIGW.MOVE.ELT [LAMBDA (W) (* rrb "10-JAN-83 15:15") (* lets the user select an element and move it.) (EVAL.AS.PROCESS (LIST (QUOTE FIGW.SEL.AND.MOVE) W]) (FIGW.SEL.AND.MOVE [LAMBDA (W) (* rrb "10-JAN-83 18:06") (* lets the user select an element and move it.) (PROG ((SELPOS (FIGW.SELECT.ITEM W)) NEWPOS) (COND (SELPOS (CURSORPOSITION SELPOS W) (SETQ NEWPOS (GETDRAWPOSITION W)) (FIGW.MOVE.THING SELPOS NEWPOS W))) (RETURN SELPOS]) (FIGW.MOVE.CURVEPART [LAMBDA (CURVESPEC SELPOS NEWPOS WINDOW) (* rrb "26-JAN-83 15:44") (* returns a curve element which has the part SELPOS moved to NEWPOS.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW WINDOW)) (GCURVE (fetch (SCREENELT GLOBALPART) of CURVESPEC))) [replace (CURVE LATLONKNOTS) of GCURVE with (for PT in (fetch (LOCALCURVE KNOTS) of (fetch (SCREENELT LOCALPART) of CURVESPEC)) as LATLONPT in (fetch (CURVE LATLONKNOTS) of GCURVE) collect (COND ((EQUAL PT SELPOS) (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO)) (T LATLONPT] (RETURN (LOCAL.CURVE.FROM.GLOBAL GCURVE WINDOW]) (FIGW.MOVE.CIRCLEPART [LAMBDA (CIRCLESPEC SELPOS NEWPOS WINDOW) (* rrb "27-JAN-83 08:50") (* returns a circle element which has the part SELPOS moved to NEWPOS.) (PROG ((LCIRCLE (fetch (SCREENELT LOCALPART) of CIRCLESPEC)) (GCIRCLE (fetch (SCREENELT GLOBALPART) of CIRCLESPEC)) (MAPINFO (MAPDESCFROMFIGUREW WINDOW)) CENTERPT RADIUSPT) (SETQ CENTERPT (fetch (LOCALCIRCLE CENTERPOSITION) of LCIRCLE)) (SETQ RADIUSPT (fetch (LOCALCIRCLE RADIUSPOSITION) of LCIRCLE)) (* first update the global structures then create a new local one from it.) [COND ((EQUAL SELPOS CENTERPT) (* center point moved, move both center and radius.) (replace (CIRCLE CENTERLATLON) of GCIRCLE with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO)) (replace (CIRCLE RADIUSLATLON) of GCIRCLE with (UNSCALE.POSITION.FROM.MAPINFO (PTPLUS RADIUSPT (PTDIFFERENCE NEWPOS CENTERPT)) MAPINFO))) ((EQUAL SELPOS RADIUSPT) (replace (CIRCLE RADIUSLATLON) of GCIRCLE with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO] (RETURN (LOCAL.CIRCLE.FROM.GLOBAL GCIRCLE WINDOW]) (FIGW.MOVE.ELLIPSEPART [LAMBDA (ELLIPSEELT SELPOS NEWPOS WINDOW) (* rrb "26-JAN-83 16:37") (* returns an ellipse element which has the part SELPOS moved to NEWPOS.) (PROG ((LOCALEL (fetch (SCREENELT LOCALPART) of ELLIPSEELT)) (GLOBALEL (fetch (SCREENELT GLOBALPART) of ELLIPSEELT)) (MAPINFO (MAPDESCFROMFIGUREW WINDOW)) CENTERPT MINRADPT MAJRADPT) (SETQ CENTERPT (fetch (LOCALELLIPSE ELLIPSECENTER) of LOCALEL)) (SETQ MINRADPT (fetch (LOCALELLIPSE MINORRADIUSPOSITION) of LOCALEL)) (SETQ MAJRADPT (fetch (LOCALELLIPSE MAJORRADIUSPOSITION) of LOCALEL)) [COND ((EQUAL SELPOS CENTERPT) (* if the center moves, take everything else with it.) (replace (ELLIPSE ELLIPSECENTERLATLON) of GLOBALEL with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO)) (replace (ELLIPSE SEMIMINORLATLON) of GLOBALEL with (UNSCALE.POSITION.FROM.MAPINFO (PTPLUS MINRADPT (PTDIFFERENCE NEWPOS CENTERPT)) MAPINFO)) (replace (ELLIPSE SEMIMAJORLATLON) of GLOBALEL with (UNSCALE.POSITION.FROM.MAPINFO (PTPLUS MAJRADPT (PTDIFFERENCE NEWPOS CENTERPT)) MAPINFO))) ((EQUAL SELPOS MINRADPT) (replace (ELLIPSE SEMIMINORLATLON) of GLOBALEL with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO))) ((EQUAL SELPOS MAJRADPT) (replace (ELLIPSE SEMIMAJORLATLON) of GLOBALEL with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO] (replace (ELLIPSE ORIENTATION) of GLOBALEL with (COMPUTE.ELLIPSE.ORIENTATION (fetch (ELLIPSE ELLIPSECENTERLATLON) of GLOBALEL) (fetch (ELLIPSE SEMIMINORLATLON) of GLOBALEL))) (RETURN (LOCAL.ELLIPSE.FROM.GLOBAL GLOBALEL WINDOW]) (FIGW.MOVE.IMAGE [LAMBDA (IMAGEELT SELPOS NEWPOS WINDOW) (* rrb "26-JAN-83 16:14") (* moves a image figure element to a new position.) (PROG ((GIMAGE (fetch (SCREENELT GLOBALPART) of IMAGEELT))) (replace (IMAGE DISPLAYLATLON) of GIMAGE with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS ( MAPDESCFROMFIGUREW WINDOW))) (RETURN (LOCAL.IMAGE.FROM.GLOBAL GIMAGE WINDOW]) ) (DEFINEQ (MARKFIGURE [LAMBDA (FIGUREELT W MARK) (* rrb "24-JAN-83 19:30") (* marks the pick up points of a figure element.) (SELECTQ (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGUREELT)) (CURVE (MARKKNOTS (fetch (LOCALCURVE KNOTS) of (fetch (SCREENELT LOCALPART) of FIGUREELT)) W MARK)) (TEXT (MARKTEXTREGION FIGUREELT W MARK)) (CIRCLE (MARKCIRCLEKNOTS FIGUREELT W MARK)) (ELLIPSE (MARKELLIPSEKNOTS FIGUREELT W MARK)) (IMAGE (MARKIMAGEKNOTS FIGUREELT W MARK)) (MAPPIECE (* for now don't allow it to be selected.) NIL) NIL]) (FIGW.SHOWMARKS [LAMBDA (W) (* marks all of the hot spots of figure elements in a figure window.) (MAPFIGURESPECS (WINDOWPROP W (QUOTE FIGURESPECS)) (FUNCTION FIGW.MARKSELECTIONSPOTS) W]) (FIGW.MARKSELECTIONSPOTS [LAMBDA (FIGUREELT W) (* rrb "10-JAN-83 11:51") (* marks the pick up points of a figure element.) (MARKFIGURE FIGUREELT W FIGW.LOCATEMARK]) (MARKKNOTS [LAMBDA (PTS WINDOW MARK) (* rrb "10-JAN-83 11:01") (* marks the points on the list PTS in window.) (for PT in PTS do (MARKPOINT PT WINDOW MARK]) (MARKPOINT [LAMBDA (PT WINDOW MARK) (* rrb "25-JAN-83 20:02") (* marks a point in a window with a mark. The mark should be a bitmap. NIL) (OR MARK (SETQ MARK FIGW.SELECTEDMARK)) (PROG ((MARKWIDTH (BITMAPWIDTH MARK)) HALFWIDTH) (RETURN (BITBLT MARK 0 0 WINDOW (IDIFFERENCE (fetch (POSITION XCOORD) of PT) (SETQ HALFWIDTH (LRSH MARKWIDTH 1))) (IDIFFERENCE (fetch (POSITION YCOORD) of PT) HALFWIDTH) MARKWIDTH MARKWIDTH (QUOTE INPUT) (QUOTE INVERT]) (MARKCIRCLEKNOTS [LAMBDA (CIRCLESPEC W MARK) (* rrb "24-JAN-83 19:29") (* marks the hotspots of a circle.) (MARKPOINT (fetch (LOCALCIRCLE CENTERPOSITION) of (SETQ CIRCLESPEC (fetch (SCREENELT LOCALPART) of CIRCLESPEC))) W MARK) (MARKPOINT (fetch (LOCALCIRCLE RADIUSPOSITION) of CIRCLESPEC) W MARK]) (MARKELLIPSEKNOTS [LAMBDA (ELLIPSEELT W MARK) (* rrb "24-JAN-83 19:29") (* marks the hotspots of a ellispe.) (MARKPOINT (fetch (LOCALELLIPSE ELLIPSECENTER) of (SETQ ELLIPSEELT (fetch (SCREENELT LOCALPART) of ELLIPSEELT))) W MARK) (MARKPOINT (fetch (LOCALELLIPSE MINORRADIUSPOSITION) of ELLIPSEELT) W MARK) (MARKPOINT (fetch (LOCALELLIPSE MAJORRADIUSPOSITION) of ELLIPSEELT) W MARK]) (MARKIMAGEKNOTS [LAMBDA (IMAGEELT WINDOW MARK) (* rrb "24-JAN-83 19:30") (* marks the hot area for text element.) (* for now mark the position of the image) (MARKPOINT (fetch (LOCALIMAGE IMAGEPOSITION) of (fetch (SCREENELT LOCALPART) of IMAGEELT)) WINDOW MARK]) ) (DEFINEQ (ON.CIRCLE.HOT.SPOT [LAMBDA (CIRCLESPEC POS PTFLG) (* rrb "24-JAN-83 18:58") (* determines if POS is on a hot spot of a circle element.) (PROG ((LOCALCIRCLE (fetch (SCREENELT LOCALPART) of CIRCLESPEC)) CENTERPT RADIUSPT) (SETQ CENTERPT (fetch (LOCALCIRCLE CENTERPOSITION) of LOCALCIRCLE)) (SETQ RADIUSPT (fetch (LOCALCIRCLE RADIUSPOSITION) of LOCALCIRCLE)) (RETURN (COND ((NULL PTFLG) (AND (OR (FIGW.NEARPT CENTERPT POS) (FIGW.NEARPT RADIUSPT POS)) CIRCLESPEC)) ((FIGW.NEARPT CENTERPT POS) CENTERPT) ((FIGW.NEARPT RADIUSPT POS) RADIUSPT]) (FIGW.SELECT.ITEM [LAMBDA (WINDOW ITEMFLG) (* rrb "10-JAN-83 18:02") (* selects allows the user to select one of the figure elements from the figurew WINDOW. If ITEMFLG is non-NIL, it returns the item selected, otherwise it returns the position. Keeps control and probably shouldn't) (PROG ((SELECTABLEITEMS (WINDOWPROP WINDOW (QUOTE FIGURESPECS))) NOW PREVIOUS OLDPOS BUTTON) (COND ((NULL SELECTABLEITEMS) (* no items, don't do anything.) (RETURN))) (TOTOPW WINDOW) (FIGW.SHOWMARKS WINDOW) (until (MOUSESTATE (NOT UP))) (COND ((LASTMOUSESTATE MIDDLE) (SETQQ BUTTON MIDDLE)) ((LASTMOUSESTATE LEFT) (SETQQ BUTTON LEFT)) (T (* for now not interested in anything besides left and middle.) (RETURN))) (* note current item selection.) (SETQ NOW (IN.FIGURE.ELT? SELECTABLEITEMS (SETQ OLDPOS (CURSORPOSITION NIL WINDOW)) (NULL ITEMFLG))) FLIP (* turn off old selection.) (FIGW.DESELECT.ELT PREVIOUS WINDOW) (FIGW.SELECT.ELT (SETQ PREVIOUS NOW) WINDOW) LP (* wait for a button up or move out of region) (GETMOUSESTATE) (* look for change of buttons.) (COND ((LASTMOUSESTATE MIDDLE) (SETQQ BUTTON MIDDLE)) ((LASTMOUSESTATE LEFT) (SETQQ BUTTON LEFT)) (T (SETQ BUTTON NIL))) (COND ((NOT BUTTON) (* button up, selected item if one) (FIGW.DESELECT.ELT PREVIOUS WINDOW) (FIGW.SHOWMARKS WINDOW) (RETURN PREVIOUS)) ([EQ PREVIOUS (SETQ NOW (IN.FIGURE.ELT? SELECTABLEITEMS (CURSORPOSITION NIL WINDOW OLDPOS) (NULL ITEMFLG] (GO LP)) (T (GO FLIP]) (FIGW.DESELECT.ELT [LAMBDA (ELT FIGW) (* rrb "10-JAN-83 15:14") (* deselects an item from a figure window.) (* for now just unmark it.) (AND ELT (FIGW.MARK.SELECTION ELT FIGW]) (FIGW.MARK.SELECTION [LAMBDA (ELT FIGW) (* rrb "10-JAN-83 15:14") (* marks or unmarks a selection.) (COND ((POSITIONP ELT) (* handle positions {points} specially.) (MARKPOINT ELT FIGW FIGW.SELECTEDMARK)) (T (MARKFIGURE ELT FIGW FIGW.SELECTEDMARK]) (FIGW.SELECT.ELT [LAMBDA (ELT FIGW) (* rrb "10-JAN-83 15:14") (* selects an item from a figure window.) (* for now just mark it.) (AND ELT (FIGW.MARK.SELECTION ELT FIGW]) (IN.FIGURE.ELT? [LAMBDA (ITEMS POS PTFLG) (* rrb "10-JAN-83 15:09") (MAPFIGURESPECSUNTIL ITEMS (FUNCTION ON.HOT.SPOT) POS PTFLG]) (ON.HOT.SPOT [LAMBDA (FIGUREELT POS PTFLG) (* rrb "24-JAN-83 19:01") (* determines if the position POS is on the element FIGUREELT. If so it returns the element unless PTFLG is non-NIL when it returns the point it hit.) (SELECTQ (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGUREELT)) (CURVE (ON.CURVE.HOT.SPOT FIGUREELT POS PTFLG)) (TEXT (ON.TEXT.HOT.SPOT FIGUREELT POS PTFLG)) (CIRCLE (ON.CIRCLE.HOT.SPOT FIGUREELT POS PTFLG)) (ELLIPSE (ON.ELLIPSE.HOT.SPOT FIGUREELT POS PTFLG)) (IMAGE (ON.IMAGE.HOT.SPOT FIGUREELT POS PTFLG)) (MAPPIECE (* for now map pieces don't have hot spots.) NIL) NIL]) (ON.CURVE.HOT.SPOT [LAMBDA (CURVE POS PTFLG) (* rrb "24-JAN-83 18:58") (* returns the curve if POS is close to any of its knots.) (PROG (NEARPT) (SETQ NEARPT (for PT in (fetch (LOCALCURVE KNOTS) of (fetch (SCREENELT LOCALPART) of CURVE)) thereis (FIGW.NEARPT PT POS))) (RETURN (AND NEARPT (COND (PTFLG NEARPT) (T CURVE]) (ON.ELLIPSE.HOT.SPOT [LAMBDA (ELLIPSEELT POS PTFLG) (* rrb "24-JAN-83 18:59") (* determines if POS is on one of the hot spots of an ellipse element.) (PROG ((LOCALELLIPSE (fetch (SCREENELT LOCALPART) of ELLIPSEELT)) CENTERPT MINRADPT MAJRADPT) (SETQ CENTERPT (fetch (LOCALELLIPSE ELLIPSECENTER) of LOCALELLIPSE)) (SETQ MINRADPT (fetch (LOCALELLIPSE MINORRADIUSPOSITION) of LOCALELLIPSE)) (SETQ MAJRADPT (fetch (LOCALELLIPSE MAJORRADIUSPOSITION) of LOCALELLIPSE)) (RETURN (COND ((NULL PTFLG) (AND (OR (FIGW.NEARPT CENTERPT POS) (FIGW.NEARPT MINRADPT POS) (FIGW.NEARPT MAJRADPT POS)) ELLIPSEELT)) ((FIGW.NEARPT CENTERPT POS) CENTERPT) ((FIGW.NEARPT MINRADPT POS) MINRADPT) ((FIGW.NEARPT MAJRADPT POS) MAJRADPT]) (ON.IMAGE.HOT.SPOT [LAMBDA (IMAGEELT POS PTFLG) (* rrb "24-JAN-83 19:00") (* determines if a position is on the hot spot of a image element.) (* for now use the position of the image) (PROG [(IMAGEPT (fetch (LOCALIMAGE IMAGEPOSITION) of (fetch (SCREENELT LOCALPART) of IMAGEELT] (RETURN (AND (FIGW.NEARPT IMAGEPT POS) (COND (PTFLG IMAGEPT) (T IMAGEELT]) (FIGW.NEARPT [LAMBDA (TARGETPT HITPT) (* rrb " 3-JAN-83 16:26") (* returns T if HITPT is "near" TARGETPT.) (PROG ((TX (fetch (POSITION XCOORD) of TARGETPT)) (TY (fetch (POSITION YCOORD) of TARGETPT)) (HX (fetch (POSITION XCOORD) of HITPT)) (HY (fetch (POSITION YCOORD) of HITPT)) (FIGW.POINT.WIDTH 4)) (RETURN (AND (IGREATERP HX (IDIFFERENCE TX FIGW.POINT.WIDTH)) (IGREATERP (IPLUS TX FIGW.POINT.WIDTH) HX) (IGREATERP HY (IDIFFERENCE TY FIGW.POINT.WIDTH)) (IGREATERP (IPLUS TY FIGW.POINT.WIDTH) HY]) ) (* stuff for changing properties of a figure element) (DEFINEQ (FIGW.CHANGE.ELT [LAMBDA (W) (* rrb "25-JAN-83 12:29") (* lets the user select an element and change one of its properties.) (EVAL.AS.PROCESS (LIST (QUOTE FIGW.SEL.AND.CHANGE) W]) (FIGW.SEL.AND.CHANGE [LAMBDA (W) (* rrb "25-JAN-83 16:35") (* lets the user select an element and change one of its properties.) (PROG ((SELELT (FIGW.SELECT.ITEM W T))) (FIGW.CHANGE.PROPERTY SELELT W) (RETURN SELELT]) (FIGW.CHANGE.PROPERTY [LAMBDA (FIGUREELT WINDOW) (* rrb "27-JAN-83 13:00") (* changes a property of a figure element.) (COND (FIGUREELT (PROG [(NEWFIGUREELT (SELECTQ (fetch PTYPE of (fetch (SCREENELT GLOBALPART) of FIGUREELT)) (CURVE (CHANGE.CURVEPART FIGUREELT WINDOW)) (TEXT (CHANGE.TEXTPART FIGUREELT WINDOW)) (IMAGE) (CIRCLE) (ELLIPSE) (ERROR "bad figure element" FIGUREELT] (COND (NEWFIGUREELT (* if the user interaction resulted in a new element update it. The new element can have either a new global part or the same global part depending on whether the information that changed is needed to display the element. If the element can be displayed from its local information only, such as if one of the knots of a curve changed, then the global part can be reused. NIL) (FIGW.UPDATE.ELEMENT FIGUREELT NEWFIGUREELT WINDOW]) (FIGW.UPDATE.ELEMENT [LAMBDA (OLDELT NEWELT FIGUREW) (* rrb "27-JAN-83 11:32") (* replaces an old element with a new one. The two elements may have the same global part. This also handles propagation to other windows that have the same figure displayed.) (PROG ((GLOBALPART (fetch (SCREENELT GLOBALPART) of OLDELT)) (NEWGLOBAL (fetch (SCREENELT GLOBALPART) of NEWELT)) LOCALELT) (* do the window that the interaction occurred in first.) (FIGW.UPDATE.FIGURE.ELEMENT1 OLDELT NEWELT FIGUREW) (* propagate to other windows.) (for FIGW in ALL.MAPWS when (AND (NEQ FIGW FIGUREW) (SETQ LOCALELT (LOCAL.ELT.OF.GLOBALPART GLOBALPART FIGW))) do (FIGW.UPDATE.FIGURE.ELEMENT1 LOCALELT (FIGW.LOCAL.FROM.GLOBAL NEWGLOBAL FIGW) FIGW]) (LOCAL.ELT.OF.GLOBALPART [LAMBDA (GLOBALPART FIGW) (* returns the local element from FIGW that has global part GLOBALPART - NIL if there isn't one.) (for ELT in (FIGURESPECS FIGW) when (EQ (fetch (SCREENELT GLOBALPART) of ELT) GLOBALPART) do (RETURN ELT]) (FIGW.LOCAL.FROM.GLOBAL [LAMBDA (GLOBALELT FIGW) (* rrb "26-JAN-83 16:58") (* calculates a screen element from a global element into a figure window.) (SELECTQ (fetch PTYPE of GLOBALELT) (CURVE (LOCAL.CURVE.FROM.GLOBAL GLOBALELT FIGW)) (TEXT (LOCAL.TEXT.FROM.GLOBAL GLOBALELT FIGW)) (IMAGE (LOCAL.IMAGE.FROM.GLOBAL GLOBALELT FIGW)) (CIRCLE (LOCAL.CIRCLE.FROM.GLOBAL GLOBALELT FIGW)) (ELLIPSE (LOCAL.ELLIPSE.FROM.GLOBAL GLOBALELT FIGW)) (MAPPIECE (* shouldn't happen but if it does it will undoubtedly be in a demo so return something reasonable.) (create SCREENELT LOCALPART ← NIL GLOBALPART ← GLOBALELT)) (ERROR "bad figure element" GLOBALELT]) (LOCAL.CURVE.FROM.GLOBAL [LAMBDA (CURVE WINDOW) (* rrb "26-JAN-83 15:44") (* returns a screen elt that has a curve screen element calculated from the global part.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW WINDOW))) (RETURN (create SCREENELT LOCALPART ←(create LOCALCURVE KNOTS ←(for LATLONPT in (fetch (CURVE LATLONKNOTS) of CURVE) collect (SCALE.POSITION.FROM.MAPINFO LATLONPT MAPINFO))) GLOBALPART ← CURVE]) (LOCAL.TEXT.FROM.GLOBAL [LAMBDA (GTEXT WINDOW) (* rrb "26-JAN-83 16:32") (* creates a local text screen element from a global text element.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW WINDOW)) TEXTPOS) (RETURN (create SCREENELT LOCALPART ←(create LOCALTEXT LOCATIONPOSITION ←(SETQ TEXTPOS (SCALE.POSITION.FROM.MAPINFO (fetch (TEXT LOCATIONLATLON) of GTEXT) MAPINFO)) DISPLAYPOSITION ←(PTPLUS TEXTPOS (fetch (TEXT DISPLAYOFFSET) of GTEXT))) GLOBALPART ← GTEXT]) (LOCAL.IMAGE.FROM.GLOBAL [LAMBDA (IMAGE WINDOW) (* rrb "26-JAN-83 16:58") (* creates an image screen element from a global one onto WINDOW.) (create SCREENELT LOCALPART ←(create LOCALIMAGE IMAGEPOSITION ←(SCALE.POSITION.FROM.MAPINFO (fetch (IMAGE DISPLAYLATLON) of IMAGE) (MAPDESCFROMFIGUREW WINDOW) )) GLOBALPART ← IMAGE]) (FIGW.UPDATE.FIGURE.ELEMENT1 [LAMBDA (OLDELT NEWELT FIGUREW) (* rrb "26-JAN-83 09:32") (* replaces an old element with a new one. The two elements should have the same global part but this may not be critical. This also handles propagation to other windows that have the same figure displayed.) (FIGW.ERASE.AND.DELETE.ITEM OLDELT FIGUREW) (FIGW.DISPLAY.AND.ADD.ITEM NEWELT FIGUREW]) (CHANGE.CURVEPART [LAMBDA (CURVEELT WINDOW) (* rrb "27-JAN-83 10:21") (* lets the user specify a new property for CURVEELT and returns a new one.) (PROG (NEWVAL) (RETURN (SELECTQ [MENU (COND ((type? MENU CURVE.PROPERTY.MENU) CURVE.PROPERTY.MENU) (T (SETQ CURVE.PROPERTY.MENU (create MENU ITEMS ←(QUOTE (Brush% Shape Brush% Size Dashing Move% Knot Add% Knot Delete% Knot Close% or% Open Scale)) CENTERFLG ← T TITLE ← "Which property?"] (Brush% Shape (AND (SETQ NEWVAL (PAINTW.READBRUSHSHAPE)) (CREATE.SPLINE.ELT.USING CURVEELT NIL NIL (create BRUSH BRUSHSHAPE ← NEWVAL using (fetch (CURVE BRUSH) of (fetch (SCREENELT GLOBALPART) of CURVEELT))) NIL NIL NIL WINDOW))) (Brush% Size (AND (SETQ NEWVAL (READBRUSHSIZE)) (CREATE.SPLINE.ELT.USING CURVEELT NIL NIL (create BRUSH BRUSHSIZE ← NEWVAL using (fetch (CURVE BRUSH) of (fetch (SCREENELT GLOBALPART) of CURVEELT))) NIL NIL NIL WINDOW))) (Dashing (AND (SETQ NEWVAL (READDASHING)) (CREATE.SPLINE.ELT.USING CURVEELT NIL NIL NIL NEWVAL NIL NIL WINDOW))) (Move% Knot) (Add% Knot) (Delete% Knot) (Close% or% Open (CREATE.SPLINE.ELT.USING CURVEELT NIL (COND ((fetch (CURVE CLOSE) of (fetch (SCREENELT GLOBALPART) of CURVEELT)) (* now close, switch it to open.) (QUOTE OPEN)) (T (QUOTE CLOSE))) NIL NIL NIL NIL WINDOW)) NIL]) (FIGW.DECODE.DASHING [LAMBDA (DASH DEFAULT) (* rrb "26-JAN-83 12:02") (* goes from a read dash into an object that the curve drawing routines like.) (COND ((NULL DASH) DEFAULT) ((EQ DASH 0) (* 0 is used to indicate no dashing.) NIL) (T DASH]) (CREATE.SPLINE.ELT.USING [LAMBDA (OLDCURVEELT NEWKNOTS NEWCLOSEFLG NEWBRUSH NEWDASHING NEWMINSCALE NEWMAXSCALE MAPW) (* rrb "27-JAN-83 11:12") (* creates a spline element) (PROG ([KNOTS (OR NEWKNOTS (fetch (LOCALCURVE KNOTS) of (fetch (SCREENELT LOCALPART) of OLDCURVEELT] (GCURVE (fetch (SCREENELT GLOBALPART) of OLDCURVEELT)) (MAPINFO (MAPDESCFROMFIGUREW MAPW))) (RETURN (create SCREENELT LOCALPART ←(create LOCALCURVE KNOTS ← KNOTS) GLOBALPART ←(create CURVE MINSCALE ←(OR NEWMINSCALE (fetch (CURVE MINSCALE) of GCURVE)) MAXSCALE ←(OR NEWMAXSCALE (fetch (CURVE MAXSCALE) of GCURVE)) BRUSH ←(OR NEWBRUSH (fetch (CURVE BRUSH) of GCURVE)) CLOSE ←(COND (NEWCLOSEFLG (NEQ NEWCLOSEFLG (QUOTE OPEN))) (T (fetch (CURVE CLOSE) of GCURVE))) DASHING ←(FIGW.DECODE.DASHING NEWDASHING (fetch (CURVE DASHING) of GCURVE)) LATLONKNOTS ←(COND (NEWKNOTS (for PT in KNOTS collect ( UNSCALE.POSITION.FROM.MAPINFO PT MAPINFO))) (T (fetch (CURVE LATLONKNOTS) of GCURVE]) (READDASHING [LAMBDA NIL (* rrb "25-JAN-83 17:24") (* reads a value of dashing from the user.) (PROMPTPRINT "You will be prompted for a series of numbers which specify the number of points ON and OFF. Enter 0 to end the dashing pattern. Enter a number over 999 to leave the dashing unchanged.") [COND (MAPW.NUMBERPAD.READER) (T (SETQ MAPW.NUMBERPAD.READER (CREATE.MAPW.NUMBERPAD.READER] (bind VAL DASHLST OFF? until (EQ (SETQ VAL (PROGN [printout PROMPTWINDOW T "Enter the number of points " (COND (OFF? (QUOTE OFF)) (T (QUOTE ON] (NUMBERPAD.READ MAPW.NUMBERPAD.READER))) 0) do [COND ((IGREATERP VAL 999) (RETURN)) (T (SETQ DASHLST (CONS VAL DASHLST)) (SETQ OFF? (NOT OFF?] finally (RETURN (OR (REVERSE DASHLST) 0]) ) (RPAQQ CURVE.PROPERTY.MENU NIL) (RPAQQ TEXT.PROPERTY.MENU NIL) (RPAQQ IMAGE.PROPERTY.MENU NIL) (RPAQQ CIRCLE.PROPERTY.MENU NIL) (RPAQQ ELLIPSE.PROPERTY.MENU NIL) (RPAQQ CHOOSE.FONT.MENU NIL) (RPAQQ MAPW.NUMBERPAD.READER NIL) (DEFINEQ (FIGUREW [LAMBDA (FIGURESPECS REGION TITLE) (* rrb "20-JAN-83 12:20") (* creates a figure window and returns it.) (PROG ((W (CREATEW REGION TITLE))) (* set the right margin so that text will never run into it. This can be removed when character positions are kept in points so \DSPPRINTCHAR doesn't have to look at the right margin.) (DSPRIGHTMARGIN 64000 W) (WINDOWPROP W (QUOTE FIGURESPECS) FIGURESPECS) (WINDOWPROP W (QUOTE COMMANDMENU) (CREATE.FIGUREW.COMMANDMENU W)) (WINDOWPROP W (QUOTE BUTTONEVENTFN) (FUNCTION FIGUREW.BUTTON.HANDLER)) (WINDOWPROP W (QUOTE REPAINTFN) (FUNCTION FIGUREW.REPAINTFN)) (WINDOWPROP W (QUOTE MOVEFN) (FUNCTION FIGUREW.MOVEFN)) (WINDOWPROP W (QUOTE RESHAPEFN) (FUNCTION RESHAPEBYREPAINTANDMOVEFN)) (FIGUREW.MOVEFN W) (WINDOWPROP W (QUOTE CLOSEFN) (FUNCTION FIGUREW.CLOSEFN)) (WINDOWPROP W (QUOTE OPENFN) (FUNCTION FIGUREW.OPENFN)) (WINDOWPROP W (QUOTE SCROLLFN) (FUNCTION SCROLLBYREPAINTFN)) (FIGUREW.REPAINTFN W) (RETURN W]) (CREATE.FIGUREW.COMMANDMENU [LAMBDA (WINDOW) (* rrb "28-JAN-83 16:16") (* returns the control menu for a figure window.) (PROG [(CMENU (create MENU ITEMS ←(LIST (QUOTE (Delete FIGW.DELETE.ELT "Deletes a piece.")) (QUOTE (Move FIGW.MOVE.ELT "Moves one of the pieces.")) (QUOTE (Change FIGW.CHANGE.ELT "Changes a property of a piece.")) (QUOTE ("" NILL)) (QUOTE (Text FIGW.ADDTEXT "Adds text to the figure.")) (LIST CIRCLEICON (QUOTE FIGW.ADDCIRCLE) "Adds a circle to the figure.") (LIST ELLIPSEICON (QUOTE FIGW.ADDELLIPSE) "Adds an ellipse to the figure.") (LIST CLOSECURVEICON (QUOTE FIGW.ADDCLOSEDCURVE) "Adds a closed curve by accepting points the curve goes through.") (LIST OPENCURVEICON (QUOTE FIGW.ADDOPENCURVE) "Adds a curve by accepting points the curve goes through.") (QUOTE ("" NILL)) (QUOTE (Size SETFIGUREWBRUSHSIZE "Sets the size of the brush that new lines are drawn with.")) (QUOTE (Shape SETFIGUREWBRUSHSHAPE "Sets the shape of the brush that new lines are drawn with.")) (QUOTE ("" NILL)) (QUOTE (inspect INSPECTFIGURESPECS "Calls the Inspector on the figure data structures."))) CENTERFLG ← T WHENSELECTEDFN ←(FUNCTION FIGUREW.SELECTIONFN) MENUUSERDATA ←(LIST (QUOTE FIGUREW) WINDOW) MENUFONT ←(QUOTE (GACHA 12 BOLD] (SETQ CMENU (ADDMENU CMENU NIL (UPPERLEFTMENUPOSITION CMENU WINDOW))) (WINDOWPROP CMENU (QUOTE FIGUREW) WINDOW) [COND (CHARMICONFONT (* if charm icon menu stuff is loaded, put an icon menu beside the regular command menu.) (WINDOWPROP CMENU (QUOTE ICONMENU) (CREATE.FIGUREW.ICONMENU CMENU)) (WINDOWPROP CMENU (QUOTE MOVEFN) (FUNCTION MOVE.ICONMENU)) (WINDOWPROP CMENU (QUOTE CLOSEFN) (FUNCTION CLOSE.ICONMENU)) (WINDOWPROP CMENU (QUOTE OPENFN) (FUNCTION OPEN.ICONMENU] (RETURN CMENU]) (INSPECTFIGURESPECS [LAMBDA (MAPW) (* rrb "26-JAN-83 08:43") (* calls the inspector on the figure specs of a figure window.) (INSPECT/TOP/LEVEL/LIST (FIGURESPECS MAPW]) (FIGUREW.BUTTON.HANDLER [LAMBDA (W) (* handles a button event in a figure window.) (TOTOPW W]) (FIGUREW.CLOSEFN [LAMBDA (W) (* rrb "26-JAN-83 08:48") (* closes and breaks the link from a windows command menu to it so that it will be collected.) (PROG [(COMWINDOW (WINDOWPROP W (QUOTE COMMANDMENU] (for MENU in (WINDOWPROP COMWINDOW (QUOTE MENU)) do (PUTMENUPROP MENU (QUOTE FIGUREW) NIL)) (CLOSEW COMWINDOW) (RETURN W]) (FIGUREW.MOVEFN [LAMBDA (W NEWPOS) (* rrb "30-DEC-82 10:57") (* move function for a figure window. Moves the command menu.) (PROG [(WMENU (WINDOWPROP W (QUOTE COMMANDMENU] (AND WMENU (MOVEW WMENU (UPPERLEFTMENUPOSITION WMENU W NEWPOS]) (FIGUREW.OPENFN [LAMBDA (W) (* rrb "26-JAN-83 09:06") (* creates the link from a windows command menu to it that had been deleted so that it would be collected.) (PROG [(COMMANDMENUW (WINDOWPROP W (QUOTE COMMANDMENU] (for MENU in (WINDOWPROP COMMANDMENUW (QUOTE MENU)) do (PUTMENUPROP MENU (QUOTE FIGUREW) W)) (OPENW COMMANDMENUW]) (FIGUREW.REPAINTFN [LAMBDA (W REG) (* rrb "25-JAN-83 20:23") (* redisplays the figure in a window) (* for now ignore the region.) (DSPOPERATION (QUOTE PAINT) W) (MAPFIGURESPECS (FIGURESPECS W) (FUNCTION FIGW.DRAWFIGURE) W REG]) (FIGUREW.SELECTIONFN [LAMBDA (ITEM MENU) (* rrb "12-JAN-83 11:29") (* calls the function appropriate for the item selected from the command menu associated with a figure window.) (APPLY* (CADR ITEM) (WINDOWPROP (WFROMMENU MENU) (QUOTE FIGUREW]) (CREATE.MAPW.NUMBERPAD.READER [LAMBDA NIL (* rrb "25-JAN-83 13:54") (CREATE.NUMBERPAD.READER NIL NIL (QUOTE (GACHA 12 BOLD)) (QUOTE (GACHA 12 BOLD]) ) (* functions for dealing with text.) (DEFINEQ (FIGW.DRAWTEXT [LAMBDA (TEXTELT WINDOW REGION) (* rrb "24-JAN-83 17:50") (* shows a text element) (* the text element has a location that identifies its latitude longitude and a display position that give the origin of the text.) (PROG [(GTEXT (fetch (SCREENELT GLOBALPART) of TEXTELT)) (POSITION (fetch (LOCALTEXT DISPLAYPOSITION) of (fetch (SCREENELT LOCALPART) of TEXTELT] (DSPFONT (fetch (TEXT FONT) of GTEXT) WINDOW) (MOVETO (fetch XCOORD of POSITION) (fetch YCOORD of POSITION) WINDOW) (PRIN3 (fetch (TEXT CHARACTERS) of GTEXT) WINDOW]) (FIGW.ADDTEXT [LAMBDA (W) (* rrb "26-JAN-83 17:46") (* reads a piece of text from the user and adds it to the figure associated with W.) (FIGW.ADD.ELEMENT (READTEXT W) W]) (READTEXT [LAMBDA (WINDOW) (* rrb "20-JAN-83 13:03") (* reads text and a place to put it from the user and returns a TEXTELT that represents it. Can return NIL if the user positions it outside of the window.) (POSITIONTEXTELT (READ.FROM.PROMPT.WINDOW "Text to be printed: ") CURRENTFIGWFONT WINDOW "locate the text"]) (POSITIONTEXTELT [LAMBDA (TEXT FONT WINDOW PROMPTMSG) (* rrb "26-JAN-83 14:49") (* gets a position for a piece of text from the user and returns a text element that represents it. The text location is the center position of the text.) (* later this should change the cursor to the image being placed.) (PROG (P1 LOCATION DISPLAYPOSITION SCALE (MAPINFO (MAPDESCFROMFIGUREW WINDOW)) NEW.BITMAP DSP (WDTH (STRINGWIDTH TEXT FONT)) (HGHT (FONTHEIGHT FONT)) (DESCNT (FONTDESCENT FONT))) (SETQ SCALE (SCALE.FROM.MAPINFO MAPINFO)) (SETQ NEW.BITMAP (BITMAPCREATE WDTH HGHT)) (SETQ DSP (DSPCREATE NEW.BITMAP)) (DSPFONT FONT DSP) (MOVETO 0 DESCNT DSP) (PRIN3 TEXT DSP) (SETQ P1 (GET.BITMAP.POSITION WINDOW NEW.BITMAP (QUOTE PAINT) PROMPTMSG)) (* correction is because GET.BITMAP.POSITION returns the lower left corner but text is position by the center.) (RETURN (AND P1 (create SCREENELT LOCALPART ←[create LOCALTEXT LOCATIONPOSITION ←[SETQ LOCATION (create POSITION XCOORD ←(IPLUS (fetch (POSITION XCOORD) of P1) (LRSH WDTH 1)) YCOORD ←(IPLUS (fetch (POSITION YCOORD) of P1) (LRSH HGHT 1] DISPLAYPOSITION ←(SETQ DISPLAYPOSITION (create POSITION XCOORD ←(fetch (POSITION XCOORD) of P1) YCOORD ←(IPLUS (fetch (POSITION YCOORD) of P1) DESCNT] GLOBALPART ←(create TEXT MAXSCALE ←(TIMES SCALE DEFAULT.VISIBLE.SCALE.FACTOR) MINSCALE ←(QUOTIENT SCALE DEFAULT.VISIBLE.SCALE.FACTOR) CHARACTERS ← TEXT FONT ← FONT LOCATIONLATLON ←(AND MAPINFO ( UNSCALE.POSITION.FROM.MAPINFO LOCATION MAPINFO)) DISPLAYOFFSET ←(PTDIFFERENCE DISPLAYPOSITION LOCATION]) (FIGW.MOVE.TEXT [LAMBDA (TEXTELT SELPOS NEWPOS WINDOW) (* rrb "26-JAN-83 16:40") (* moves a text figure element to a new position. A text elt has two pick up points, its location and its label display position.) (PROG ((MAPINFO (MAPDESCFROMFIGUREW WINDOW)) (LTEXT (fetch (SCREENELT LOCALPART) of TEXTELT)) (GTEXT (fetch (SCREENELT GLOBALPART) of TEXTELT)) LOC) [COND ((EQUAL (SETQ LOC (fetch (LOCALTEXT LOCATIONPOSITION) of LTEXT)) SELPOS) (* move both the text location) (replace (TEXT LOCATIONLATLON) of GTEXT with (UNSCALE.POSITION.FROM.MAPINFO NEWPOS MAPINFO))) ((EQUAL (fetch (LOCALTEXT DISPLAYPOSITION) of LTEXT) SELPOS) (* keep the display offset up to date.) (replace (TEXT DISPLAYOFFSET) of GTEXT with (PTDIFFERENCE NEWPOS LOC] (RETURN (LOCAL.TEXT.FROM.GLOBAL GTEXT WINDOW]) (MARKTEXTREGION [LAMBDA (TEXTELT WINDOW MARK) (* rrb "24-JAN-83 19:30") (* marks the hot area for text element.) (* mark the location and the display position of the text) (MARKPOINT (fetch (LOCALTEXT LOCATIONPOSITION) of (SETQ TEXTELT (fetch (SCREENELT LOCALPART) of TEXTELT))) WINDOW MARK) (MARKPOINT (fetch (LOCALTEXT DISPLAYPOSITION) of TEXTELT) WINDOW MARK]) (ON.TEXT.HOT.SPOT [LAMBDA (TEXTELT POS PTFLG) (* rrb "24-JAN-83 19:41") (* determines whether or not POS is on a hot spot of a text element.) (* look at both the location of the text and its display position.) (PROG ((LOCALTEXT (fetch (SCREENELT LOCALPART) of TEXTELT)) TEXTPT) (RETURN (COND ((OR (FIGW.NEARPT (SETQ TEXTPT (fetch (LOCALTEXT LOCATIONPOSITION) of LOCALTEXT)) POS) (FIGW.NEARPT (SETQ TEXTPT (fetch (LOCALTEXT DISPLAYPOSITION) of LOCALTEXT)) POS)) (COND (PTFLG TEXTPT) (T TEXTELT]) (CREATE.TEXT.ELT.USING [LAMBDA (OLDTEXTELT NEWFONT NEWCHARACTERS NEWCOLOR NEWMINSCALE NEWMAXSCALE MAPW) (* rrb "29-JAN-83 16:38") (* creates a text element that has changed some of the fields) (PROG ((GTEXT (fetch (SCREENELT GLOBALPART) of OLDTEXTELT))) (RETURN (create SCREENELT LOCALPART ←(create LOCALTEXT using (fetch (SCREENELT LOCALPART) of OLDTEXTELT)) GLOBALPART ←(create TEXT MINSCALE ←(OR NEWMINSCALE (fetch (TEXT MINSCALE) of GTEXT)) MAXSCALE ←(OR NEWMAXSCALE (fetch (TEXT MAXSCALE) of GTEXT)) LOCATIONLATLON ←(fetch (TEXT LOCATIONLATLON) of GTEXT) FONT ←(OR NEWFONT (fetch (TEXT FONT) of GTEXT)) COLOR ←(OR NEWFONT (fetch (TEXT COLOR) of GTEXT)) CHARACTERS ←(OR NEWCHARACTERS (fetch (TEXT CHARACTERS) of GTEXT)) DISPLAYOFFSET ←(fetch (TEXT DISPLAYOFFSET) of GTEXT]) (CHANGE.TEXTPART [LAMBDA (TEXTELT WINDOW) (* rrb "29-JAN-83 16:37") (* lets the user specify a new property for TEXTELT and returns a new one.) (PROG (NEWVAL) (RETURN (SELECTQ [MENU (COND ((type? MENU TEXT.PROPERTY.MENU) TEXT.PROPERTY.MENU) (T (SETQ TEXT.PROPERTY.MENU (create MENU ITEMS ←(QUOTE (Font% Style Location Display% Position MinScale MaxScale)) CENTERFLG ← T TITLE ← "Which property?"] (Font% Style (AND (SETQ NEWVAL (READFONT)) (CREATE.TEXT.ELT.USING TEXTELT NEWVAL NIL NIL NIL NIL WINDOW))) (Location (AND (SETQ NEWVAL (READLATLON (fetch (TEXT LOCATIONLATLON) of (fetch (SCREENELT GLOBALPART) of TEXTELT)) WINDOW)) (* move location) )) (Display% Position) (MinScale) (MaxScale) NIL]) (READFONT [LAMBDA NIL (* rrb "29-JAN-83 15:17") (* give the user a choice of fonts) (MENU (COND ((type? MENU CHOOSE.FONT.MENU) CHOOSE.FONT.MENU) (T (SETQ CHOOSE.FONT.MENU (create MENU ITEMS ←[QUOTE ((Helvetica5 (QUOTE (HELVETICA 5))) (Helvetica8 (QUOTE (HELVETICA 8))) (Helvetica10 (QUOTE (HELVETICA 10))) (Helvetica12 (QUOTE (HELVETICA 12))) (Helvetica14 (QUOTE (HELVETICA 14))) (Helvetica18 (QUOTE (HELVETICA 18))) (TimesRoman8 (QUOTE (TIMESROMAN 8))) (TimesRoman10 (QUOTE (TIMESROMAN 10))) (TimesRoman12 (QUOTE (TIMESROMAN 12))) (TimesRoman14 (QUOTE (TIMESROMAN 14))) (TimesRoman18 (QUOTE (TIMESROMAN 18))) (Gacha8 (QUOTE (GACHA 8))) (Gacha10 (QUOTE (GACHA 10))) (Gacha12 (QUOTE (GACHA 12))) (Gacha12B (QUOTE (GACHA 12 BOLD] CENTERFLG ← T]) ) (DEFINEQ (GET.BITMAP.POSITION [LAMBDA (WINDOW BITMAP OPERATION MSG) (* rrb "17-JAN-83 12:28") (* gets a position by tracking with a bitmap) (PROG (BUFFER.BITMAP WIDTH HEIGHT) (SETQ WIDTH (BITMAPWIDTH BITMAP)) (SETQ HEIGHT (BITMAPHEIGHT BITMAP)) (SETQ BUFFER.BITMAP (BITMAPCREATE WIDTH HEIGHT)) (printout PROMPTWINDOW T MSG) (RETURN (TRACK.BITMAP1 WINDOW BITMAP BUFFER.BITMAP WIDTH HEIGHT (OR OPERATION (QUOTE PAINT]) (TRACK.BITMAP1 [LAMBDA (W BITMAP BUFFER.BITMAP WIDTH HEIGHT OPERATION) (* rrb "20-JAN-83 11:38") (* tracks BITMAP until a button goes down and comes up. Returns the position at the up click.) (* there is other code in BIGFONT that is probably better for this.) (PROG [DOWN LEFT BOTTOM NEW.LEFT NEW.BOTTOM (DSP (WINDOWPROP W (QUOTE DSP] (RETURN (until (AND DOWN (LASTMOUSESTATE UP)) do (GETMOUSESTATE) (UPDATELATLON W) (COND ((LASTMOUSESTATE (NOT UP)) (SETQ DOWN T))) (SETQ NEW.LEFT (LASTMOUSEX DSP)) (SETQ NEW.BOTTOM (LASTMOUSEY DSP)) (COND ((OR (NEQ NEW.LEFT LEFT) (NEQ NEW.BOTTOM BOTTOM)) [COND (LEFT (BITBLT BUFFER.BITMAP 0 0 DSP LEFT BOTTOM WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE] (SETQ LEFT NEW.LEFT) (SETQ BOTTOM NEW.BOTTOM) (BITBLT DSP LEFT BOTTOM BUFFER.BITMAP 0 0 WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (BITBLT BITMAP 0 0 DSP LEFT BOTTOM WIDTH HEIGHT (QUOTE INPUT) OPERATION))) finally (* restore screen) (BITBLT BUFFER.BITMAP 0 0 DSP LEFT BOTTOM WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (RETURN (AND (INSIDEP (DSPCLIPPINGREGION NIL DSP) LEFT BOTTOM) (create POSITION XCOORD ← LEFT YCOORD ← BOTTOM]) ) (DEFINEQ (DISTANCEBETWEEN [LAMBDA (P1 P2) (* rrb " 5-JAN-83 12:17") (* returns the distance between two points) (SQRT (PLUS (SQUARE (DIFFERENCE (fetch (POSITION XCOORD) of P1) (fetch (POSITION XCOORD) of P2))) (SQUARE (DIFFERENCE (fetch (POSITION YCOORD) of P1) (fetch (POSITION YCOORD) of P2]) (SQUARE [LAMBDA (X) (TIMES X X]) ) (DEFINEQ (GETAISFILEINFO [LAMBDA (FILE PROPERTY) (* rrb "30-NOV-82 18:28") (* returns a property from an AIS file.) (PROG (OFD TMP) (* check the file.) [COND ((OR (SETQ OFD (FINDFILE FILE NIL AISDIRECTORIES)) (SETQ OFD FILE)) (SETQ OFD (GETSTREAM (OPENFILE OFD (QUOTE INPUT)) (QUOTE INPUT] (* make sure the file is an AIS file and read its bits per sample, width and height.) (SETQ TMP (INSUREAISFILE OFD)) (RETURN (SELECTQ PROPERTY (BITSPERSAMPLE (CAR TMP)) (WIDTH (CADR TMP)) (HEIGHT (CADDR TMP)) (WORDSPERSAMPLE (CADDDR TMP)) (ERROR "unknown AIS file property." PROPERTY]) (INVISIBLEPARTP [LAMBDA (WINDOW POINT) (* rrb "30-NOV-82 17:25") (* determines if POINT is in the visible part of a window.) (INSIDE? (DSPCLIPPINGREGION NIL WINDOW) (fetch (POSITION XCOORD) of POINT) (fetch (POSITION YCOORD) of POINT]) (UPPERLEFTMENUPOSITION [LAMBDA (MENU WINDOW NEWPOS) (* rrb "10-JAN-83 18:17") (* returns the position MENU needs to be in in order to fit in next to WINDOW on the upper left.) (* doesn't check for being off the right hand side of the screen and probably should.) (PROG [(WREG (WINDOWPROP WINDOW (QUOTE REGION] (RETURN (create POSITION XCOORD ←(COND (NEWPOS (IPLUS (fetch (POSITION XCOORD) of NEWPOS) (fetch (REGION WIDTH) of WREG))) (T (fetch (REGION PRIGHT) of WREG))) YCOORD ←(IDIFFERENCE (COND (NEWPOS (IPLUS (fetch (POSITION YCOORD) of NEWPOS) (fetch (REGION HEIGHT) of WREG))) (T (fetch (REGION PTOP) of WREG))) (COND ((type? MENU MENU) (fetch (MENU IMAGEHEIGHT) of MENU)) [(WINDOWP MENU) (fetch (REGION HEIGHT) of (WINDOWPROP MENU (QUOTE REGION] (T (ERROR "arg not MENU or WINDOW" MENU]) ) (* FOLLOWING DEFINITIONS EXPORTED) [DECLARE: EVAL@COMPILE (RECORD PELT (PTYPE MINSCALE MAXSCALE . PBODY)) (RECORD SCREENELT (LOCALPART . GLOBALPART)) (TYPERECORD CURVE (MINSCALE MAXSCALE LATLONKNOTS BRUSH COLOR CLOSE DASHING)) (TYPERECORD TEXT (MINSCALE MAXSCALE LOCATIONLATLON FONT COLOR CHARACTERS DISPLAYOFFSET)) (TYPERECORD CIRCLE (MINSCALE MAXSCALE CENTERLATLON RADIUSLATLON BRUSH DASHING)) (TYPERECORD ELLIPSE (MINSCALE MAXSCALE ELLIPSECENTERLATLON SEMIMINORLATLON SEMIMAJORLATLON ORIENTATION BRUSH DASHING)) (TYPERECORD IMAGE (MINSCALE MAXSCALE DISPLAYLATLON BITMAP SUBREGION)) (RECORD LOCALIMAGE (IMAGEPOSITION)) (RECORD LOCALELLIPSE (ELLIPSECENTER SEMIMINORRADIUS SEMIMAJORRADIUS MINORRADIUSPOSITION MAJORRADIUSPOSITION)) (RECORD LOCALCIRCLE (CENTERPOSITION RADIUSPOSITION RADIUS)) (RECORD LOCALTEXT (LOCATIONPOSITION DISPLAYPOSITION)) (RECORD LOCALCURVE (KNOTS)) ] (* END EXPORTED DEFINITIONS) (RPAQ POINTREADINGCURSOR (CURSORCREATE (READBITMAP) 7 7)) (16 16 "@@@@" "@GL@" "AMG@" "CAAH" "FA@L" "DA@D" "LA@F" "HA@B" "OOON" "HA@B" "LA@F" "DA@D" "FA@L" "CAAH" "AMG@" "@GL@")(READVARS POINTMARK FIGW.SELECTEDMARK FIGW.LOCATEMARK CLOSECURVEICON OPENCURVEICON CIRCLEICON ELLIPSEICON) ({(READBITMAP)(7 7 "HB@@" "DD@@" "BH@@" "A@@@" "BH@@" "DD@@" "HB@@")} {(READBITMAP)(7 7 "ON@@" "ON@@" "ON@@" "ON@@" "ON@@" "ON@@" "ON@@")} {(READBITMAP)(11 11 "OON@" "OON@" "L@F@" "L@F@" "L@F@" "L@F@" "L@F@" "L@F@" "L@F@" "OON@" "OON@")} {(READBITMAP)(20 12 "@@OH@@@@" "@OOO@@@@" "@OHON@@@" "AL@AO@@@" "AH@@G@@@" "CH@@C@@@" "CH@@C@@@" "CH@@G@@@" "AN@@N@@@" "@OCLN@@@" "@COOL@@@" "@@NCH@@@")} {(READBITMAP)(20 12 "@@@@@@@@" "@L@@@@@@" "@L@@F@@@" "AL@@O@@@" "AH@@G@@@" "CH@@C@@@" "CH@@C@@@" "CH@@G@@@" "AN@@N@@@" "@OCLN@@@" "@COOL@@@" "@@NCH@@@")} {(READBITMAP)(20 12 "@AOH@@@@" "@COL@@@@" "@G@N@@@@" "@F@F@@@@" "@N@G@@@@" "@L@C@@@@" "@L@C@@@@" "@N@G@@@@" "@F@F@@@@" "@G@N@@@@" "@COL@@@@" "@AOH@@@@")} {(READBITMAP)(20 12 "@COL@@@@" "AOOOH@@@" "CN@GL@@@" "G@@@N@@@" "N@@@G@@@" "L@@@C@@@" "L@@@C@@@" "N@@@G@@@" "G@@@N@@@" "CN@GL@@@" "AOOOH@@@" "@COL@@@@")}) (* functions needed from NOTEPAD. Copied here so don't need all of notepad.) (DEFINEQ (MARK.SPOT [LAMBDA (X/POSITION Y WINDOW) (* rrb "14-JAN-83 15:40") (PROG [X WIDTH HEIGHT (COLORDS (WINDOWPROP WINDOW (QUOTE INCOLOR] (COND ((POSITIONP X/POSITION) (SETQ X (fetch (POSITION XCOORD) of X/POSITION)) (SETQ Y (fetch (POSITION YCOORD) of X/POSITION))) (T (SETQ X X/POSITION))) (SETQ WIDTH (BITMAPWIDTH SPOTMARKER)) (SETQ HEIGHT (BITMAPHEIGHT SPOTMARKER)) (BITBLT (COND [COLORDS (COND ((AND (BITMAPP COLORSPOTMARKER) (EQ (BITSPERPIXEL COLORSPOTMARKER) (COLORNUMBERBITSPERPIXEL))) COLORSPOTMARKER) (T (SETQ COLORSPOTMARKER (COLORIZEBITMAP SPOTMARKER 0 (MAXIMUMCOLOR) (COLORNUMBERBITSPERPIXEL] (T SPOTMARKER)) 0 0 (OR COLORDS WINDOW) (IDIFFERENCE X (IQUOTIENT WIDTH 2)) (IDIFFERENCE Y (IQUOTIENT HEIGHT 2)) WIDTH HEIGHT (QUOTE INPUT) (QUOTE INVERT]) (READ.FROM.PROMPT.WINDOW [LAMBDA (PRMPT) (* edited: "15-DEC-82 23:02") (CLEARBUF T T) (CAR (PROCESS.READ PROMPTWINDOW PRMPT T]) (GETWREGION [LAMBDA (W) (* rrb "28-JAN-83 12:56") (* gets a region from a window) (PROG ((REG (GETREGION))) (RETURN (create REGION LEFT ←(IDIFFERENCE (fetch LEFT of REG) (DSPXOFFSET NIL W)) BOTTOM ←(IDIFFERENCE (fetch BOTTOM of REG) (DSPYOFFSET NIL W)) WIDTH ←(fetch WIDTH of REG) HEIGHT ←(fetch HEIGHT of REG]) ) (RPAQ SPOTMARKER (READBITMAP)) (17 18 "@@@@@@@@" "@@@@@@@@" "@@L@@@@@" "@@L@@@@@" "@@L@@@@@" "@@L@@@@@" "@@@@@@@@" "ANMN@@@@" "ANMN@@@@" "@@@@@@@@" "@@L@@@@@" "@@L@@@@@" "@@L@@@@@" "@@L@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@") (RPAQ CIRCLE.CENTER (CURSORCREATE (READBITMAP) 8 8)) (16 16 "@GN@" "AOOH" "CLCL" "G@@N" "FDBF" "NJEG" "LEJC" "LBDC" "LBDC" "LEJC" "NJEG" "FDBF" "G@@N" "CLCL" "AOOH" "@GN@")(RPAQ CIRCLE.EDGE (CURSORCREATE (READBITMAP) 15 8)) (16 16 "@@AL" "@@@L" "@@@N" "@@@F" "@@BG" "@@CC" "@@CK" "OOOO" "OOOO" "@@CK" "@@CC" "@@BG" "@@@F" "@@@N" "@@@L" "@@AL")(RPAQ ELLIPSE.CENTER (CURSORCREATE (READBITMAP) 8 8)) (16 16 "@GN@" "AOOH" "CLCL" "G@@N" "FDBF" "NJEG" "LEJC" "LBDC" "LBDC" "LEJC" "NJEG" "FDBF" "G@@N" "CLCL" "AOOH" "@GN@")(RPAQ ELLIPSE.SEMI.MAJOR (CURSORCREATE (READBITMAP) 15 8)) (16 16 "@@AL" "@@@L" "@@@N" "@@@F" "@@BG" "@@CC" "@@CK" "OOOO" "OOOO" "@@CK" "@@CC" "@@BG" "@@@F" "@@@N" "@@@L" "@@AL")(RPAQ ELLIPSE.SEMI.MINOR (CURSORCREATE (READBITMAP) 8 15)) (16 16 "@OO@" "COOL" "OIIO" "NCLG" "HGNA" "@OO@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@" "@AH@")(RPAQ CURVE.KNOT (CURSORCREATE (READBITMAP) 8 8)) (16 16 "@GN@" "AOOH" "CLCL" "G@@N" "FDBF" "NJEG" "LEJC" "LBDC" "LBDC" "LEJC" "NJEG" "FDBF" "G@@N" "CLCL" "AOOH" "@GN@")[DECLARE: EVAL@COMPILE (RECORD BRUSH (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR)) ] (RPAQQ BITMAPDIRECTORIES ({DSK} {PHYLUM}<AIS>)) (RPAQQ DRAWBITMAPALIST NIL) (RPAQQ DRAWCURVESWITHLINESFLG NIL) (RPAQQ FIGURE.ELEMENT.TYPES (CURVE TEXT CIRCLE ELLIPSE MAPPIECE IMAGE)) (RPAQQ DRAWCURVEWITHLINESFLG NIL) (RPAQQ DEFAULT.VISIBLE.SCALE.FACTOR 3) (RPAQ CURRENTFIGUREWBRUSH (CREATE BRUSH BRUSHSHAPE ← (QUOTE ROUND) BRUSHSIZE ← 1 BRUSHCOLOR ← WHITECOLOR)) (RPAQQ CURRENTFIGUREWDASHING NIL) (RPAQQ CURRENTFIGWFONT (HELVETICA 12)) (RPAQQ CHARMICONFONT NIL) (FILESLOAD (FROM VALUEOF LISPUSERSDIRECTORIES) READNUMBER) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS BITMAPDIRECTORIES DRAWBITMAPALIST DRAWCURVEWITHLINESFLG CURRENTFIGUREWBRUSH CURRENTFIGUREWDASHING POINTMARK CLOSECURVEICON OPENCURVEICON ELLIPSEICON CIRCLEICON POINTMARKHALFWIDTH POINTMARKWIDTH DEFAULT.VISIBLE.SCALE.FACTOR FIGURE.ELEMENT.TYPES) ) (PUTPROPS MAPSKETCH COPYRIGHT ("Xerox Corporation" 1984)) (DECLARE: DONTCOPY (FILEMAP (NIL (3989 15055 (ADDFIGUREWELT 3999 . 4304) (BITMAPFROMFILE 4306 . 4894) (DECODEBITMAP 4896 . 5947) (FIGURESPECS 5949 . 6138) (GETDRAWPOSITION 6140 . 6778) (MAPFIGURESPECS 6780 . 7456) ( MAPFIGURESPECSUNTIL 7458 . 8224) (READBRUSHSIZE 8226 . 8780) (READSPLINE 8782 . 9817) (READCIRCLE 9819 . 10624) (READELLIPSE 10626 . 11766) (RESHAPEBYREPAINTANDMOVEFN 11768 . 13143) (SETFIGUREWBRUSHSHAPE 13145 . 13619) (SETFIGUREWBRUSHSIZE 13621 . 14081) (SHOWDRAWPOINT 14083 . 14676) (SHOWFIGUREKNOTS 14678 . 15053)) (15056 20091 (FIGW.DRAWFIGURE 15066 . 16406) (FIGW.ERASE.ELT 16408 . 16789) ( FIGW.DRAWCURVE 16791 . 17483) (FIGW.DRAWIMAGE 17485 . 18388) (FIGW.DRAWCIRCLE 18390 . 19160) ( FIGW.DRAWELLIPSE 19162 . 20089)) (20092 27601 (FIGW.ADDCLOSEDCURVE 20102 . 20442) (FIGW.ADDCIRCLE 20444 . 20771) (FIGW.ADDELLIPSE 20773 . 21102) (FIGW.ADDOPENCURVE 21104 . 21444) (FIGW.DELETE.ELT 21446 . 21660) (FIGW.SEL.AND.DELETE 21662 . 22039) (FIGW.DELETE.ITEM 22041 . 22234) ( FIGW.ERASE.AND.DELETE.ITEM 22236 . 22462) (CREATE.CIRCLE.ELT 22464 . 23351) (LOCAL.CIRCLE.FROM.GLOBAL 23353 . 24256) (CREATE.SPLINE.ELT 24258 . 25053) (CREATE.ELLIPSE.ELT 25055 . 26013) ( LOCAL.ELLIPSE.FROM.GLOBAL 26015 . 27171) (COMPUTE.ELLIPSE.ORIENTATION 27173 . 27599)) (27602 38081 ( FIGW.ADD.ELEMENT 27612 . 28526) (FIGW.DELETE.ELEMENT 28528 . 29348) (MAPW.INSIDE.REGION 29350 . 29976) (ELT.INSIDE.MAPWP 29978 . 30354) (FIGW.DISPLAY.AND.ADD.ITEM 30356 . 30728) ( FIGW.DISPLAY.AND.ADD.ITEMS 30730 . 30993) (FIGW.MOVE.THING 30995 . 32220) (FIGW.MOVE.ELT 32222 . 32520 ) (FIGW.SEL.AND.MOVE 32522 . 32998) (FIGW.MOVE.CURVEPART 33000 . 33904) (FIGW.MOVE.CIRCLEPART 33906 . 35413) (FIGW.MOVE.ELLIPSEPART 35415 . 37552) (FIGW.MOVE.IMAGE 37554 . 38079)) (38082 42013 (MARKFIGURE 38092 . 38897) (FIGW.SHOWMARKS 38899 . 39192) (FIGW.MARKSELECTIONSPOTS 39194 . 39478) (MARKKNOTS 39480 . 39764) (MARKPOINT 39766 . 40486) (MARKCIRCLEKNOTS 40488 . 40963) (MARKELLIPSEKNOTS 40965 . 41548) (MARKIMAGEKNOTS 41550 . 42011)) (42014 50264 (ON.CIRCLE.HOT.SPOT 42024 . 42850) ( FIGW.SELECT.ITEM 42852 . 45102) (FIGW.DESELECT.ELT 45104 . 45476) (FIGW.MARK.SELECTION 45478 . 45919) (FIGW.SELECT.ELT 45921 . 46287) (IN.FIGURE.ELT? 46289 . 46477) (ON.HOT.SPOT 46479 . 47279) ( ON.CURVE.HOT.SPOT 47281 . 47825) (ON.ELLIPSE.HOT.SPOT 47827 . 48878) (ON.IMAGE.HOT.SPOT 48880 . 49487) (FIGW.NEARPT 49489 . 50262)) (50327 62003 (FIGW.CHANGE.ELT 50337 . 50677) (FIGW.SEL.AND.CHANGE 50679 . 51075) (FIGW.CHANGE.PROPERTY 51077 . 52215) (FIGW.UPDATE.ELEMENT 52217 . 53244) ( LOCAL.ELT.OF.GLOBALPART 53246 . 53633) (FIGW.LOCAL.FROM.GLOBAL 53635 . 54580) (LOCAL.CURVE.FROM.GLOBAL 54582 . 55219) (LOCAL.TEXT.FROM.GLOBAL 55221 . 55971) (LOCAL.IMAGE.FROM.GLOBAL 55973 . 56518) ( FIGW.UPDATE.FIGURE.ELEMENT1 56520 . 56980) (CHANGE.CURVEPART 56982 . 59048) (FIGW.DECODE.DASHING 59050 . 59502) (CREATE.SPLINE.ELT.USING 59504 . 60930) (READDASHING 60932 . 62001)) (62264 69265 (FIGUREW 62274 . 63694) (CREATE.FIGUREW.COMMANDMENU 63696 . 66169) (INSPECTFIGURESPECS 66171 . 66487) ( FIGUREW.BUTTON.HANDLER 66489 . 66648) (FIGUREW.CLOSEFN 66650 . 67207) (FIGUREW.MOVEFN 67209 . 67613) ( FIGUREW.OPENFN 67615 . 68168) (FIGUREW.REPAINTFN 68170 . 68624) (FIGUREW.SELECTIONFN 68626 . 69032) ( CREATE.MAPW.NUMBERPAD.READER 69034 . 69263)) (69311 79361 (FIGW.DRAWTEXT 69321 . 70193) (FIGW.ADDTEXT 70195 . 70525) (READTEXT 70527 . 70940) (POSITIONTEXTELT 70942 . 73291) (FIGW.MOVE.TEXT 73293 . 74379) (MARKTEXTREGION 74381 . 75005) (ON.TEXT.HOT.SPOT 75007 . 75828) (CREATE.TEXT.ELT.USING 75830 . 77042) (CHANGE.TEXTPART 77044 . 78183) (READFONT 78185 . 79359)) (79362 81673 (GET.BITMAP.POSITION 79372 . 79977) (TRACK.BITMAP1 79979 . 81671)) (81674 82231 (DISTANCEBETWEEN 81684 . 82181) (SQUARE 82183 . 82229)) (82232 84877 (GETAISFILEINFO 82242 . 83158) (INVISIBLEPARTP 83160 . 83571) ( UPPERLEFTMENUPOSITION 83573 . 84875)) (87102 88947 (MARK.SPOT 87112 . 88188) (READ.FROM.PROMPT.WINDOW 88190 . 88390) (GETWREGION 88392 . 88945))))) STOP