====== Pinta, Pintarel y Zoomdraw ====== ===== Pinta ===== Pinta es un programa que permite dibujar en la pantalla (rudimentariamente) y genera un listado basic. El propio programa confía en la instrucción CHAIN MERGE para ir ejecutando el programa generado. 10 REM programa simple de dibujo por comandos 20 SCREEN 2:CLS:LINEA=10 30 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1 40 ESTADO=0 50 IN$=INKEY$:IF IN$="" THEN GOTO 50 60 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y) 70 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV) 80 IF IN$="8" THEN Y=Y-1 90 IF IN$="2" THEN Y=Y+1 100 IF IN$="6" THEN X=X+1 110 IF IN$="4" THEN X=X-1 120 IF IN$=CHR$(13) THEN GOSUB 220 130 IF IN$=CHR$(27) THEN ESTADO=1 140 P=POINT(X,Y):PSET (X,Y):IF P=1 THEN PRESET(X,Y) 150 PV=POINT(XV,YV):PSET (XV,YV):IF P=1 THEN PRESET(XV,YV) 160 IF IN$="S" OR IN$="s" THEN GOSUB 300 170 IF IN$="p" OR IN$="P" THEN GOSUB 390 180 IF IN$="B" OR IN$="b" THEN GOSUB 350 190 IF IN$="C" OR IN$="c" THEN GOSUB 220 200 IF IN$="L" OR IN$="l" THEN GOTO 460 210 GOTO 50 220 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN 230 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN 240 IF ESTADO=2 THEN LINE (XV,YV)-(X,Y),,B:GOTO 260 250 LINE (XV,YV)-(X,Y) 260 B$=(STR$(LINEA)+"line ("+STR$(XV)+","+STR$(YV)+")-("+STR$(X)+","+STR$(Y)+")") 270 IF ESTADO=2 THEN B$=B$+",,b" 280 PRINT #1,B$:LINEA=LINEA+10 290 ESTADO=0:RETURN 300 REM grabar 310 INPUT "Grabar archivo. Nombre? ";A$ 320 PRINT #1,LINEA;"linea=";LINEA 330 CLOSE #1:SHELL "copy temporal.bas "+A$:OPEN "TEMPORAL.BAS" FOR APPEND AS #1 340 RETURN 350 REM borrar 360 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT " " 370 IF A$="S" OR A$="s" THEN RUN 380 RETURN 390 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y) 400 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV) 410 PAINT (X,Y),1 420 IF P=0 THEN PSET(X,Y) ELSE PRESET(X,Y) 430 IF PV=0 THEN PSET(XV,YV) ELSE PRESET(XV,YV) 440 B$=(STR$(LINEA)+"paint("+STR$(X)+","+STR$(Y)+"),1") 450 PRINT #1,B$:LINEA=LINEA+10:RETURN 460 INPUT "nombre del archivo?";N$ 470 OPEN N$ FOR APPEND AS #2 480 CLOSE #1 490 SHELL"copy "+N$+" temporal.bas >NUL":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 500 PRINT #1 ,"9999 common linea:chain "+CHR$(34)+"pinta3"+CHR$(34)+",520":CLOSE #1 510 CLS:RUN "temporal" 520 REM LINEA=EOF(1)*10 530 OPEN "temporal.bas" FOR APPEND AS #1:GOTO 50  ===== Pintarel ===== Pintarel es la siguiente evolución de Pinta. En lugar de insertar coordenadas absolutas, inserta coordenadas relativas en el listado basic generado, de forma que se puede mover el dibujo (por aquella época yo no imaginaba que se podía hacer algo parecido con DRAW). 10 REM programa simple de dibujo por comandos/relativo 20 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1 30 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1 40 ESTADO=0 50 IN$=INKEY$:IF IN$="" THEN GOTO 50 60 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y) 70 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV) 80 IF IN$="8" THEN Y=Y-1 90 IF IN$="2" THEN Y=Y+1 100 IF IN$="6" THEN X=X+1 110 IF IN$="4" THEN X=X-1 120 IF IN$=CHR$(13) THEN GOSUB 220 130 IF IN$=CHR$(27) THEN ESTADO=1 140 P=POINT(X,Y):PSET (X,Y):IF P=1 THEN PRESET(X,Y) 150 PV=POINT(XV,YV):PSET (XV,YV):IF P=1 THEN PRESET(XV,YV) 160 KEY 1,"SALVAR":KEY(1)ON:ON KEY (1) GOSUB 300 170 KEY 2,"PINTAR":KEY(2)ON:ON KEY (2) GOSUB 390 180 KEY 3,"BORRAR":KEY(3)ON:ON KEY (3) GOSUB 350 190 KEY 4,"CUADRO":KEY(4)ON:ON KEY (4) GOSUB 215 200 KEY 5,"CARGAR":KEY(5)ON:ON KEY (5) GOSUB 460 210 GOTO 50 215 IN$="c" 220 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN 230 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN 240 IF ESTADO=2 THEN LINE (XV,YV)-(X,Y),,B:GOTO 260 250 LINE (XV,YV)-(X,Y) 260 B$=(STR$(LINEA)+"line ((" +STR$(XV)+"px)*rx,("+STR$(YV)+"py)*ry)-((" +STR$(X)+"+px)*rx,("+ STR$(Y)+"+py)*ry),c") 270 IF ESTADO=2 THEN B$=B$+",,b" 280 PRINT #1,B$:LINEA=LINEA+10 290 ESTADO=0:RETURN 300 REM grabar 310 INPUT "Grabar archivo. Nombre? ";A$ 320 PRINT #1,LINEA;"linea=";LINEA 330 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 340 RETURN 350 REM borrar 360 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT " " 370 IF A$="S" OR A$="s" THEN RUN 380 RETURN 390 IF P=0 THEN PRESET(X,Y) ELSE PSET(X,Y) 400 IF PV=0 THEN PRESET(XV,YV) ELSE PSET(XV,YV) 410 PAINT (X,Y),1 420 IF P=0 THEN PSET(X,Y) ELSE PRESET(X,Y) 430 IF PV=0 THEN PSET(XV,YV) ELSE PRESET(XV,YV) 440 B$=(STR$(LINEA)+"paint(("+STR$(X)+"+px)*rx,("+STR$(Y)+"+py)*ry),c") 450 PRINT #1,B$:LINEA=LINEA+10:RETURN 460 INPUT "nombre del archivo?";N$ 470 OPEN N$ FOR APPEND AS #2 480 CLOSE #1:CLOSE #2 490 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 500 PRINT #1 ,"9999 common linea:chain "+CHR$(34)+"pintaxxx"+CHR$(34)+",520":CLOSE #1 510 CLS:RUN "temporal" 520 REM LINEA=EOF(1)*10 530 OPEN "temporal.bas" FOR APPEND AS #1:GOTO 50  ===== Zoomdraw ===== Zoomdraw añade a Pintarel la posibilidad de cambiar el tamaño de los objetos pintados, es decir, crea objetos que, además de poderse desplazar (cambiando px y py) se pueden cambiar de tamaño (cambiando rx y ry) (en realidad esta posibilidad ya estaba en pintarel, pero faltaba poder cambiar el tamaño del archivo cargado). 10 REM programa simple de dibujo por comandos/relativo 15 KEY ON 20 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320 30 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410 40 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370 50 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230 60 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480 70 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560 75 KEY 7,"CIRCULO":KEY(7) ON:ON KEY (7) GOSUB 700 80 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1 90 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1 100 ESTADO=0 110 IN$=INKEY$:IF IN$="" THEN GOTO 110 120 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY) 130 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY) 140 IF IN$="8" THEN Y=Y-1/RY 150 IF IN$="2" THEN Y=Y+1/RY 160 IF IN$="6" THEN X=X+1/RX 170 IF IN$="4" THEN X=X-1/RX 180 IF IN$=CHR$(13) THEN GOSUB 240 190 IF IN$=CHR$(27) THEN ESTADO=0 200 P=POINT(X*RX+PX,Y*RY+PY):PSET (X*RX+PX,Y*RY+PY):IF P=1 THEN PRESET(X*RX+PX,Y*RY+PY) 210 PV=POINT(XV*RX+PX,YV*RY+PY):PSET (XV*RX+PX,YV*RY+PY):IF P=1 THEN PRESET(XV*RX+PX,YV*RY+PY) 220 LOCATE 1,1:PRINT USING"####.###";X,Y:GOTO 110 230 IN$="c" 240 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN 250 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN 260 IF ESTADO=2 THEN LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY),,B:GOTO 280 265 IF ESTADO=3 THEN GOSUB 700 270 LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY) 280 B$=(STR$(LINEA)+"line (" +STR$(XV)+"*rx+px,"+STR$(YV)+"*RY+py)-(" +STR$(X)+"*rx+px,"+ STR$(Y)+"*ry+py),c") 290 IF ESTADO=2 THEN B$=B$+",,b" 300 PRINT #1,B$:LINEA=LINEA+10 310 ESTADO=0:RETURN 320 REM grabar 330 INPUT "Grabar archivo. Nombre? ";A$ 340 PRINT #1,LINEA;"linea=";LINEA 350 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 360 RETURN 370 REM borrar 380 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT " " 390 IF A$="S" OR A$="s" THEN RUN 400 RETURN 410 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY) 420 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY) 430 PAINT (X*RX+PX,Y*RY+PY),1 440 IF P=0 THEN PSET(X*RX+PX,Y*RY+PY) ELSE PRESET(X*RX+PX,Y*RY+PY) 450 IF PV=0 THEN PSET(XV*RX+PX,YV*RY+PY) ELSE PRESET(XV*RX+PX,YV*RY+PY) 460 B$=(STR$(LINEA)+"paint("+STR$(X)+"*rx+px,"+STR$(Y)+"*ry+py),c") 470 PRINT #1,B$:LINEA=LINEA+10:RETURN 480 INPUT "nombre del archivo?";N$ 490 OPEN N$ FOR APPEND AS #2 500 CLOSE #1:CLOSE #2 510 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 520 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",540,all":CLOSE #1 530 CLS:RUN "temporal" 540 BEEP:REM LINEA=EOF(1)*10 550 BEEP:OPEN "temporal.bas" FOR APPEND AS #1:KEY ON:GOTO 620 560 LOCATE 22,1:INPUT "¨Tama¤o x,y?",RX,RY:LOCATE 22,1:PRINT SPACE$(80) 570 LOCATE 22,1:INPUT "¨coordenadas?",PX,PY:LOCATE 22,1:PRINT SPACE$(80) 580 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",600,all":CLOSE #1 590 CLS:CHAIN "temporal",10,ALL 600 REM carga las teclas de nuevo 610 OPEN "temporal.bas" FOR APPEND AS #1:KEY ON 620 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320 630 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410 640 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370 650 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230 660 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480 670 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560 680 GOTO 110 700 IF ESTADO=0 THEN XV=X:YV=Y:ESTADO=3:RETURN 710 IF ESTADO>0 AND ESTADO<3 THEN RETURN 720 RA=((X-XV)^2+(Y-YV)^2)^(1/2) 730 CIRCLE (XV*RX+PX,YV*RY+PY),RA*RX,C,,,(RX/RY) 740 B$=STR$(LINEA)+"CIRCLE ("+STR$(XV)+"*RX+PX,"+STR$(YV)+"*RY+PY),"+STR$(RA)+"*RX,C,,,(RY/RX)" 750 PRINT #1,B$:LINEA=LINEA+10:RETURN ===== Zoomgraf ===== Realmente no tengo muy claro qué añade Zoomgraf a todo esto... 10 REM programa simple de dibujo por comandos/relativo 15 KEY ON 20 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320 30 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410 40 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370 50 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230 60 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480 70 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560 80 SCREEN 2:CLS:LINEA=10:C=1:RX=1:RY=1:PX=1:PY=1 90 X=320:Y=100:OPEN "temporal.bas" FOR OUTPUT AS #1 100 ESTADO=0 110 IN$=INKEY$:IF IN$="" THEN GOTO 110 120 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY) 130 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY) 140 IF IN$="8" THEN Y=Y-1/RY 150 IF IN$="2" THEN Y=Y+1/RY 160 IF IN$="6" THEN X=X+1/RX 170 IF IN$="4" THEN X=X-1/RX 180 IF IN$=CHR$(13 ) THEN GOSUB 240 190 IF IN$=CHR$(27) THEN ESTADO=0 200 P=POINT(X*RX+PX,Y*RY+PY):PSET (X*RX+PX,Y*RY+PY):IF P=1 THEN PRESET(X*RX+PX,Y*RY+PY) 210 PV=POINT(XV*RX+PX,YV*RY+PY):PSET (XV*RX+PX,YV*RY+PY):IF P=1 THEN PRESET(XV*RX+PX,YV*RY+PY) 220 LOCATE 1,1:PRINT USING"####.###";X,Y:GOTO 110 230 IN$="c" 240 IF ESTADO=0 AND IN$="C" OR IN$="c" THEN ESTADO=2:XV=X:YV=Y:RETURN 250 IF ESTADO=0 THEN ESTADO=1:XV=X:YV=Y:RETURN 260 IF ESTADO=2 THEN LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY),,B:GOTO 280 270 LINE (XV*RX+PX,YV*RY+PY)-(X*RX+PX,Y*RY+PY) 280 B$=(STR$(LINEA)+"line (" +STR$(XV)+"*rx+px,"+STR$(YV)+"*RY+py)-(" +STR$(X)+"*rx+px,"+ STR$(Y)+"*ry+py),c") 290 IF ESTADO=2 THEN B$=B$+",,b" 300 PRINT #1,B$:LINEA=LINEA+10 310 ESTADO=0:RETURN 320 REM grabar 330 INPUT "Grabar archivo. Nombre? ";A$ 340 PRINT #1,LINEA;"linea=";LINEA 350 CLOSE #1:SHELL "copy temporal.bas "+A$+" >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 360 RETURN 370 REM borrar 380 LOCATE 21,1:INPUT "¨Borrar? (s/n)";A$ :LOCATE 21,1:PRINT " " 390 IF A$="S" OR A$="s" THEN RUN 400 RETURN 410 IF P=0 THEN PRESET(X*RX+PX,Y*RY+PY) ELSE PSET(X*RX+PX,Y*RY+PY) 420 IF PV=0 THEN PRESET(XV*RX+PX,YV*RY+PY) ELSE PSET(XV*RX+PX,YV*RY+PY) 430 PAINT (X*RX+PX,Y*RY+PY),1 440 IF P=0 THEN PSET(X*RX+PX,Y*RY+PY) ELSE PRESET(X*RX+PX,Y*RY+PY) 450 IF PV=0 THEN PSET(XV*RX+PX,YV*RY+PY) ELSE PRESET(XV*RX+PX,YV*RY+PY) 460 B$=(STR$(LINEA)+"paint("+STR$(X)+"*rx+px,"+STR$(Y)+"*ry+py),c") 470 PRINT #1,B$:LINEA=LINEA+10:RETURN 480 INPUT "nombre del archivo?";N$ 490 OPEN N$ FOR APPEND AS #2 500 CLOSE #1:CLOSE #2 510 SHELL"copy "+N$+" temporal.bas >nul":OPEN "TEMPORAL.BAS" FOR APPEND AS #1 520 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",540,all":CLOSE #1 530 CLS:RUN "temporal" 540 BEEP:REM LINEA=EOF(1)*10 550 BEEP:OPEN "temporal.bas" FOR APPEND AS #1:KEY ON:GOTO 620 560 LOCATE 22,1:INPUT "¨Tama¤o x,y?",RX,RY:LOCATE 22,1:PRINT SPACE$(80) 570 LOCATE 22,1:INPUT "¨coordenadas?",PX,PY:LOCATE 22,1:PRINT SPACE$(80) 580 PRINT #1 ,"9999 chain "+CHR$(34)+"zoomdraw"+CHR$(34)+",600,all":CLOSE #1 590 CLS:CHAIN "temporal",10,ALL 600 REM carga las teclas de nuevo 610 OPEN "temporal.bas" FOR APPEND AS #1:KEY ON 620 KEY 1,"SALVAR":KEY(1) ON:ON KEY (1) GOSUB 320 630 KEY 2,"PINTAR":KEY(2) ON:ON KEY (2) GOSUB 410 640 KEY 3,"BORRAR":KEY(3) ON:ON KEY (3) GOSUB 370 650 KEY 4,"CUADRO":KEY(4) ON:ON KEY (4) GOSUB 230 660 KEY 5,"CARGAR":KEY(5) ON:ON KEY (5) GOSUB 480 670 KEY 6,"TAMA¥O":KEY(6) ON:ON KEY (6) GOSUB 560 680 GOTO 110  ===== Ejemplo de código generado ===== {{:es:basic:gwbasic:qb64-dibujo-ejemplo.jpg|Ejemplo de imagen generada con Pinta.bas: una casita en un paisaje, y bajo ella el mensaje "Pulse cualquier tecla para continuar"}} 5 SCREEN 2 10 LINE( 356, 86)-( 331, 77) 20 LINE( 331, 77)-( 304, 87) 30 LINE( 304, 87)-( 246, 71) 40 LINE( 246, 71)-( 278, 61) 50 LINE( 278, 61)-( 331, 77) 60 LINE( 356, 87)-( 356, 102) 70 LINE( 356, 102)-( 307, 102) 80 LINE( 307, 102)-( 306, 102) 90 LINE( 305, 102)-( 305, 88) 100 LINE( 305, 102)-( 244, 88) 110 LINE( 244, 88)-( 245, 72) 120 LINE( 245, 72)-( 245, 72) 130 LINE( 245, 82)-( 211, 73) 140 LINE( 211, 73)-( 152, 77) 150 LINE( 152, 77)-( 132, 68) 160 LINE( 132, 68)-( 43, 86) 170 LINE( 130, 68)-( 13, 78) 180 LINE( 13, 78)-( 42, 75) 190 LINE( 42, 75)-( 7, 65) 200 LINE( 212, 74)-( 245, 77) 210 LINE( 297, 66)-( 368, 59) 220 LINE( 368, 59)-( 411, 51) 230 LINE( 411, 51)-( 434, 34) 240 LINE( 434, 34)-( 460, 40) 250 LINE( 460, 40)-( 586, 47) 260 LINE( 586, 47)-( 639, 33) 270 LINE( 435, 34)-( 505, 42)