home *** CD-ROM | disk | FTP | other *** search
Wrap
GW-BASIC | 1988-06-02 | 31.9 KB | 862 lines
5 DIM X(700), Y(700), Z(700), XI(700), YI(700), ZI(700), NALCAD%(100) 10 DIM IN%(1000),JN%(1000),N%(18), C%(18), OL$(18), L%(18), D%(18), DMP%(1) 15 DIM FL$(18), HE%(1500), SI$(18), EM$(10), LSTBOX%(43), COMBOX%(34) 16 DIM XPOS(50), YPOS(50), ZPOS(50), IND%(50), JND%(50),LT$(18) 100 ON ERROR GOTO 7700 110 GOTO 10000 197 REM 198 REM Set up highlight boxes 199 REM 200 DATA 68 , 9 ,-1 ,-1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-1 205 DATA -3841 ,-1 ,-1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-1 ,-3841 210 DATA -1 ,-1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-1 ,-3841 ,-1 215 DATA -1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-1 ,-3841 ,-1 ,-1 220 DATA -1 ,-1 , 240 , 0 225 FOR I=0 TO 43: READ LSTBOX%(I): NEXT I 250 DATA 52 , 9 ,-1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-3841 ,-1 255 DATA -1 ,-1 ,-16 ,-1 ,-1 ,-3841 ,-1 ,-1 ,-1 ,-16 260 DATA -1 ,-1 ,-3841 ,-1 ,-1 ,-1 ,-16 ,-1 ,-1 ,-3841 265 DATA -1 ,-1 ,-1 , 240 , 0 300 FOR I=0 TO 34: READ COMBOX%(I): NEXT I 320 DATA 111 , 14 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 325 DATA -1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 330 DATA -1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 335 DATA -1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 ,-1 ,-1 340 DATA -1 ,-1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 345 DATA -257 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 ,-1 350 DATA -1 ,-1 ,-1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 ,-1 355 DATA -1 ,-257 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 360 DATA -1 ,-1 ,-1 ,-1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 365 DATA -1 ,-1 ,-257 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-257 370 DATA 0 375 FOR I=0 TO 100: READ NALCAD%(I): NEXT I 390 RETURN 797 REM 798 REM Set up main screen boxes 799 REM 800 SCREEN 2,0,0,0:KEY OFF 801 CLS 805 REM LINE (117,5)-(542,18),,B 810 LINE (4,21)-(542,178),,B:LINE (545,21)-(636,194),,B 815 LINE (4,181)-(542,194),,B 820 LINE (545,32)-(636,32):LINE (77,181)-(77,194) 825 LOCATE 2,3: PRINT "3-D Shapes ": LOCATE 4, 71: PRINT "OBJECTS";HM$ 830 PUT (4,5), NALCAD%, XOR: LOCATE 10,5 890 RETURN 897 REM 898 REM PRINT TO COMMAND LINE WITH COMBOX% 899 REM 900 LOCATE 24,2:PRINT HL$;:LOCATE 24,13: PRINT MI$;CHR$(11) 910 COMBOX1=95 : SL=1 912 PUT (COMBOX1,183), COMBOX%, XOR 915 A$=INKEY$: IF A$="" THEN 915 916 A1$=RIGHT$(A$,1): A1ASC=ASC(A1$) 920 IF A1ASC <>RI AND A1ASC <>LE AND A1ASC <>RET THEN 915 925 IF A1ASC <>RI THEN 950 930 COMBOX2=COMBOX1+64: IF COMBOX2=(95+NI*64) THEN COMBOX2=95 935 S0=SL+1: IF S0=NI+1 THEN S0=1 940 PUT (COMBOX1,183),COMBOX%,XOR : SL=S0 : COMBOX1=COMBOX2: GOTO 912 950 IF A1ASC <>LE THEN 970 955 COMBOX2 = COMBOX1 - 64: IF COMBOX2=31 THEN COMBOX2=95+64*(NI-1) 960 S0=SL-1: IF S0=0 THEN S0= NI 965 PUT (COMBOX1,183),COMBOX%,XOR : SL=S0 : COMBOX1=COMBOX2: GOTO 912 970 PUT (COMBOX1,183), COMBOX%,XOR: RETURN 997 REM 998 REM Initialization 999 REM 1000 KEY OFF: RET$=CHR$(13): HM$=CHR$(11): ESCAPE=27:NODELIMIT=700:LINELIMIT=1000:EXCEED=0 1018 GOSUB 200 1020 XE=100: YE=100: ZE=100: EM=1: UP=72 : DOWN=80 : RI=77: LE=75: RET=13 1025 XC=5: YC=5: ZC=5 : SW=337: SH=157: LB=101: BB=22 : PI=3.14159 1030 SCALFAC=1: PW= SQR((XE-XC)^2+(YE-YC)^2+(ZE-ZC)^2)/SCALFAC: LO=0: LN=0: LL=0 1090 RETURN 1096 REM 1097 REM Project points in space to 3-D image plane 1099 REM 1100 FOR I%= P1 TO (P1+PQ-1) 1105 T1=(XE-XC)*(X(I%)-XC) + (YE-YC)*(Y(I%)-YC) + (ZE-ZC)*(Z(I%)-ZC) 1110 T2=(XC-XE)*(X(I%)-XE) + (YC-YE)*(Y(I%)-YE) + (ZC-ZE)*(Z(I%)-ZE) 1120 XI(I%)=(X(I%)-XE)*(T1/T2) + X(I%) 1125 YI(I%)=(Y(I%)-YE)*(T1/T2) + Y(I%) 1130 ZI(I%)=(Z(I%)-ZE)*(T1/T2) + Z(I%): NEXT I%: RETURN 1197 REM 1198 REM GET A NUMERIC VALUE FROM THE USER 1199 REM 1200 EC=3:GOSUB 1300: LOCATE 2,18: PRINT "INPUT"; HM$;: LOCATE 2,25 1202 PRINT PL$;: LOCATE 2,50: PRINT "DEFLT=";: LOCATE 2,58: 1203 PRINT USING "####.##"; DV;:PRINT HM$;: NUM = DV: COMBOX1 = 135: SL=1 1205 PUT (COMBOX1,7) , COMBOX%,XOR 1210 A$=INKEY$: IF A$="" THEN 1210 1215 A1$=RIGHT$(A$,1): A1ASC=ASC(A1$) 1220 IF A1ASC<> RI AND A1ASC <> LE AND A1ASC <> RET THEN 1210 1225 IF A1ASC=RET THEN 1240 1230 COMBOX2= -(COMBOX1=135)*391 - (COMBOX1=391)*135: SL=-(SL=1)*2 - (SL=2)*1 1235 PUT (COMBOX1,7), COMBOX%, XOR: COMBOX1=COMBOX2: GOTO 1205 1240 PUT (COMBOX1,7), COMBOX%,XOR: ON SL GOTO 1245,1290 1245 LOCATE 2,49: PRINT " "; HM$ 1246 LOCATE 2,36: INPUT NUM: PRINT HM$; 1290 EC=3: GOSUB 1300:RETURN 1297 REM 1298 REM Erasing subroutine 1299 REM 1300 ON EC GOTO 1305, 1315, 1325, 1335, 1345 1305 LOCATE 24,2: PRINT " ";HM$; 1310 LOCATE 24,13:PRINT" "; 1312 PRINT HM$;: GOTO 1390 1315 LOCATE 24,13:PRINT" "; 1316 PRINT HM$;: GOTO 1390 1325 LOCATE 2,18 1326 PRINT " ";HM$;:GOTO 1390 1335 FOR I= 4 TO 21: LOCATE I,2 1336 PRINT" "; 1337 NEXT I 1338 LOCATE 22,2 1339 PRINT" "; 1340 PRINT HM$;: GOTO 1390 1345 LOCATE 4,71: PRINT " ";HM$; 1346 FOR I=1 TO NS+1: LOCATE 5+I,71: PRINT " ";HM$;: NEXT I 1347 GOTO 1390 1390 RETURN 1396 REM 1397 REM Make a modified cylinder 1399 REM 1400 PL$="Bt radius=":DV=BOTRAD: GOSUB 1200 : BOTRAD=NUM: PL$="Tp radius=" 1405 DV=BOTRAD: GOSUB 1200: TOPRAD=NUM 1407 PL$="# of sides": DV=4: GOSUB 1200: SIDES=NUM: GOSUB 7500: IF SIDETEST=1 THEN 1407 1408 PNODES=LN+2*SIDES: PLINES=LL+3*SIDES: GOSUB 7800: IF EXCEED=1 THEN 1800 1412 PL$=" Height = ": DV=HEIGHT: GOSUB 1200: HEIGHT=NUM 1413 PL$="Eccentr=" : DV=1: GOSUB 1200: ECC=NUM: PL$="Obj. name=" 1415 LEGLEN=8: GOSUB 1600: OL$(LO+1)=LB$: LOCATE 6+LO, 71: PRINT LB$; HM$ 1420 NS=NS+1: SI$(NS)= LB$: BOTRAD1=BOTRAD/COS(PI/SIDES) 1425 TOPRAD1=TOPRAD/COS(PI/SIDES): FOR I=1 TO SIDES 1430 AA=(I-1)*2*PI/SIDES + PI/SIDES: X(LN+I)= ECC*BOTRAD1*COS(AA) 1433 Z(LN+I)=BOTRAD1*SIN(AA): Y(LN+I)=0: X(LN+SIDES+I)=ECC*TOPRAD1*COS(AA) 1434 Z(LN+SIDES+I)=TOPRAD1*SIN(AA): Y(LN+SIDES+I)=HEIGHT: NEXT I 1435 FOR I=1 TO SIDES: IN%(LL+I)=LN+I: JN%(LL+I)=LN+I+1 1437 IN%(LL+2*SIDES+I)=LN+SIDES+I 1440 JN%(LL+2*SIDES+I)=LN+SIDES+I+1: IN%(LL+SIDES+I)=LN+I 1443 JN%(LL+SIDES+I)=LN+SIDES+I: NEXT I 1445 JN%(LL+SIDES)=LN+1: JN%(LL+3*SIDES)=LN+SIDES+1: LO=LO+1: N%(LO)=LN+1 1448 C%(LO)=2*SIDES 1450 L%(LO)=LL+1: D%(LO)=3*SIDES: LN=LN+2*SIDES: LL=LL+3*SIDES 1490 GOTO 1800 1596 REM 1597 REM Get an 8-character label 1599 REM 1600 LOCATE 2,18: PRINT PL$; HM$: LOCATE 2,30: INPUT LB$: PRINT HM$ 1605 TEMP$="": FOR I=1 TO LEN(LB$): C=ASC(MID$(LB$,I,1)): IF NOT ((C>47 AND C<58) OR (C>64 AND C<91) OR (C>96 AND C<123)) THEN 1620 1610 IF C>96 THEN C = C AND 223 1615 TEMP$=TEMP$ + CHR$(C) 1620 NEXT I: LB$=TEMP$: IF LEN(LB$)=0 THEN EC=3: GOSUB 1300: GOTO 1600 1655 IF LEN(LB$) > LEGLEN THEN LB$ = LEFT$(LB$,LEGLEN) 1660 EC=3: GOSUB 1300: RETURN 1696 REM 1697 REM Begin the routine for drawing the shape(s) designated 1699 REM 1700 IF LO>=1 THEN 1705 1701 EM$=" An object must be created with...": GOSUB 3500: GOSUB 3550 1702 EM$=" MAKE, SPECIAL or LIBRAR before it can be drawn.": GOSUB 3500 1703 GOSUB 3550: GOTO 2400 1705 IF (XE<>XC OR ZE<>ZC) THEN 1715 1707 EM$=" Viewing location cannot be directly above center.": GOSUB 3500: GOSUB 3550 1708 EM$=" Change viewing location or CENTER...": GOSUB 3500: GOSUB 3550 1709 EM$=" before attempting to DRAW or REDRAW.": GOSUB 3500: GOSUB 3550: GOTO 2400 1715 GOSUB 3300: IF TARF=1 THEN 2400 1719 P1=N%(SL): PQ= C%(SL): L1=L%(SL): LQ= D%(SL): GOSUB 1100 1720 GOSUB 2100: GOSUB 2000: GOSUB 2200: GOSUB 2300: GOTO 2400 1797 REM 1798 REM DISPLAY "MAKE" MENU AND GET A SHAPE 1799 REM 1800 EC=1:GOSUB 1300:HL$=" MAKE": NI=5 1805 MI$=" LINE POLYGN MODCYL CONE QUIT": GOSUB 900 1810 ON SL GOTO 4000,3600,1400,3400,2400 1996 REM 1997 REM Change 3-D image plane points to 2-D 1999 REM 2000 FOR I%= P1 TO (P1+PQ-1) 2005 X2=(XI(I%)-XC)*IX + (YI(I%)-YC)*JX + (ZI(I%)-ZC)*KX 2010 Y2=(XI(I%)-XC)*IY + (YI(I%)-YC)*JY + (ZI(I%)-ZC)*KY 2015 XI(I%)=X2 : YI(I%)=Y2: NEXT I%: RETURN 2096 REM 2097 REM Calculate image plane cartesian vectors 2099 REM 2100 IX=(ZE-ZC)/SQR((ZE-ZC)^2 + (XE-XC)^2) : JX=0 2105 KX= -(XE-XC)/SQR((ZE-ZC)^2 + (XE-XC)^2) 2110 PA= (XE-XC)*(YC-YE): PB= (XC-XE)^2 + (ZC-ZE)^2 : PC=(ZE-ZC)*(YC-YE) 2115 VL= SQR(PA^2 + PB^2 + PC^2) : IY= PA/VL: JY=PB/VL : KY=PC/VL 2120 RETURN 2196 REM 2197 REM Change 2-D image plane points to screen points 2199 REM 2200 FOR I%=P1 TO (P1+PQ-1): XI(I%)=XI(I%)*(SW/PW)+SW/2 + LB 2205 YI(I%)=YI(I%)*(SH/PW)+SH/2+BB 2215 NEXT I% 2290 RETURN 2296 REM 2297 REM Draw lines on screen 2299 REM 2300 FOR I%= L1 TO (L1+LQ-1): XX1=XI(IN%(I%)): YY1=178-YI(IN%(I%)): XX2=XI(JN%(I%)): YY2= 178-YI(JN%(I%)) 2305 IF NOT (XX1>8 AND XX1<534 AND YY1>24 AND YY1<175 AND XX2>8 AND XX2<534 AND YY2>24 AND YY2<175) THEN 2315 2310 LINE (XX1,YY1)-(XX2,YY2): GOTO 2360 2315 IF ABS(YY2-YY1) > ABS(XX2-XX1) THEN 2345 2320 IF XX2 < XX1 THEN SWAP XX1,XX2: SWAP YY1,YY2 2325 IF XX1 = XX2 THEN 2360 2330 MMM=(YY2-YY1)/(XX2-XX1): BBB= -MMM*XX1 + YY1: FOUND=0: FOR J=XX1 TO XX2 STEP 1: PY=MMM*J + BBB: IF (J>8 AND J<534 AND PY>24 AND PY<175) THEN FOUND=1:MARK1=J: PY1=PY: J=XX2 2335 NEXT J: IF FOUND=0 THEN 2360 2336 FOUND=0: FOR J=XX2 TO XX1 STEP -1: PY=MMM*J+BBB: IF (J>8 AND J<534 AND PY>24 AND PY<175) THEN FOUND=1:MARK2=J:PY2=PY:J=XX1 2337 NEXT J: IF FOUND=1 THEN LINE (MARK1,PY1)-(MARK2,PY2) 2338 GOTO 2360 2345 IF YY2<YY1 THEN SWAP YY1,YY2: SWAP XX1,XX2 2350 MMM=(XX2-XX1)/(YY2-YY1): BBB=-MMM*YY1 + XX1: FOUND=0: FOR J=YY1 TO YY2 STEP 1: PX=MMM*J + BBB: IF (PX>8 AND PX<534 AND J>24 AND J<175) THEN FOUND=1: MARK1=J: PX1=PX: J=YY2 2355 NEXT J: IF FOUND=0 THEN 2360 2356 FOUND=0: FOR J=YY2 TO YY1 STEP -1: PX=MMM*J+BBB: IF (PX>8 AND PX<534 AND J>24 AND J<175) THEN FOUND=1: MARK2=J: PX2=PX: J=YY1 2357 NEXT J: IF FOUND=1 THEN LINE (PX1,MARK1)-(PX2,MARK2) 2360 NEXT I% 2390 RETURN 2397 REM 2398 REM SHAPE OPTIONS 2399 REM 2400 EC=1: GOSUB 1300:HL$=" SHAPE " 2405 MI$=" MAKE DELETE MOVE DRAW WIPE OTHER QUIT" 2410 NI=7: GOSUB 900 2415 ON SL GOTO 1800,4200,2900,1700,2450,3700,10010 2450 EC=4:GOSUB 1300: GOTO 2400 2497 REM 2498 REM VIEW OPTIONS 2499 REM 2500 EC=1: GOSUB 1300: NI=4: HL$=" VIEW" 2505 MI$=" EYES CENTER TSCOPE QUIT": GOSUB 900 2510 ON SL GOTO 2600,3800,7600,10010 2596 REM 2597 REM Change EYES location 2599 REM 2600 PL$=" X-eye = ": DV=XE: GOSUB 1200: XE=NUM: PL$=" Y-eye = ": DV=YE 2605 GOSUB 1200: YE=NUM: PL$=" Z-eye = ": DV=ZE: GOSUB 1200: ZE=NUM 2610 PW = SQR((XE-XC)^2 + (YE-YC)^2 + (ZE-ZC)^2)/SCALFAC : GOTO 2500 2696 REM 2697 REM Change CENTER location 2699 REM 2700 PL$="X-center= ": DV=XC: GOSUB 1200: XC=NUM: PL$="Y-center= ": DV=YC 2705 GOSUB 1200: YC=NUM: PL$="Z-center= ": DV=ZC: GOSUB 1200: ZC=NUM 2710 PW = SQR((XE-XC)^2 + (YE-YC)^2 + (ZE-ZC)^2)/SCALFAC : GOTO 2500 2796 REM 2797 REM Display SCREEN options 2799 REM 2800 EC=1: GOSUB 1300: HL$=" SCREEN ": NI=3: MI$=" WIPE REDRAW QUIT" 2805 GOSUB 900 : ON SL GOTO 2850,2855,10010 2850 EC=4: GOSUB 1300: GOTO 2800 2855 IF LO>=1 THEN 2860 2856 EM$="Can't REDRAW until an object exists.":GOSUB 3500:GOSUB 3550:GOTO 2800 2860 IF (XE<>XC OR ZE<>ZC) THEN 2864 2861 EM$=" Viewing location cannot be directly above center.": GOSUB 3500: GOSUB 3550 2862 EM$=" Change viewing location or CENTER...": GOSUB 3500: GOSUB 3550 2863 EM$=" before attempting to DRAW or REDRAW.": GOSUB 3500: GOSUB 3550: GOTO 2800 2864 P1=1: PQ=LN: L1=1: LQ=LL: GOSUB 1100: GOSUB 2100: GOSUB 2000: GOSUB 2200 2865 GOSUB 2300: GOTO 2800 2896 REM 2897 REM Display MOVE options 2899 REM 2900 IF LO>=1 THEN 2904 2901 EM$="Can't MOVE until an object is created.": GOSUB 3500: GOSUB 3550 2902 GOTO 2400 2904 EC=1: GOSUB 1300: HL$=" MOVE": NI=3 2905 MI$="TRNSLT ROTATE QUIT":GOSUB 900: ON SL GOTO 2950,2960,2400 2950 GOSUB 3300: IF TARF=1 THEN 2900 2951 OC=SL: GOTO 3100 2960 GOSUB 3300: IF TARF=1 THEN 2900 2961 OC=SL: GOTO 3000 2996 REM 2997 REM Rotate the selected object 2999 REM 3000 PL$= "X-rotat = ": DV=0: GOSUB 1200: AX=NUM: PL$="Y-rotat = ":DV=0 3003 GOSUB 1200: AY=NUM: PL$="Z-rotat = ": DV=0: GOSUB 1200: AZ=NUM 3007 X0=0: Y0=0: Z0=0: FOR I%=N%(OC) TO (N%(OC)+C%(OC)-1): X0=X0+X(I%) 3008 Y0=Y0+Y(I%): Z0=Z0+Z(I%): NEXT I%: X0=X0/C%(OC): Y0=Y0/C%(OC) 3009 Z0=Z0/C%(OC): FOR I%=N%(OC) TO (N%(OC) + C%(OC) -1) 3010 A=1: P1=X(I%): C1=X0: P2=Z(I%): C2=Z0: AN=AY 3011 IF AN=0 THEN 3026 3012 R=SQR((P1-C1)^2+(P2-C2)^2): IF R=0 THEN 3026 3014 SN=(P2-C2)/R: CO=(P1-C1)/R 3016 IF CO=0 THEN TH=-(PI/2)*(SN>0) - (3*PI/2)*(SN<0): GOTO 3024 3018 IF SN=0 THEN TH=-PI*(CO<0) : GOTO 3024 3020 Q1=-(SN>0 AND CO>0): Q2=-(SN>0 AND CO<0): Q3=-(SN<0 AND CO<0) 3021 Q4=-(SN<0 AND CO>0) 3022 TH=ATN(ABS(SN/CO)): TH=TH*Q1 + (PI-TH)*Q2 + (PI+TH)*Q3 + (2*PI-TH)*Q4 3024 TH=TH-AN*2*PI/360: P1=C1+R*COS(TH): P2=C2+R*SIN(TH) 3026 IF A=1 THEN X(I%)=P1:Z(I%)=P2:A=2:P1=Z(I%):C1=Z0:P2=Y(I%):C2=Y0:AN=AX:GOTO 3011 3028 IF A=2 THEN Z(I%)=P1:Y(I%)=P2:A=3:P1=Y(I%):C1=Y0:P2=X(I%):C2=X0:AN=AZ:GOTO 3011 3030 IF A=3 THEN Y(I%)=P1:X(I%)=P2 3032 NEXT I% 3090 GOTO 2900 3096 REM 3097 REM Translate the selected object 3099 REM 3100 PL$="X-transl =" : DV= 0: GOSUB 1200: XT=NUM 3102 PL$="Y-transl =" : DV= 0: GOSUB 1200: YT=NUM 3104 PL$="Z-transl =" : DV= 0: GOSUB 1200: ZT=NUM 3105 FOR I= N%(OC) TO (N%(OC) + C%(OC) -1): X(I)=X(I)+XT: Y(I)=Y(I)+YT 3110 Z(I)=Z(I) + ZT : NEXT I: GOTO 2900 3196 REM 3197 REM Print a list along the side 3199 REM 3200 EC=5: GOSUB 1300: LOCATE 4, 71: PRINT HT$;HM$;: FOR I=1 TO NS 3205 LOCATE 5+I, 71: PRINT SI$(I); HM$;: NEXT I 3290 RETURN 3296 REM 3297 REM Select an item with the LSTBOX 3299 REM 3300 LSTBOX1=39: SL=1 : TARF=0 3305 PUT (558, LSTBOX1), LSTBOX%, XOR 3310 A$= INKEY$: IF A$= "" THEN 3310 3315 A1$= RIGHT$(A$,1): A1ASC= ASC(A1$) 3320 IF A1ASC<>UP AND A1ASC<>DOWN AND A1ASC<>RET AND A1ASC<>ESCAPE THEN 3310 3321 IF A1ASC<>ESCAPE THEN 3325 3322 TARF=1: GOTO 3390 3325 IF A1ASC = RET THEN 3390 3330 IF A1ASC = UP THEN 3350 3335 S0=SL+1: IF S0 = NS+1 THEN S0=1 3340 LSTBOX2= LSTBOX1 + 8: IF LSTBOX2= (39 + 8*NS) THEN LSTBOX2 = 39 3345 GOTO 3360 3350 S0= SL-1: IF S0=0 THEN S0=NS 3355 LSTBOX2=LSTBOX1 - 8: IF LSTBOX2=31 THEN LSTBOX2 = 39+ 8*(NS-1) 3360 PUT (558, LSTBOX1), LSTBOX%, XOR: SL=S0: LSTBOX1=LSTBOX2: GOTO 3305 3390 PUT (558, LSTBOX1), LSTBOX%, XOR: RETURN 3396 REM 3397 REM Add cone to object list 3399 REM 3400 PL$="Bt radius=":DV=RAD: GOSUB 1200 : RAD=NUM 3405 PL$="# of sides": DV=6: GOSUB 1200: SIDES=NUM: GOSUB 7500: IF SIDETEST = 1 THEN 3405 3406 PNODES=LN+SIDES+1: PLINES=LL+2*SIDES: GOSUB 7800: IF EXCEED=1 THEN 1800 3410 PL$=" Height = ": DV=HEIGHT: GOSUB 1200: HEIGHT=NUM 3412 PL$="Eccentr=": DV=1: GOSUB 1200: ECC=NUM 3415 PL$="Obj. name=": LEGLEN=8: GOSUB 1600: OL$(LO+1)=LB$: LOCATE 6+LO,71 3420 PRINT LB$; HM$;: NS=NS+1: SI$(NS)=LB$: RAD1=RAD/COS(PI/SIDES) 3425 FOR I=1 TO SIDES: AA=PI*(2*I-1)/SIDES: X(LN+I)=ECC*RAD1*COS(AA) 3430 Y(LN+I)=0: Z(LN+I)=RAD1*SIN(AA): NEXT I: X(LN+SIDES+1)=0 3435 Y(LN+SIDES+1)=HEIGHT: Z(LN+SIDES+1)=0: FOR I=1 TO SIDES 3440 IN%(LL+I)=LN+I: JN%(LL+I)=LN+I+1: IN%(LL+SIDES+I)=LN+I 3445 JN%(LL+SIDES+I)=LN+SIDES+1: NEXT I: JN%(LL+SIDES)=LN+1 3450 LO=LO+1: N%(LO)=LN+1: C%(LO)=SIDES+1: L%(LO)=LL+1: D%(LO)=2*SIDES 3455 LN=LN+SIDES+1: LL=LL+2*SIDES 3490 GOTO 1800 3496 REM 3497 REM Print to message line, 3550 begins erase 3499 REM 3500 LOCATE 2, 18: PRINT EM$;HM$;: RETURN 3550 A$=INKEY$: IF A$="" THEN 3550 3555 EC=3: GOSUB 1300: RETURN 3596 REM 3597 REM MAKE A POLYGON 3599 REM 3600 PL$="radius=": DV= RAD: GOSUB 1200: RAD=NUM 3603 PL$="# of sides= ":DV=4: GOSUB 1200: SIDES=NUM: GOSUB 7500: IF SIDETEST=1 THEN 3603 3604 PNODES=LN+SIDES: PLINES=LL+SIDES: GOSUB 7800: IF EXCEED=1 THEN 1800 3605 PL$="eccentr= ":DV=1: GOSUB 1200 3610 ECC=NUM: PL$="Obj. Name=": LEGLEN=8: GOSUB 1600: OL$(LO+1)=LB$ 3615 LOCATE 6+LO,71:PRINT LB$;HM$:NS=LO+1:SI$(NS)=LB$:RAD1=RAD/COS(PI/SIDES) 3620 FOR I= 1 TO SIDES: KA= (I-1)*2*PI/SIDES + PI/SIDES 3625 X(LN+I)=ECC*RAD1*COS(KA) : Z(LN+I)=RAD1*SIN(KA) : Y(LN+I)=0 : NEXT I 3630 FOR I=1 TO SIDES: IN%(LL+I)=LN+I:JN%(LL+I)=LN+I+1:NEXT I 3633 JN%(LL+SIDES)=LN+1: LO=LO+1 3635 N%(LO)=LN+1: C%(LO)=SIDES: L%(LO)=LL+1: D%(LO)=SIDES: LL=LL+SIDES 3640 LN=LN+SIDES 3690 GOTO 1800 3696 REM 3697 REM Display other SHAPE operations 3699 REM 3700 EC=1: GOSUB 1300: HL$=" SHAPE": NI=6 3705 MI$="DUPLCT SPECL CMBINE LIBRAR RENAME QUIT": GOSUB 900 3710 ON SL GOTO 4100,6300,4800,4300,6200,2400 3796 REM 3797 REM Display CENTER options 3799 REM 3800 EC=1: GOSUB 1300: NI=3: HL$= " CENTER" 3805 MI$=" AUTO MANUAL QUIT": GOSUB 900 3810 ON SL GOTO 3900, 2700, 2500 3896 REM 3897 REM Set viewing CENTER automatically 3899 REM 3900 IF LO <>0 THEN 3920 3905 EM$=" No AUTO centering yet...": GOSUB 3500: GOSUB 3550 3910 EM$="At least 1 object must be defined first.": GOSUB 3500: GOSUB 3550 3915 GOTO 3800 3920 XC=0: YC=0: ZC=0: FOR I=1 TO LN: XC=XC+X(I)/LN 3925 YC=YC+Y(I)/LN: ZC=ZC+Z(I)/LN: NEXT I 3930 PW = SQR((XE-XC)^2 + (YE-YC)^2 + (ZE-ZC)^2)/SCALFAC 3990 GOTO 3800 3996 REM 3997 REM Make a LINE in space 3999 REM 4000 PL$=" x1 =": DV=0: GOSUB 1200: X(LN+1)=NUM 4005 PL$=" y1 =": DV=0: GOSUB 1200: Y(LN+1)=NUM 4010 PL$=" z1 =": DV=0: GOSUB 1200: Z(LN+1)=NUM 4015 PL$=" x2 =": DV=X(LN+1): GOSUB 1200: X(LN+2)=NUM 4020 PL$=" y2 =": DV=Y(LN+1): GOSUB 1200: Y(LN+2)=NUM 4025 PL$=" z2 =": DV=Z(LN+1): GOSUB 1200: Z(LN+2)=NUM: PL$="Obj. name=" 4030 LEGLEN=8: GOSUB 1600: OL$(LO+1) = LB$ 4035 LOCATE 6+LO,71:PRINT LB$;HM$:NS=LO+1:SI$(NS)=LB$: IN%(LL+1)=LN+1 4040 JN%(LL+1)=LN+2: LO=LO+1: N%(LO)=LN+1: C%(LO)=2: L%(LO)=LL+1: D%(LO)=1 4045 LN=LN+2: LL=LL+1: GOTO 1800 4096 REM 4097 REM Duplicate an object 4099 REM 4100 IF LO>=1 THEN 4104 4102 EM$="Can't DUPLICATE until an object is defined." : GOSUB 3500: GOSUB 3550 4103 GOTO 3700 4104 GOSUB 3300: IF TARF=1 THEN 3700 4105 OC=SL:PNODES=LN+C%(OC):PLINES=LL+D%(OC):GOSUB 7800:IF EXCEED=1 THEN 2400 4107 FOR I=1 TO C%(OC): X(LN+I)=X(N%(OC)+I-1) 4108 Y(LN+I)=Y(N%(OC)+I-1) 4109 Z(LN+I)=Z(N%(OC)+I-1): NEXT I 4110 FOR I%=1 TO D%(OC): IN%(LL+I%)=IN%(L%(OC)+I%-1) + (LN+1) - N%(OC) 4115 JN%(LL+I%)=JN%(L%(OC)+I%-1) + (LN+1) -N%(OC): NEXT I% 4120 PL$="Obj. name=": LEGLEN=8: GOSUB 1600: OL$(LO+1)=LB$: NS=NS+1 4125 SI$(NS)=LB$:LOCATE 6+LO, 71: PRINT LB$; HM$ 4130 LO=LO+1: N%(LO)=LN+1: C%(LO)=C%(OC): L%(LO)=LL+1: D%(LO)=D%(OC) 4135 LL=LL+D%(OC): LN=LN+C%(OC) 4190 GOTO 2400 4196 REM 4197 REM Delete an object from the object list 4199 REM 4200 GOTO 4250 4201 GOSUB 3300: IF TARF=1 THEN 2400 4202 OC=SL: GOSUB 5700 4206 ON SL GOTO 4207, 2400 4207 Q=C%(OC): Q1=Q: Q2=D%(OC): FOR I=N%(OC) TO (LN-Q): X(I)=X(I+Q) 4208 Y(I)=Y(I+Q): Z(I)=Z(I+Q): NEXT I: Q=D%(OC): FOR I=L%(OC) TO LL-Q 4209 IN%(I)=IN%(I+Q) 4210 JN%(I)=JN%(I+Q): NEXT I: DE=C%(OC): KE=N%(OC)+C%(OC): FOR I=1 TO LL 4215 IN%(I)=IN%(I) + DE*(IN%(I)>=KE): JN%(I)=JN%(I)+DE*(JN%(I)>=KE): NEXT I 4220 FOR I=OC+1 TO LO: N%(I)=N%(I)-Q1: L%(I)=L%(I)-Q2: NEXT I 4225 FOR I=OC TO LO-1: P=I+1: N%(I)=N%(P): C%(I)=C%(P): L%(I)=L%(P) 4226 D%(I)=D%(P) 4230 OL$(I)=OL$(P): SI$(I)=SI$(P): NEXT I: LN=LN-Q1: LL=LL-Q2:LO=LO-1:NS=NS-1 4240 HT$="OBJECTS": FOR I=1 TO LO: SI$(I)=OL$(I): NEXT I: GOSUB 3200: GOTO 4290 4250 IF LO>=1 THEN 4201 4255 EM$="Can't DELETE until an object is created.": GOSUB 3500: GOSUB 3550 4260 GOTO 2400 4290 GOTO 2400 4296 REM 4297 REM Display LIBRARY options 4299 REM 4300 EC=1: GOSUB 1300: HL$=" LIBRARY" : NI=4 4305 MI$=" GRAB STASH DELETE QUIT" : GOSUB 900 4310 ON SL GOTO 5500,5600,6100,3700 4497 REM 4498 REM DISK OPTIONS 4499 REM 4500 EC=1: GOSUB 1300: HL$=" DISK": NI=5 4505 MI$=" LOAD DELETE SAVE REPLAC QUIT": GOSUB 900 4510 ON SL GOTO 4700,5200,7200,7300,10010 4596 REM 4597 REM Save Nalcad file to disk drive 4599 REM 4600 EM$="Place disk with DIRECTORY in drive...": GOSUB 3500: GOSUB 3550 4601 OPERATION$="SAVE": PL$="Filename=": LEGLEN=8: GOSUB 1600: NA$=LB$: EM=0 4602 OPEN "DIR" FOR INPUT AS #1: INPUT#1, NF: FOR I=1 TO NF: INPUT#1,FL$(I) 4605 IF FL$(I)=NA$ THEN EM=1 4607 NEXT I: CLOSE 1: IF EM=0 THEN 4620 4610 EM$=" Filename exists in Directory...": GOSUB 3500: GOSUB 3550 4617 EM$=" Restart SAVEing process.": GOSUB 3500: GOSUB 3550: GOTO 4600 4619 OPERATION$="REPLACE" 4620 OPEN NA$ FOR OUTPUT AS #1: PRINT#1, SCALFAC: PRINT#1,XE: PRINT#1,YE: PRINT#1,ZE 4622 PRINT#1, XC: PRINT#1,YC: PRINT#1,ZC: PRINT#1,LN: PRINT#1, LL: PRINT#1,LO 4625 FOR I%=1 TO LN: PRINT#1, X(I%): PRINT#1, Y(I%): PRINT#1,Z(I%): NEXT I% 4630 FOR I%=1 TO LL: PRINT#1, IN%(I%): PRINT#1, JN%(I%): NEXT I% 4635 FOR I%=1 TO LO: PRINT#1, OL$(I%): PRINT#1,N%(I%): PRINT#1, C%(I%) 4640 PRINT#1, L%(I%): PRINT#1, D%(I%): NEXT I%: CLOSE 1 4642 IF OPERATION$="REPLACE" THEN 5930 4645 OPEN "DIR" FOR INPUT AS #1: INPUT#1, NF: FOR I%=1 TO NF: INPUT#1, FL$(I%) 4650 NEXT I%: CLOSE 1: NF=NF+1: FL$(NF)=LB$: OPEN "DIR" FOR OUTPUT AS #1 4655 PRINT#1, NF: FOR I%=1 TO NF: PRINT#1, FL$(I%): NEXT I%: CLOSE 1 4660 GOTO 4500 4696 REM 4697 REM Load a 3-D Shapes file 4699 REM 4700 EM$="Place disk with DIRECTORY in drive...": GOSUB 3500: GOSUB 3550 4701 EC=5: GOSUB 1300: OPEN "DIR" FOR INPUT AS #1: INPUT#1, NS 4705 FOR I%=1 TO NS: INPUT#1, SI$(I%): NEXT I%: CLOSE 1: HT$=" FILES" 4710 GOSUB 3200: GOSUB 3300: IF TARF=1 THEN EC=5:GOSUB 1300: GOTO 4745 4711 FFF=SL:GOSUB 5700: ON SL GOTO 4712, 4792 4712 EC=5: GOSUB 1300 4714 REM OPEN SI$(FFF) FOR INPUT AS #1: INPUT#1,XE: INPUT#1,YE: INPUT#1,ZE 4715 OPEN SI$(FFF) FOR INPUT AS #1: INPUT#1, SCALFAC: INPUT#1,XE: INPUT#1,YE: INPUT#1,ZE 4720 INPUT#1,XC: INPUT#1, YC: INPUT#1,ZC: INPUT#1,LN: INPUT#1,LL 4725 INPUT#1,LO: FOR I%=1 TO LN: INPUT#1,X(I%): INPUT#1, Y(I%): INPUT#1,Z(I%) 4730 NEXT I%: FOR I%=1 TO LL: INPUT#1, IN%(I%): INPUT#1, JN%(I%): NEXT I% 4735 FOR I%=1 TO LO: INPUT#1,OL$(I%): INPUT#1,N%(I%): INPUT#1,C%(I%) 4740 INPUT#1,L%(I%): INPUT#1, D%(I%): NEXT I%: CLOSE 1 4745 HT$="OBJECTS": NS=LO: FOR I%=1 TO NS: SI$(I%)=OL$(I%) 4750 NEXT I%: GOSUB 3200 4755 PW = SQR((XE-XC)^2 + (YE-YC)^2 + (ZE-ZC)^2)/SCALFAC 4790 GOTO 4500 4792 EC=5: GOSUB 1300: GOTO 4500 4796 REM 4797 REM Combine two objects from the object list 4799 REM 4800 IF LO>=2 THEN 4804 4801 EM$="Before COMBINING, at least two objects must...": GOSUB 3500: GOSUB 3550 4802 EM$="be created using MAKE, SPECIAL or LIBRAR.": GOSUB 3500: GOSUB 3550 4803 GOTO 3700 4804 EM$=" Press a key, then select object #1 for combining...": GOSUB 3500: GOSUB 3550 4805 GOSUB 3300: IF TARF=1 THEN 3700 4806 O1=SL: EM$=" Press a key, then select object #2 for combining..." 4807 GOSUB 3500: GOSUB 3550:GOSUB 3300: IF TARF=1 THEN 3700 4808 O2=SL:GOSUB 5700: ON SL GOTO 4809, 4925 4809 IF O2<O1 THEN O3=O1: O1=O2: O2=O3: GOTO 4815 4810 IF O1=O2 THEN EM$=" Same object! ":GOSUB 3500: GOSUB 3550: GOTO 4800 4815 IF O2=O1+1 THEN 4910: REM Bypass 4817 PNODES=LN+C%(O2):PLINES=LL+D%(O2):GOSUB 7800: IF EXCEED=1 THEN 3700 4820 PII=N%(O1)+C%(O1):LA=N%(O2):SZ=C%(O2):FOR I%=1 TO LN:HE%(I%)=I%:NEXT I% 4825 FOR I%=LN TO PII STEP -1:B%=I%+SZ:X(B%)=X(I%):Y(B%)=Y(I%):Z(B%)=Z(I%):HE%(B%)=HE%(I%) 4830 NEXT I%:FOR I%=1 TO SZ:B%=PII+I%-1:C%=LA+SZ+I%-1:X(B%)=X(C%):Y(B%)=Y(C%) 4835 Z(B%)=Z(C%): HE%(B%)=HE%(C%): NEXT I%: FOR I%=LA+2*SZ TO LN+SZ:B%=I%-SZ: X(B%)=X(I%) 4840 Y(B%)=Y(I%): Z(B%)=Z(I%): HE%(B%)=HE%(I%) : NEXT I% 4843 FOR I%=1 TO LL: FOR J%=1 TO LN 4846 IF IN%(I%)=HE%(J%) THEN IN%(I%)=J%: J%=LN 4849 NEXT J%: NEXT I% 4852 FOR I%=1 TO LL: FOR J%=1 TO LN 4855 IF JN%(I%)=HE%(J%) THEN JN%(I%)=J%: J%=LN 4858 NEXT J%: NEXT I% 4861 FOR I%=1 TO LO: FOR J%=1 TO LN 4864 IF N%(I%)=HE%(J%) THEN N%(I%)=J%: J%=LN 4867 NEXT J%: NEXT I% 4875 PII=L%(O1) + D%(O1):LA=L%(O2):SZ=D%(O2):FOR I%=1 TO LL:HE%(I%)=I%:NEXT I% 4880 FOR I%=LL TO PII STEP -1:B%=I%+SZ:IN%(B%)=IN%(I%):JN%(B%)=JN%(I%):HE%(B%)=HE%(I%) 4881 NEXT I% 4885 FOR I%=1 TO SZ:B%=PII+I%-1:C%=LA+SZ+I%-1:IN%(B%)=IN%(C%):JN%(B%)=JN%(C%) 4890 HE%(B%)=HE%(C%):NEXT I%:FOR I%=LA+2*SZ TO LL+SZ:B%=I%-SZ:IN%(B%)=IN%(I%) 4895 JN%(B%)=JN%(I%): HE%(B%)=HE%(I%): NEXT I% 4900 FOR I%=1 TO LO: FOR J%=1 TO LL 4903 IF L%(I%)=HE%(J%) THEN L%(I%)=J%: J%=LL 4905 NEXT J%: NEXT I% 4910 C%(O1)=C%(O1) + C%(O2): D%(O1)=D%(O1) + D%(O2) 4915 FOR I%=O2 + 1 TO LO:B%=I%-1:N%(B%)= N%(I%): C%(B%)=C%(I%): L%(B%)=L%(I%) 4916 D%(B%)=D%(I%) 4920 OL$(B%)=OL$(I%): SI$(B%)=SI$(I%): NEXT I%: LO=LO-1: NS=LO 4925 HT$="OBJECTS" : GOSUB 3200: GOTO 3700 4997 REM 4998 REM DISPLAY OTHER MAIN MENU COMMANDS 4999 REM 5000 EC=2: GOSUB 1300: NI=3 5005 MI$= "STATUS RESET QUIT ": GOSUB 900 5010 ON SL GOTO 5300,6000,10010 5196 REM 5197 REM DELETE A Nalcad file 5199 REM 5200 EM$="Place disk with DIRECTORY in drive...": GOSUB 3500: GOSUB 3550 5205 EC=5: GOSUB 1300: OPEN "DIR" FOR INPUT AS #1: INPUT#1, NS 5210 FOR I=1 TO NS:INPUT#1, SI$(I):NEXT I:CLOSE 1:HT$=" FILES":GOSUB 3200: GOSUB 3300: IF TARF=1 THEN 5245 5215 OC=SL:GOSUB 5700: ON SL GOTO 5230, 5245 5230 KILL SI$(OC): FOR I=OC TO NS-1: SI$(I)=SI$(I+1):NEXT I: NS=NS-1 5235 OPEN "DIR" FOR OUTPUT AS #1: PRINT#1, NS: FOR I=1 TO NS 5240 PRINT#1, SI$(I): NEXT I: CLOSE 1 5245 EC=5: GOSUB 1300: NS=LO: FOR I=1 TO LO: SI$(I)=OL$(I): NEXT I 5250 HT$="OBJECTS": GOSUB 3200: GOTO 4500 5296 REM 5297 REM Display STATUS 5299 REM 5300 EM$=" Nodes remaining = " +STR$(700-LN): GOSUB 3500: GOSUB 3550 5305 EM$=" Lines remaining = " +STR$(1000-LL): GOSUB 3500: GOSUB 3550 5310 EM$=" Objects remaining = " +STR$(18-LO): GOSUB 3500: GOSUB 3550 5315 GOTO 5000 5496 REM 5497 REM GRAB an object from the Library 5499 REM 5500 EM$= " Insert disk with library files...": GOSUB 3500: GOSUB 3550 5505 EC=5: GOSUB 1300: OPEN "LIBRARY" FOR INPUT AS #1: INPUT#1, TQ: NS=TQ 5510 FOR I=1 TO NS: INPUT#1,SI$(I): NEXT I: CLOSE 1:HT$="LIBRARY": GOSUB 3200 5512 GOSUB 3300: IF TARF=1 THEN EC=5: GOSUB 1300: NS=LO: FOR I=1 TO NS: SI$(I)=OL$(I): NEXT I: HT$="OBJECTS": GOSUB 3200: GOTO 4300 5514 NM$=SI$(SL): OPEN NM$ FOR INPUT AS #1 5515 INPUT#1, NC: INPUT#1, LC: PNODES=LN+NC: PLINES=LL+LC:GOSUB 7800: IF EXCEED=0 THEN 5519 5517 CLOSE 1: EC=5: GOSUB 1300: NS=LO: FOR I=1 TO NS: SI$(I)=OL$(I): NEXT I: HT$="OBJECTS": GOSUB 3200: GOTO 4300 5519 FOR I=1 TO NC: INPUT#1, X(LN+I):INPUT#1,Y(LN+I) 5520 INPUT#1,Z(LN+I): NEXT I: FOR I=1 TO LC: INPUT#1, NU:IN%(LL+I)=LN+NU 5525 INPUT#1,NU: JN%(LL+I)=LN+NU: NEXT I: CLOSE 1 5526 EC=5: GOSUB 1300: NS=LO: FOR I=1 TO NS: SI$(I)=OL$(I): NEXT I 5530 NS=NS+1: SI$(NS)=NM$: HT$="OBJECTS": GOSUB 3200: LO=LO+1 5535 N%(LO)=LN+1: C%(LO)=NC: L%(LO)=LL+1: D%(LO)=LC: LN=LN+NC: LL=LL+LC 5540 OL$(LO)=NM$: GOTO 4300 5596 REM 5597 REM STASH an object in the library 5599 REM 5600 EM$=" Select object from list...": GOSUB 3500: GOSUB 3550 5601 GOSUB 3300: IF TARF=1 THEN 4300 5604 OC=SL: NM$=SI$(OC): PL$="STASH name": LEGLEN=8: GOSUB 1600 5605 EM=0: OPEN "LIBRARY" FOR INPUT AS #1 : INPUT#1, TQ: FOR I=1 TO TQ 5610 INPUT#1, LT$(I): IF LT$(I) = LB$ THEN EM=1 5615 NEXT I: CLOSE 1: IF EM=0 THEN 5620 5616 EM$= " Name already exists in Library...": GOSUB 3500: GOSUB 3550 5617 EM$= " Choose another name. ": GOSUB 3500: GOSUB 3550: GOTO 5600 5620 X0=0: Y0=0: Z0=0: FOR I=N%(OC) TO N%(OC)+C%(OC)-1: X0=X0+X(I):Y0=Y0+Y(I) 5625 Z0=Z0+Z(I): NEXT I: X0=X0/C%(OC): Y0=Y0/C%(OC): Z0=Z0/C%(OC) 5630 OPEN LB$ FOR OUTPUT AS #1: PRINT#1, C%(OC): PRINT#1, D%(OC) 5635 FOR I=N%(OC) TO N%(OC)+C%(OC)-1: PRINT#1, X(I)-X0: PRINT#1, Y(I)-Y0 5640 PRINT#1, Z(I)-Z0: NEXT I: FOR I=L%(OC) TO L%(OC)+D%(OC)-1 5642 PRINT#1, IN%(I)+1-N%(OC) 5645 PRINT#1, JN%(I)+1-N%(OC): NEXT I: CLOSE 1: OPEN "LIBRARY" FOR INPUT AS #1 5650 INPUT#1, TQ: FOR I=1 TO TQ: INPUT#1, LT$(I): NEXT I: CLOSE 1: TQ=TQ+1 5652 LT$(TQ)=LB$ 5655 OPEN "LIBRARY" FOR OUTPUT AS #1: PRINT#1, TQ: FOR I=1 TO TQ 5660 PRINT#1, LT$(I): NEXT I: CLOSE 1: GOTO 4300 5696 REM 5697 REM "Are you sure?" subroutine 5699 REM 5700 EC=2: GOSUB 1300: NI=2: MI$=" YES CANCEL Are you sure?":GOSUB 900 5705 RETURN 5896 REM 5897 REM Save with REPLACE 5899 REM 5900 EM$=" Place disk with DIRECTORY in drive...": GOSUB 3500: GOSUB 3550 5903 EC=5: GOSUB 1300: HT$=" FILES" : OPEN "DIR" FOR INPUT AS #1 5905 INPUT#1, NS: FOR I=1 TO NS: INPUT#1, SI$(I): NEXT I: CLOSE 1 5910 GOSUB 3200: GOSUB 3300: IF TARF=1 THEN 5930 5914 OC=SL: GOSUB 5700: ON SL GOTO 5925, 5915 5915 EC=5: GOSUB 1300: HT$="OBJECTS": FOR I=1 TO LO: SI$(I)=OL$(I): NEXT I 5920 NS=LO: GOSUB 3200: GOTO 4500 5925 NA$=SI$(OC): GOTO 4619 5930 EC=5: GOSUB 1300: HT$="OBJECTS": FOR I=1 TO LO: SI$(I)=OL$(I): NEXT I 5935 NS=LO: GOSUB 3200: GOTO 4500 5996 REM 5997 REM RESET the Nalcad program 5999 REM 6000 EM$="RESET does a warm restart of 3-D Shapes ...": GOSUB 3500: GOSUB 3550 6005 EM$="All shape data is erased from RAM." : GOSUB 3500: GOSUB 3550 6010 GOSUB 5700: ON SL GOTO 6015, 5000 6015 EC=4: GOSUB 1300: EC=5: GOSUB 1300: NS=0: GOSUB 1020 6020 LOCATE 4, 71: PRINT "OBJECTS"; HM$: GOTO 10010 6096 REM 6097 REM DELETE a LIBRARY file 6099 REM 6100 EM$="Insert disk containing LIBRARY. Press any key.":GOSUB 3500 6105 GOSUB 3550: EC=5: GOSUB 1300: OPEN "LIBRARY" FOR INPUT AS #1 6110 INPUT#1, NS: FOR I=1 TO NS: INPUT#1, SI$(I): NEXT I: CLOSE 1:HT$="LIBRARY": GOSUB 3200 6115 GOSUB 3300: IF TARF=1 THEN 6135 6119 OC=SL: GOSUB 5700: ON SL GOTO 6120, 6135 6120 KILL SI$(OC): FOR I= OC TO NS-1 : SI$(I)=SI$(I+1):NEXT I 6125 OPEN "LIBRARY" FOR OUTPUT AS #1: PRINT#1, NS-1: FOR I=1 TO NS-1 6130 PRINT#1, SI$(I): NEXT I: CLOSE 1 6135 EC=5: GOSUB 1300: NS=LO: FOR I=1 TO NS: SI$(I)=OL$(I): NEXT I: HT$="OBJECTS": GOSUB 3200 6140 GOTO 4300 6196 REM 6197 REM RENAME an item in the object list 6199 REM 6200 IF LO>=1 THEN 6204 6201 EM$="Can't RENAME an object until one exists.": GOSUB 3500: GOSUB 3550 6202 GOTO 3700 6204 GOSUB 3300: IF TARF=1 THEN 3700 6205 OC=SL: PL$="New name =": LEGLEN=8: GOSUB 1600 6207 SI$(OC)=LB$: OL$(OC)=LB$: EC=5: GOSUB 1300: HT$="OBJECTS": GOSUB 3200 6210 GOTO 3700 6296 REM 6297 REM Create SPECIAL Object 6299 REM 6300 FOR I=1 TO 50: XPOS(I)=0: YPOS(I)=0: ZPOS(I)=0: IND%(I)=1: JND%(I)=1 6305 NEXT I: SPECNAME$=" ": GOSUB 6400: GOSUB 6500 6315 NDI=1: NDF=10: GOSUB 6600: LNI=1: LNF=10 : GOSUB 6700 6320 EC=1: GOSUB 1300: HL$=" SPECIAL": NI=5 6325 MI$="PARAMS NODES LINES INSTAL QUIT": GOSUB 900 6326 IF ((SL=2 AND SPECNODES <2) OR (SL=3 AND SPECLINES <1)) THEN GOSUB 7400: GOTO 6320 6330 ON SL GOTO 6800, 6900, 7000, 7100, 6336 6336 GOSUB 5700: ON SL GOTO 6340, 6320 6340 EC=4: GOSUB 1300: GOTO 3700 6396 REM 6397 REM Set up screen for special objects 6399 REM 6400 EC=4: GOSUB 1300: LINE (40,35)-(512,35): LINE (351,35)-(351,143) 6405 LOCATE 4,6: PRINT "Object name=";: LOCATE 4,30: PRINT "# of nodes="; 6410 LOCATE 4,49: PRINT "# of lines=";: LOCATE 6,19: PRINT "Node Data" 6415 LOCATE 6,51: PRINT "Line Data";:LOCATE 8,7 6420 PRINT "------------------------------------";: LOCATE 8,46 6425 PRINT "-------------------";HM$ 6430 LOCATE 7,7: PRINT "No. X Y Z";: LOCATE 7,46 6435 PRINT "No. I-node J-node";HM$ 6490 RETURN 6496 REM 6497 REM Print Parameters 6499 REM 6500 LOCATE 4,19: PRINT " ": LOCATE 4,19: PRINT SPECNAME$ 6505 LOCATE 4,42: PRINT " ": LOCATE 4,42: PRINT SPECNODES 6510 LOCATE 4,63: PRINT " ": LOCATE 4,63: PRINT SPECLINES 6590 RETURN 6596 REM 6597 REM Print 10 special nodes 6599 REM 6600 N$="####.##" 6602 FOR I=9 TO 18: LOCATE I,8: PRINT " "; 6605 NEXT I: FOR I=NDI TO NDF: LOCATE 9+I-NDI,8: PRINT I;: LOCATE 9+I-NDI,14 6610 PRINT USING N$; XPOS(I);: LOCATE 9+I-NDI,24: PRINT USING N$; YPOS(I); 6615 LOCATE 9+I-NDI,34: PRINT USING N$; ZPOS(I);: NEXT I: PRINT HM$; 6690 RETURN 6696 REM 6697 REM Print 10 special lines 6699 REM 6700 FOR I=9 TO 18: LOCATE I,47: PRINT " ";: NEXT I 6705 FOR I=LNI TO LNF: LOCATE 9+I-LNI,47: PRINT I;: LOCATE 9+I-LNI,53 6710 PRINT IND%(I);: LOCATE 9+I-LNI,60: PRINT JND%(I);: NEXT I: PRINT HM$; 6790 RETURN 6796 REM 6797 REM Set Parameters subroutine 6798 REM ********************* 6799 REM 6800 EC=1: GOSUB 1300: NI=4: MI$=" NAME NODES LINES QUIT" 6805 HL$=" PARAMS": GOSUB 900: ON SL GOTO 6810, 6820, 6830, 6320 6810 LEGLEN=8: PL$="Obj. name=": GOSUB 1600: SPECNAME$=LB$ 6815 IF LB$=" " THEN BEEP: GOTO 6810 6818 GOSUB 6500: GOTO 6800 6820 PL$="# of nodes": DV=SPECNODES: GOSUB 1200: SPECNODES=NUM 6822 IF SPECNODES>50 THEN SPECNODES=50 6825 GOSUB 6500: GOTO 6800 6830 PL$="# of lines": DV=SPECLINES: GOSUB 1200: SPECLINES=NUM 6832 IF SPECLINES>50 THEN SPECLINES=50 6835 GOSUB 6500: GOTO 6800 6896 REM 6897 REM Special NODE Operations 6899 REM 6900 EC=1: GOSUB 1300: NI=3: HL$=" NODES": MI$="REVIEW SET QUIT" 6905 GOSUB 900: ON SL GOTO 6910, 6925, 6320 6910 PL$=" From # ": DV=1: GOSUB 1200: NDI=NUM 6915 IF NDI>=SPECNODES THEN NDI = SPECNODES -10 6917 IF NDI<1 THEN NDI=1 6920 NDF= -(NDI+9)*((NDI+9)<SPECNODES) - SPECNODES*((NDI+9)>=SPECNODES) 6922 GOSUB 6600: GOTO 6900 6925 IF SPECNODES >= 2 THEN 6935 6930 EM$="Minimum number of nodes is 2...": GOSUB 3500: GOSUB 3550 6933 EM$="Go to PARAMS option, reset No. of nodes.": GOSUB 3500: GOSUB 3550 6934 GOTO 6900 6935 PL$=" From # ": DV=1: GOSUB 1200: NDI=NUM 6940 IF NDI>=SPECNODES THEN NDI=SPECNODES -10 6945 IF NDI<1 THEN NDI=1 6947 PL$=" To # " 6948 DV=-(NDI+5)*((NDI+5)<=SPECNODES) - SPECNODES*((NDI+5)>SPECNODES) 6949 GOSUB 1200: NDF=NUM: IF (NDF>(NDI+9) AND (NDI+9)<SPECNODES) THEN NDF=NDI+9 6951 IF (NDF >= SPECNODES AND SPECNODES < (NDI+9)) THEN NDF=SPECNODES 6953 GOSUB 6600: FOR I=NDI TO NDF: PL$=" X("+STR$(I)+")=": DV= XPOS(I) 6955 GOSUB 1200: XPOS(I)=NUM: PL$=" Y("+STR$(I)+")=": DV= YPOS(I): GOSUB 1200 6957 YPOS(I)=NUM: PL$=" Z("+STR$(I)+")=": DV=ZPOS(I): GOSUB 1200: ZPOS(I)=NUM 6959 LOCATE 9+I-NDI,8 : PRINT " "; 6961 LOCATE 9+I-NDI,8: PRINT I;: LOCATE 9+I-NDI,14: PRINT USING N$; XPOS(I); 6963 LOCATE 9+I-NDI,24: PRINT USING N$; YPOS(I);: LOCATE 9+I-NDI,34 6965 PRINT USING N$; ZPOS(I);: NEXT I: PRINT HM$ 6990 GOTO 6900 6996 REM 6997 REM LINES Option of the Special option 6999 REM 7000 EC=1: GOSUB 1300: HL$=" LINES": NI=3: MI$="REVIEW SET QUIT" 7005 GOSUB 900: ON SL GOTO 7010,7040,6320 7010 IF SPECLINES >=1 THEN 7030 7015 EM$="Minimum number of lines is 1...": GOSUB 3500: GOSUB 3550 7020 EM$="Go to PARAMS option, reset No. of lines.": GOSUB 3500: GOSUB 3550 7025 GOTO 7000 7030 PL$=" From ": DV=1: GOSUB 1200: LNI=NUM 7032 IF LNI >= SPECLINES THEN LNI =SPECLINES -9 7034 IF LNI <1 THEN LNI=1 7036 LNF= LNI+9: IF LNF> SPECLINES THEN LNF=SPECLINES 7038 GOSUB 6700: GOTO 7000 7040 PL$=" From ": DV=1: GOSUB 1200: LNI=NUM 7042 IF LNI >= SPECLINES THEN LNI =SPECLINES -9 7044 IF LNI <1 THEN LNI=1 7046 PL$=" To":DV=-(LNI+9)*((LNI+9)<=SPECLINES)-SPECLINES*((LNI+9)>SPECLINES) 7048 GOSUB 1200: LNF=NUM: IF LNF > (LNI+9) THEN LNF=(LNI+9) 7050 IF LNF > SPECLINES THEN LNF = SPECLINES 7052 GOSUB 6700 : FOR I=LNI TO LNF 7054 PL$="I-node("+STR$(I)+")=": DV=IND%(I): GOSUB 1200 7056 IND%(I)=NUM: IF (NUM<1 OR NUM >SPECNODES) THEN BEEP: IND%(I)=1:GOTO 7054 7058 PL$="J-node("+STR$(I)+")=": DV=JND%(I): GOSUB 1200 7060 JND%(I)=NUM: IF (NUM<1 OR NUM >SPECNODES) THEN BEEP: JND%(I)=1:GOTO 7058 7062 LOCATE 9+I-LNI,47: PRINT " ";: LOCATE 9+I-LNI,47 7064 PRINT I;: LOCATE 9+I-LNI,53: PRINT IND%(I);: LOCATE 9+I-LNI,60 7066 PRINT JND%(I);: NEXT I: PRINT HM$ 7090 GOTO 7000 7096 REM 7097 REM INSTALL the special object in the object list 7099 REM 7100 IF SPECNAME$<>" " AND SPECNODES>=2 AND SPECLINES>=1 THEN 7105 7101 EM$="Parameters are improperly set...": GOSUB 3500: GOSUB 3550 7102 EM$="Reset PARAMS or quit SPECIAL without INSTALLING.":GOSUB 3500 7103 GOSUB 3550: GOTO 6320 7105 PNODES=LN+SPECNODES:PLINES=LL+SPECLINES: GOSUB 7800:IF EXCEED=1 THEN 6320 7106 LOCATE 6+LO,71: PRINT SPECNAME$; HM$: NS=NS+1: SI$(NS)=SPECNAME$ 7110 LO=LO+1: OL$(LO)=SPECNAME$: FOR I=1 TO SPECNODES: X(LN+I)=XPOS(I) 7115 Y(LN+I)=YPOS(I): Z(LN+I)=ZPOS(I): NEXT I: FOR I=1 TO SPECLINES 7120 IN%(LL+I)=LN+IND%(I): JN%(LL+I)=LN+JND%(I): NEXT I: N%(LO)=LN+1 7125 C%(LO)=SPECNODES: L%(LO)=LL+1: D%(LO)=SPECLINES: LN=LN+SPECNODES 7130 LL=LL+SPECLINES 7190 GOTO 6320 7195 REM 7196 REM Check to see if at least one object 7197 REM exists before savin a 3-D Shapes file 7198 REM 7200 IF LO > 0 THEN 4600 7205 EM$=" At least one object must exist...": GOSUB 3500: GOSUB 3550 7210 EM$=" before you can save a 3-D Shapes file to disk.": GOSUB 3500: GOSUB 3550 7290 GOTO 4500 7296 REM 7297 REM Check to make sure an object exists before 7298 REM a REPLAC operation can take place 7299 REM 7300 IF LO > 0 THEN 5900 7305 EM$=" At least one object must exist in RAM memory...": GOSUB 3500: GOSUB 3550 7310 EM$=" before you can replace a 3-D Shapes file on disk.": GOSUB 3500: GOSUB 3550 7390 GOTO 4500 7396 REM 7397 REM Print error message due to failure 7398 REM properly set PARAMS in SPECIAL operation 7399 REM 7400 EM$=" Node and line parameters must be properly set...": GOSUB 3500: GOSUB 3550 7405 EM$=" before invoking any NODES or LINES operations.": GOSUB 3500: GOSUB 3550 7490 RETURN 7496 REM 7497 REM Test for proper number of sides 7499 REM 7500 SIDETEST=0: IF (SIDES >=3 AND INT(SIDES) = SIDES) THEN 7590 7510 SIDETEST=1: EM$="# of sides must be an integer...": GOSUB 3500:GOSUB 3550 7520 EM$="...which is greater than or equal to 3.": GOSUB 3500:GOSUB 3550 7590 RETURN 7596 REM 7597 REM Change the scalefactor of the image 7598 REM 7600 PL$=" T-factor ": DV= SCALFAC: GOSUB 1200: SCALFAC=NUM 7605 IF (SCALFAC >=0.1 AND SCALFAC <= 10) THEN 7615 7607 EM$=" Value must be >= 0.1 and <= 10. Re-enter T-factor." 7608 GOSUB 3500: GOSUB 3550: GOTO 7600 7615 PW = SQR((XE-XC)^2 + (YE-YC)^2 + (ZE-ZC)^2)/SCALFAC 7690 GOTO 2500 7696 REM 7697 REM Error handling subroutine 7699 REM 7700 IF ERR<> 25 THEN 7715 7705 EM$=" Hardware error. Check to make sure...": GOSUB 3500: GOSUB 3550 7710 EM$=" printer is turned on.": GOSUB 3500: GOSUB 3550: RESUME 10010 7715 IF ERR<> 53 THEN 7735 7720 EM$="Directory, Library or NalCad file not found...":GOSUB 3500:GOSUB 3550 7725 EM$="Insert proper disk in drive...": GOSUB 3500: GOSUB 3550 7730 EM$="Control is directed to Main Menu.": GOSUB 3500: GOSUB 3550: GOSUB 7780: RESUME 10010 7735 IF ERR<> 61 THEN 7750 7740 EM$=" Disk is full...": GOSUB 3500: GOSUB 3550: EM$="Insert a different Nalcad disk in drive...": GOSUB 3500: GOSUB 3550 7745 EM$="Control is directed to main menu.": GOSUB 3500: GOSUB 3550: RESUME 10010 7750 IF (ERR<> 70 AND ERR<> 71) THEN 7765 7755 EM$=" Disk is write-protected, or...": GOSUB 3500: GOSUB 3550: EM$="drive door is open...": GOSUB 3500: GOSUB 3550 7760 EM$="Control is directed to main menu.": GOSUB 3500: GOSUB 3550: GOSUB 7780: RESUME 10010 7765 EM$="ERROR. Control is directed to main menu.": GOSUB 3500: GOSUB 3550: GOSUB 7780: RESUME 10010 7779 REM Begin short subroutine for relisting objects 7780 HT$="OBJECTS": NS=LO: FOR I=1 TO NS: SI$(I)=OL$(I): NEXT I: GOSUB 3200: RETURN 7796 REM 7797 REM Test for excessive nodes or lines 7799 REM 7800 EXCEED=0: IF (PNODES < NODELIMIT AND PLINES < LINELIMIT) THEN 7890 7805 EXCEED=1: EM$="Operation disallowed...": GOSUB 3500: GOSUB 3550 7810 EM$="Node and/or line limit will be exceeded." :GOSUB 3500:GOSUB 3550 7890 RETURN 9996 END 9997 REM ********************* 9998 REM Begin main program 9999 REM ********************* 10000 GOSUB 1000: REM initialization 10005 GOSUB 800: REM draw main screen boxes 10010 EC=1: GOSUB 1300: REM clear menu block 10015 HL$=" MAIN": MI$=" DISK SHAPE VIEW SCREEN OTHER QUIT" 10020 NI=6: GOSUB 900: ON SL GOTO 4500,2400,2500,2800,5000,10050 10050 GOSUB 5700: ON SL GOTO 10060, 10010 10060 LOCATE 20,2: SCREEN 0,0,0,0: END