home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 289.WOOD.BAS < prev    next >
BASIC Source File  |  1986-05-19  |  11KB  |  278 lines

  1. 100 REM ** WOOD.BAS * WRITTEN BY THE CODEWORKS STAFF **
  2. 101 REM ** CODEWORKS, 3838 SOUTH WARNER ST. TACOMA WA, 98409
  3. 102 REM ** (206) 475-2219 VOICE  (206) 475-2356 MODEM
  4. 103 REM ** DO NOT REMOVE THE ABOVE CREDIT LINES PLEASE.
  5. 105 CLEAR 1000:REM USE ONLY IF YOU NEED TO CLEAR SPACE **
  6. 110 DEFINT I,J,K,N,U
  7. 120 DIM R(50,3),S(80,2),O(50,5)
  8. 130 GOSUB 160
  9. 140 REM ** INPUT AND INSTRUCTION MODULE **
  10. 150 GOTO 170
  11. 160 PRINT CHR$(12):RETURN:REM CHANGE TO CLS IF NECESSARY **
  12. 170 PRINT STRING$(22,"-");" The CodeWorks ";STRING$(23,"-")
  13. 180 PRINT"            W O O D   C U T T I N G   G U I D E"        
  14. 190 PRINT"           also known as BalsaCalc to the Editors"
  15. 200 PRINT STRING$(60,"-")
  16. 210 PRINT "(Enter dimensions in INCHES and decimal fractions.)"
  17. 220 PRINT
  18. 230 PRINT"You need to enter Length, (0 will terminate entries),"
  19. 240 PRINT"              then Width,"
  20. 250 PRINT"              then Grain direction of each required piece."
  21. 260 PRINT" Grain = 1 for parallel to length,"
  22. 270 PRINT"       = 2 for parallel to  width."
  23. 280 PRINT
  24. 290 INPUT"Enter 0 for no Kerf, 1 for 1/16th, 2 for 1/8th inch";SK
  25. 300 IF SK=1 THEN SK=.0625 ELSE IF SK=2 THEN SK=.125 ELSE SK=0
  26. 310 PRINT
  27. 320 LA=96:LB=48
  28. 330 FOR I = 1 TO 49
  29. 340 PRINT"PIECE #";I;"LENGTH";:INPUT R(I,1)
  30. 350 IF R(I,1)=0 THEN GOTO 440
  31. 360 PRINT"           WIDTH";:INPUT R(I,2)
  32. 370 IF R(I,2)=0 THEN PRINT"CAN'T HAVE ZERO WIDTH-TRY AGAIN":GOTO 340
  33. 380 PRINT"           GRAIN";:INPUT R(I,3)
  34. 390 IF R(I,3)>2 OR R(I,3)<1  THEN PRINT"PLEASE ENTER ONLY 1 OR 2":GOTO 380
  35. 400 PRINT STRING$(33,"-")
  36. 410 IF R(I,1)>LA OR R(I,2)>LB OR (R(I,1)>LB AND R(I,3)=2) THEN PRINT "CAN'T BE DONE - TRY AGAIN":GOTO 340
  37. 420 IF R(I,3)=2 THEN T=R(I,1):R(I,1)=R(I,2):R(I,2)=T
  38. 430 NEXT I
  39. 440 NR=I-1:FL=0:SQ=0:LF=0
  40. 450 REM ** FIND THE TOTAL SQ AREA OF REQ. PIECES **
  41. 460 FOR I=1 TO NR
  42. 470 SQ=SQ+R(I,1)*R(I,2)
  43. 480 NEXT I
  44. 490 LF=INT((SQ-1)/(LA*LB))+1:REM ** ESTABLISH EXPECTED SHEETS **
  45. 500 REM ** SORT REQ PIECES INTO DESCENDING ORDER ***
  46. 510 F=0
  47. 520 FOR I=1 TO NR-1
  48. 530 L=I+1
  49. 540 IF FL=1 THEN GOTO 570
  50. 550 IF R(I,1)+R(I,2)=>R(L,1)+R(L,2)THEN GOTO 610
  51. 560 GOTO 580
  52. 570 IF R(I,1)=>R(L,1) THEN GOTO 610
  53. 580 T=R(I,1):R(I,1)=R(L,1):R(L,1)=T
  54. 590 T=R(I,2):R(I,2)=R(L,2):R(L,2)=T
  55. 600 F=1
  56. 610 NEXT I
  57. 620 IF F=1 THEN GOTO 510
  58. 630 REM *** NOW SORT WIDTH WITHIN LENGTH ***
  59. 640 F=0
  60. 650 FOR I=1 TO NR-1
  61. 660 L=I+1
  62. 670 IF R(I,1)<>R(L,1) THEN GOTO 710
  63. 680 IF R(I,2)=>R(L,2) THEN GOTO 710
  64. 690 T=R(I,2):R(I,2)=R(L,2):R(L,2)=T
  65. 700 F=1
  66. 710 NEXT I
  67. 720 IF F=1 THEN GOTO 640
  68. 730 IF FL=<1 THEN GOTO 930
  69. 740 IF INT(FL/2)-FL/2<>0 THEN GOTO 830
  70. 750 REM *** RECIRCULATE THE REQUIRED LIST ROUTINE ***
  71. 760 R(0,1)=R(NR,1):R(0,2)=R(NR,2)
  72. 770 FOR Q=NR TO 0 STEP -1
  73. 780 L=Q-1:IF L<0 THEN GOTO 810
  74. 790 R(Q,1)=R(L,1):R(Q,2)=R(L,2)
  75. 800 R(L,1)=0:R(L,2)=0
  76. 810 NEXT Q
  77. 820 REM *** THE OBVIOUS IMPOSSIBLE FIT ROUTINE ****
  78. 830 IF FL<>2*NR THEN GOTO 930
  79. 840 FT=0
  80. 850 FOR I=1 TO NR-1
  81. 860 FOR Q=I+1 TO NR
  82. 870 IF R(I,1)+R(Q,1)>LA AND R(Q,2)>LB-R(I,2) THEN FT=1:GOTO 910
  83. 880 IF R(I,2)+R(Q,2)>LB AND R(I,1)+R(Q,1)+R(Q+1,1)>LA AND R(Q+1,2)>LB-R(I,2) OR  R(Q+1,2)>LB-R(Q,2) THEN FT=1:GOTO 910
  84. 890 NEXT Q
  85. 900 NEXT I
  86. 910 IF LF<2 THEN LF=LF+FT
  87. 920 REM ** COMPARE REQUIRED PIECES TO STOCK PIECES ***
  88. 930 K=1
  89. 940 FOR I=1 TO NR
  90. 950 J=1
  91. 960 REM ** IF THERE IS NO STOCK - PULL IN A NEW SHEET ***
  92. 970 IF J>NS THEN S(J,1)=LA:S(J,2)=LB:NP=NP+1:NS=NS+1:V=1:GOTO 950
  93. 980 IF NP>LF AND FL<>2*NR THEN GOTO 1710
  94. 990 IF V<>1 OR FL=>4 THEN GOTO 1080
  95. 1000 REM *** MOVE NEXT 48" PIECE SO IT CUTS FROM A FULL SHEET ***
  96. 1010 FOR Q=I TO NR
  97. 1020 IF R(Q,2)<>LB THEN GOTO 1060
  98. 1030 T=R(I,1):R(I,1)=R(Q,1):R(Q,1)=T
  99. 1040 T=R(I,2):R(I,2)=R(Q,2):R(Q,2)=T
  100. 1050 GOTO 1080
  101. 1060 NEXT Q
  102. 1070 REM ** LOOK FOR EXACT FIT IN THE STOCKPILE ***
  103. 1080 FOR U=1 TO NS:IF R(I,1)=S(U,1) AND R(I,2)=S(U,2) THEN J=U:GOTO 1210
  104. 1090 NEXT U
  105. 1100 REM *** LOOK FOR EQUAL LENGTHS ****
  106. 1110 FOR U=1 TO NS:IF R(I,1)=S(U,1) AND R(I,2)=< S(U,2)THEN J=U:GOTO 1210
  107. 1120 NEXT U
  108. 1130 REM *** LOOK FOR EQUAL WIDTHS ****
  109. 1140 FOR U=1 TO NS:IF R(I,2)=S(U,2) AND R(I,1)=< S(U,1) THEN J=U:GOTO 1210
  110. 1150 NEXT U
  111. 1160 REM *** TAKE ANYTHING THAT FITS! ***
  112. 1170 FOR U=1 TO NS:IF R(I,1)=<S(U,1) AND R(I,2)=< S(U,2) THEN J=U:GOTO 1210
  113. 1180 NEXT U
  114. 1190 J=J+1:GOTO 970
  115. 1200 REM ** STUFF THE CUT BUFFER WITH ALL THE DIMENSIONS ***
  116. 1210 O(K,1)=R(I,1):O(K,2)=R(I,2):O(K,3)=S(J,1):O(K,4)=S(J,2)
  117. 1220 L=S(J,1):W=S(J,2):LC=R(I,1):WC=R(I,2)
  118. 1230 REM *** CHECK FOR SINGLE CUT SITUATIONS *****
  119. 1240 IF L=LC AND W=WC THEN S(J,1)=0:S(J,2)=0:C=1:GOTO 1360
  120. 1250 IF L=LC THEN S(J,2)=W-WC-SK:C=2:GOTO 1360
  121. 1260 IF W=WC THEN S(J,1)=L-LC-SK:C=3:GOTO 1360
  122. 1270 REM ** DETERMINE WHETHER 4 OR 5 CUT AND SIZE OF LEFTOVERS ***
  123. 1280 IF INT(FL/2)-FL/2<>0 AND V=1 AND I=1 THEN GOTO 1350
  124. 1290 IF R(I,1)+R(I+1,1)=S(J,1) AND R(I,2)=R(I+1,2) THEN GOTO 1350
  125. 1300 IF R(I+1,1)+R(I+2,1)=S(J,1) AND R(I+1,2)=R(I+2,2) THEN GOTO 1350
  126. 1310 IF R(I+1,1)=R(I+2,1) AND R(I,1)=R(I+1,1) AND R(I+1,2)=R(I+2,2) THEN GOTO 1350
  127. 1320 IF R(I+1,1)+R(I+2,1)=S(J,1) AND R(I+1,2)+R(I+2,2)=<S(J,2) THEN GOTO 1350
  128. 1330 IF R(I+1,1)+R(I+2,1)>R(I,1) AND R(I+1,2)=R(I+2,2) THEN GOTO 1350
  129. 1340 S(J,1)=L-LC-SK:S(J,2)=W:J=NS+1:S(J,1)=LC:S(J,2)=W-WC-SK:NS=NS+1:C=4:GOTO 1360
  130. 1350 S(J,1)=L:S(J,2)=W-WC-SK:J=NS+1:S(J,1)=L-LC-SK:S(J,2)=WC:NS=NS+1:C=5
  131. 1360 O(K,5)=C:NO=NO+1:REM ** ADD CUT CODE TO CUT BUFFER ***
  132. 1370 IF V=1 THEN PRINT TAB(10);"--- New Sheet ---"
  133. 1380 PRINT"CUTTING "O(K,1);O(K,2);"from";O(K,3);O(K,4);"cut code";O(K,5)
  134. 1390 K=K+1:V=0
  135. 1400 REM ** ELIMINATE DEADWOOD FROM STOCKPILE **
  136. 1410 F=0
  137. 1420 FOR J=1 TO NS-1
  138. 1425 IF NS=<1 THEN GOTO 1470
  139. 1430 IF S(J,1)=0 THEN S(J,1)=S(NS,1):S(J,2)=S(NS,2):NS=NS-1:F=1
  140. 1440 NEXT J
  141. 1450 IF F=1 THEN GOTO 1410
  142. 1460 REM ** SORT THE STOCKPILE INTO ASCENDING ORDER **
  143. 1470 F=0
  144. 1480 FOR J=1 TO NS-1
  145. 1490 L=J+1
  146. 1500 IF S(J,1)+S(J,2)=<S(L,1)+S(L,2) THEN GOTO 1540
  147. 1510 T=S(J,1):S(J,1)=S(L,1):S(L,1)=T
  148. 1520 T=S(J,2):S(J,2)=S(L,2):S(L,2)=T
  149. 1530 F=1
  150. 1540 NEXT J
  151. 1550 IF F=1 THEN GOTO 1470
  152. 1560 NEXT I
  153. 1570 GOSUB 160
  154. 1580 PRINT TAB(15);"----- R E S U L T S -----"
  155. 1590 PRINT"AREA REQUIRED =";SQ;":AREA LEFT OVER = ";NP*(LA*LB)-SQ;"SQ.IN."
  156. 1600 PRINT"MINIMUM SHEETS FOR THIS PROJECT BY SQ. AREA = ";INT((SQ-1)/(LA*LB))+1
  157. 1610 PRINT"YOU NEED ";NP;" FULL SHEET(S) WITH A TOTAL AREA =";(LA*LB)*NP
  158. 1620 PRINT"Kerf =";SK;"Inches"
  159. 1630 PRINT"THE CUTTING ORDER FOLLOWS (Grain runs parallel to length)"
  160. 1640 PRINT
  161. 1650 PRINT"Length";TAB(10);"Width    OUT OF";TAB(29);"Length";TAB(40);"Width";TAB(50);"CUT CODE"
  162. 1660 PRINT
  163. 1670 FOR K=1 TO NO
  164. 1680 IF O(K,3)=LA AND O(K,4)=LB THEN D$="New sheet->" ELSE D$=""
  165. 1690 PRINT O(K,1);TAB(10);O(K,2);TAB(19);D$;TAB(30);O(K,3);TAB(40);O(K,4);TAB(50);O(K,5)
  166. 1700 NEXT K
  167. 1710 IF NP>LF AND FL<>2*NR THEN NP=0:NS=0:NO=0:GOTO 1720 ELSE GOTO 1750
  168. 1720 PRINT:PRINT"Attempt--> ";FL+2;" of ";2*NR+1
  169. 1730 FL=FL+1
  170. 1740 IF FL=>2 THEN GOTO 730 ELSE GOTO 510
  171. 1750 PRINT
  172. 1760 IF SQ=NP*(LA*LB) THEN PRINT "ATTEMPTS =";FL+1;":This is an EXCELLENT solution!":GOTO 1820
  173. 1770 IF NP<>LF THEN PRINT"ATTEMPTS =";FL+1;":A POOR solution or IMPOSSIBLE fit or cut" 
  174. 1780 IF NP<>LF THEN PRINT"I can't tell which, it's up to you."
  175. 1790 IF NR>4 AND LF<>NP THEN PRINT"You might try to combine similar pieces and do better.":GOTO 1820
  176. 1800 IF LF=NP THEN PRINT"ATTEMPTS =";FL+1;":This is a SATISFACTORY solution."
  177. 1810 IF SQ=<(LA*LB)*NP AND FT=1 THEN PRINT"Extra sheet is due to an impossible fit or cut."
  178. 1820 PRINT
  179. 1830 INPUT"Do you wish to print the cutting diagrams (Y/N)";A$
  180. 1840 IF A$="Y" OR A$="y" THEN GOTO 1860 ELSE RUN 100
  181. 1850 END
  182. 1860 REM *** PRINT CUT LIST ROUTINE ***
  183. 1870 INPUT"ENTER THE NAME OF THIS PROJECT";B$
  184. 1880 LPRINT "PROJECT ID IS: ";B$
  185. 1890 LPRINT" "
  186. 1900 LPRINT"GRAIN ALWAYS RUNS PARALLEL TO THIS DIRECTION ----->>>"
  187. 1910 LPRINT" "
  188. 1920 IF SK<>0 THEN LPRINT"KERF OF ";SK;"INCHES IS REMOVED FROM CUTOFF PIECES."
  189. 1930 LPRINT"  1 1 1 INDICATES 1ST CUT, 2 2 2 INDICATES 2ND CUT"
  190. 1940 FOR K = 1 TO NO
  191. 1950 LPRINT" ":LPRINT" "
  192. 1960 LPRINT "PIECE # ";K
  193. 1970 L=O(K,3):W=O(K,4):LC=O(K,1):WC=O(K,2):C=O(K,5)
  194. 1980 LPRINT"STOCK PIECE IS ";L;"INCHES LONG AND ";W;"INCHES WIDE"
  195. 1990 LPRINT"PIECE TO CUT IS ";LC;"INCHES LONG AND ";WC;"INCHES WIDE";" / CUT CODE =";C
  196. 2000 LPRINT" "
  197. 2010 L=L*.82:LC=LC*.82
  198. 2020 W=W*.44:WC=WC*.44
  199. 2030 IF LC=<6 THEN LC=6
  200. 2040 IF LC > (.94*L) THEN LC=(.94*L)
  201. 2050 ON C GOTO 2300,2370,2480,2190,2070
  202. 2060 REM *** CODE 5 CUT -2 CUTS REQUIRED 1ST HORIZ 2ND VERT ***
  203. 2070 LPRINT STRING$(L,"-")
  204. 2080 FOR M=1 TO WC
  205. 2090 LPRINT"!";STRING$(LC-2,">");TAB(LC);"2";TAB(L);"!"
  206. 2100 NEXT M
  207. 2110 LPRINT STRING$(L,"1")
  208. 2120 FOR U=WC TO W
  209. 2130 LPRINT"!";TAB(L);"!"
  210. 2140 NEXT U
  211. 2150 LPRINT STRING$(L,"-")
  212. 2160 NEXT K
  213. 2170 GOTO 2550
  214. 2180 REM *** CODE 4 CUT -2 CUTS REQUIRED 1ST VERT 2ND HORIZ ***
  215. 2190 LPRINT STRING$(L,"-")
  216. 2200 FOR M=1 TO WC
  217. 2210 LPRINT "!";STRING$(LC-2,">");TAB(LC);"1";TAB(L);"!"
  218. 2220 NEXT M
  219. 2230 LPRINT STRING$(LC,"2");TAB(L);"!"
  220. 2240 FOR U = WC TO W
  221. 2250 LPRINT "!";TAB(LC);"1";TAB(L);"!"
  222. 2260 NEXT U
  223. 2270 LPRINT STRING$(L,"-")
  224. 2280 GOTO 2160
  225. 2290 REM *** CODE 1 CUT -  NO CUTS REQUIRED ***
  226. 2300 LPRINT" "
  227. 2310 LPRINT"***********************************"
  228. 2320 LPRINT"*                                 *"
  229. 2330 LPRINT"*  EXACT FIT - NO CUTS REQUIRED   *"
  230. 2340 LPRINT"*                                 *"
  231. 2350 LPRINT"***********************************"
  232. 2360 GOTO 2160
  233. 2370 REM *** CODE 2 CUT  - ONE HORIZ CUT REQUIRED ***
  234. 2380 LPRINT STRING$(L,"-")
  235. 2390 FOR M=1 TO WC
  236. 2400 LPRINT "!";STRING$(L-2,">");TAB(L);"!"
  237. 2410 NEXT M
  238. 2420 LPRINT STRING$(L,"1")
  239. 2430 FOR U=WC TO W
  240. 2440 LPRINT "!";TAB(L);"!"
  241. 2450 NEXT U
  242. 2460 LPRINT STRING$(L,"-")
  243. 2470 GOTO 2160
  244. 2480 REM *** CODE 3 CUT - ONE VERT CUT REQUIRED ***
  245. 2490 LPRINT STRING$(L,"-")
  246. 2500 FOR M = 1 TO W
  247. 2510 LPRINT"!";STRING$(LC-2,">");TAB(LC);"1";TAB(L);"!"
  248. 2520 NEXT M
  249. 2530 LPRINT STRING$(L,"-")
  250. 2540 GOTO 2160
  251. 2550 REM **** PRINT REQUIRED PIECE LIST AND LEFTOVER STOCK ****
  252. 2560 LPRINT" "
  253. 2570 LPRINT"NUMBER OF FULL SHEETS USED = ";NP
  254. 2580 LPRINT"TOTAL SQ INCHES OF REQUIRED PIECES =";SQ
  255. 2590 LPRINT" "
  256. 2600 LPRINT"LIST OF REQUIRED PIECES"
  257. 2610 LPRINT "LENGTH";TAB(15);"WIDTH"
  258. 2620 LPRINT STRING$(20,"-")
  259. 2630 FOR I=1 TO NR
  260. 2640 LPRINT R(I,1);TAB(10);"X";TAB(15);R(I,2)
  261. 2650 NEXT I
  262. 2660 LPRINT" "
  263. 2670 LPRINT"LIST OF LEFTOVER PIECES"
  264. 2680 LPRINT"LENGTH";TAB(15);"WIDTH"
  265. 2690 LPRINT STRING$(20,"-")
  266. 2700 FOR J= 1 TO NS
  267. 2710 LPRINT S(J,1);TAB(10);"X";TAB(15);S(J,2)
  268. 2720 NEXT J
  269. 2730 REM PRINT THE CUT BUFFER ******
  270. 2740 LPRINT" "
  271. 2750 LPRINT" THE CUTTING ORDER AND CUT CODES ARE:"
  272. 2760 LPRINT" "
  273. 2770 FOR K=1 TO NO
  274. 2780 LPRINT O(K,1);TAB(10);"X";TAB(12);O(K,2);TAB(24)"OUT OF";TAB(30);O(K,3);TAB(40);"X";TAB(42);O(K,4);TAB(55);"CUT CODE";O(K,5)
  275. 2790 NEXT K
  276. 2800 PRINT"DONE"
  277. 2810 END
  278.