' qfigsub2.bas

'$INCLUDE: 'QFIG.BI'

SUB CL.R.edraw (simple%, show%)
'                                                           clear and redraw
CLS 0
i% = windowx%(wndwfctr%) + pxo%
IF i% > REGIONXMAX THEN i% = REGIONXMAX
LINE (pxo%, pyo%)-(i%, pyo%), 3
i% = windowy%(wndwfctr%) + pyo%
IF i% > REGIONYMAX THEN i% = REGIONYMAX
LINE (pxo%, pyo%)-(pxo%, i%), 3
FOR i% = pxo% TO windowx%(wndwfctr%) + pxo% STEP 4
IF i% > REGIONXMAX THEN EXIT FOR
LINE (i%, pyo%)-(i%, pyo% + 2), 3
IF INT(i% / 20) * 20 = i% THEN LINE -(i%, pyo% + 4), 3
IF INT(i% / 40) * 40 = i% THEN LINE -(i%, pyo% + 6), 3
IF i% <> 0 AND INT(i% / 200) * 200 = i% THEN CIRCLE (i%, pyo% + 6), 3, 3, , , 1
NEXT i%
FOR i% = pyo% TO windowy%(wndwfctr%) + pyo% STEP 4
IF i% > REGIONYMAX THEN EXIT FOR
LINE (pxo%, i%)-(pxo% + 2, i%), 3
IF INT(i% / 20) * 20 = i% THEN LINE -(pxo% + 4, i%), 3
IF INT(i% / 40) * 40 = i% THEN LINE -(pxo% + 6, i%), 3
IF i% <> 0 AND INT(i% / 200) * 200 = i% THEN CIRCLE (pxo% + 6, i%), 3, 3, , , 1
NEXT i%
IF nobj% <> 0 THEN
 IF show% <> 0 THEN
       LOCATE 12, 30: COLOR 10: PRINT msgrdrw$; : COLOR 7
 END IF
 xmin% = REGIONXMAX: xmax% = 0: ymin% = REGIONYMAX: ymax% = 0
 FOR n% = 0 TO nobj% - 1
 SetObject n%, 7, simple%
 NEXT n%
END IF
LINE (PMAP(0, 2), PMAP(windowy%(0) - texth% * 4 - 5, 3))-(PMAP(639, 2), PMAP(windowy%(0), 3)), 0, BF
KeyDisplay
LINE (PMAP(0, 2), PMAP(windowy%(0) - texth% * 4 - 4, 3))-(PMAP(639, 2), PMAP(windowy%(0) - texth% * 4 - 4, 3)), 3
'
END SUB

SUB CopySymm
'                                                             symmetric copy
job% = 11
KeySwitch 0
SetInst job%
wx1% = 17 * 8 - 8
wx2% = 17 * 8 + 40
wy1% = line1% * texth% - texth%
wy2% = line1% * texth%
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(13), 0, 1
'
startcopysymm:
selh% = 1
Marking 2, n%
IF n% = 0 THEN Marking 2, n%: GOTO donecopysymm
DO
 CursorMotion keyin%
LOOP UNTIL keyin% <> 1
Marking 2, n%
IF keyin% = 4 THEN GOTO donecopysymm
VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
Marking.Chk 2, sobj%, snode%
IF sobj% < 0 THEN GOTO startcopysymm
FOR i% = 0 TO 6: obj%(nobj%, i%) = obj%(sobj%, i%): NEXT i%
FOR i% = 0 TO obj%(nobj%, 1): xx(nobj%, i%) = xx(sobj%, i%)
yy(nobj%, i%) = yy(sobj%, i%): NEXT i%
SELECT CASE keyin%
 CASE 2
       FOR i% = 0 TO obj%(nobj%, 1)
         yy(nobj%, i%) = 2! * yy(sobj%, snode%) - yy(nobj%, i%)
       NEXT i%
 CASE 3
       FOR i% = 0 TO obj%(nobj%, 1)
         xx(nobj%, i%) = 2! * xx(sobj%, snode%) - xx(nobj%, i%)
       NEXT i%
END SELECT
SetObject nobj%, 7, 0
nobj% = nobj% + 1
Object.Max.Check
GOTO startcopysymm
'
donecopysymm:
SetInst job%
KeySwitch 1
job% = 0
VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
selh% = 0
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 0, BF
LOCATE line1%, 17: COLOR 3: PRINT kky$(13); : COLOR 7
'
END SUB

SUB Disp.C (sobj%, snode%)
'                                                                  cut nodes
IF obj%(sobj%, 1) = 1 THEN EXIT SUB
IF fnoo%(sobj%) = 2 AND obj%(sobj%, 1) = 3 THEN EXIT SUB
CursorDisplay px%, py%
FOR i% = 0 TO nobj% - 1
IF fnoo%(i%) = 11 AND obj%(i%, 5) = sobj% AND obj%(i%, 6) = snode% THEN Killer i%, sobj%
NEXT i%
SetObject sobj%, 0, 0
FOR i% = 1 TO 3: obj%(sobj%, i%) = obj%(sobj%, i%) - 1: NEXT i%
IF snode% <> obj%(sobj%, 1) + 1 THEN
 FOR i% = snode% + 1 TO obj%(sobj%, 1) + 1
 xx(sobj%, i% - 1) = xx(sobj%, i%): yy(sobj%, i% - 1) = yy(sobj%, i%)
 NEXT i%
 IF fnoo%(sobj%) = 2 OR fnoo%(sobj%) = 4 THEN
       xx(sobj%, obj%(sobj%, 1)) = xx(sobj%, 0)
       yy(sobj%, obj%(sobj%, 1)) = yy(sobj%, 0)
 END IF
END IF
IF fnoo%(sobj%) = 3 OR fnoo%(sobj%) = 4 THEN
 snode% = obj%(sobj%, 1)
 G.Addnode sobj%, snode%, 0
 ' Next line resets a closed curve which was originally a Poly
 'but has just been edited
 IF fnoo%(sobj%) = 4 AND obj%(sobj%, 6) <> 0 THEN obj%(sobj%, 6) = 0
END IF
FOR i% = 0 TO nobj% - 1
IF fnoo%(i%) = 11 AND obj%(i%, 5) = sobj% THEN
 SetObject i%, 0, 0
 snode% = 0
 IF obj%(i%, 6) <> 0 THEN snode% = obj%(sobj%, 1): obj%(i%, 6) = snode%
 G.ArrowDirec sobj%, snode%, i%
 SetObject i%, 7, 0
END IF
NEXT i%
SetObject sobj%, 7, 0
CursorDisplay px%, py%
'
END SUB

SUB Disp.D (sobj%, snode%)
'                                                             displace nodes
pxold% = px%: pyold% = py%
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
 IF snode% = obj%(sobj%, 1) THEN
       LINE (pxold%, pyold%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 0
 ELSE
       LINE (pxold%, pyold%)-(xx(sobj%, snode% + 1), yy(sobj%, snode% + 1)), 0
       IF snode% <> 0 THEN
         LINE (pxold%, pyold%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 0
       ELSEIF fnoo%(sobj%) = 2 OR fnoo%(sobj%) = 4 THEN
         LINE (pxold%, pyold%)-(xx(sobj%, obj%(sobj%, 1) - 1), yy(sobj%, obj%(sobj%, 1) - 1)), 0
       END IF
 END IF
 IF keyin% = 4 THEN GOTO donedisp
 ' Next line resets a closed curve which was originally a Poly
 'but has just been edited
 IF fnoo%(sobj%) = 4 AND obj%(sobj%, 6) <> 0 THEN obj%(sobj%, 6) = 0
 IF snode% = obj%(sobj%, 1) THEN
       LINE (px%, py%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 2
 ELSE
       LINE (px%, py%)-(xx(sobj%, snode% + 1), yy(sobj%, snode% + 1)), 2
       IF snode% <> 0 THEN
         LINE (px%, py%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 2
       ELSEIF fnoo%(sobj%) = 2 OR fnoo%(sobj%) = 4 THEN
         LINE (px%, py%)-(xx(sobj%, obj%(sobj%, 1) - 1), yy(sobj%, obj%(sobj%, 1) - 1)), 2
       END IF
 END IF
 CursorDisplay px%, py%
 pxold% = px%: pyold% = py%
LOOP UNTIL keyin% = 2
CursorDisplay px%, py%
IF snode% = obj%(sobj%, 1) THEN
 LINE (pxold%, pyold%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 0
ELSE
 LINE (pxold%, pyold%)-(xx(sobj%, snode% + 1), yy(sobj%, snode% + 1)), 0
 IF snode% <> 0 THEN
       LINE (pxold%, pyold%)-(xx(sobj%, snode% - 1), yy(sobj%, snode% - 1)), 0
 ELSEIF fnoo%(sobj%) = 2 OR fnoo%(sobj%) = 4 THEN
       LINE (pxold%, pyold%)-(xx(sobj%, obj%(sobj%, 1) - 1), yy(sobj%, obj%(sobj%, 1) - 1)), 0
 END IF
END IF
SetObject sobj%, 0, 0
xx(sobj%, snode%) = px%: yy(sobj%, snode%) = py%
IF (fnoo%(sobj%) = 2 OR fnoo%(sobj%) = 4) AND snode% = 0 THEN
 xx(sobj%, obj%(sobj%, 1)) = px%: yy(sobj%, obj%(sobj%, 1)) = py%
END IF
'                                                                     arrows
FOR i% = 0 TO nobj% - 1
IF fnoo%(i%) <> 11 THEN GOTO chkdisp
IF obj%(i%, 5) <> sobj% THEN GOTO chkdisp
SetObject i%, 0, 0
G.ArrowDirec sobj%, obj%(i%, 6), i%
SetObject i%, 7, 0
chkdisp: NEXT i%
'
donedisp:
SetObject sobj%, 7, 0
CursorDisplay px%, py%
'
END SUB

SUB DispCut
'                                                         displace/cut nodes
job% = 9
CursorDisplay px%, py%
FOR i% = 0 TO 92: SWAP curs%(i%), curs2%(i%): NEXT i%
CursorDisplay px%, py%
KeySwitch 0
SetInst job%
wx1% = 47 * 8 - 8
wx2% = 47 * 8 + 40
wy1% = line1% * texth% - texth%
wy2% = line1% * texth%
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(16), 0, 1
'
startdispcut:
Marking 2, n%
IF n% = 0 THEN Marking 2, n%: GOTO donedispcut
selh% = 1
DO
 CursorMotion keyin%
LOOP UNTIL keyin% <> 1
Marking 2, n%
IF keyin% = 4 THEN GOTO donedispcut
VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
selh% = 0
Marking.Chk 2, sobj%, snode%
IF sobj% < 0 THEN GOTO startdispcut
SELECT CASE keyin%
 CASE 2
       Disp.D sobj%, snode%
 CASE 3
       Disp.C sobj%, snode%
END SELECT
GOTO startdispcut
'
donedispcut:
SetInst job%
KeySwitch 1
CursorDisplay px%, py%
FOR i% = 0 TO 92: SWAP curs%(i%), curs2%(i%): NEXT i%
CursorDisplay px%, py%
job% = 0
selh% = 0
VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 0, BF
LOCATE line1%, 47: COLOR 3: PRINT kky$(16); : COLOR 7
'
END SUB

SUB EditObject
'                                                            edit one object
job% = 8
KeySwitch 0
SetInst job%
wx1% = 31 * 8 - 8
wx2% = 31 * 8 + 40
wy1% = line1% * texth% - texth%
wy2% = line1% * texth%
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(15), 0, 1
'
Marking 1, n%
startediting:
IF n% = 0 THEN Marking 1, n%: GOTO donediting
selh% = 1
startediting2:
DO
 CursorMotion keyin%
 IF keyin% = 4 THEN Marking 1, n%: GOTO donediting
LOOP UNTIL keyin% = 2 OR keyin% = 3
Marking.Chk 1, sobj%, snode%
IF sobj% < 0 THEN
  IF keyin% = 3 THEN
    G.Group1 1  '1 means change thickness
  END IF
 GOSUB donediting
END IF
VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
Marking.One 1, sobj%
FOR i% = 0 TO 6: obj%(nobj%, i%) = obj%(sobj%, i%): NEXT i%
FOR i% = 0 TO obj%(nobj%, 1): xx(nobj%, i%) = xx(sobj%, i%)
yy(nobj%, i%) = yy(sobj%, i%): NEXT i%
CursorDisplay px%, py%
SetObject sobj%, 0, 0
CursorDisplay px%, py%
selh% = 0
ON fnoo%(sobj%) GOSUB edline, edline, edline, edline, edcrcl, edarc, edellps, edbox, edbox, edstring, edarrw
CursorDisplay px%, py%
SetObject sobj%, 7, 0
CursorDisplay px%, py%
Marking.One 1, sobj%
GOTO startediting
'
edline:
obj%(sobj%, 4) = thick%: obj%(sobj%, 5) = ltype%
IF keyin% = 3 AND fnoo%(sobj%) >= 2 THEN GOTO regularshape
obj%(sobj%, 0) = obj%(sobj%, 0) + 4 - 2 * fnoo%(sobj%)
IF fnoo%(sobj%) = 0 OR fnoo%(sobj%) = 2 THEN obj%(sobj%, 0) = obj%(sobj%, 0) + 2

'**** added for converting poly to original shape ****
IF (fnoo%(sobj%) = 1 OR fnoo%(sobj%) = 2) AND obj%(sobj%, 6) <> 0 THEN
 FOR itemp% = obj%(sobj%, 6) TO (obj%(sobj%, 1) - 1)
   xx(sobj%, itemp%) = xx(sobj%, itemp% + 1)
   yy(sobj%, itemp%) = yy(sobj%, itemp% + 1)
 NEXT itemp%
 obj%(sobj%, 6) = 0
 FOR itemp% = 1 TO 3: obj%(sobj%, itemp%) = obj%(sobj%, itemp%) - 1: NEXT itemp%
END IF
'****************************
IF fnoo%(sobj%) > 2 AND INT(obj%(sobj%, 1) / 2) * 2 <> obj%(sobj%, 1) THEN
 G.Addnode sobj%, obj%(sobj%, 1), 1
 FOR i% = 0 TO nobj% - 1
       IF fnoo%(i%) = 11 AND obj%(i%, 5) = sobj% AND obj%(i%, 6) <> 0 THEN obj%(i%, 6) = obj%(i%, 6) + 1
 NEXT i%
END IF
GOSUB OKarrow: RETURN
'                                          keyin%=3 and closed line or curve
regularshape:
x0 = 0!: y0 = 0!
FOR i% = 0 TO obj%(sobj%, 2): x0 = x0 + xx(sobj%, i%): y0 = y0 + yy(sobj%, i%)
NEXT i%: x0 = x0 / (obj%(sobj%, 2) + 1): y0 = y0 / (obj%(sobj%, 2) + 1)
IF fnoo%(sobj%) <> 3 THEN
 x2 = 2! * pi / obj%(sobj%, 1)
ELSE
 x3 = x0: y3 = y0
 x0 = (xx(sobj%, 0) + xx(sobj%, obj%(sobj%, 1))) / 2!
 y0 = (yy(sobj%, 0) + yy(sobj%, obj%(sobj%, 1))) / 2!
 x4 = xx(sobj%, 0) - xx(sobj%, obj%(sobj%, 1))
 y4 = yy(sobj%, 0) - yy(sobj%, obj%(sobj%, 1))
 x3 = x3 - x0: y3 = y3 - y0
 x2 = pi / obj%(sobj%, 1)
 IF x4 * y3 - y4 * x3 > 0 THEN x2 = -x2
END IF
SELECT CASE fnoo%(sobj%)
CASE IS = 2
 rad = SQR((xx(sobj%, snode%) - x0) ^ 2 + (yy(sobj%, snode%) - y0) ^ 2)
 s1 = Angle(x0, y0, xx(sobj%, snode%), yy(sobj%, snode%))
 xx(sobj%, 0) = xx(sobj%, snode%): yy(sobj%, 0) = yy(sobj%, snode%)
 xx(sobj%, obj%(sobj%, 1)) = xx(sobj%, snode%)
 yy(sobj%, obj%(sobj%, 1)) = yy(sobj%, snode%)
 FOR i% = 1 TO obj%(sobj%, 2)
 xx(sobj%, i%) = x0 + rad * COS(s1 + x2 * i%)
 yy(sobj%, i%) = y0 - rad * SIN(s1 + x2 * i%)
 NEXT i%
CASE IS >= 3
 r1 = -10000!: r3 = 10000!
 FOR i% = 0 TO obj%(sobj%, 2)
 rad = SQR((xx(sobj%, i%) - x0) ^ 2 + (yy(sobj%, i%) - y0) ^ 2)
 IF rad > r1 THEN r1 = rad: s1 = Angle(x0, y0, xx(sobj%, i%), yy(sobj%, i%))
 IF rad < r3 THEN r3 = rad
 NEXT i%
 IF fnoo%(sobj%) = 4 THEN
       s1 = s1 + pi / 2!
 ELSE
       x1 = x4 * COS(s1) - y4 * SIN(s1): y1 = x4 * SIN(s1) + y4 * COS(s1)
       x3 = SGN(y1) * SQR(ABS(4! * r1 * r1 - x1 * x1))
       IF x1 > 0! THEN
         s2 = -ATN(x3 / x1)
       ELSEIF x1 < 0! THEN
         s2 = -ATN(x3 / x1) - pi
       ELSE
         s2 = -SGN(x3) * pi / 2!
       END IF
       x3 = SIN(s2): IF x3 <> 0! THEN y3 = -y1 / 2! / x3: IF y3 > 1! THEN r3 = y3
 END IF
 FOR i% = 0 TO obj%(sobj%, 2)
 IF fnoo%(sobj%) = 3 THEN
       x3 = r1 * COS(i% * x2 + s2): y3 = -r3 * SIN(i% * x2 + s2)
 ELSE
       x3 = r3 * COS(i% * x2): y3 = -r1 * SIN(i% * x2)
 END IF
 xx(sobj%, i%) = x0 + x3 * COS(s1) + y3 * SIN(s1)
 yy(sobj%, i%) = y0 - x3 * SIN(s1) + y3 * COS(s1)
 NEXT i%
 IF fnoo%(sobj%) = 4 THEN
       xx(sobj%, obj%(sobj%, 1)) = xx(sobj%, 0)
       yy(sobj%, obj%(sobj%, 1)) = yy(sobj%, 0)
 END IF
END SELECT
RETURN
'
edcrcl:
IF xx(nobj%, 1) > pxmax% OR xx(nobj%, 1) < pxmin% OR yy(nobj%, 1) > pymax2% OR yy(nobj%, 1) < pymin% THEN
  RETURN
END IF
obj%(nobj%, 4) = thick%
CursorDisplay px%, py%
px% = xx(nobj%, 1): py% = yy(nobj%, 1)
SetObject nobj%, 7, 0
CursorDisplay px%, py%
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
    SetObject nobj%, 0, 0
 IF keyin% = 4 THEN
    CursorDisplay px%, py%: GOTO edcrcldone
 END IF
 xx(nobj%, 1) = px%: yy(nobj%, 1) = py%
 xx(nobj%, 2) = SQR((px% - xx(nobj%, 0)) ^ 2 + (py% - yy(nobj%, 0)) ^ 2)
 SetObject nobj%, 7, 0
 CursorDisplay px%, py%
LOOP UNTIL keyin% = 2
GOSUB editok
edcrcldone:
RETURN
'
edarc:
obj%(nobj%, 4) = thick%
CursorDisplay px%, py%
SetObject nobj%, 7, 0
px% = xx(nobj%, snode%): py% = yy(nobj%, snode%)
CursorDisplay px%, py%
pxold% = px%: pyold% = py%
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
 SetObject nobj%, 0, 0
 IF keyin% = 4 THEN CursorDisplay px%, py%: GOTO edarcdone
 x0 = xx(nobj%, 1): y0 = yy(nobj%, 1): rad = xx(nobj%, 3)
 x3 = xx(nobj%, 2): y3 = yy(nobj%, 2)
 r1 = yy(nobj%, 3): r3 = yy(nobj%, 4)
 x1 = xx(nobj%, 0): y1 = yy(nobj%, 0)
 IF snode% = 1 THEN
       cx = (x1 + x3) / 2!: cy = (y1 + y3) / 2!
       IF x1 = x3 THEN
         y0 = cy: x0 = px%
       ELSEIF y1 = y3 THEN
         x0 = cx: y0 = py%
       ELSE
         dx = x3 - x1: dy = y3 - y1
         x0 = (dx * cx / dy + dy * px% / dx - py% + cy) / (dx / dy + dy / dx)
         y0 = py% + dy * (x0 - px%) / dx
       END IF
       xx(nobj%, 3) = SQR((x0 - x1) ^ 2 + (y0 - y1) ^ 2)
       yy(nobj%, 3) = Angle(x0, y0, xx(nobj%, 0), yy(nobj%, 0))
       yy(nobj%, 4) = Angle(x0, y0, xx(nobj%, 2), yy(nobj%, 2))
       xx(nobj%, 1) = x0: yy(nobj%, 1) = y0
       px% = INT(x0): py% = INT(y0)
 ELSE
       IF snode% = 0 THEN x1 = px%: y1 = py% ELSE x3 = px%: y3 = py%
       x4 = SQR((x1 - x3) ^ 2 + (y1 - y3) ^ 2) / 2!
       IF x4 > rad THEN
         px% = pxold%: py% = pyold%
       ELSE
         y4 = SQR(rad * rad - x4 * x4)
         s2 = Angle(0!, 0!, y4, -x4)
         IF (r3 > r1 AND r3 - r1 > pi) OR (r3 < r1 AND r3 - r1 > -pi) THEN s2 = pi - s2
         s2 = 2! * s2
         x4 = x3 - x1 * COS(s2) - y1 * SIN(s2)
         y4 = y3 - y1 * COS(s2) + x1 * SIN(s2)
         xx(nobj%, 1) = ((1! - COS(s2)) * x4 + SIN(s2) * y4) / 2! / (1! - COS(s2))
         yy(nobj%, 1) = ((1! - COS(s2)) * y4 - SIN(s2) * x4) / 2! / (1! - COS(s2))
         xx(nobj%, snode%) = px%: yy(nobj%, snode%) = py%
         yy(nobj%, 3) = Angle(xx(nobj%, 1), yy(nobj%, 1), x1, y1)
         yy(nobj%, 4) = Angle(xx(nobj%, 1), yy(nobj%, 1), x3, y3)
         pxold% = px%: pyold% = py%
       END IF
 END IF
 SetObject nobj%, 7, 0
 px% = INT(CSNG(px%) / CSNG(s%)) * s%: py% = INT(CSNG(py%) / CSNG(s%)) * s%
 CursorDisplay px%, py%
LOOP UNTIL keyin% = 2
xx(nobj%, 0) = xx(nobj%, 1) + xx(nobj%, 3) * COS(yy(nobj%, 3))
yy(nobj%, 0) = yy(nobj%, 1) - xx(nobj%, 3) * SIN(yy(nobj%, 3))
xx(nobj%, 2) = xx(nobj%, 1) + xx(nobj%, 3) * COS(yy(nobj%, 4))
yy(nobj%, 2) = yy(nobj%, 1) - xx(nobj%, 3) * SIN(yy(nobj%, 4))
GOSUB editok
edarcdone:
GOSUB OKarrow
RETURN
'
edellps:
IF xx(nobj%, 1) > pxmax% OR xx(nobj%, 1) < pxmin% OR yy(nobj%, 1) > pymax2% OR yy(nobj%, 1) < pymin% THEN
  RETURN
END IF
obj%(nobj%, 4) = thick%
CursorDisplay px%, py%
px% = xx(nobj%, 0): py% = yy(nobj%, 0)
IF yy(nobj%, 2) > 1 THEN
 px% = px% + xx(nobj%, 2) / yy(nobj%, 2)
 py% = py% - xx(nobj%, 2)
ELSE
 px% = px% + xx(nobj%, 2)
 py% = py% - xx(nobj%, 2) * yy(nobj%, 2)
END IF
SetObject nobj%, 7, 0
CursorDisplay px%, py%
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
 SetObject nobj%, 0, 0
 IF keyin% = 4 THEN CursorDisplay px%, py%: GOTO edellpsdone
 rad = ABS(px% - xx(nobj%, 0)): rt = ABS(py% - yy(nobj%, 0))
 IF rad > rt THEN
       rt = rt / rad
 ELSE
       IF rad <> 0 THEN SWAP rad, rt: rt = rad / rt
 END IF
 xx(nobj%, 2) = rad: yy(nobj%, 2) = rt
 SetObject nobj%, 7, 0
 CursorDisplay px%, py%
LOOP UNTIL keyin% = 2
xx(nobj%, 1) = xx(nobj%, 0): yy(nobj%, 1) = yy(nobj%, 0)
IF rt < 1! THEN
 xx(nobj%, 1) = xx(nobj%, 1) + rad
ELSE
 yy(nobj%, 1) = yy(nobj%, 1) - rad
END IF
GOSUB editok
edellpsdone:
RETURN
'
edbox:
fillnow% = fill%
obj%(nobj%, 4) = thick%: obj%(nobj%, 5) = ltype%
fill% = obj%(nobj%, 6)
CursorDisplay px%, py%
SetObject nobj%, 7, 0
CursorDisplay px%, py%
inbox% = 2
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
 wkill% = 1
 SetObject nobj%, 0, 0
 IF keyin% = 4 THEN CursorDisplay px%, py%: GOTO edboxdone
 obj%(nobj%, 6) = fill%
 IF fill% <> 0 THEN
       obj%(nobj%, 0) = obj%(nobj%, 0) - fnoo%(nobj%) + 9: obj%(nobj%, 5) = 0
 ELSE
       obj%(nobj%, 0) = obj%(nobj%, 0) - fnoo%(nobj%) + 8
 END IF
 xx(nobj%, snode%) = px%: yy(nobj%, snode%) = py%
 SetObject nobj%, 7, 0
 CursorDisplay px%, py%
LOOP UNTIL keyin% = 2
inbox% = 0
'****add here for edit boxtext (NOT COMPLETE OR FUNCTIONAL!)
FOR ibt% = 0 TO nobj% - 1
 IF obj%(ibt%, 0) = 10 THEN
  IF (obj%(ibt%, 6) = (sobj% + 1)) THEN
    tempx0% = xx(nobj%, 0)
    tempx1% = xx(nobj%, 1)
    tempy0% = yy(nobj%, 0)
    tempy1% = yy(nobj%, 1)
    'recalculate coordinates for boxtext
     SetObject ibt%, 0, 0
    '------------
    xx(ibt%, 0) = tempx1% - ((tempx1% - tempx0%) / 2)
    yy(ibt%, 0) = tempy1% - ((tempy1% - tempy0%) / 2) - texth% + 4
   '------------
    '
     SetObject ibt%, 7, 0
    EXIT FOR
  END IF
 END IF
NEXT ibt%
' **** End Edit Boxtext ****
GOSUB editok
edboxdone:
fill% = fillnow%
RETURN
'
edstring:
chartypeold% = chartype%: charptold% = charpt%
chartype% = obj%(nobj%, 5): charpt% = obj%(nobj%, 4)
edstring1:
CursorDisplay px%, py%
SetObject nobj%, 7, 0
pxold% = px%: pyold% = py%
LINE (px%, py%)-(px% + epitch%(chartype%, 0) * charpt% / 250 * ptmm, py% + eheight(chartype%) * charpt% * ptmm / .25), 2, B
CursorDisplay px%, py%
CursorDisplay px%, py%
LINE (pxold%, pyold%)-(pxold% + epitch%(chartype%, 0) * charpt% / 250 * ptmm, pyold% + eheight(chartype%) * charpt% * ptmm / .25), 0, B
CursorDisplay px%, py%
ams$ = ""
FOR i% = 1 TO obj%(nobj%, 1)
IF SGN(yy(nobj%, i%)) = 0 THEN
 ams$ = ams$ + CHR$(xx(nobj%, i%))
ELSE
 ams$ = ams$ + STRING$(1, VAL("&j" + HEX$(yy(nobj%, i%)) + HEX$(xx(nobj%, i%))))
END IF
NEXT i%
L.Text px%, py%: PRINT "-> "; : Chr.Input ams$
L.Text px%, py%: PRINT SPACE$(LEN(ams$) + 3);
CursorDisplay px%, py%
SetObject nobj%, 0, 0
CursorDisplay px%, py%
obj%(nobj%, 4) = charpt%: obj%(nobj%, 5) = chartype%
IF ams$ <> "" THEN
 obj%(nobj%, 1) = LEN(ams$)
 G.Charset ams$, nobj%
END IF
j% = 0: FOR i% = 1 TO obj%(nobj%, 1): j% = j% + yy(nobj%, i%): NEXT i%
IF j% <> 0 AND chartype% > 1 THEN obj%(nobj%, 5) = obj%(nobj%, 5) - 2
GOSUB editok
edstringdone:
chartype% = chartypeold%: charpt% = charptold%
RETURN
'
edarrw: RETURN                                          ' no edit for arrows
'
OKarrow:
FOR i% = 0 TO nobj% - 1
IF fnoo%(i%) = 11 AND obj%(i%, 5) = sobj% THEN
 CursorDisplay px%, py%
 SetObject i%, 0, 0
 obj%(i%, 4) = obj%(sobj%, 4)
 G.ArrowDirec sobj%, obj%(i%, 6), i%
 SetObject i%, 7, 0
 CursorDisplay px%, py%
END IF
NEXT i%
RETURN
'
editok:
FOR i% = 0 TO 6: obj%(sobj%, i%) = obj%(nobj%, i%): NEXT i%
FOR i% = 0 TO obj%(sobj%, 1): xx(sobj%, i%) = xx(nobj%, i%)
yy(sobj%, i%) = yy(nobj%, i%): NEXT i%
RETURN
'
donediting:
SetInst job%
KeySwitch 1
job% = 0
selh% = 0
VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 0, BF
LOCATE line1%, 31: COLOR 3: PRINT kky$(15); : COLOR 7
CL.R.edraw 0, 0
'
END SUB

SUB G.Group
'                                                get several objects grouped
job% = 13
KeySwitch 0
LOCATE 2, 2: COLOR 11: PRINT "Setting Group No. "; group%; : COLOR 7
SetInst job%
'
Marking 1, n%
IF n% = 0 THEN Marking 1, n%: GOTO donegrouping
c% = 0
DO
 CursorMotion keyin%
 SELECT CASE keyin%
       CASE 4
         ggroup% = 100 * group%
         FOR i% = 0 TO nobj% - 1
               IF obj%(i%, 0) <> fnoo%(i%) THEN
                 IF obj%(i%, 0) - fnoo%(i%) = ggroup% THEN
                       Marking.One 1, i%
                       obj%(i%, 0) = fnoo%(i%)
                       Marking.One 1, i%
                 END IF
               END IF
         NEXT i%
         GOTO donegrouping
       CASE 2 TO 3
         Marking.Chk 1, sobj%, snode%
         IF sobj% >= 0 THEN
               Marking.One 1, sobj%
               IF fnoo%(sobj%) <> obj%(sobj%, 0) THEN
                 ggroup% = obj%(sobj%, 0) - fnoo%(sobj%)
                 IF ggroup% = 100 * group% THEN c% = 0
                 obj%(sobj%, 0) = fnoo%(sobj%)
                 FOR i% = 0 TO nobj% - 1
                       IF obj%(i%, 0) <> fnoo%(i%) THEN
                         IF obj%(i%, 0) - fnoo%(i%) = ggroup% THEN
                               Marking.One 1, i%
                               obj%(i%, 0) = fnoo%(i%)
                               Marking.One 1, i%
                         END IF
                       END IF
                 NEXT i%
               ELSE
                 obj%(sobj%, 0) = 100 * group% + obj%(sobj%, 0)
                 c% = c% + 1
               END IF
               Marking.One 1, sobj%
         END IF
 END SELECT
LOOP UNTIL keyin% = 3
IF c% <> 0 THEN group% = group% + 1
'
donegrouping:
Marking 1, n%
SetInst job%
LOCATE 2, 2: COLOR 0: PRINT SPACE$(25); : COLOR 7
KeySwitch 1
job% = 0
'
END SUB

SUB Help.Me
'                                                              help messages
KEY(17) OFF: KEY(19) OFF
SCREEN scrtype%
VIEW PRINT 1 TO line3%
CLS 0
SCREEN scrtype%
COLOR 7
ON job% + 1 GOSUB h.0, h.1, h.2, h.3, h.4, h.5, h.6, h.7, h.8, h.9, h.10, h.11, h.12
VIEW PRINT 1 TO line1%
SCREEN scrtype%
IF seljob% <> 0 THEN VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
CL.R.edraw 0, 0
IF seljob% <> 0 AND py% > pymax2% THEN py% = pymax2%
CursorDisplay px%, py%
KeyDisplay
SetInst 0
SELECT CASE seljob%
       CASE 0
          linesel% = 0
       CASE 1 TO 5
          wx1% = (seljob% * 7 - 4) * 8 - 8
          wx2% = (seljob% * 7 - 4) * 8 + 40
          wy1% = (line2% + linesel%) * texth% - texth%
          wy2% = (line2% + linesel%) * texth%
       CASE 6 TO 9
          wx1% = (5 + seljob% * 7) * 8 - 8
          wx2% = (5 + seljob% * 7) * 8 + 40
          wy1% = (line2% + linesel%) * texth% - texth%
          wy2% = (line2% + linesel%) * texth%
END SELECT
COLOR 11
IF seljob% <> 0 THEN
        LINE (PMAP(wx1%, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
        ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(seljob% + linesel% * 10), 0, 1
       COLOR 7
       VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
END IF
IF selh% = 1 THEN Marking 1, n%
KEY(17) ON: KEY(19) ON
help% = 1
EXIT SUB
'
h.0:
KeySwitch 0
PRINT
PRINT
PRINT TAB(3); " FUNCTION KEY (A) ==> [ESC] ==> (B) ==> [ESC] ==> (C) ==> [ESC] ==> (A)"

PRINT TAB(11); "(A)"; TAB(35); "(B)"; TAB(60); "(C)";
PRINT TAB(1); " f.1: Straight Lines"; TAB(28); "to Move objects"; TAB(54); "to change Box Fill Pattern"
PRINT TAB(1); " f.2: Curves"; TAB(28); "to Copy objects"; TAB(54); "to change font type"
PRINT TAB(1); " f.3: Circles & Ellipses"; TAB(28); "to Copy symmetrically"; TAB(54); "to change font size"
PRINT TAB(1); " f.4: Arcs"; TAB(28); "to Rotate objects"; TAB(54); "to Zoom"
PRINT TAB(1); " f.5: Boxes w/wo filler"; TAB(28); "to Edit objects"; TAB(54); "to Hide/Show Text"
PRINT TAB(1); " f.6: Polygons"; TAB(28); "to Cut or Move nodes"; TAB(54); "to Redraw screen"
PRINT TAB(1); " f.7: Closed curves"; TAB(28); "to Kill objects"; TAB(54); "to Reset (clear) drawing"
PRINT TAB(1); " f.8: Arrows"; TAB(28); "to change line Pattern"
PRINT TAB(1); " f.9: Strings"; TAB(28); "to change line Thickness"
PRINT TAB(1); "f.10: File operations"; TAB(28); "to change cursor pitch"
PRINT
PRINT TAB(2); "SPACE/RETURN/DEL ==> to set each choice";
PRINT TAB(45); "ARROWS ==> to move the cursor";
PRINT TAB(2); "PGUP/PGDN ==> Page-up/Page-down";
PRINT TAB(45); "CTRL+w ==> Widen window (Zoom)"
PRINT TAB(45); "CTRL+s ==> Reset all the objects";
PRINT TAB(45); "CTRL+r ==> Redraw all the objects"
PRINT TAB(2); "CTRL+q ==> Quit Program";
PRINT TAB(45); "CTRL+h ==> Context sensitive help"
PRINT TAB(2); "CTRL+LEFT/RIGHT ARROWS ==> Shift Region Right/Left"
PRINT TAB(2); "CTRL+T ==> Hide/Show text toggle"
GOSUB help.hit
KeySwitch 1
seljob% = 0
RETURN
'
h.1:
PRINT
PRINT TAB(5); " Lines(f.1)/ Curves(f.2)/ Polygons(f.6)/ Closed Curves(f.7)"
PRINT
PRINT TAB(5); "   SPACE  = to set intermediate points"
PRINT TAB(5); "   RETURN = to set the last point"
PRINT TAB(5); "   DEL    = to cancel drawing"
PRINT
PRINT TAB(5); "   f.8/f.9       = to change Line Type/Thickness"

wnode% = 1
GOSUB help.hit
RETURN
'
h.2:
PRINT
PRINT TAB(5); " Circles/ Ellipses(f.3)"
PRINT
PRINT TAB(5); "   SPACE  => Circles   ---  to set center and radius"
PRINT TAB(5); "   RETURN => Ellipses  ---  to set diagonal points"
PRINT TAB(5); "   DEL    = to cancel drawing"
PRINT
PRINT TAB(5); "   f.8/f.9       = to change Line Type/Thickness"
GOSUB help.hit
RETURN
'
h.3:
PRINT
PRINT TAB(5); " Arcs(f.4)"
PRINT
PRINT TAB(5); "   SPACE  = to set two end points"
PRINT TAB(5); "   RETURN = to set the last point on the arc"
PRINT TAB(5); "   DEL    = to cancel drawing"
PRINT
PRINT TAB(5); "   f.8/f.9       = to change Line Type/Thickness"
GOSUB help.hit
RETURN
'
h.4:
PRINT
PRINT TAB(5); " Boxes with or without filler(f.5)"
PRINT
PRINT TAB(5); "   SPACE/RETURN  = to set diagonal points"
PRINT TAB(5); "   DEL           = to cancel drawing"
PRINT
PRINT TAB(5); "After drawing box you will be asked if you"
PRINT TAB(5); "want to add centered text to the box   "
PRINT
PRINT TAB(5); "   f.1           = to change filler pattern"
PRINT TAB(5); "   f.8/f.9       = to change Line Type/Thickness"


GOSUB help.hit
RETURN
'
h.5:
PRINT
PRINT TAB(5); " Strings(f.9)"
PRINT
PRINT TAB(5); "      SPACE/RETURN  = to start the string (ended by RETURN)"
PRINT TAB(5); "          DEL       = to cancel "
PRINT
PRINT TAB(5); "      Use f.1 & f.2 to change size and font"
GOSUB help.hit
RETURN
'
h.6:
PRINT
PRINT TAB(5); " Arrows on Lines/ Curves/ Arcs(f.8)"
PRINT
PRINT TAB(5); "   SPACE  = to set/reset one arrow at that end"
PRINT TAB(5); "   RETURN = to set/reset arrows at both ends"
PRINT TAB(5); "   DEL    = to cancel drawing"
GOSUB help.hit
RETURN
'
h.7:
PRINT
PRINT TAB(5); " Move or Copy objects(f.1)(f.2)"
PRINT
PRINT TAB(5); "   SPACE  = to move/copy individual object"
PRINT TAB(5); "   RETURN = to set region to be moved/copied"
PRINT TAB(5); "   DEL    = to cancel operation"
GOSUB help.hit
RETURN
'
h.8:
PRINT
PRINT TAB(5); " Edit objects(f.5)  --  Line thickness and pattern are updated"
PRINT
PRINT TAB(5); "   SPACE/RETURN = to select object/area respectively"
PRINT TAB(5); "   DEL             = to cancel operation"
PRINT : PRINT
PRINT TAB(5); "    Lines, Polygons  <== (SPACE)  ==>     Curves,  Closed Curves"
PRINT TAB(5); "     Polygons, Curves == (RETURN) ==> Regular Polygons, Ellipses"
PRINT TAB(5); "    Circles and Ellipses (SPACE)   :        radii can be changed"
PRINT TAB(5); "    Arcs       (SPACE) : end positions and radius can be changed"
PRINT TAB(5); "    Boxes      (SPACE) :                     size can be changed"
PRINT TAB(5); "              (RETURN) :           filler pattern can be changed"
PRINT TAB(5); "    Strings   (RETURN) :                          To end editing"
PRINT
PRINT TAB(5); "NOTE: To change string(s) font/size select it in area to edit"
COLOR 14
PRINT
PRINT TAB(5); "NOTE: To Move or Cut nodes of Lines/ Curves/ Polygons/ Closed Curves"
PRINT TAB(5); "      Use DspCut(f.6)"
COLOR 7

GOSUB help.hit
RETURN
'
h.9:
PRINT
PRINT TAB(5); " Move or Cut nodes of Lines/ Curves/ Polygons/ Closed Curves(f.6)"
PRINT
PRINT TAB(5); "   SPACE  = to move the node"
PRINT TAB(5); "   RETURN = to cut the node"
PRINT TAB(5); "   DEL    = to cancel operation"
GOSUB help.hit
RETURN
'
h.10:
PRINT
PRINT TAB(5); " Kill objects(f.7)"
PRINT
PRINT TAB(5); "   SPACE/RETURN  = to select the object/area respectively"
PRINT TAB(5); "   y = to confirm this choice"
PRINT TAB(5); "   n = to cancel operation"
GOSUB help.hit
RETURN
'
h.11:
PRINT
PRINT TAB(5); " Symmetric copy of Lines/ Curves/ Polygons/ Closed Curves(f.3)"
PRINT
PRINT TAB(5); "   SPACE  = to copy symmetrically with respect to the horizontal axis"
PRINT TAB(5); "   RETURN = to copy symmetrically with respect to the vertical axis"
PRINT TAB(5); "   DEL    = to cancel operation"
GOSUB help.hit
RETURN
'
h.12:
PRINT
PRINT TAB(5); " Rotate Lines/ Curves/ Polygons/ Closed Curves(f.4)"
PRINT
PRINT TAB(5); "   Before any operation:"
PRINT TAB(5); "      RETURN = to enter the incremental angle"
PRINT
PRINT TAB(5); "   After the set:"
PRINT TAB(5); "      ARROWS, SPACE  = anticlockwise rotation"
PRINT TAB(5); "      RETURN         = to set the position and copy"
PRINT TAB(5); "      DEL            = to cancel operation"
GOSUB help.hit
RETURN
'
help.hit:
PRINT : PRINT TAB(60); : COLOR 10: PRINT "< Hit any key >"; : COLOR 7
DO: res$ = INKEY$: LOOP UNTIL res$ <> ""
RETURN
'
END SUB

SUB Killer (i%, s%)
'                                                                    kill i%
wkill% = 1
SetObject i%, 0, 0
IF i% <> nobj% - 1 THEN
 FOR j% = i% + 1 TO nobj% - 1
       FOR k% = 0 TO 6: obj%(j% - 1, k%) = obj%(j%, k%): NEXT k%
       FOR k% = 0 TO obj%(j% - 1, 1): xx(j% - 1, k%) = xx(j%, k%)
         yy(j% - 1, k%) = yy(j%, k%): NEXT k%
       IF fnoo%(j% - 1) = 11 AND obj%(j% - 1, 5) <> s% AND obj%(j% - 1, 5) > i% THEN obj%(j% - 1, 5) = obj%(j% - 1, 5) - 1
 NEXT j%
END IF
nobj% = nobj% - 1
'
END SUB

SUB KillObject
'                                                            kill one object
job% = 10
CursorDisplay px%, py%
FOR i% = 0 TO 92: SWAP curs%(i%), curs1%(i%): NEXT i%
CursorDisplay px%, py%
KeySwitch 0
SetInst job%
wx1% = 54 * 8 - 8
wx2% = 54 * 8 + 40
wy1% = line1% * texth% - texth%
wy2% = line1% * texth%
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(17), 0, 1
'
Marking 1, n%
startkilling:
IF n% = 0 THEN Marking 1, n%: GOTO donekilling
selh% = 1
DO
 CursorMotion keyin%
IF keyin% = 4 THEN Marking 1, n%: GOTO donekilling
LOOP UNTIL keyin% <> 1
IF keyin% = 2 THEN
selh% = 0
VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
Marking.Chk 1, sobj%, snode%
IF sobj% < 0 THEN Marking 1, n%: GOTO donekilling
ipy% = py%: ipx% = px%: L.Text ipx%, ipy%
PRINT "Sure(y/n)??";
bkey$ = yesno$
L.Text ipx%, ipy%: PRINT SPACE$(12);
IF bkey$ = "n" THEN Marking 1, n%: SetObject sobj%, 7, 0: GOTO donekilling
CursorDisplay px%, py%
grp% = obj%(sobj%, 0) - fnoo%(sobj%)
DO
 Marking.One 1, sobj%
 i% = sobj%                                                 'arrow deleting
 DO UNTIL i% = nobj% - 1
       i% = i% + 1
       IF fnoo%(i%) = 11 AND obj%(i%, 5) = sobj% THEN
         Killer i%, sobj%
         i% = i% - 1
       END IF
 LOOP
 Killer sobj%, sobj%                                      'kill THAT object
 sobj% = -1
 IF grp% <> 0 THEN                                           'group killing
       FOR i% = 0 TO nobj% - 1
         IF obj%(i%, 0) - fnoo%(i%) = grp% THEN sobj% = i%: EXIT FOR
       NEXT i%
 END IF
LOOP UNTIL sobj% < 0
CursorDisplay px%, py%
IF nobj% <> 0 THEN GOTO startkilling
'=======================
ELSEIF keyin% = 3 THEN
       G.Group1 0   ' 0 means kill
'==========================
END IF
'
donekilling:
SetInst job%
KeySwitch 1
CursorDisplay px%, py%
FOR i% = 0 TO 92: SWAP curs%(i%), curs1%(i%): NEXT i%
CursorDisplay px%, py%
job% = 0
selh% = 0
VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 0, BF
LOCATE line1%, 54: COLOR 3: PRINT kky$(17); : COLOR 7
'
END SUB

SUB MarkEnds (c%)
'                                                    marking end points only
c% = 0
xyshift% = INT(3! * wndwxy(wndwfctr%))
FOR i% = 0 TO nobj% - 1
IF fnoo%(i%) <> 1 AND fnoo%(i%) <> 3 AND fnoo%(i%) <> 6 THEN GOTO nomarkends
c% = c% + 1
PPUT xx(i%, 0) - xyshift%, yy(i%, 0) - xyshift%, mark%()
PPUT xx(i%, obj%(i%, 2)) - xyshift%, yy(i%, obj%(i%, 2)) - xyshift%, mark%()
nomarkends: NEXT i%
'
END SUB

SUB Marking (c%, n%)
'                                              marking1 or marking2 (c%=1,2)
IF nobj% = 0 THEN EXIT SUB
n% = 0
FOR i% = 0 TO nobj% - 1
IF obj%(i%, c% + 1) < 0 THEN GOTO nomarking
Marking.One c%, i%: n% = n% + 1
nomarking: NEXT i%
'
END SUB

SUB Marking.Chk (m%, sobj%, snode%)
'                                           get object # chosen (marking.m%)
sobj% = -1: snode% = -1
more% = 0
FOR i% = 0 TO nobj% - 1
IF obj%(i%, m% + 1) < 0 THEN GOTO nomarkchk
FOR j% = 0 TO obj%(i%, m% + 1)
dist = SQR((xx(i%, j%) - CSNG(px%)) ^ 2 + (yy(i%, j%) - CSNG(py%)) ^ 2)
IF dist < 3! * wndwxy(wndwfctr%) THEN
 sobj% = i%: snode% = j%
 SetObject sobj%, 3, 0
'------------------
' check for for next
'
FOR i1% = i% + 1 TO nobj% - 1
FOR j1% = 0 TO obj%(i1%, m% + 1)
 dist = SQR((xx(i1%, j1%) - CSNG(px%)) ^ 2 + (yy(i1%, j1%) - CSNG(py%)) ^ 2)
 IF dist < 3! * wndwxy(wndwfctr%) THEN
   more% = 1
   EXIT FOR
 END IF
NEXT j1%
IF more% = 1 THEN EXIT FOR
NEXT i1%
IF more% = 1 THEN
ipy% = py%: ipx% = px%: L.Text ipx%, ipy%
PRINT "y/n?";
  bkey$ = yesno$
L.Text ipx%, ipy%: PRINT SPACE$(5);
ELSE
 bkey$ = "y"
END IF
'------------
IF bkey$ = "y" THEN EXIT SUB
 SetObject sobj%, 7, 0
 sobj% = -1: snode% = -1
END IF
NEXT j%
nomarkchk: NEXT i%
'
END SUB

SUB Marking.One (c%, i%)
'                                                            mark one object
xyshift% = INT(3! * wndwxy(wndwfctr%))
FOR j% = 0 TO obj%(i%, c% + 1)
 IF fnoo%(i%) = obj%(i%, 0) THEN
       PPUT xx(i%, j%) - xyshift%, yy(i%, j%) - xyshift%, mark%()
 ELSE
       PPUT xx(i%, j%) - xyshift%, yy(i%, j%) - xyshift%, markg%()
 END IF
NEXT j%
'
END SUB

SUB Marking.Reg (sx%, sy%, ex%, ey%, total%)
'                                                       get objects # chosen
total% = -1
FOR i% = 0 TO nobj% - 1: IF obj%(i%, 2) < 0 THEN GOTO nomarkreg
FOR j% = 0 TO obj%(i%, 1)
IF (xx(i%, j%) - sx%) * (xx(i%, j%) - ex%) > 0 THEN GOTO nomarkreg1
IF (yy(i%, j%) - sy%) * (yy(i%, j%) - ey%) > 0 THEN GOTO nomarkreg1
total% = total% + 1: mobj%(total%) = i%: GOTO nomarkreg
nomarkreg1: NEXT j%
nomarkreg: NEXT i%
'
END SUB

SUB Object.Max.Check
'                                                      only warn the maximum
IF nobj% < UBOUND(xx, 1) THEN EXIT SUB
LOCATE 2, 25
IF nobj% = UBOUND(xx, 1) THEN
 COLOR 14
 PRINT CHR$(7); " The next one will be the last object. ";
ELSE
 COLOR 10
 PRINT CHR$(7); " This one is the very very last one!!! ";
END IF
COLOR 7
'
END SUB

SUB Rotate
'                                                              rotate object
job% = 12
KeySwitch 0
SetInst job%
s2 = pi / 90!
wx1% = 24 * 8 - 8
wx2% = 24 * 8 + 40
wy1% = line1% * texth% - texth%
wy2% = line1% * texth%
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 11, BF
ptext PMAP(wx1%, 2) + 19, PMAP(wy1%, 3) + 1, kky$(14), 0, 1
'
startrotate:
Marking 2, n%
selh% = 1
IF n% = 0 THEN Marking 2, n%: GOTO donerotate1
DO
 CursorMotion keyin%
LOOP UNTIL keyin% <> 1
Marking 2, n%
IF keyin% = 4 THEN CursorDisplay px%, py%: GOTO donerotate
VIEW SCREEN (0, 0)-(windowx%(0), winpy%)
IF keyin% = 3 THEN
 L.Text px%, py%
 a$ = fno$(90, 1): PRINT "Angle (PI/n) : n = ";
 Chr.Input a$: s2 = VAL(a$): IF s2 <= 0! THEN s2 = 90!
 s2 = pi / s2
 L.Text px%, py%: PRINT SPACE$(30);
 GOTO startrotate
END IF
Marking.Chk 2, sobj%, snode%
IF sobj% < 0 THEN GOTO startrotate
selh% = 0
FOR i% = 0 TO 6: obj%(nobj%, i%) = obj%(sobj%, i%): NEXT i%
FOR i% = 0 TO obj%(nobj%, 1): xx(nobj%, i%) = xx(sobj%, i%)
yy(nobj%, i%) = yy(sobj%, i%): NEXT i%
DO
 CursorMotion keyin%
 CursorDisplay px%, py%
 IF keyin% <> 3 THEN
       SetObject nobj%, 0, 1
       FOR i% = 0 TO obj%(nobj%, 1)
       s1 = Angle(xx(nobj%, snode%), yy(nobj%, snode%), xx(nobj%, i%), yy(nobj%, i%))
       rad = SQR((xx(nobj%, i%) - xx(nobj%, snode%)) ^ 2 + (yy(nobj%, i%) - yy(nobj%, snode%)) ^ 2)
       xx(nobj%, i%) = xx(nobj%, snode%) + rad * COS(s1 + s2)
       yy(nobj%, i%) = yy(nobj%, snode%) - rad * SIN(s1 + s2)
       NEXT i%
       IF keyin% = 4 THEN GOTO donerotate
       SetObject nobj%, 3, 1
 END IF
 CursorDisplay px%, py%
LOOP UNTIL keyin% = 3
CursorDisplay px%, py%
SetObject nobj%, 0, 1
SetObject nobj%, 7, 0
nobj% = nobj% + 1
Object.Max.Check
'
donerotate:
IF sobj% >= 0 THEN
SetObject sobj%, 0, 0
SetObject sobj%, 7, 0
END IF
CursorDisplay px%, py%
donerotate1:
SetInst job%
KeySwitch 1
job% = 0
selh% = 0
VIEW SCREEN (0, 0)-(windowx%(0), windowy%(0))
LINE (PMAP(wx1% - 1, 2), PMAP(wy1%, 3))-(PMAP(wx2%, 2), PMAP(wy2%, 3)), 0, BF
LOCATE line1%, 24: COLOR 3: PRINT kky$(14); : COLOR 7
'
END SUB