home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / ham / aprs114.zip / MAPFIX.BAS < prev    next >
BASIC Source File  |  1993-07-09  |  14KB  |  292 lines

  1.    REM Map files must contain the string [0,Labels ] as the first text line
  2.    REM after the 0,-1 that indivates the end of all lines and start of Labels
  3.    REM This program looks for that string to wrap around to the start.
  4.    RdsOn = -1: Labls = -1
  5.    MaxUnts = 20: u = 20'Total number of units anticipated
  6.    DIM x%(1000), y%(1000)'MAP coordinates
  7.    DIM LN$(80)         'LineNames
  8.    DIM ML$(80), Mla(80), MLo(80), MLr(80) 'Map Labels, lengths and coordinates
  9. Begin: CLS
  10.    PRINT "             MAPFIX.bas PROGRAM FOR DISPLAYING APRS MAPS": PRINT
  11.    PRINT "This program allows you to look at a map file and all of its points."
  12.    PRINT "It does not allow you to change anything or modify the data points yet."
  13.    PRINT "The way to use it, is to run this MAPFIX.bas program within the Quick"
  14.    PRINT "BASIC environment and to also LOAD the associated MAP file as a DOCUMENT."
  15.    PRINT
  16.    PRINT "Then each time you run the MAPFIX program to see how your points look,"
  17.    PRINT "you can Quit the program and use the F2 key to go manipulate the data"
  18.    PRINT "points in the MAP file.  Then save the latest version of your map data"
  19.    PRINT "and hit F5 to re-run the MAPFIX.bas program to see how the changes look!"
  20.    PRINT
  21.    PRINT "One feature of MAPFIX.bas is that it shows you the decimal values of the"
  22.    PRINT "cursor position which is necessary for placing map labels in the MAP file."
  23.    PRINT
  24.    PRINT
  25.    PRINT "ALSO NOTE THAT THE SIZE OF THE INTEGER ARRAYS USED IN APRS IS 1000, SO"
  26.    PRINT "You should never have more than 1000 points in your file.  If you need"
  27.    PRINT "more points, begin another map."
  28.    PRINT
  29.    PRINT "HIT ENTER to continue..."; : INPUT a$
  30.  
  31.  
  32. INIT: ON ERROR GOTO ErrorTrap
  33.       ScrnType$ = "EGA": Ycen = 200: Yfactr = 1: SCREEN 9
  34.       IF ScrnType$ = "EGA" THEN COLOR 15, 0
  35.       REM ScrnType$ = "CGA": Yfactr=200/400:Ycen = 200*Yfactr: SCREEN 2
  36.       GOSUB Help: GOSUB LoadMap: Uid$ = "bruninga"
  37. ON ERROR GOTO 0
  38.       
  39.       Tags = -1: KP = 1
  40.       Usr$ = "3poscor"
  41.       COM$ = "COM1:"
  42.       Baud$ = "9600"
  43.       Port$ = "nadn"
  44.       OPEN COM$ + Baud$ + ",n,8,1,cs0,ds0,cd0" FOR RANDOM AS #1
  45.      
  46. Main: GOSUB DrawMap
  47.       DO
  48.          REM IF ScrnType$ = "EGA" THEN COLOR 15, 0 'no idea why this was here
  49. GoAgain: LET a$ = INKEY$
  50.       IF a$ <> "" THEN
  51.         a$ = UCASE$(a$): Key$ = a$
  52.         IF a$ = "G" THEN GOSUB Grid
  53.         IF a$ = "S" THEN GOSUB Labels
  54.         IF a$ = "L" THEN Labls = NOT Labls
  55.         IF a$ = "T" THEN Tags = NOT Tags
  56.         IF a$ = "H" THEN GOSUB Help
  57.         IF a$ = "M" THEN GOSUB MapList
  58.         IF a$ = "N" THEN GOSUB NextLine: GOSUB Cursor
  59.         IF a$ = "P" THEN GOSUB Previous: GOSUB Cursor
  60.         IF a$ = "Q" THEN SYSTEM
  61.         IF a$ = " " THEN GOSUB DrawMap
  62.         IF a$ = "+" THEN Z = Z + 1: GOSUB Cursor ' moves to next map point
  63.         IF a$ = "-" THEN Z = Z - 1: GOSUB Cursor ' moves backwards
  64.  
  65.         B$ = "": IF LEN(a$) = 2 THEN B$ = RIGHT$(a$, 1): REM process arrow & special keys
  66.         IF B$ = "I" THEN RS = RS * 2: GOSUB CurDrwMap: REM change scale
  67.         IF B$ = "Q" THEN RS = RS / 2: GOSUB CurDrwMap
  68.         IF B$ = CHR$(132) THEN RS = RS * 8: GOSUB CurDrwMap: REM change scale by factor of 4
  69.         IF B$ = "V" THEN RS = RS / 8: GOSUB CurDrwMap
  70.        
  71.         IF B$ = "G" THEN CDX = CPX: CDY = CPY: GOSUB DrawMap 'Home key
  72.         IF B$ = "O" THEN CDX = LONo: CDY = LATo: GOSUB DrawMap 'End Key
  73.         IF B$ = "M" THEN CPX = CPX - 4 / (KP * ppdV): GOSUB Cursor
  74.         IF B$ = "K" THEN CPX = CPX + 4 / (KP * ppdV): GOSUB Cursor
  75.         IF B$ = "H" THEN CPY = CPY + 4 / (KP * ppdV): GOSUB Cursor
  76.         IF B$ = "P" THEN CPY = CPY - 4 / (KP * ppdV): GOSUB Cursor
  77.         REM Here are the special MapFIx routines
  78.         REM IF B$ = "=" THEN
  79.             REM  x%(Z) = DX + (CUX - 320) / KP
  80.             REM  y%(Z) = DY + (CUY - Ycen) / KP
  81.             REM  GOSUB DrawMap
  82.             REM  END IF
  83.         REM IF B$ = ">" THEN GOSUB SaveMap
  84.            
  85.         IF a$ = "6" THEN CPX = CPX - 20 / (KP * ppdV): GOSUB Cursor'SHIFT Cursor by 4
  86.         IF a$ = "4" THEN CPX = CPX + 20 / (KP * ppdV): GOSUB Cursor
  87.         IF a$ = "8" THEN CPY = CPY + 20 / (KP * ppdV): GOSUB Cursor
  88.         IF a$ = "2" THEN CPY = CPY - 20 / (KP * ppdV): GOSUB Cursor
  89.         
  90.       END IF
  91.       
  92.       REM LOCATE 25, 3: PRINT "F3 to save new Map Point.  F4 to save New Map to file named NEWMAP";
  93.       LOOP
  94.       SYSTEM 'you should never get here
  95.  
  96. ErrorTrap: fault = ERR: 'Error handling routine
  97.            IF ERR = 57 THEN PRINT "  I/O-error-User-logoff"; : RESUME
  98.            IF ERR = 69 THEN PRINT "  Comm-buffer-overflow"; : RESUME
  99.            IF ERR = 53 THEN PRINT "  file-"; File$; "-not-found": CLOSE : RESUME NEXT
  100.            IF ERR = 62 THEN RESUME NEXT
  101.            IF ERR = 2 THEN PRINT "SYNTAX-error"
  102.            RESET
  103.            PRINT : PRINT "Error beyond repair. Number = "; ERR;
  104.            INPUT "Hit RETURN to return to DOS"; a$
  105.            SYSTEM
  106.  
  107. MapList: CLS : PRINT "MAP FILES LIST": PRINT
  108.          PRINT "To display MAP files, please enter the path to your xxxxxxx.MAP files."
  109.          PRINT "For example, the default '\APRS\*.MAP' will show all maps in the APRS"
  110.          PRINT "directory.  Similarly '*.map' will search your present QB directory."
  111.          PRINT "For any other path, enter the full file specification.": PRINT
  112.          F$ = "\aprs\*.map"
  113.          PRINT "Enter Filespec ("; F$; ")";
  114.          INPUT a$: IF a$ <> "" THEN F$ = a$
  115.          PRINT : PRINT : FILES F$
  116.          RETURN
  117.  
  118.  
  119. LoadMap: 'Ecoast map X/640=16 deg and Y/200=10 deg. for 40 & 20 Pix-per-deg
  120.          'Now modified so that original map data is 640/375...
  121.          'Raw map = 256 mile scale so RngScale = 256 for ppdV=20
  122.          'Modified so that now vertical scale is 400 vice 200 or 375
  123. Again: LOCATE 23, 1: INPUT "Which mapfile to look at (or CR for list)"; a$
  124.        IF a$ = "" THEN GOSUB MapList: GOTO Again
  125.        a = INSTR(3, a$, "."): IF a = 0 THEN a$ = a$ + ".map"
  126.        LET File$ = a$: OPEN File$ FOR INPUT AS #3
  127.        IF fault = 53 THEN fault = 0: RETURN
  128.        INPUT #3, LATo: LINE INPUT #3, LatText$
  129.        INPUT #3, LONo: LINE INPUT #3, LonText$
  130.        INPUT #3, ppdV: LINE INPUT #3, VS$'Pixels per degree horiz
  131.        INPUT #3, LatCen: LINE INPUT #3, LatCen$
  132.        INPUT #3, LonCen: LINE INPUT #3, LonCen$
  133.        INPUT #3, MapRng: LINE INPUT #3, MapRng$
  134.        INPUT #3, MinRng: LINE INPUT #3, Mr$
  135.        RS = 2 ^ INT(LOG(MapRng) / LOG(2))'Rng is intgr of VERTrng
  136.        REM KP = 256 / RS
  137.        i = 0: LNi = 0: LINE INPUT #3, a$' Ignore line of instrutcitons
  138.      
  139.      DO WHILE NOT EOF(3)
  140.         i = i + 1: INPUT #3, x%(i), y: y%(i) = y * Yfactr
  141.         IF x%(i) = 0 AND NOT EOF(3) THEN ' Get line color & store with x=0
  142.            INPUT #3, y%(i): LNi = LNi + 1: LINE INPUT #3, LN$(LNi)' Save line name
  143.            IF y = -1 THEN GOSUB LoadLabels ' All labels listed at end of file
  144.            END IF
  145.         LOOP: nmp = i
  146.      LET CDY = LatCen: CDX = LonCen'Center display on ORIGIN
  147.      LET CPX = CDX: CPY = CDY 'Cursor Posn to Center of Display
  148.      LET Z = 2: LNptr = 1: REM start at first point and first line segment
  149.      CLOSE #3: RETURN:     REM first X% value is map color.  2nd val is 1st pt
  150.  
  151. NextLine: i = Z
  152.           DO UNTIL i = UBOUND(x%)
  153.           i = i + 1: IF x%(i) = 0 THEN Z = i + 1: LNptr = LNptr + 1: EXIT DO
  154.           LOOP: GOTO ShowLine
  155. Previous: i = Z
  156.           DO UNTIL i = LBOUND(x%)
  157.           i = i - 1: IF x%(i) = 0 THEN Z = i - 1: LNptr = LNptr - 1: EXIT DO
  158.           LOOP
  159. ShowLine: CIRCLE (Xtest, Ytest), 10, 0 'Erase old circle
  160.           IF LEFT$(LN$(LNptr), 6) = "Labels" THEN Z = 2: LNptr = 1
  161.           IF Z < 2 THEN Z = 2: LNptr = 1
  162.           LOCATE 23, 40
  163.           PRINT "LineName: "; LEFT$(LN$(LNptr) + "                 ", 20);
  164.           RETURN
  165.  
  166. LoadLabels: k = 0
  167.      DO WHILE NOT EOF(3)
  168.         k = k + 1: INPUT #3, ML$(k), Mla(k), MLo(k), MLr(k)
  169.      LOOP: NML = k: RETURN
  170.        
  171. SaveMap: OPEN "newmap" FOR OUTPUT AS #4
  172.          PRINT #4, LAT; LatText$
  173.          PRINT #4, LON; LonText$
  174.          PRINT #4, ppdV; VS$
  175.          PRINT #4, LatCen; LatCen$
  176.          PRINT #4, LonCen; LonCen$
  177.          PRINT #4, MapRng; MapRng$
  178.          PRINT #4, MinRng; MS$
  179.          PRINT #4, "Format line for comments. ETC"
  180.          FOR i = 1 TO nmp
  181.          PRINT #4, x%(i); INT((y%(i) / Yfactr) + .5)
  182.          NEXT i: CLOSE #4: RETURN
  183.  
  184. CurDrwMap: CDX = CPX: CDY = CPY
  185. DrawMap: 'Draw to range scale RS and center display CDX and CDY
  186.          'Original Map was 40 pix-per-deg Horiz and 20 vert for 200 display
  187.          'Now ppdH and ppdV are variables.  The scaling factor KP is 1 for
  188.          'the original map scale.
  189.          IF RS < MinRng THEN LET RS = MinRng
  190.          KP = 100 * 120 / (RS * ppdV)'This is to scale it down from the 120 maps
  191.          Lfac = COS(CDY / 57.296)
  192.          DX = ppdV * (LONo - CDX)
  193.          DY = (LATo - CDY) * ppdV * Yfactr
  194.          CLS : LOCATE 1, 2: PRINT "Redrawing Map"
  195.          REM first put ORIGIN and map CENTER on the map
  196.          LINE (320 - KP * DX, Ycen - KP * DY)-(960 - KP * DX, Ycen - KP * DY), 14
  197.          LINE (320 - KP * DX, Ycen - KP * DY)-(320 - KP * DX, 3 * Ycen - KP * DY), 14
  198.          CMX = 320 + KP * (CDX - LonCen) * ppdV
  199.          CMY = Ycen + KP * (CDY - LatCen) * ppdV * Yfactr
  200.          LINE (CMX - 27, CMY)-(CMX + 27, CMY), 14
  201.          LINE (CMX, CMY - 20)-(CMX, CMY + 20), 14
  202.          CIRCLE (CMX, CMY), 10, 14
  203.  
  204.          CIRCLE (320 - KP * DX, Ycen - KP * DY), 12, 14
  205.          FOR i = 0 TO nmp - 1
  206.          x = 320 + KP * (x%(i) - DX): y = Ycen + KP * (y%(i) - DY)
  207.          X1 = 320 + KP * (x%(i + 1) - DX): Y1 = Ycen + KP * (y%(i + 1) - DY)
  208.          IF x%(i + 1) <> 0 THEN
  209.             IF RdsOn OR LineColor <> 12 THEN LINE (x, y)-(X1, Y1), LineColor
  210.             ELSE LineColor = y%(i + 1): i = i + 1
  211.          END IF
  212.          NEXT i
  213.  
  214.          CPX = CDX: CPY = CDY: GOSUB Cursor' Cursor Posn to center
  215.          LOCATE 25, 1: PRINT "Use + and - to move MAPpoint.  N for next line segment.  P for previous.";
  216.          LOCATE 1, 60: PRINT "TOTAL PTS:"; nmp; "="; INT(nmp / 10); "%";
  217.  
  218. Labels: IF Labls THEN
  219.             FOR i = 1 TO NML ' Now plot labels on map
  220.             IF RS <= MLr(i) OR Key$ = "S" THEN
  221.                LET x = 320 + KP * (CDX - MLo(i)) * ppdV
  222.                LET y = Ycen + KP * (CDY - Mla(i)) * ppdV * Yfactr
  223.                IF Tags AND y > 14 * Yfactr AND y < 350 * Yfactr AND x > 8 * (LEN(ML$(i)) + 1) AND x < 632 THEN
  224.                   LOCATE y / (14 * Yfactr), (x / 8) - LEN(ML$(i)): PRINT ML$(i);
  225.                   END IF
  226.                END IF
  227.             NEXT i
  228.          END IF: RETURN
  229.            
  230. Grid: 'draw lat/long degree lines THIS HAS NOT BEEN FIXED FOR DIFF MAPS
  231.      FOR i = 0 TO 16: LINE (i * 40, 0)-(i * 40, 400 * Yfactr), 1: NEXT i
  232.      FOR i = 0 TO 10: LINE (0, i * 400 * Yfactr / 10)-(640, i * 400 * Yfactr / 10), 1: NEXT i
  233.      LOCATE 23, 1: a = INT(.5 + (RS * 60 / 256))
  234.      IF RS = 256 THEN PRINT "Grid in degrees"
  235.      IF RS < 256 THEN PRINT "Grid every"; a; "minutes"
  236.      RETURN
  237.  
  238. Cursor: CIRCLE (CUX, CUY), 4, 0
  239.      LET CUX = 320 + KP * (CDX - CPX) * ppdV
  240.      LET CUY = Ycen + KP * (CDY - CPY) * ppdV * Yfactr
  241.      CIRCLE (CUX, CUY), 4, 12
  242.      x = INT(CPX): y = INT(CPY): xm = (CPX - x) * 60: ym = (CPY - y) * 60
  243.      x$ = RIGHT$(STR$(x), 3) + " "
  244.      LOCATE 1, 2: PRINT "RNG"; RIGHT$("   " + STR$(RS), 4) + "      "
  245.      LOCATE 2, 2: PRINT "LAT "; y; MID$(STR$(ym) + "   ", 2, 5)
  246.      LOCATE 3, 2: PRINT "LON "; x$; MID$(STR$(xm) + "   ", 2, 5)
  247.      LINE (0, 0)-(116, 42 * Yfactr), 12, B'Box around it
  248.  REM MAP DEBUG
  249.      IF Z < 1 THEN Z = 1 ELSE IF Z >= nmp - 1 THEN Z = nmp - 1
  250.      IF x%(Z) = 0 AND a$ = "+" THEN LNptr = LNptr + 1: Z = Z + 1
  251.      IF x%(Z) = 0 AND a$ = "-" THEN LNptr = LNptr - 1: Z = Z - 1
  252.      IF LNptr < 0 THEN LNptr = 0
  253.      GOSUB ShowLine ' and erase old mappoint pointer
  254.      Xtest = KP * (x%(Z) - DX) + 320: Ytest = KP * (y%(Z) - DY) + Ycen
  255.      CIRCLE (Xtest, Ytest), 10, 11
  256.      LOCATE 23, 1: PRINT "MapPt #"; Z; "X/Y vals:";
  257.      PRINT TAB(23); x%(Z); TAB(29); y%(Z)
  258.      PRINT "Cursor coordinates:"; TAB(23);
  259.      PRINT INT(.5 + DX + (CUX - 320) / KP); TAB(29); INT(.5 + DY + (CUY - Ycen) / KP);
  260.      LOCATE 24, 40: PRINT "Degrees: ";
  261.      PRINT LEFT$(STR$(CPY) + " ", 7); LEFT$(STR$(CPX) + "   ", 7);
  262.      LET a$ = "": LET B$ = "": RETURN
  263.  
  264. Help: CLS : LINE (0, 0)-(639, 18 * Yfactr), 14, BF: LOCATE 1, 34: PRINT " HELP SCREEN "
  265.       LOCATE 3, 1
  266.       PRINT " This program finds map points for fixing lines or adding labels.   The cursor"
  267.       PRINT " is shown in both LAT/LONG, map coordiniates and in decimal degrees.   The map"
  268.       PRINT " ORIGIN is shown by two yellow lines and a circle.  Labels are right justified"
  269.       PRINT " about where a period(.) should be.  Stations & objects will be left justified."
  270.       PRINT ""
  271.       PRINT " G - Grid overlay                S - Show all Labels"
  272.       PRINT " N - Next line segment           M - Map files list"
  273.       PRINT " P - Previous line segment       L - Labels on/off"
  274.       PRINT " Q - QUIT & return to QB         + - Move to next map point"
  275.       PRINT " H - HELP screen                 - - Move to previous map point"
  276.       PRINT
  277.       PRINT " On the MAP screen, use the white arrow keys with NumLock off for best movement"
  278.       PRINT " Space bar        -  Draw map"
  279.       PRINT " Arrow Keys       -  Move cursor. (use Shift to move faster)"
  280.       PRINT " Home             -  Home the map to the cursor coordinates"
  281.       PRINT " PgUp, PgDn       -  Change map scale up/dn by 2 (use CTRL for factor of 8)"
  282.       PRINT " End              -  Redraw map centered on ORIGIN"
  283.       PRINT
  284.       PRINT " Observe your map, make notes, Quit.  Then Load ur map as a DOCUMENT and edit!"
  285.       PRINT
  286.       LOCATE 25, 1: PRINT "Use + and - to move MAPpoint.  N for next line segment.  P for previous.";
  287.       LINE (0, 0)-(634, 348 * Yfactr), 15, B
  288.       RETURN
  289.  
  290. END
  291.  
  292.