├── Barcode Scanner Gerber ├── InterfaceBoard.GBL ├── InterfaceBoard.GBO ├── InterfaceBoard.GBS ├── InterfaceBoard.GKO ├── InterfaceBoard.GTL ├── InterfaceBoard.GTO ├── InterfaceBoard.GTP ├── InterfaceBoard.GTS └── InterfaceBoard.TXT ├── Enclosure.stl ├── Interface-Board.dch ├── Interface-Board.dip ├── Interface-Board.pdf ├── LICENSE ├── README.md ├── Raspbian Setup.txt ├── ScannerApp ├── ScannerApp.py ├── data examples │ ├── order-details.xml │ ├── order-details.xsd │ ├── orders-list.xml │ ├── orders-list.xsd │ ├── product-details.xml │ ├── product-details.xsd │ ├── product-list.xml │ └── product-list.xsd ├── graphics │ ├── battery.psd │ ├── battery0.bmp │ ├── battery1.bmp │ ├── battery10.bmp │ ├── battery2.bmp │ ├── battery3.bmp │ ├── battery4.bmp │ ├── battery5.bmp │ ├── battery6.bmp │ ├── battery7.bmp │ ├── battery8.bmp │ ├── battery9.bmp │ ├── false.bmp │ ├── false.psd │ ├── tabbar-orders-selected.bmp │ ├── tabbar-orders.bmp │ ├── tabbar-parts-selected.bmp │ ├── tabbar-parts.bmp │ ├── tabbar-power.bmp │ ├── tabbar-power.psd │ ├── tabbar-products-selected.bmp │ ├── tabbar-products.bmp │ ├── tabbar-products.psd │ ├── true.bmp │ ├── true.psd │ ├── wifi.psd │ ├── wifi0.bmp │ ├── wifi1.bmp │ ├── wifi2.bmp │ ├── wifi3.bmp │ └── wifi4.bmp └── lib │ ├── Config.py │ ├── Hardware.py │ ├── LTC2943_1.py │ ├── NetworkComms.py │ ├── Objects.py │ ├── Orders.py │ ├── Parts.py │ ├── Products.py │ ├── UI.py │ ├── UICommon.py │ └── __init__.py ├── Software-Flowchart.pdf ├── bom.csv └── front lens.dxf /Barcode Scanner Gerber/InterfaceBoard.GBO: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GBO* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Legend,Bot* 5 | G04 #@! TF.Part,Single* 6 | %FSLAX35Y35*% 7 | G04* 8 | G71* 9 | G90* 10 | G75* 11 | G01* 12 | G04 BotSilk* 13 | %LPD*% 14 | M02* 15 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.GBS: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GBS* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Soldermask,Bot* 5 | G04 #@! TF.Part,Single* 6 | %ADD22C,3.0*% 7 | %ADD30R,1.6X1.6*% 8 | %ADD31C,1.6*% 9 | %ADD32O,1.5X2.0*% 10 | %ADD33R,1.7X1.7*% 11 | %ADD34C,1.7*% 12 | %ADD40C,1.8*% 13 | %ADD41O,1.5X2.5*% 14 | %ADD53C,2.75*% 15 | %FSLAX35Y35*% 16 | G04* 17 | G71* 18 | G90* 19 | G75* 20 | G01* 21 | G04 BotMask* 22 | %LPD*% 23 | D22* 24 | X6047354Y254027D3* 25 | Y762027D3* 26 | Y1270027D3* 27 | D30* 28 | X2226077Y2111597D3* 29 | D31* 30 | X2476077D3* 31 | X2676077D3* 32 | X2926077D3* 33 | D32* 34 | X1936077Y1376597D3* 35 | X3216077D3* 36 | D33* 37 | X347617Y603310D3* 38 | D34* 39 | Y349310D3* 40 | D40* 41 | X823930Y5112287D3* 42 | X1077930D3* 43 | X1331930D3* 44 | X1585930D3* 45 | X1839930D3* 46 | X2093930D3* 47 | X2347930D3* 48 | X2601930D3* 49 | X2855930D3* 50 | X3109930D3* 51 | X3363930D3* 52 | X3617930D3* 53 | X3871930D3* 54 | X823930Y5366287D3* 55 | X1077930D3* 56 | X1331930D3* 57 | X1585930D3* 58 | X1839930D3* 59 | X2093930D3* 60 | X2347930D3* 61 | X2601930D3* 62 | X2855930D3* 63 | X3109930D3* 64 | X3363930D3* 65 | X3617930D3* 66 | X3871930D3* 67 | X4125930Y5112287D3* 68 | Y5366287D3* 69 | X4379930Y5112287D3* 70 | Y5366287D3* 71 | X4633930Y5112287D3* 72 | Y5366287D3* 73 | X4887930Y5112287D3* 74 | Y5366287D3* 75 | X5141930Y5112287D3* 76 | Y5366287D3* 77 | X5395930Y5112287D3* 78 | Y5366287D3* 79 | X5649930Y5112287D3* 80 | Y5366287D3* 81 | D41* 82 | X4008933Y2769287D3* 83 | X4183933D3* 84 | D53* 85 | X333930Y2939287D3* 86 | X6133930D3* 87 | X333930Y5244287D3* 88 | X6133930D3* 89 | M02* 90 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.GKO: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GKO* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Profile* 5 | G04 #@! TF.Part,Single* 6 | %ADD11C,0.14*% 7 | %FSLAX35Y35*% 8 | G04* 9 | G71* 10 | G90* 11 | G75* 12 | G01* 13 | G04 BoardOutline* 14 | %LPD*% 15 | X300000Y0D2* 16 | D11* 17 | X1648343D1* 18 | G03X1778343Y150000I-7289J137651D01* 19 | G01* 20 | Y1090000D1* 21 | X3388343D1* 22 | Y160000D1* 23 | G03X3528343Y0I150870J-9239D01* 24 | G01* 25 | X6200000D1* 26 | G03X6500000Y300000I4J299996D01* 27 | G01* 28 | Y5300000D1* 29 | G03X6200000Y5600000I-299996J4D01* 30 | G01* 31 | X300000D1* 32 | G03X0Y5300000I-4J-299996D01* 33 | G01* 34 | Y300000D1* 35 | G03X300000Y0I299996J-4D01* 36 | G01* 37 | M02* 38 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.GTO: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GTO* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Legend,Top* 5 | G04 #@! TF.Part,Single* 6 | %ADD10C,0.25*% 7 | %ADD27C,0.40002*% 8 | %ADD35O,0.39191X0.39105*% 9 | %ADD37O,0.39127X0.39172*% 10 | %ADD42O,0.39208X0.3915*% 11 | %ADD55C,0.15686*% 12 | %ADD56C,0.31373*% 13 | %FSLAX35Y35*% 14 | G04* 15 | G71* 16 | G90* 17 | G75* 18 | G01* 19 | G04 TopSilk* 20 | %LPD*% 21 | X4797383Y2442217D2* 22 | D10* 23 | Y2192197D1* 24 | X4816303Y2442217D2* 25 | Y2192197D1* 26 | Y2442217D2* 27 | X4756463D1* 28 | X4816303Y2192197D2* 29 | X4756463D1* 30 | X4945780Y1049303D2* 31 | Y919403D1* 32 | X729287Y539206D2* 33 | Y359175D1* 34 | X569280Y539206D2* 35 | Y359175D1* 36 | D27* 37 | X649283Y714189D3* 38 | X3940645Y382413D2* 39 | D10* 40 | Y62133D1* 41 | X3959727Y382413D2* 42 | Y62133D1* 43 | Y382413D2* 44 | X3839493Y382277D1* 45 | X3959727Y62133D2* 46 | X3839493Y62269D1* 47 | X1956029Y1546597D2* 48 | Y2106564D1* 49 | X2086016D1* 50 | X3076148D2* 51 | X3206135D1* 52 | Y1526602D1* 53 | Y1236567D2* 54 | Y1116597D1* 55 | X1946019D1* 56 | Y1246564D1* 57 | X474617Y222310D2* 58 | X220617D1* 59 | Y730310D1* 60 | X474617D1* 61 | Y222310D1* 62 | D35* 63 | X4074331Y433824D3* 64 | X3966960Y457190D2* 65 | D10* 66 | Y657162D1* 67 | X3906863D1* 68 | Y457190D1* 69 | X3966960D1* 70 | D37* 71 | X1187833Y561181D3* 72 | X1164463Y433820D2* 73 | D10* 74 | X864477D1* 75 | Y383820D1* 76 | X1164463D1* 77 | Y433820D1* 78 | D42* 79 | X4150873Y813618D3* 80 | X4074106Y736983D2* 81 | D10* 82 | X3774236D1* 83 | X4074106Y1036983D2* 84 | X3774236D1* 85 | Y1006983D2* 86 | Y1036983D1* 87 | X4074106Y1006983D2* 88 | Y1036983D1* 89 | Y736983D2* 90 | Y766983D1* 91 | X3774236Y736983D2* 92 | Y766983D1* 93 | X4645626Y208650D2* 94 | X4963101D1* 95 | X3760493Y1111380D2* 96 | X4745473D1* 97 | Y2127380D1* 98 | X3760493D1* 99 | Y1111380D1* 100 | X322297Y953084D2* 101 | X492285D1* 102 | Y1093142D1* 103 | X322297Y2033137D2* 104 | X492285D1* 105 | Y1893079D1* 106 | X1090925Y2151180D2* 107 | Y1151260D1* 108 | X1350961Y2151180D2* 109 | Y1151260D1* 110 | X1090925D2* 111 | X1350961D1* 112 | X1090925Y2151180D2* 113 | X1170919D1* 114 | X1270967D2* 115 | X1350961D1* 116 | X1170919D2* 117 | G03X1270967Y2151180I50024J28D01* 118 | G01* 119 | X5341476Y187938D2* 120 | D55* 121 | X5336646Y197597D1* 122 | X5326876Y207367D1* 123 | X5317217Y212197D1* 124 | X5297788D1* 125 | X5288017Y207367D1* 126 | X5278359Y197597D1* 127 | X5273417Y187938D1* 128 | X5268588Y173338D1* 129 | Y148967D1* 130 | X5273417Y134480D1* 131 | X5278359Y124709D1* 132 | X5288017Y115050D1* 133 | X5297788Y110109D1* 134 | X5317217D1* 135 | X5326876Y115050D1* 136 | X5336646Y124709D1* 137 | X5341476Y134480D1* 138 | X5372848Y192655D2* 139 | X5382619Y197597D1* 140 | X5397219Y212084D1* 141 | Y110109D1* 142 | X5421322Y2412354D2* 143 | X5416492Y2422013D1* 144 | X5406722Y2431783D1* 145 | X5397063Y2436613D1* 146 | X5377634D1* 147 | X5367863Y2431783D1* 148 | X5358205Y2422013D1* 149 | X5353263Y2412354D1* 150 | X5348434Y2397754D1* 151 | Y2373383D1* 152 | X5353263Y2358896D1* 153 | X5358205Y2349125D1* 154 | X5367863Y2339466D1* 155 | X5377634Y2334525D1* 156 | X5397063D1* 157 | X5406722Y2339466D1* 158 | X5416492Y2349125D1* 159 | X5421322Y2358896D1* 160 | X5457636Y2412242D2* 161 | Y2417071D1* 162 | X5462465Y2426842D1* 163 | X5467294Y2431671D1* 164 | X5477065Y2436500D1* 165 | X5496494D1* 166 | X5506153Y2431671D1* 167 | X5510982Y2426842D1* 168 | X5515923Y2417071D1* 169 | Y2407413D1* 170 | X5510982Y2397642D1* 171 | X5501323Y2383154D1* 172 | X5452694Y2334525D1* 173 | X5520753D1* 174 | X4393168Y793721D2* 175 | X4388339Y803379D1* 176 | X4378568Y813150D1* 177 | X4368910Y817979D1* 178 | X4349481D1* 179 | X4339710Y813150D1* 180 | X4330051Y803379D1* 181 | X4325110Y793721D1* 182 | X4320281Y779121D1* 183 | Y754750D1* 184 | X4325110Y740262D1* 185 | X4330051Y730492D1* 186 | X4339710Y720833D1* 187 | X4349481Y715892D1* 188 | X4368910D1* 189 | X4378568Y720833D1* 190 | X4388339Y730492D1* 191 | X4393168Y740262D1* 192 | X4434312Y817867D2* 193 | X4487658D1* 194 | X4458570Y779009D1* 195 | X4473170D1* 196 | X4482829Y774179D1* 197 | X4487658Y769350D1* 198 | X4492599Y754750D1* 199 | Y745092D1* 200 | X4487658Y730492D1* 201 | X4477999Y720721D1* 202 | X4463399Y715892D1* 203 | X4448799D1* 204 | X4434312Y720721D1* 205 | X4429482Y725662D1* 206 | X4424541Y735321D1* 207 | X5142574Y698817D2* 208 | X5137744Y708476D1* 209 | X5127974Y718247D1* 210 | X5118315Y723076D1* 211 | X5098886D1* 212 | X5089115Y718247D1* 213 | X5079457Y708476D1* 214 | X5074515Y698817D1* 215 | X5069686Y684217D1* 216 | Y659847D1* 217 | X5074515Y645359D1* 218 | X5079457Y635588D1* 219 | X5089115Y625930D1* 220 | X5098886Y620988D1* 221 | X5118315D1* 222 | X5127974Y625930D1* 223 | X5137744Y635588D1* 224 | X5142574Y645359D1* 225 | X5222576Y620988D2* 226 | Y722964D1* 227 | X5173946Y655017D1* 228 | X5246834D1* 229 | X4790085Y793721D2* 230 | X4785256Y803379D1* 231 | X4775485Y813150D1* 232 | X4765827Y817979D1* 233 | X4746397D1* 234 | X4736627Y813150D1* 235 | X4726968Y803379D1* 236 | X4722027Y793721D1* 237 | X4717197Y779121D1* 238 | Y754750D1* 239 | X4722027Y740262D1* 240 | X4726968Y730492D1* 241 | X4736627Y720833D1* 242 | X4746397Y715892D1* 243 | X4765827D1* 244 | X4775485Y720833D1* 245 | X4785256Y730492D1* 246 | X4790085Y740262D1* 247 | X4879745Y817867D2* 248 | X4831228D1* 249 | X4826399Y774179D1* 250 | X4831228Y779009D1* 251 | X4845828Y783950D1* 252 | X4860316D1* 253 | X4874916Y779009D1* 254 | X4884687Y769350D1* 255 | X4889516Y754750D1* 256 | Y745092D1* 257 | X4884687Y730492D1* 258 | X4874916Y720721D1* 259 | X4860316Y715892D1* 260 | X4845828D1* 261 | X4831228Y720721D1* 262 | X4826399Y725662D1* 263 | X4821458Y735321D1* 264 | X5419149Y1636931D2* 265 | X5414320Y1646590D1* 266 | X5404549Y1656361D1* 267 | X5394891Y1661190D1* 268 | X5375461D1* 269 | X5365691Y1656361D1* 270 | X5356032Y1646590D1* 271 | X5351091Y1636931D1* 272 | X5346261Y1622331D1* 273 | Y1597961D1* 274 | X5351091Y1583473D1* 275 | X5356032Y1573702D1* 276 | X5365691Y1564044D1* 277 | X5375461Y1559102D1* 278 | X5394891D1* 279 | X5404549Y1564044D1* 280 | X5414320Y1573702D1* 281 | X5419149Y1583473D1* 282 | X5508809Y1646590D2* 283 | X5503980Y1656248D1* 284 | X5489380Y1661078D1* 285 | X5479722D1* 286 | X5465122Y1656248D1* 287 | X5455351Y1641648D1* 288 | X5450522Y1617390D1* 289 | Y1593131D1* 290 | X5455351Y1573702D1* 291 | X5465122Y1563931D1* 292 | X5479722Y1559102D1* 293 | X5484551D1* 294 | X5499039Y1563931D1* 295 | X5508809Y1573702D1* 296 | X5513639Y1588302D1* 297 | Y1593131D1* 298 | X5508809Y1607731D1* 299 | X5499039Y1617390D1* 300 | X5484551Y1622219D1* 301 | X5479722D1* 302 | X5465122Y1617390D1* 303 | X5455351Y1607731D1* 304 | X5450522Y1593131D1* 305 | X4441853Y2303991D2* 306 | X4432194Y2299162D1* 307 | X4422423Y2289391D1* 308 | X4417594Y2279733D1* 309 | Y2260304D1* 310 | X4422423Y2250533D1* 311 | X4432194Y2240875D1* 312 | X4441853Y2235933D1* 313 | X4456453Y2231104D1* 314 | X4480823D1* 315 | X4495311Y2235933D1* 316 | X4505082Y2240875D1* 317 | X4514740Y2250533D1* 318 | X4519682Y2260304D1* 319 | Y2279733D1* 320 | X4514740Y2289391D1* 321 | X4505082Y2299162D1* 322 | X4495311Y2303991D1* 323 | X4417707Y2359622D2* 324 | X4422536Y2345135D1* 325 | X4432194Y2340193D1* 326 | X4441965D1* 327 | X4451623Y2345135D1* 328 | X4456565Y2354793D1* 329 | X4461394Y2374222D1* 330 | X4466223Y2388822D1* 331 | X4475994Y2398481D1* 332 | X4485653Y2403310D1* 333 | X4500253D1* 334 | X4509911Y2398481D1* 335 | X4514853Y2393651D1* 336 | X4519682Y2379051D1* 337 | Y2359622D1* 338 | X4514853Y2345135D1* 339 | X4509911Y2340193D1* 340 | X4500253Y2335364D1* 341 | X4485653D1* 342 | X4475994Y2340193D1* 343 | X4466223Y2349964D1* 344 | X4461394Y2364452D1* 345 | X4456565Y2383881D1* 346 | X4451623Y2393652D1* 347 | X4441965Y2398481D1* 348 | X4432194D1* 349 | X4422536Y2393652D1* 350 | X4417707Y2379052D1* 351 | Y2359622D1* 352 | X4461196Y973497D2* 353 | X4451538Y968667D1* 354 | X4441767Y958897D1* 355 | X4436937Y949238D1* 356 | Y929809D1* 357 | X4441767Y920038D1* 358 | X4451537Y910380D1* 359 | X4461196Y905438D1* 360 | X4475796Y900609D1* 361 | X4500167D1* 362 | X4514654Y905438D1* 363 | X4524425Y910380D1* 364 | X4534084Y920038D1* 365 | X4539025Y929809D1* 366 | Y949238D1* 367 | X4534084Y958896D1* 368 | X4524425Y968667D1* 369 | X4514654Y973496D1* 370 | X4470967Y1068098D2* 371 | X4485567Y1063157D1* 372 | X4495338Y1053498D1* 373 | X4500167Y1038898D1* 374 | Y1034069D1* 375 | X4495338Y1019469D1* 376 | X4485567Y1009811D1* 377 | X4470967Y1004869D1* 378 | X4466138D1* 379 | X4451538Y1009811D1* 380 | X4441879Y1019469D1* 381 | X4437050Y1034069D1* 382 | Y1038898D1* 383 | X4441879Y1053498D1* 384 | X4451538Y1063157D1* 385 | X4470967Y1068098D1* 386 | X4495338D1* 387 | X4519596Y1063157D1* 388 | X4534196Y1053498D1* 389 | X4539025Y1038898D1* 390 | Y1029240D1* 391 | X4534196Y1014640D1* 392 | X4524425Y1009810D1* 393 | X601413Y2282817D2* 394 | X591754Y2277988D1* 395 | X581983Y2268217D1* 396 | X577154Y2258559D1* 397 | Y2239130D1* 398 | X581983Y2229359D1* 399 | X591754Y2219701D1* 400 | X601413Y2214759D1* 401 | X616013Y2209930D1* 402 | X640383D1* 403 | X654871Y2214759D1* 404 | X664642Y2219701D1* 405 | X674300Y2229359D1* 406 | X679242Y2239130D1* 407 | Y2258559D1* 408 | X674300Y2268217D1* 409 | X664642Y2277988D1* 410 | X654871Y2282817D1* 411 | X596696Y2314190D2* 412 | X591754Y2323961D1* 413 | X577267Y2338561D1* 414 | X679242D1* 415 | X596696Y2369933D2* 416 | X591754Y2379704D1* 417 | X577267Y2394304D1* 418 | X679242D1* 419 | X587382Y882976D2* 420 | Y780888D1* 421 | X621412D1* 422 | X636012Y785830D1* 423 | X645782Y795488D1* 424 | X650612Y805259D1* 425 | X655441Y819747D1* 426 | Y844117D1* 427 | X650612Y858717D1* 428 | X645782Y868376D1* 429 | X636012Y878147D1* 430 | X621412Y882976D1* 431 | X587382D1* 432 | X686813Y863434D2* 433 | X696584Y868376D1* 434 | X711184Y882864D1* 435 | Y780888D1* 436 | X3460734Y226017D2* 437 | Y162787D1* 438 | X3562822D1* 439 | X3509363D2* 440 | Y201646D1* 441 | X3480276Y257389D2* 442 | X3475334Y267160D1* 443 | X3460847Y281760D1* 444 | X3562822D1* 445 | X71827Y196174D2* 446 | X173915D1* 447 | Y239974D1* 448 | X168974Y254574D1* 449 | X164144Y259403D1* 450 | X154486Y264233D1* 451 | X139886D1* 452 | X130115Y259403D1* 453 | X125286Y254574D1* 454 | X120457Y239974D1* 455 | X115515Y254574D1* 456 | X110686Y259403D1* 457 | X101028Y264233D1* 458 | X91257D1* 459 | X81598Y259404D1* 460 | X76657Y254574D1* 461 | X71827Y239974D1* 462 | Y196174D1* 463 | X120457D2* 464 | Y239974D1* 465 | X71828Y295605D2* 466 | X144715D1* 467 | X159315Y300434D1* 468 | X168974Y310205D1* 469 | X173915Y324805D1* 470 | Y334464D1* 471 | X168974Y349064D1* 472 | X159315Y358834D1* 473 | X144715Y363664D1* 474 | X71828D1* 475 | Y395036D2* 476 | Y463095D1* 477 | X173915Y395036D1* 478 | Y463095D1* 479 | X71828Y494467D2* 480 | X71827Y562526D1* 481 | X173915Y494467D1* 482 | Y562526D1* 483 | X71827Y657015D2* 484 | Y593898D1* 485 | X173915D1* 486 | Y657015D1* 487 | X120457Y593898D2* 488 | Y632757D1* 489 | Y688388D2* 490 | Y732075D1* 491 | X115515Y746675D1* 492 | X110686Y751617D1* 493 | X101027Y756446D1* 494 | X91257D1* 495 | X81598Y751617D1* 496 | X76657Y746675D1* 497 | X71827Y732075D1* 498 | Y688388D1* 499 | X173915D1* 500 | X120457Y722417D2* 501 | X173915Y756446D1* 502 | X3633104Y498131D2* 503 | X3637821Y488472D1* 504 | X3647592Y478701D1* 505 | X3657363Y473872D1* 506 | X3671963Y468931D1* 507 | X3696221D1* 508 | X3710821Y473872D1* 509 | X3720479Y478701D1* 510 | X3730250Y488472D1* 511 | X3735080Y498131D1* 512 | Y517560D1* 513 | X3730250Y527331D1* 514 | X3720480Y536989D1* 515 | X3710821Y541818D1* 516 | X3696221Y546760D1* 517 | X3671963D1* 518 | X3657363Y541818D1* 519 | X3647592Y536989D1* 520 | X3637821Y527331D1* 521 | X3633104Y517560D1* 522 | Y498131D1* 523 | X3715650Y512731D2* 524 | X3744850Y541818D1* 525 | X3652646Y578132D2* 526 | X3647704Y587903D1* 527 | X3633217Y602503D1* 528 | X3735192D1* 529 | X976507Y729556D2* 530 | X966848Y724839D1* 531 | X957077Y715068D1* 532 | X952248Y705297D1* 533 | X947307Y690697D1* 534 | Y666439D1* 535 | X952248Y651839D1* 536 | X957077Y642181D1* 537 | X966848Y632410D1* 538 | X976507Y627581D1* 539 | X995936D1* 540 | X1005707Y632410D1* 541 | X1015365Y642181D1* 542 | X1020194Y651839D1* 543 | X1025136Y666439D1* 544 | Y690697D1* 545 | X1020194Y705297D1* 546 | X1015365Y715068D1* 547 | X1005707Y724839D1* 548 | X995936Y729556D1* 549 | X976507D1* 550 | X991107Y647010D2* 551 | X1020194Y617810D1* 552 | X1114796Y729444D2* 553 | X1066279D1* 554 | X1061450Y685756D1* 555 | X1066279Y690585D1* 556 | X1080879Y695527D1* 557 | X1095367D1* 558 | X1109967Y690585D1* 559 | X1119738Y680927D1* 560 | X1124567Y666327D1* 561 | Y656668D1* 562 | X1119738Y642068D1* 563 | X1109967Y632297D1* 564 | X1095367Y627468D1* 565 | X1080879D1* 566 | X1066279Y632297D1* 567 | X1061450Y637239D1* 568 | X1056508Y646897D1* 569 | X1285816Y2615783D2* 570 | X1329503D1* 571 | X1344103Y2620725D1* 572 | X1349045Y2625554D1* 573 | X1353874Y2635213D1* 574 | Y2644983D1* 575 | X1349045Y2654642D1* 576 | X1344103Y2659583D1* 577 | X1329503Y2664413D1* 578 | X1285816D1* 579 | Y2562325D1* 580 | X1319845Y2615783D2* 581 | X1353874Y2562325D1* 582 | X1385247Y2644871D2* 583 | X1395018Y2649813D1* 584 | X1409618Y2664300D1* 585 | Y2562325D1* 586 | X1009972Y2615783D2* 587 | X1053660D1* 588 | X1068260Y2620725D1* 589 | X1073201Y2625554D1* 590 | X1078030Y2635213D1* 591 | Y2644983D1* 592 | X1073201Y2654642D1* 593 | X1068260Y2659583D1* 594 | X1053660Y2664413D1* 595 | X1009972D1* 596 | Y2562325D1* 597 | X1044001Y2615783D2* 598 | X1078030Y2562325D1* 599 | X1114344Y2640042D2* 600 | Y2644871D1* 601 | X1119174Y2654642D1* 602 | X1124003Y2659471D1* 603 | X1133774Y2664300D1* 604 | X1153203D1* 605 | X1162861Y2659471D1* 606 | X1167691Y2654642D1* 607 | X1172632Y2644871D1* 608 | Y2635213D1* 609 | X1167691Y2625442D1* 610 | X1158032Y2610954D1* 611 | X1109403Y2562325D1* 612 | X1177461D1* 613 | X1517975Y2615783D2* 614 | X1561663D1* 615 | X1576263Y2620725D1* 616 | X1581204Y2625554D1* 617 | X1586034Y2635213D1* 618 | Y2644983D1* 619 | X1581204Y2654642D1* 620 | X1576263Y2659583D1* 621 | X1561663Y2664413D1* 622 | X1517975D1* 623 | Y2562325D1* 624 | X1552004Y2615783D2* 625 | X1586034Y2562325D1* 626 | X1627177Y2664300D2* 627 | X1680523D1* 628 | X1651436Y2625442D1* 629 | X1666036D1* 630 | X1675694Y2620613D1* 631 | X1680523Y2615783D1* 632 | X1685465Y2601183D1* 633 | Y2591525D1* 634 | X1680523Y2576925D1* 635 | X1670865Y2567154D1* 636 | X1656265Y2562325D1* 637 | X1641665D1* 638 | X1627177Y2567154D1* 639 | X1622348Y2572096D1* 640 | X1617406Y2581754D1* 641 | X5508802Y168567D2* 642 | X5552490D1* 643 | X5567090Y173509D1* 644 | X5572031Y178338D1* 645 | X5576860Y187997D1* 646 | Y197767D1* 647 | X5572031Y207426D1* 648 | X5567090Y212367D1* 649 | X5552490Y217197D1* 650 | X5508802D1* 651 | Y115109D1* 652 | X5542831Y168567D2* 653 | X5576860Y115109D1* 654 | X5666521Y217084D2* 655 | X5618004D1* 656 | X5613174Y173397D1* 657 | X5618004Y178226D1* 658 | X5632604Y183167D1* 659 | X5647091D1* 660 | X5661691Y178226D1* 661 | X5671462Y168567D1* 662 | X5676291Y153967D1* 663 | Y144309D1* 664 | X5671462Y129709D1* 665 | X5661691Y119938D1* 666 | X5647091Y115109D1* 667 | X5632604D1* 668 | X5618004Y119938D1* 669 | X5613174Y124880D1* 670 | X5608233Y134538D1* 671 | X5815636Y395026D2* 672 | Y438714D1* 673 | X5810695Y453314D1* 674 | X5805865Y458256D1* 675 | X5796207Y463085D1* 676 | X5786436D1* 677 | X5776778Y458256D1* 678 | X5771836Y453314D1* 679 | X5767007Y438714D1* 680 | Y395026D1* 681 | X5869094D1* 682 | X5815636Y429056D2* 683 | X5869095Y463085D1* 684 | X5781607Y552745D2* 685 | X5771948Y547916D1* 686 | X5767119Y533316D1* 687 | Y523657D1* 688 | X5771948Y509057D1* 689 | X5786548Y499286D1* 690 | X5810807Y494457D1* 691 | X5835065D1* 692 | X5854495Y499286D1* 693 | X5864265Y509057D1* 694 | X5869095Y523657D1* 695 | Y528486D1* 696 | X5864265Y542974D1* 697 | X5854495Y552745D1* 698 | X5839895Y557574D1* 699 | X5835065D1* 700 | X5820465Y552745D1* 701 | X5810807Y542974D1* 702 | X5805978Y528486D1* 703 | Y523657D1* 704 | X5810807Y509057D1* 705 | X5820465Y499286D1* 706 | X5835065Y494457D1* 707 | X4322695Y105061D2* 708 | X4366383D1* 709 | X4380983Y110002D1* 710 | X4385924Y114831D1* 711 | X4390754Y124490D1* 712 | Y134261D1* 713 | X4385924Y143919D1* 714 | X4380983Y148861D1* 715 | X4366383Y153690D1* 716 | X4322695D1* 717 | Y51602D1* 718 | X4356724Y105061D2* 719 | X4390754Y51602D1* 720 | X4441556D2* 721 | X4490185Y153578D1* 722 | X4422126D1* 723 | X5478039Y1191275D2* 724 | Y1234963D1* 725 | X5473098Y1249563D1* 726 | X5468269Y1254504D1* 727 | X5458610Y1259333D1* 728 | X5448839D1* 729 | X5439181Y1254504D1* 730 | X5434239Y1249563D1* 731 | X5429410Y1234963D1* 732 | Y1191275D1* 733 | X5531498D1* 734 | X5478039Y1225304D2* 735 | X5531498Y1259333D1* 736 | X5429523Y1314964D2* 737 | X5434352Y1300477D1* 738 | X5444010Y1295535D1* 739 | X5453781D1* 740 | X5463439Y1300477D1* 741 | X5468381Y1310135D1* 742 | X5473210Y1329564D1* 743 | X5478039Y1344164D1* 744 | X5487810Y1353823D1* 745 | X5497469Y1358652D1* 746 | X5512069D1* 747 | X5521727Y1353823D1* 748 | X5526669Y1348993D1* 749 | X5531498Y1334393D1* 750 | Y1314964D1* 751 | X5526669Y1300477D1* 752 | X5521727Y1295535D1* 753 | X5512069Y1290706D1* 754 | X5497469D1* 755 | X5487810Y1295535D1* 756 | X5478039Y1305306D1* 757 | X5473210Y1319794D1* 758 | X5468381Y1339223D1* 759 | X5463439Y1348994D1* 760 | X5453781Y1353823D1* 761 | X5444010D1* 762 | X5434352Y1348994D1* 763 | X5429523Y1334394D1* 764 | Y1314964D1* 765 | X5205667Y870484D2* 766 | Y914171D1* 767 | X5200725Y928771D1* 768 | X5195896Y933713D1* 769 | X5186238Y938542D1* 770 | X5176467D1* 771 | X5166808Y933713D1* 772 | X5161867Y928771D1* 773 | X5157037Y914171D1* 774 | Y870484D1* 775 | X5259125D1* 776 | X5205667Y904513D2* 777 | X5259125Y938542D1* 778 | X5191067Y1033144D2* 779 | X5205667Y1028202D1* 780 | X5215438Y1018544D1* 781 | X5220267Y1003944D1* 782 | Y999114D1* 783 | X5215438Y984514D1* 784 | X5205667Y974856D1* 785 | X5191067Y969914D1* 786 | X5186238D1* 787 | X5171638Y974856D1* 788 | X5161979Y984514D1* 789 | X5157150Y999114D1* 790 | Y1003944D1* 791 | X5161979Y1018544D1* 792 | X5171638Y1028202D1* 793 | X5191067Y1033144D1* 794 | X5215438D1* 795 | X5239696Y1028202D1* 796 | X5254296Y1018543D1* 797 | X5259125Y1003943D1* 798 | Y994285D1* 799 | X5254296Y979685D1* 800 | X5244525Y974856D1* 801 | X5485574Y801103D2* 802 | X5529261D1* 803 | X5543861Y806045D1* 804 | X5548803Y810874D1* 805 | X5553632Y820533D1* 806 | Y830303D1* 807 | X5548803Y839962D1* 808 | X5543861Y844903D1* 809 | X5529261Y849733D1* 810 | X5485574D1* 811 | Y747645D1* 812 | X5519603Y801103D2* 813 | X5553632Y747645D1* 814 | X5585005Y830191D2* 815 | X5594775Y835133D1* 816 | X5609375Y849620D1* 817 | Y747645D1* 818 | X5669948Y849620D2* 819 | X5655348Y844791D1* 820 | X5645577Y830191D1* 821 | X5640748Y805933D1* 822 | Y791333D1* 823 | X5645577Y767074D1* 824 | X5655348Y752474D1* 825 | X5669948Y747645D1* 826 | X5679606D1* 827 | X5694206Y752474D1* 828 | X5703865Y767074D1* 829 | X5708806Y791333D1* 830 | Y805933D1* 831 | X5703865Y830191D1* 832 | X5694206Y844791D1* 833 | X5679606Y849620D1* 834 | X5669948D1* 835 | X5703865Y830191D2* 836 | X5645577Y767074D1* 837 | X5340177Y1882461D2* 838 | X5383865D1* 839 | X5398465Y1887402D1* 840 | X5403407Y1892231D1* 841 | X5408236Y1901890D1* 842 | Y1911661D1* 843 | X5403407Y1921319D1* 844 | X5398465Y1926261D1* 845 | X5383865Y1931090D1* 846 | X5340177D1* 847 | Y1829002D1* 848 | X5374207Y1882461D2* 849 | X5408236Y1829002D1* 850 | X5439608Y1911548D2* 851 | X5449379Y1916490D1* 852 | X5463979Y1930978D1* 853 | Y1829002D1* 854 | X5495352Y1911548D2* 855 | X5505123Y1916490D1* 856 | X5519723Y1930978D1* 857 | Y1829002D1* 858 | X5699374Y2165710D2* 859 | X5743061D1* 860 | X5757661Y2170652D1* 861 | X5762603Y2175481D1* 862 | X5767432Y2185139D1* 863 | Y2194910D1* 864 | X5762603Y2204569D1* 865 | X5757661Y2209510D1* 866 | X5743061Y2214339D1* 867 | X5699374D1* 868 | Y2112252D1* 869 | X5733403Y2165710D2* 870 | X5767432Y2112252D1* 871 | X5798805Y2194798D2* 872 | X5808575Y2199739D1* 873 | X5823175Y2214227D1* 874 | Y2112252D1* 875 | X5859489Y2189969D2* 876 | Y2194798D1* 877 | X5864319Y2204569D1* 878 | X5869148Y2209398D1* 879 | X5878919Y2214227D1* 880 | X5898348D1* 881 | X5908006Y2209398D1* 882 | X5912836Y2204569D1* 883 | X5917777Y2194798D1* 884 | Y2185139D1* 885 | X5912836Y2175369D1* 886 | X5903177Y2160881D1* 887 | X5854548Y2112252D1* 888 | X5922606D1* 889 | X5618204Y1277760D2* 890 | X5661891D1* 891 | X5676491Y1282702D1* 892 | X5681433Y1287531D1* 893 | X5686262Y1297189D1* 894 | Y1306960D1* 895 | X5681433Y1316619D1* 896 | X5676491Y1321560D1* 897 | X5661891Y1326389D1* 898 | X5618204D1* 899 | Y1224302D1* 900 | X5652233Y1277760D2* 901 | X5686262Y1224302D1* 902 | X5717635Y1306848D2* 903 | X5727405Y1311789D1* 904 | X5742005Y1326277D1* 905 | Y1224302D1* 906 | X5783149Y1326277D2* 907 | X5836495D1* 908 | X5807407Y1287419D1* 909 | X5822007D1* 910 | X5831666Y1282589D1* 911 | X5836495Y1277760D1* 912 | X5841436Y1263160D1* 913 | Y1253502D1* 914 | X5836495Y1238902D1* 915 | X5826836Y1229131D1* 916 | X5812236Y1224302D1* 917 | X5797636D1* 918 | X5783149Y1229131D1* 919 | X5778319Y1234072D1* 920 | X5773378Y1243731D1* 921 | X953459Y991447D2* 922 | X997147D1* 923 | X1011747Y996388D1* 924 | X1016688Y1001217D1* 925 | X1021517Y1010876D1* 926 | Y1020647D1* 927 | X1016688Y1030305D1* 928 | X1011747Y1035247D1* 929 | X997147Y1040076D1* 930 | X953459D1* 931 | Y937988D1* 932 | X987488Y991447D2* 933 | X1021517Y937988D1* 934 | X1052890Y1020534D2* 935 | X1062661Y1025476D1* 936 | X1077261Y1039964D1* 937 | Y937988D1* 938 | X1157263D2* 939 | Y1039964D1* 940 | X1108633Y972017D1* 941 | X1181521D1* 942 | X1480666Y640064D2* 943 | Y683752D1* 944 | X1475725Y698352D1* 945 | X1470895Y703293D1* 946 | X1461237Y708122D1* 947 | X1451466D1* 948 | X1441808Y703293D1* 949 | X1436866Y698352D1* 950 | X1432037Y683752D1* 951 | Y640064D1* 952 | X1534124D1* 953 | X1480666Y674093D2* 954 | X1534125Y708122D1* 955 | X1451578Y739495D2* 956 | X1446637Y749266D1* 957 | X1432149Y763866D1* 958 | X1534125Y763865D1* 959 | X1432149Y853526D2* 960 | Y805009D1* 961 | X1475837Y800180D1* 962 | X1471008Y805009D1* 963 | X1466066Y819609D1* 964 | Y834096D1* 965 | X1471008Y848696D1* 966 | X1480666Y858467D1* 967 | X1495266Y863296D1* 968 | X1504925D1* 969 | X1519524Y858467D1* 970 | X1529295Y848696D1* 971 | X1534124Y834096D1* 972 | Y819609D1* 973 | X1529295Y805009D1* 974 | X1524354Y800180D1* 975 | X1514695Y795238D1* 976 | X3587974Y803239D2* 977 | X3660862D1* 978 | X3675462Y808068D1* 979 | X3685120Y817839D1* 980 | X3690062Y832439D1* 981 | Y842097D1* 982 | X3685120Y856697D1* 983 | X3675462Y866468D1* 984 | X3660862Y871297D1* 985 | X3587974D1* 986 | X3612345Y907611D2* 987 | X3607516D1* 988 | X3597745Y912441D1* 989 | X3592916Y917270D1* 990 | X3588087Y927041D1* 991 | Y946470D1* 992 | X3592916Y956128D1* 993 | X3597745Y960957D1* 994 | X3607516Y965899D1* 995 | X3617174D1* 996 | X3626945Y960957D1* 997 | X3641433Y951299D1* 998 | X3690062Y902670D1* 999 | Y970728D1* 1000 | X4720619Y174190D2* 1001 | Y101302D1* 1002 | X4725448Y86702D1* 1003 | X4735219Y77044D1* 1004 | X4749819Y72102D1* 1005 | X4759477D1* 1006 | X4774077Y77044D1* 1007 | X4783848Y86702D1* 1008 | X4788677Y101302D1* 1009 | Y174190D1* 1010 | X4829820Y174078D2* 1011 | X4883167D1* 1012 | X4854079Y135219D1* 1013 | X4868679D1* 1014 | X4878337Y130390D1* 1015 | X4883167Y125561D1* 1016 | X4888108Y110961D1* 1017 | Y101302D1* 1018 | X4883167Y86702D1* 1019 | X4873508Y76931D1* 1020 | X4858908Y72102D1* 1021 | X4844308D1* 1022 | X4829820Y76931D1* 1023 | X4824991Y81873D1* 1024 | X4820050Y91531D1* 1025 | X3611704Y1533221D2* 1026 | X3684592D1* 1027 | X3699192Y1538050D1* 1028 | X3708850Y1547821D1* 1029 | X3713792Y1562421D1* 1030 | Y1572079D1* 1031 | X3708850Y1586679D1* 1032 | X3699192Y1596450D1* 1033 | X3684592Y1601279D1* 1034 | X3611704D1* 1035 | X3713792Y1681281D2* 1036 | X3611817D1* 1037 | X3679763Y1632652D1* 1038 | Y1705539D1* 1039 | X631733Y945586D2* 1040 | X733821D1* 1041 | Y1003873D1* 1042 | X665763Y1093534D2* 1043 | X733821Y1093533D1* 1044 | X680363Y1093534D2* 1045 | X670592Y1083875D1* 1046 | X665763Y1074104D1* 1047 | Y1059617D1* 1048 | X670592Y1049846D1* 1049 | X680363Y1040187D1* 1050 | X694963Y1035246D1* 1051 | X704621D1* 1052 | X719221Y1040187D1* 1053 | X728880Y1049846D1* 1054 | X733821Y1059617D1* 1055 | Y1074104D1* 1056 | X728880Y1083875D1* 1057 | X719221Y1093533D1* 1058 | X680363Y1178364D2* 1059 | X670592Y1173535D1* 1060 | X665763Y1158935D1* 1061 | Y1144335D1* 1062 | X670592Y1129735D1* 1063 | X680363Y1124906D1* 1064 | X690021Y1129735D1* 1065 | X694963Y1139506D1* 1066 | X699792Y1163764D1* 1067 | X704621Y1173535D1* 1068 | X714392Y1178364D1* 1069 | X719221D1* 1070 | X728880Y1173535D1* 1071 | X733821Y1158935D1* 1072 | Y1144335D1* 1073 | X728880Y1129735D1* 1074 | X719221Y1124906D1* 1075 | X694963Y1209737D2* 1076 | Y1268025D1* 1077 | X685192D1* 1078 | X675421Y1263195D1* 1079 | X670592Y1258366D1* 1080 | X665763Y1248595D1* 1081 | Y1233995D1* 1082 | X670592Y1224337D1* 1083 | X680363Y1214566D1* 1084 | X694963Y1209737D1* 1085 | X704621D1* 1086 | X719221Y1214566D1* 1087 | X728880Y1224337D1* 1088 | X733821Y1233995D1* 1089 | Y1248595D1* 1090 | X728880Y1258366D1* 1091 | X719221Y1268025D1* 1092 | X665763Y1299397D2* 1093 | X733821D1* 1094 | X694963D2* 1095 | X680363Y1304339D1* 1096 | X670592Y1313997D1* 1097 | X665763Y1323768D1* 1098 | Y1338368D1* 1099 | X646333Y1536556D2* 1100 | X636563Y1526898D1* 1101 | X631733Y1512298D1* 1102 | Y1492868D1* 1103 | X636563Y1478268D1* 1104 | X646333Y1468498D1* 1105 | X655992D1* 1106 | X665763Y1473439D1* 1107 | X670592Y1478268D1* 1108 | X675421Y1487927D1* 1109 | X685192Y1517127D1* 1110 | X690021Y1526898D1* 1111 | X694963Y1531727D1* 1112 | X704621Y1536556D1* 1113 | X719221D1* 1114 | X728880Y1526898D1* 1115 | X733821Y1512298D1* 1116 | Y1492868D1* 1117 | X728880Y1478268D1* 1118 | X719221Y1468498D1* 1119 | X680363Y1626329D2* 1120 | X670592Y1616558D1* 1121 | X665763Y1606787D1* 1122 | Y1592299D1* 1123 | X670592Y1582529D1* 1124 | X680363Y1572870D1* 1125 | X694963Y1567929D1* 1126 | X704621D1* 1127 | X719221Y1572870D1* 1128 | X728880Y1582529D1* 1129 | X733821Y1592299D1* 1130 | Y1606787D1* 1131 | X728880Y1616558D1* 1132 | X719221Y1626329D1* 1133 | X665763Y1715989D2* 1134 | X733821D1* 1135 | X680363D2* 1136 | X670592Y1706330D1* 1137 | X665763Y1696560D1* 1138 | Y1682072D1* 1139 | X670592Y1672301D1* 1140 | X680363Y1662643D1* 1141 | X694963Y1657701D1* 1142 | X704621D1* 1143 | X719221Y1662643D1* 1144 | X728880Y1672301D1* 1145 | X733821Y1682072D1* 1146 | Y1696560D1* 1147 | X728880Y1706330D1* 1148 | X719221Y1715989D1* 1149 | X665763Y1747361D2* 1150 | X733821D1* 1151 | X685192D2* 1152 | X670592Y1761961D1* 1153 | X665763Y1771732D1* 1154 | Y1786220D1* 1155 | X670592Y1795991D1* 1156 | X685192Y1800820D1* 1157 | X733821D1* 1158 | X665763Y1832193D2* 1159 | X733821D1* 1160 | X685192D2* 1161 | X670592Y1846793D1* 1162 | X665763Y1856563D1* 1163 | Y1871051D1* 1164 | X670592Y1880822D1* 1165 | X685192Y1885651D1* 1166 | X733821D1* 1167 | X694963Y1917024D2* 1168 | Y1975311D1* 1169 | X685192D1* 1170 | X675421Y1970482D1* 1171 | X670592Y1965653D1* 1172 | X665763Y1955882D1* 1173 | Y1941282D1* 1174 | X670592Y1931624D1* 1175 | X680363Y1921853D1* 1176 | X694963Y1917024D1* 1177 | X704621D1* 1178 | X719221Y1921853D1* 1179 | X728880Y1931624D1* 1180 | X733821Y1941282D1* 1181 | Y1955882D1* 1182 | X728880Y1965653D1* 1183 | X719221Y1975311D1* 1184 | X665763Y2006684D2* 1185 | X733821D1* 1186 | X694963D2* 1187 | X680363Y2011625D1* 1188 | X670592Y2021284D1* 1189 | X665763Y2031055D1* 1190 | Y2045655D1* 1191 | X1625403Y1569946D2* 1192 | X1698291D1* 1193 | X1712891Y1574776D1* 1194 | X1722550Y1584546D1* 1195 | X1727491Y1599146D1* 1196 | Y1608805D1* 1197 | X1722550Y1623405D1* 1198 | X1712891Y1633175D1* 1199 | X1698291Y1638005D1* 1200 | X1625404D1* 1201 | X1640004Y1727665D2* 1202 | X1630345Y1722836D1* 1203 | X1625516Y1708236D1* 1204 | Y1698577D1* 1205 | X1630345Y1683977D1* 1206 | X1644945Y1674206D1* 1207 | X1669204Y1669377D1* 1208 | X1693462D1* 1209 | X1712891Y1674206D1* 1210 | X1722662Y1683977D1* 1211 | X1727491Y1698577D1* 1212 | Y1703406D1* 1213 | X1722662Y1717894D1* 1214 | X1712891Y1727665D1* 1215 | X1698291Y1732494D1* 1216 | X1693462D1* 1217 | X1678862Y1727665D1* 1218 | X1669204Y1717894D1* 1219 | X1664374Y1703406D1* 1220 | Y1698577D1* 1221 | X1669204Y1683977D1* 1222 | X1678862Y1674206D1* 1223 | X1693462Y1669377D1* 1224 | X1629375Y3934894D2* 1225 | D56* 1226 | Y3730719D1* 1227 | X1716975D1* 1228 | X1746175Y3740602D1* 1229 | X1755834Y3750261D1* 1230 | X1765492Y3769577D1* 1231 | Y3798777D1* 1232 | X1755834Y3818319D1* 1233 | X1746175Y3827977D1* 1234 | X1716975Y3837636D1* 1235 | X1746175Y3847519D1* 1236 | X1755834Y3857177D1* 1237 | X1765492Y3876494D1* 1238 | Y3896036D1* 1239 | X1755834Y3915353D1* 1240 | X1746175Y3925236D1* 1241 | X1716975Y3934894D1* 1242 | X1629375D1* 1243 | Y3837636D2* 1244 | X1716975D1* 1245 | X1944813Y3866836D2* 1246 | Y3730719D1* 1247 | Y3837636D2* 1248 | X1925496Y3857177D1* 1249 | X1905954Y3866836D1* 1250 | X1876979D1* 1251 | X1857437Y3857177D1* 1252 | X1838120Y3837636D1* 1253 | X1828237Y3808436D1* 1254 | Y3789119D1* 1255 | X1838120Y3759919D1* 1256 | X1857437Y3740602D1* 1257 | X1876979Y3730719D1* 1258 | X1905954D1* 1259 | X1925496Y3740602D1* 1260 | X1944813Y3759919D1* 1261 | X2007558Y3866836D2* 1262 | Y3730719D1* 1263 | Y3808436D2* 1264 | X2017441Y3837636D1* 1265 | X2036758Y3857177D1* 1266 | X2056299Y3866836D1* 1267 | X2085499D1* 1268 | X2265044Y3837636D2* 1269 | X2245503Y3857177D1* 1270 | X2225961Y3866836D1* 1271 | X2196986D1* 1272 | X2177444Y3857177D1* 1273 | X2158127Y3837636D1* 1274 | X2148244Y3808436D1* 1275 | Y3789119D1* 1276 | X2158127Y3759919D1* 1277 | X2177444Y3740602D1* 1278 | X2196986Y3730719D1* 1279 | X2225961D1* 1280 | X2245503Y3740602D1* 1281 | X2265044Y3759919D1* 1282 | X2376306Y3866836D2* 1283 | X2356989Y3857177D1* 1284 | X2337448Y3837636D1* 1285 | X2327789Y3808436D1* 1286 | Y3789119D1* 1287 | X2337448Y3759919D1* 1288 | X2356989Y3740602D1* 1289 | X2376306Y3730719D1* 1290 | X2405506D1* 1291 | X2425048Y3740602D1* 1292 | X2444365Y3759919D1* 1293 | X2454248Y3789119D1* 1294 | Y3808436D1* 1295 | X2444365Y3837636D1* 1296 | X2425048Y3857177D1* 1297 | X2405506Y3866836D1* 1298 | X2376306D1* 1299 | X2633568Y3934894D2* 1300 | Y3730719D1* 1301 | Y3837636D2* 1302 | X2614251Y3857177D1* 1303 | X2594710Y3866836D1* 1304 | X2565510D1* 1305 | X2546193Y3857177D1* 1306 | X2526651Y3837636D1* 1307 | X2516993Y3808436D1* 1308 | Y3789119D1* 1309 | X2526651Y3759919D1* 1310 | X2546193Y3740602D1* 1311 | X2565510Y3730719D1* 1312 | X2594710D1* 1313 | X2614251Y3740602D1* 1314 | X2633568Y3759919D1* 1315 | X2696313Y3808436D2* 1316 | X2812889D1* 1317 | Y3827977D1* 1318 | X2803230Y3847519D1* 1319 | X2793572Y3857177D1* 1320 | X2774030Y3866836D1* 1321 | X2744830D1* 1322 | X2725513Y3857177D1* 1323 | X2705972Y3837636D1* 1324 | X2696313Y3808436D1* 1325 | Y3789119D1* 1326 | X2705972Y3759919D1* 1327 | X2725513Y3740602D1* 1328 | X2744830Y3730719D1* 1329 | X2774030D1* 1330 | X2793572Y3740602D1* 1331 | X2812889Y3759919D1* 1332 | X3209265Y3905694D2* 1333 | X3189948Y3925236D1* 1334 | X3160748Y3934894D1* 1335 | X3121890D1* 1336 | X3092690Y3925236D1* 1337 | X3073148Y3905694D1* 1338 | Y3886377D1* 1339 | X3083031Y3866836D1* 1340 | X3092690Y3857177D1* 1341 | X3112007Y3847519D1* 1342 | X3170407Y3827977D1* 1343 | X3189948Y3818319D1* 1344 | X3199607Y3808436D1* 1345 | X3209265Y3789119D1* 1346 | Y3759919D1* 1347 | X3189948Y3740602D1* 1348 | X3160748Y3730719D1* 1349 | X3121890D1* 1350 | X3092690Y3740602D1* 1351 | X3073148Y3759919D1* 1352 | X3388810Y3837636D2* 1353 | X3369269Y3857177D1* 1354 | X3349727Y3866836D1* 1355 | X3320752D1* 1356 | X3301210Y3857177D1* 1357 | X3281893Y3837636D1* 1358 | X3272010Y3808436D1* 1359 | Y3789119D1* 1360 | X3281893Y3759919D1* 1361 | X3301210Y3740602D1* 1362 | X3320752Y3730719D1* 1363 | X3349727D1* 1364 | X3369269Y3740602D1* 1365 | X3388810Y3759919D1* 1366 | X3568131Y3866836D2* 1367 | Y3730719D1* 1368 | Y3837636D2* 1369 | X3548814Y3857177D1* 1370 | X3529272Y3866836D1* 1371 | X3500297D1* 1372 | X3480755Y3857177D1* 1373 | X3461438Y3837636D1* 1374 | X3451555Y3808436D1* 1375 | Y3789119D1* 1376 | X3461438Y3759919D1* 1377 | X3480755Y3740602D1* 1378 | X3500297Y3730719D1* 1379 | X3529272D1* 1380 | X3548814Y3740602D1* 1381 | X3568131Y3759919D1* 1382 | X3630876Y3866836D2* 1383 | Y3730719D1* 1384 | Y3827977D2* 1385 | X3660076Y3857177D1* 1386 | X3679617Y3866836D1* 1387 | X3708593D1* 1388 | X3728134Y3857177D1* 1389 | X3737793Y3827977D1* 1390 | Y3730719D1* 1391 | X3800538Y3866836D2* 1392 | Y3730719D1* 1393 | Y3827977D2* 1394 | X3829738Y3857177D1* 1395 | X3849279Y3866836D1* 1396 | X3878255D1* 1397 | X3897796Y3857177D1* 1398 | X3907455Y3827977D1* 1399 | Y3730719D1* 1400 | X3970200Y3808436D2* 1401 | X4086775D1* 1402 | Y3827977D1* 1403 | X4077117Y3847519D1* 1404 | X4067458Y3857177D1* 1405 | X4047917Y3866836D1* 1406 | X4018717D1* 1407 | X3999400Y3857177D1* 1408 | X3979858Y3837636D1* 1409 | X3970200Y3808436D1* 1410 | Y3789119D1* 1411 | X3979858Y3759919D1* 1412 | X3999400Y3740602D1* 1413 | X4018717Y3730719D1* 1414 | X4047917D1* 1415 | X4067458Y3740602D1* 1416 | X4086775Y3759919D1* 1417 | X4149520Y3866836D2* 1418 | Y3730719D1* 1419 | Y3808436D2* 1420 | X4159403Y3837636D1* 1421 | X4178720Y3857177D1* 1422 | X4198262Y3866836D1* 1423 | X4227462D1* 1424 | X4487721Y3895811D2* 1425 | X4507263Y3905694D1* 1426 | X4536463Y3934670D1* 1427 | Y3730719D1* 1428 | X4608866Y3750261D2* 1429 | X4599208Y3740377D1* 1430 | X4608866Y3730719D1* 1431 | X4618749Y3740377D1* 1432 | X4608866Y3750261D1* 1433 | X4739895Y3934670D2* 1434 | X4710695Y3925011D1* 1435 | X4691153Y3895811D1* 1436 | X4681495Y3847294D1* 1437 | Y3818094D1* 1438 | X4691153Y3769577D1* 1439 | X4710695Y3740377D1* 1440 | X4739895Y3730719D1* 1441 | X4759211D1* 1442 | X4788411Y3740377D1* 1443 | X4807728Y3769577D1* 1444 | X4817611Y3818094D1* 1445 | Y3847294D1* 1446 | X4807728Y3895811D1* 1447 | X4788411Y3925011D1* 1448 | X4759211Y3934670D1* 1449 | X4739895D1* 1450 | X4807728Y3895811D2* 1451 | X4691153Y3769577D1* 1452 | X6372917Y163034D2* 1453 | Y338010D1* 1454 | X6460293Y250634D2* 1455 | X6285317D1* 1456 | X6412672Y1266519D2* 1457 | X6300364D1* 1458 | X6298663Y704906D2* 1459 | X6308321Y685589D1* 1460 | X6327863Y666048D1* 1461 | X6347180Y656389D1* 1462 | X6386038D1* 1463 | X6405580Y666048D1* 1464 | X6424897Y685589D1* 1465 | X6434780Y704906D1* 1466 | X6444438Y734106D1* 1467 | Y782848D1* 1468 | X6434780Y811823D1* 1469 | X6424897Y831365D1* 1470 | X6405580Y850682D1* 1471 | X6386038Y860565D1* 1472 | X6347180D1* 1473 | X6327863Y850682D1* 1474 | X6308322Y831365D1* 1475 | X6298663Y811823D1* 1476 | M02* 1477 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.GTP: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GTP* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Paste,Top* 5 | G04 #@! TF.Part,Single* 6 | %AMOUTLINE0* 7 | 4,1,6, 8 | -0.25,0.175, 9 | 0.4,0.175, 10 | 0.4,-0.175, 11 | -0.25,-0.175, 12 | -0.4,-0.057, 13 | -0.4,0.057, 14 | -0.25,0.175, 15 | 0*% 16 | %AMOUTLINE1* 17 | 4,1,6, 18 | 0.25,-0.175, 19 | -0.4,-0.175, 20 | -0.4,0.175, 21 | 0.25,0.175, 22 | 0.4,0.057, 23 | 0.4,-0.057, 24 | 0.25,-0.175, 25 | 0*% 26 | %ADD23R,1.0X1.1*% 27 | %ADD24R,1.1X1.0*% 28 | %ADD25R,1.6X2.7*% 29 | %ADD26R,1.3X1.5*% 30 | %ADD28R,1.6X0.8*% 31 | %ADD29R,1.9X3.4*% 32 | %ADD36R,0.9X0.4*% 33 | %ADD38R,0.65X1.05*% 34 | %ADD43O,0.85X0.3*% 35 | %ADD44R,1.6X2.3*% 36 | %ADD46R,3.06X0.89*% 37 | %ADD47R,8.54X5.35*% 38 | %ADD48R,1.5X0.25*% 39 | %ADD49R,2.2X1.8*% 40 | %ADD50R,2.0X0.6*% 41 | %ADD57OUTLINE0*% 42 | %ADD58OUTLINE1*% 43 | %FSLAX35Y35*% 44 | G04* 45 | G71* 46 | G90* 47 | G75* 48 | G01* 49 | G04 TopPaste* 50 | %LPD*% 51 | D23* 52 | X5332903Y301657D3* 53 | Y471657D3* 54 | D24* 55 | X5519593Y2237823D3* 56 | X5349593D3* 57 | X4491440Y619190D3* 58 | X4321440D3* 59 | D23* 60 | X5158260Y349287D3* 61 | Y519287D3* 62 | D24* 63 | X4888357Y619190D3* 64 | X4718357D3* 65 | X5344950Y1745650D3* 66 | X5514950D3* 67 | D25* 68 | X4926383Y2317207D3* 69 | X4646383D3* 70 | D26* 71 | X4840727Y984353D3* 72 | X4650727D3* 73 | D24* 74 | X950943Y2302117D3* 75 | X780943D3* 76 | D28* 77 | X649280Y619187D3* 78 | Y279187D3* 79 | D29* 80 | X4094523Y222273D3* 81 | X3704523D3* 82 | D36* 83 | X4046893Y492177D3* 84 | Y557177D3* 85 | Y622177D3* 86 | X3826893D3* 87 | Y557177D3* 88 | Y492177D3* 89 | D38* 90 | X1109477Y523820D3* 91 | X919477D3* 92 | X1014477Y293820D3* 93 | D23* 94 | X1347717Y2460623D3* 95 | Y2290623D3* 96 | X1173093Y2460623D3* 97 | Y2290623D3* 98 | X1522343Y2460623D3* 99 | Y2290623D3* 100 | D24* 101 | X4316797Y396917D3* 102 | X4486797D3* 103 | X5507547Y301657D3* 104 | X5677547D3* 105 | X5507547Y476300D3* 106 | X5677547D3* 107 | X4491440Y238150D3* 108 | X4321440D3* 109 | D23* 110 | X5344950Y1189963D3* 111 | Y1359963D3* 112 | D24* 113 | X5360827Y951813D3* 114 | X5530827D3* 115 | X5682190Y650943D3* 116 | X5512190D3* 117 | X5344950Y2015550D3* 118 | X5514950D3* 119 | X5725990D3* 120 | X5895990D3* 121 | D23* 122 | X5729820Y952600D3* 123 | Y1122600D3* 124 | D24* 125 | X982490Y841287D3* 126 | X1152490D3* 127 | D23* 128 | X1347577Y666680D3* 129 | Y836680D3* 130 | D43* 131 | X4069263Y811983D3* 132 | Y861983D3* 133 | Y911983D3* 134 | Y961983D3* 135 | X3779263D3* 136 | Y911983D3* 137 | Y861983D3* 138 | Y811983D3* 139 | D44* 140 | X3924263Y886983D3* 141 | G36* 142 | X4724976Y256289D2* 143 | X4788501D1* 144 | Y351539D1* 145 | X4724976D1* 146 | Y256289D1* 147 | G37* 148 | G36* 149 | Y383289D2* 150 | X4788501D1* 151 | Y478539D1* 152 | X4724976D1* 153 | Y383289D1* 154 | G37* 155 | G36* 156 | X4820226D2* 157 | X4883751D1* 158 | Y478539D1* 159 | X4820226D1* 160 | Y383289D1* 161 | G37* 162 | G36* 163 | Y256289D2* 164 | X4883751D1* 165 | Y351539D1* 166 | X4820226D1* 167 | Y256289D1* 168 | G37* 169 | D57* 170 | X4951863Y269903D3* 171 | Y334903D3* 172 | Y399903D3* 173 | Y464900D3* 174 | D58* 175 | X4656863D3* 176 | Y399903D3* 177 | Y334903D3* 178 | Y269903D3* 179 | D46* 180 | X4999493Y1238380D3* 181 | Y1365380D3* 182 | Y1492380D3* 183 | Y1619380D3* 184 | Y1746380D3* 185 | Y1873380D3* 186 | Y2000380D3* 187 | D47* 188 | X4268993Y1619380D3* 189 | D48* 190 | X522273Y1143120D3* 191 | Y1193120D3* 192 | Y1243120D3* 193 | Y1293120D3* 194 | Y1343120D3* 195 | Y1393120D3* 196 | Y1443120D3* 197 | Y1493120D3* 198 | Y1543120D3* 199 | Y1593120D3* 200 | Y1643120D3* 201 | Y1693120D3* 202 | Y1743120D3* 203 | Y1793120D3* 204 | Y1843120D3* 205 | D49* 206 | X187273Y958120D3* 207 | Y2033120D3* 208 | D50* 209 | X950943Y2095720D3* 210 | Y1968720D3* 211 | Y1841720D3* 212 | Y1714720D3* 213 | Y1587720D3* 214 | Y1460720D3* 215 | Y1333720D3* 216 | Y1206720D3* 217 | X1490943D3* 218 | Y1333720D3* 219 | Y1460720D3* 220 | Y1587720D3* 221 | Y1714720D3* 222 | Y1841720D3* 223 | Y1968720D3* 224 | Y2095720D3* 225 | M02* 226 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.GTS: -------------------------------------------------------------------------------- 1 | G04 DipTrace 3.0.0.2* 2 | G04 InterfaceBoard.GTS* 3 | %MOMM*% 4 | G04 #@! TF.FileFunction,Soldermask,Top* 5 | G04 #@! TF.Part,Single* 6 | %AMOUTLINE0* 7 | 4,1,6, 8 | -0.25,0.175, 9 | 0.4,0.175, 10 | 0.4,-0.175, 11 | -0.25,-0.175, 12 | -0.4,-0.057, 13 | -0.4,0.057, 14 | -0.25,0.175, 15 | 0*% 16 | %AMOUTLINE1* 17 | 4,1,6, 18 | 0.25,-0.175, 19 | -0.4,-0.175, 20 | -0.4,0.175, 21 | 0.25,0.175, 22 | 0.4,0.057, 23 | 0.4,-0.057, 24 | 0.25,-0.175, 25 | 0*% 26 | %ADD22C,3.0*% 27 | %ADD23R,1.0X1.1*% 28 | %ADD24R,1.1X1.0*% 29 | %ADD25R,1.6X2.7*% 30 | %ADD26R,1.3X1.5*% 31 | %ADD28R,1.6X0.8*% 32 | %ADD29R,1.9X3.4*% 33 | %ADD30R,1.6X1.6*% 34 | %ADD31C,1.6*% 35 | %ADD32O,1.5X2.0*% 36 | %ADD33R,1.7X1.7*% 37 | %ADD34C,1.7*% 38 | %ADD36R,0.9X0.4*% 39 | %ADD38R,0.65X1.05*% 40 | %ADD40C,1.8*% 41 | %ADD41O,1.5X2.5*% 42 | %ADD43O,0.85X0.3*% 43 | %ADD44R,1.6X2.3*% 44 | %ADD45R,1.65X2.4*% 45 | %ADD46R,3.06X0.89*% 46 | %ADD47R,8.54X5.35*% 47 | %ADD48R,1.5X0.25*% 48 | %ADD49R,2.2X1.8*% 49 | %ADD50R,2.0X0.6*% 50 | %ADD53C,2.75*% 51 | %ADD57OUTLINE0*% 52 | %ADD58OUTLINE1*% 53 | %FSLAX35Y35*% 54 | G04* 55 | G71* 56 | G90* 57 | G75* 58 | G01* 59 | G04 TopMask* 60 | %LPD*% 61 | D22* 62 | X6047354Y254027D3* 63 | Y762027D3* 64 | Y1270027D3* 65 | D23* 66 | X5332903Y301657D3* 67 | Y471657D3* 68 | D24* 69 | X5519593Y2237823D3* 70 | X5349593D3* 71 | X4491440Y619190D3* 72 | X4321440D3* 73 | D23* 74 | X5158260Y349287D3* 75 | Y519287D3* 76 | D24* 77 | X4888357Y619190D3* 78 | X4718357D3* 79 | X5344950Y1745650D3* 80 | X5514950D3* 81 | D25* 82 | X4926383Y2317207D3* 83 | X4646383D3* 84 | D26* 85 | X4840727Y984353D3* 86 | X4650727D3* 87 | D24* 88 | X950943Y2302117D3* 89 | X780943D3* 90 | D28* 91 | X649280Y619187D3* 92 | Y279187D3* 93 | D29* 94 | X4094523Y222273D3* 95 | X3704523D3* 96 | D30* 97 | X2226077Y2111597D3* 98 | D31* 99 | X2476077D3* 100 | X2676077D3* 101 | X2926077D3* 102 | D32* 103 | X1936077Y1376597D3* 104 | X3216077D3* 105 | D33* 106 | X347617Y603310D3* 107 | D34* 108 | Y349310D3* 109 | D36* 110 | X4046893Y492177D3* 111 | Y557177D3* 112 | Y622177D3* 113 | X3826893D3* 114 | Y557177D3* 115 | Y492177D3* 116 | D38* 117 | X1109477Y523820D3* 118 | X919477D3* 119 | X1014477Y293820D3* 120 | D23* 121 | X1347717Y2460623D3* 122 | Y2290623D3* 123 | X1173093Y2460623D3* 124 | Y2290623D3* 125 | X1522343Y2460623D3* 126 | Y2290623D3* 127 | D24* 128 | X4316797Y396917D3* 129 | X4486797D3* 130 | X5507547Y301657D3* 131 | X5677547D3* 132 | X5507547Y476300D3* 133 | X5677547D3* 134 | X4491440Y238150D3* 135 | X4321440D3* 136 | D23* 137 | X5344950Y1189963D3* 138 | Y1359963D3* 139 | D24* 140 | X5360827Y951813D3* 141 | X5530827D3* 142 | X5682190Y650943D3* 143 | X5512190D3* 144 | X5344950Y2015550D3* 145 | X5514950D3* 146 | X5725990D3* 147 | X5895990D3* 148 | D23* 149 | X5729820Y952600D3* 150 | Y1122600D3* 151 | D24* 152 | X982490Y841287D3* 153 | X1152490D3* 154 | D23* 155 | X1347577Y666680D3* 156 | Y836680D3* 157 | D40* 158 | X823930Y5112287D3* 159 | X1077930D3* 160 | X1331930D3* 161 | X1585930D3* 162 | X1839930D3* 163 | X2093930D3* 164 | X2347930D3* 165 | X2601930D3* 166 | X2855930D3* 167 | X3109930D3* 168 | X3363930D3* 169 | X3617930D3* 170 | X3871930D3* 171 | X823930Y5366287D3* 172 | X1077930D3* 173 | X1331930D3* 174 | X1585930D3* 175 | X1839930D3* 176 | X2093930D3* 177 | X2347930D3* 178 | X2601930D3* 179 | X2855930D3* 180 | X3109930D3* 181 | X3363930D3* 182 | X3617930D3* 183 | X3871930D3* 184 | X4125930Y5112287D3* 185 | Y5366287D3* 186 | X4379930Y5112287D3* 187 | Y5366287D3* 188 | X4633930Y5112287D3* 189 | Y5366287D3* 190 | X4887930Y5112287D3* 191 | Y5366287D3* 192 | X5141930Y5112287D3* 193 | Y5366287D3* 194 | X5395930Y5112287D3* 195 | Y5366287D3* 196 | X5649930Y5112287D3* 197 | Y5366287D3* 198 | D41* 199 | X4008933Y2769287D3* 200 | X4183933D3* 201 | D53* 202 | X333930Y2939287D3* 203 | X6133930D3* 204 | X333930Y5244287D3* 205 | X6133930D3* 206 | D43* 207 | X4069263Y811983D3* 208 | Y861983D3* 209 | Y911983D3* 210 | Y961983D3* 211 | X3779263D3* 212 | Y911983D3* 213 | Y861983D3* 214 | Y811983D3* 215 | D44* 216 | X3924263Y886983D3* 217 | D57* 218 | X4951863Y269903D3* 219 | Y334903D3* 220 | Y399903D3* 221 | Y464900D3* 222 | D58* 223 | X4656863D3* 224 | Y399903D3* 225 | Y334903D3* 226 | Y269903D3* 227 | D45* 228 | X4804363Y367403D3* 229 | D46* 230 | X4999493Y1238380D3* 231 | Y1365380D3* 232 | Y1492380D3* 233 | Y1619380D3* 234 | Y1746380D3* 235 | Y1873380D3* 236 | Y2000380D3* 237 | D47* 238 | X4268993Y1619380D3* 239 | D48* 240 | X522273Y1143120D3* 241 | Y1193120D3* 242 | Y1243120D3* 243 | Y1293120D3* 244 | Y1343120D3* 245 | Y1393120D3* 246 | Y1443120D3* 247 | Y1493120D3* 248 | Y1543120D3* 249 | Y1593120D3* 250 | Y1643120D3* 251 | Y1693120D3* 252 | Y1743120D3* 253 | Y1793120D3* 254 | Y1843120D3* 255 | D49* 256 | X187273Y958120D3* 257 | Y2033120D3* 258 | D50* 259 | X950943Y2095720D3* 260 | Y1968720D3* 261 | Y1841720D3* 262 | Y1714720D3* 263 | Y1587720D3* 264 | Y1460720D3* 265 | Y1333720D3* 266 | Y1206720D3* 267 | X1490943D3* 268 | Y1333720D3* 269 | Y1460720D3* 270 | Y1587720D3* 271 | Y1714720D3* 272 | Y1841720D3* 273 | Y1968720D3* 274 | Y2095720D3* 275 | M02* 276 | -------------------------------------------------------------------------------- /Barcode Scanner Gerber/InterfaceBoard.TXT: -------------------------------------------------------------------------------- 1 | M48 2 | METRIC,0000.00 3 | T01C0.406 4 | T02C0.6 5 | T03C1.0 6 | T04C1.1 7 | T05C1.5 8 | T06C2.75 9 | % 10 | T01 11 | X+000300Y+004572 12 | X+001094Y+004509 13 | X+001237Y+003985 14 | X+001840Y+004001 15 | X+002253Y+004223 16 | X+002268Y+004715 17 | X+001697Y+003254 18 | X+001538Y+002985 19 | X+001427Y+002762 20 | X+001477Y+002653 21 | X+001951Y+002746 22 | X+002046Y+002653 23 | X+001228Y+001960 24 | X+001141Y+001588 25 | X+001141Y+001445 26 | X+001276Y+001389 27 | X+001205Y+001270 28 | X+001618Y+000968 29 | X+000760Y+000460 30 | X+000411Y+000127 31 | X+000157Y+001302 32 | X+000173Y+001762 33 | X+000300Y+002397 34 | X+000300Y+003620 35 | X+003872Y+001969 36 | X+003999Y+001969 37 | X+004126Y+001969 38 | X+004253Y+001969 39 | X+004253Y+001842 40 | X+004126Y+001842 41 | X+004126Y+001715 42 | X+003999Y+001715 43 | X+003872Y+001715 44 | X+003872Y+001588 45 | X+003872Y+001461 46 | X+003999Y+001461 47 | X+004126Y+001461 48 | X+004253Y+001461 49 | X+004253Y+001334 50 | X+004126Y+001334 51 | X+003999Y+001334 52 | X+003999Y+001588 53 | X+004126Y+001588 54 | X+004253Y+001588 55 | X+004253Y+001715 56 | X+004380Y+001715 57 | X+004380Y+001588 58 | X+004507Y+001588 59 | X+004634Y+001588 60 | X+004634Y+001461 61 | X+004634Y+001334 62 | X+004507Y+001334 63 | X+004507Y+001461 64 | X+004380Y+001461 65 | X+004380Y+001334 66 | X+004475Y+000984 67 | X+003958Y+000970 68 | X+003888Y+000970 69 | X+003924Y+000887 70 | X+003958Y+000820 71 | X+003888Y+000820 72 | X+004173Y+000540 73 | X+004321Y+000238 74 | X+004768Y+000300 75 | X+004838Y+000300 76 | X+004804Y+000367 77 | X+004838Y+000440 78 | X+004768Y+000440 79 | X+005237Y+000587 80 | X+005744Y+001460 81 | X+005744Y+001730 82 | X+006014Y+001794 83 | X+006141Y+002016 84 | X+005983Y+002238 85 | X+005649Y+002476 86 | X+005284Y+002476 87 | X+005157Y+002222 88 | X+004634Y+001969 89 | X+004634Y+001842 90 | X+004634Y+001715 91 | X+004507Y+001715 92 | X+004507Y+001842 93 | X+004507Y+001969 94 | X+004380Y+001969 95 | X+004380Y+001842 96 | X+003999Y+001842 97 | X+003872Y+001842 98 | T02 99 | X+001936Y+001332G85X+001936Y+001422 100 | X+003216Y+001332G85X+003216Y+001422 101 | T03 102 | X+002226Y+002112 103 | X+002476Y+002112 104 | X+002676Y+002112 105 | X+002926Y+002112 106 | X+002856Y+005112 107 | X+002602Y+005112 108 | X+002602Y+005366 109 | X+002856Y+005366 110 | X+003110Y+005366 111 | X+003110Y+005112 112 | X+003364Y+005112 113 | X+003618Y+005112 114 | X+003872Y+005112 115 | X+003872Y+005366 116 | X+003618Y+005366 117 | X+003364Y+005366 118 | X+004126Y+005366 119 | X+004126Y+005112 120 | X+004380Y+005112 121 | X+004380Y+005366 122 | X+004634Y+005366 123 | X+004634Y+005112 124 | X+004888Y+005112 125 | X+004888Y+005366 126 | X+005142Y+005366 127 | X+005142Y+005112 128 | X+005396Y+005112 129 | X+005396Y+005366 130 | X+005650Y+005366 131 | X+005650Y+005112 132 | X+002348Y+005112 133 | X+002348Y+005366 134 | X+002094Y+005366 135 | X+001840Y+005366 136 | X+001840Y+005112 137 | X+002094Y+005112 138 | X+001586Y+005112 139 | X+001332Y+005112 140 | X+001332Y+005366 141 | X+001078Y+005366 142 | X+001078Y+005112 143 | X+000824Y+005112 144 | X+000824Y+005366 145 | X+001586Y+005366 146 | T04 147 | X+000348Y+000603 148 | X+000348Y+000349 149 | X+004009Y+002769 150 | X+004184Y+002769 151 | T05 152 | X+006047Y+000254 153 | X+006047Y+000762 154 | X+006047Y+001270 155 | T06 156 | X+000334Y+002939 157 | X+000334Y+005244 158 | X+006134Y+005244 159 | X+006134Y+002939 160 | T00 161 | M30 162 | -------------------------------------------------------------------------------- /Enclosure.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/Enclosure.stl -------------------------------------------------------------------------------- /Interface-Board.dch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/Interface-Board.dch -------------------------------------------------------------------------------- /Interface-Board.dip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/Interface-Board.dip -------------------------------------------------------------------------------- /Interface-Board.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/Interface-Board.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Brian Dorey 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Raspberry Pi Zero W Barcode Scanner 2 | Raspberry Pi Zero W based barcode scanner files for http://www.briandorey.com/post/Raspberry-Pi-Zero-Handheld-Barcode-Scanner-Part-3 3 | -------------------------------------------------------------------------------- /Raspbian Setup.txt: -------------------------------------------------------------------------------- 1 | Start with lite image 2 | 3 | Setup wifi================================ 4 | 5 | sudo nano /etc/wpa_supplicant/wpa_supplicant.conf 6 | 7 | add 8 | 9 | network={ 10 | ssid="The_ESSID_from_earlier" 11 | psk="Your_wifi_password" 12 | } 13 | 14 | 15 | Setup static ip============================ 16 | 17 | sudo nano /etc/dhcpcd.conf 18 | 19 | add 20 | 21 | interface eth0 22 | static ip_address=10.0.0.80/24 23 | static routers=10.0.0.1 24 | static domain_name_servers=10.0.0.1 25 | 26 | Basic Config ============================= 27 | 28 | sudo raspi-config 29 | 30 | Interface options 31 | Enable SPI, I2C, Serial 32 | 33 | Advanced Options 34 | Expand Filesystem 35 | 36 | Display Setup============================== 37 | 38 | sudo nano /boot/config.txt 39 | 40 | add 41 | 42 | enable_uart=1 43 | dtparam=spi=on 44 | dtparam=i2c1=on 45 | dtparam=i2c_arm=on 46 | dtoverlay=ads7846,cs=1,penirq=18,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=1,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900 47 | dtoverlay=pitft35-resistive,rotate=180,speed=62500000,fps=30 48 | 49 | sudo nano /boot/cmdline.txt 50 | 51 | append file 52 | 53 | fbcon=map:10 fbcon=font:VGA8x8 54 | 55 | 56 | sudo nano /etc/modules 57 | 58 | spi-bcm2835 59 | snd-bcm2835 60 | i2c-bcm2708 61 | i2c-dev 62 | ads7846 63 | 64 | sudo nano /etc/modprobe.d/lcd.conf 65 | 66 | add 67 | 68 | options ads7846_device model=7846 cs=1 gpio_pendown=17 keep_vref_on=1 swap_xy=1 pressure_max=255 x_plate_ohms=60 x_min=200 x_max=3900 y_min=200 y_max=3900 69 | 70 | 71 | sudo nano /etc/X11/xorg.conf.d/99-calibration.conf 72 | 73 | add 74 | 75 | Section "InputClass" 76 | Identifier "calibration" 77 | MatchProduct "ADS7846 Touchscreen" 78 | Option "Calibration" "126, 3734, 3892, 199" 79 | Option "SwapAxes" "1" 80 | EndSection 81 | 82 | 83 | Disable Screen Blanking 84 | 85 | sudo nano /etc/kbd/config 86 | 87 | Change 88 | 89 | BLANK_TIME=0 90 | 91 | POWERDOWN_TIME=0 92 | 93 | 94 | Install Wiring Pi============================ 95 | 96 | sudo apt-get install git 97 | git clone git://git.drogon.net/wiringPi 98 | cd ~/wiringPi 99 | ./build 100 | 101 | 102 | Samba Setup ==================================== 103 | 104 | sudo apt-get install samba samba-common-bin 105 | 106 | sudo nano /etc/samba/smb.conf 107 | 108 | update 109 | 110 | workgroup = workgroup 111 | 112 | wins support = yes 113 | 114 | add 115 | 116 | [pihome] 117 | 118 | comment= Pi Home 119 | path=/home/pi 120 | browseable=Yes 121 | writeable=Yes 122 | only guest=no 123 | create mask=0777 124 | directory mask=0777 125 | public=no 126 | 127 | 128 | sudo smbpasswd -a pi 129 | 130 | sudo /etc/init.d/samba restart 131 | 132 | 133 | Python Setup ==================================== 134 | 135 | sudo apt-get install python-smbus python3-smbus python-dev python3-dev python3-serial i2c-tools tk-dev python3-tk python3-pip 136 | sudo apt-get install python-setuptools libjpeg-dev zlib1g-dev libpng12-dev libfreetype6-dev 137 | 138 | sudo pip3 install Pillow 139 | 140 | 141 | GUI Setup ======================================= 142 | 143 | sudo apt-get install xorg openbox obconf xserver-xorg-video-fbdev 144 | 145 | 146 | sudo nano /usr/share/X11/xorg.conf.d/99-fbdev.conf 147 | 148 | add 149 | 150 | Section "Device" 151 | Identifier "myfb" 152 | Driver "fbdev" 153 | Option "fbdev" "/dev/fb1" 154 | EndSection 155 | 156 | 157 | Configure backlight brightness =============== 158 | 159 | sudo nano /etc/rc.local 160 | 161 | add 162 | 163 | sh -c 'echo "0" > /sys/class/backlight/soc\:backlight/brightness' 164 | gpio -g mode 18 pwm 165 | gpio pwmc 300 166 | gpio -g pwm 18 600 167 | 168 | FRAMEBUFFER=/dev/fb1 startx -- -dpi 60 169 | 170 | 171 | 172 | 173 | Start the application on boot ===================== 174 | 175 | sudo nano /etc/xdg/openbox/autostart 176 | 177 | add 178 | 179 | DISPLAY=:0 python3 /home/pi/ScannerApp/ScannerApp/ScannerApp.py -------------------------------------------------------------------------------- /ScannerApp/ScannerApp.py: -------------------------------------------------------------------------------- 1 | from lib import Hardware 2 | from lib import UI 3 | 4 | 5 | def main(): 6 | # initialise hardware 7 | hardware = Hardware.Hardware() 8 | hardware.init_battery_monitor(); 9 | hardware.init_scanner(); 10 | 11 | # initialise and launch the UI 12 | app = UI.UI() 13 | 14 | 15 | 16 | if __name__ == '__main__': 17 | main() 18 | -------------------------------------------------------------------------------- /ScannerApp/data examples/order-details.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /ScannerApp/data examples/order-details.xsd: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /ScannerApp/data examples/orders-list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ScannerApp/data examples/orders-list.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /ScannerApp/data examples/product-details.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /ScannerApp/data examples/product-details.xsd: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /ScannerApp/data examples/product-list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ScannerApp/data examples/product-list.xsd: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ScannerApp/graphics/battery.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/battery0.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery0.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery1.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery10.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery10.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery2.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery3.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery3.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery4.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery4.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery5.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery5.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery6.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery6.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery7.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery7.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery8.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery8.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/battery9.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/battery9.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/false.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/false.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/false.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/false.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-orders-selected.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-orders-selected.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-orders.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-orders.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-parts-selected.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-parts-selected.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-parts.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-parts.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-power.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-power.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-power.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-power.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-products-selected.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-products-selected.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-products.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-products.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/tabbar-products.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/tabbar-products.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/true.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/true.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/true.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/true.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi.psd -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi0.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi0.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi1.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi2.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi3.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi3.bmp -------------------------------------------------------------------------------- /ScannerApp/graphics/wifi4.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/graphics/wifi4.bmp -------------------------------------------------------------------------------- /ScannerApp/lib/Config.py: -------------------------------------------------------------------------------- 1 | # Variables accessable from any class 2 | 3 | # tkinter GUI library 4 | import tkinter.ttk as ttk 5 | 6 | # scanning mode: Used to determin which mode the barcode scanner is operating in. 7 | # 0 = default mode 8 | # 1 = orders mode 9 | # 2 = products mode 10 | # 3 = parts mode 11 | scanning_mode = 0 12 | 13 | 14 | # network status: Used to determin if there is a working internet connection 15 | network_status = False 16 | 17 | # use https: Determins whether the application uses http or https. http is used for local debugging 18 | 19 | use_https = True 20 | 21 | # scanner id: Used to identify the device to the data server 22 | 23 | scanner_id = "" 24 | 25 | # server url 26 | 27 | server_url = "" 28 | 29 | # order list path 30 | 31 | order_list_url = "" 32 | 33 | # order details path 34 | order_details_path = "" 35 | 36 | # order save path 37 | order_save_path = "" 38 | 39 | # products list path 40 | 41 | product_list_url = "" 42 | 43 | # products details path 44 | 45 | product_details_url = "" 46 | 47 | # product quantity path 48 | product_quantity_path = "" 49 | 50 | 51 | # table styles 52 | style_header_background_colour = "#dddddd" 53 | style_header_foreground_colour = "#000000" 54 | style_header_border_colour = "#aaaaaa" 55 | style_header_border_width = 1 56 | style_header_font = "DejaVuSans 17 bold" 57 | 58 | style_row_background_colour = "#ffffff" 59 | style_row_foreground_colour = "#000000" 60 | style_row_border_colour = "#cccccc" 61 | style_row_border_width = 1 62 | style_row_font = "DejaVuSans 17 normal" 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /ScannerApp/lib/Hardware.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from lib import LTC2943_1 4 | import subprocess 5 | import time 6 | import serial 7 | import os 8 | 9 | import subprocess as s 10 | 11 | class Hardware: 12 | """All functions related to accessing the barcode scanner hardware""" 13 | 14 | __MINVOLTAGE = 6.4 15 | __MAXVOLTAGE = 8.0 16 | 17 | Port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=1.0) 18 | 19 | 20 | ##### Private GPIO Functions ##### 21 | 22 | def __read_gpio(self, pin) : 23 | process = s.Popen(["/usr/local/bin/gpio", "read", pin], stdout = s.PIPE) 24 | data, _ = process.communicate() 25 | datastr = data.decode("utf-8") 26 | datastr = str.replace(datastr, "\r", "") 27 | datastr = str.replace(datastr, "\n", "") 28 | 29 | return datastr 30 | 31 | def __write_gpio(self, pin, status) : 32 | process = s.Popen(["/usr/local/bin/gpio", "write", pin, status], stdout = s.PIPE) 33 | stdout, stderr = process.communicate() 34 | 35 | def __gpio_mode(self, pin, mode) : 36 | process = s.Popen(["/usr/local/bin/gpio", "mode", pin, mode], stdout = s.PIPE) 37 | stdout, stderr = process.communicate() 38 | 39 | ##### Public Functions ##### 40 | 41 | def init_battery_monitor(self): 42 | # 43 | # initialise the LTC2943_1 battery monitor IC 44 | # 45 | 46 | dev = LTC2943_1.LTC2943_1() 47 | dev.set_control(0xC0) #ADC = Automatic Mode | Prescaler = 1 | ALCC = Disabled | Shutdown = no 48 | dev.set_charge_threshold_high(0xFFFF) 49 | dev.set_charge_threshold_low(0x0000) 50 | dev.set_voltage_threshold_high(0xFFFF) 51 | dev.set_voltage_threshold_low(0x0000) 52 | dev.set_current_threshold_high(0xFFFF) 53 | dev.set_current_threshold_low(0x0000) 54 | dev.set_temperature_threshold_high(0xFF) 55 | dev.set_temperature_threshold_low(0x00) 56 | 57 | return (1) 58 | 59 | def get_battery_level(self): 60 | # 61 | # Get the battery level from the LTC2943 62 | # 63 | dev = LTC2943_1.LTC2943_1() 64 | data = dev.get_data() 65 | 66 | batteryvoltage = dev.parse_voltage(data) 67 | 68 | batterylevel = (batteryvoltage - self.__MINVOLTAGE) * 100 69 | if batterylevel < 0: 70 | batterylevel = 0 71 | if batterylevel > 100: 72 | batterylevel = 100 73 | 74 | return (str(int(batterylevel))) 75 | 76 | def get_wifi_strength(self): 77 | # 78 | # get the signal strength from the current wifi connection using iwconfig 79 | # 80 | 81 | bashCommand = "iwconfig wlan0 | grep Quality" 82 | wifibytes = subprocess.check_output(['bash','-c', bashCommand]) 83 | wifistr = wifibytes.decode("utf-8") 84 | strengthlocation = wifistr.find("=") 85 | signalstrength = str(wifistr)[strengthlocation + 1:strengthlocation + 4].replace("/", "") 86 | 87 | return (str(signalstrength)) 88 | 89 | def init_scanner(self): 90 | # 91 | # Initialise the GPIO and UART for scanning 92 | # 93 | 94 | # set the direction of the GPIO pins and clear the receive buffer on the uart port 95 | self.__gpio_mode("3","out") 96 | self.__gpio_mode("4","in") 97 | self.__write_gpio("3", "1") 98 | self.Port.flushInput() 99 | 100 | def scan(self): 101 | # 102 | # Call the scanner and read the serial buffer 103 | # 104 | 105 | #­ flush the input buffer 106 | self.Port.flushInput() 107 | 108 | # enable barcode scanner on GPIO 22 109 | self.__write_gpio("3", "0") 110 | 111 | ScanTimeout = time.time() + 5 # 5 seconds from now 112 | CodeFound = 0 113 | 114 | while True: 115 | if self.__read_gpio("4") == "1": 116 | CodeFound = 1 117 | break 118 | 119 | if time.time() > ScanTimeout: 120 | break 121 | 122 | self.__write_gpio("3", "1") 123 | 124 | if CodeFound == 1: 125 | try: 126 | State = self.Port.read(13) 127 | return (State.decode("utf-8")) 128 | except: 129 | return ("invalidcode") 130 | 131 | else: 132 | return ("nocode") 133 | 134 | 135 | def restart(self): 136 | # 137 | # Restart the system 138 | # 139 | os.system("shutdown -r now") 140 | 141 | def shutdown(self): 142 | # 143 | # Shutdown the system 144 | # 145 | os.system("shutdown -h now") 146 | 147 | -------------------------------------------------------------------------------- /ScannerApp/lib/LTC2943_1.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | try: 4 | import smbus 5 | except ImportError: 6 | raise ImportError("python-smbus not found. Install with 'sudo apt-get install python-smbus'") 7 | import re 8 | 9 | 10 | class LTC2943_1: 11 | """ Functions for controlling the LTC2943_1 battery monitor IC""" 12 | 13 | global bus 14 | 15 | # I2C Address and Register Locations 16 | I2C_ADDRESS=0x64 17 | I2C_BUS = 1 18 | 19 | STATUS = 0x00 20 | CONTROL = 0x01 21 | ACCUMULATED_CHARGE_MSB = 0x02 22 | ACCUMULATED_CHARGE_LSB = 0x03 23 | CHARGE_THRESHOLD_HIGH_MSB = 0x04 24 | CHARGE_THRESHOLD_HIGH_LSB = 0x05 25 | CHARGE_THRESHOLD_LOW_MSB = 0x06 26 | CHARGE_THRESHOLD_LOW_LSB = 0x07 27 | VOLTAGE_MSB = 0x08 28 | VOLTAGE_LSB = 0x09 29 | VOLTAGE_THRESHOLD_HIGH_MSB = 0x0A 30 | VOLTAGE_THRESHOLD_HIGH_LSB = 0x0B 31 | VOLTAGE_THRESHOLD_LOW_MSB = 0x0C 32 | VOLTAGE_THRESHOLD_LOW_LSB = 0x0D 33 | CURRENT_MSB = 0x0E 34 | CURRENT_LSB = 0x0F 35 | CURRENT_THRESHOLD_HIGH_MSB = 0x10 36 | CURRENT_THRESHOLD_HIGH_LSB = 0x11 37 | CURRENT_THRESHOLD_LOW_MSB = 0x12 38 | CURRENT_THRESHOLD_LOW_LSB = 0x13 39 | TEMPERATURE_MSB = 0x14 40 | TEMPERATURE_LSB = 0x15 41 | TEMPERATURE_THRESHOLD_HIGH = 0x16 42 | TEMPERATURE_THRESHOLD_LOW = 0x17 43 | 44 | def get_smbus(self): 45 | # detect i2C port number and assign to i2c_bus 46 | i2c_bus = 0 47 | for line in open('/proc/cpuinfo').readlines(): 48 | m = re.match('(.*?)\s*:\s*(.*)', line) 49 | if m: 50 | (name, value) = (m.group(1), m.group(2)) 51 | if name == "Revision": 52 | if value[-4:] in ('0002', '0003'): 53 | i2c_bus = 0 54 | else: 55 | i2c_bus = 1 56 | break 57 | try: 58 | return smbus.SMBus(i2c_bus) 59 | except IOError: 60 | print ("Could not open the i2c bus.") 61 | 62 | def __init__(self): 63 | self.bus = self.get_smbus() 64 | 65 | 66 | def set_control(self, config): 67 | x = [config] 68 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CONTROL, x) 69 | return 70 | 71 | def set_charge_threshold_high(self, value): 72 | low = [value] 73 | high = [(value & 0xff00) >> 8] 74 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CHARGE_THRESHOLD_HIGH_LSB, low) 75 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CHARGE_THRESHOLD_HIGH_MSB, high) 76 | return 77 | 78 | def set_charge_threshold_low(self, value): 79 | low = [value] 80 | high = [(value & 0xff00) >> 8] 81 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CHARGE_THRESHOLD_LOW_LSB, low) 82 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CHARGE_THRESHOLD_HIGH_MSB, high) 83 | return 84 | 85 | def set_voltage_threshold_high(self, value): 86 | low = [value] 87 | high = [(value & 0xff00) >> 8] 88 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.VOLTAGE_THRESHOLD_HIGH_LSB, low) 89 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.VOLTAGE_THRESHOLD_HIGH_MSB, high) 90 | return 91 | 92 | def set_voltage_threshold_low(self, value): 93 | low = [value] 94 | high = [(value & 0xff00) >> 8] 95 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.VOLTAGE_THRESHOLD_LOW_LSB, low) 96 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.VOLTAGE_THRESHOLD_LOW_MSB, high) 97 | return 98 | 99 | def set_current_threshold_high(self, value): 100 | low = [value] 101 | high = [(value & 0xff00) >> 8] 102 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CURRENT_THRESHOLD_HIGH_LSB, low) 103 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CURRENT_THRESHOLD_HIGH_MSB, high) 104 | return 105 | 106 | def set_current_threshold_low(self, value): 107 | low = [value] 108 | high = [(value & 0xff00) >> 8] 109 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CURRENT_THRESHOLD_LOW_LSB, low) 110 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.CURRENT_THRESHOLD_LOW_MSB, high) 111 | return 112 | 113 | def set_temperature_threshold_high(self, value): 114 | x = [value] 115 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.TEMPERATURE_THRESHOLD_HIGH, x) 116 | return 117 | 118 | def set_temperature_threshold_low(self, value): 119 | x = [value] 120 | self.bus.write_i2c_block_data(self.I2C_ADDRESS, self.TEMPERATURE_THRESHOLD_LOW, x) 121 | return 122 | 123 | def get_data(self): 124 | out = self.bus.read_i2c_block_data(self.I2C_ADDRESS, 0x00, 24) 125 | return out 126 | 127 | def get_voltage(self): 128 | datablock = self.bus.read_i2c_block_data(self.I2C_ADDRESS, self.VOLTAGE_MSB, 2) 129 | t = ((datablock[0]) << 8) | datablock[1] 130 | out = ((float(t) / 65535.0) * 23.6) + 0.2 131 | return out 132 | 133 | def parse_control(self): 134 | t = datablock[self.CONTROL] 135 | return t 136 | 137 | def parse_status(self, datablock): 138 | t = datablock[self.STATUS] 139 | return t 140 | 141 | def parse_voltage(self, datablock): 142 | t = ((datablock[self.VOLTAGE_MSB]) << 8) | datablock[self.VOLTAGE_LSB] 143 | out = ((float(t) / 65535.0) * 23.6) + 0.2 144 | return out 145 | 146 | def parse_current(self, datablock): 147 | t = ((datablock[self.CURRENT_MSB]) << 8) | datablock[self.CURRENT_LSB] 148 | out = ((float(t - 32767) / 32767.0) * 1.3) / -1 149 | return out 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /ScannerApp/lib/NetworkComms.py: -------------------------------------------------------------------------------- 1 | # OS library for accessing os functions 2 | import os 3 | 4 | # HTTP and URL libraries 5 | import http.client, urllib.parse 6 | 7 | # Config global variables 8 | from lib import Config 9 | 10 | 11 | class Communication: 12 | """All classes related to network communication and data transfers""" 13 | 14 | 15 | def ping(self, url): 16 | # 17 | # ping a url to check if there is a working internet connection 18 | # 19 | Hostname = url 20 | Response = os.system("ping -c 1 " + Hostname) 21 | 22 | if Response == 0: 23 | return (True) 24 | else: 25 | return (False) 26 | 27 | 28 | def get_order_list(self): 29 | # 30 | # Request an xml dataset for the outstanding orders 31 | # 32 | params = urllib.parse.urlencode({'unitid': Config.scanner_id}) 33 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 34 | data = None 35 | try: 36 | if (Config.use_https): 37 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 38 | else: 39 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 40 | 41 | conn.request("POST", Config.order_list_url, params, headers) 42 | response = conn.getresponse() 43 | data = response.read() 44 | conn.close() 45 | except Exception as ex: 46 | print(ex.args[0]) 47 | pass 48 | 49 | return data 50 | 51 | def get_order_details(self, orderid): 52 | # 53 | # Request an xml dataset for the details and items of an individual order 54 | # 55 | params = urllib.parse.urlencode({'unitid': Config.scanner_id, 'orderid': str(orderid)}) 56 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 57 | data = None 58 | if (Config.use_https): 59 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 60 | else: 61 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 62 | try: 63 | conn.request("POST", Config.order_details_path, params, headers) 64 | response = conn.getresponse() 65 | data = response.read() 66 | except Exception as ex: 67 | print(ex) 68 | pass 69 | 70 | conn.close() 71 | 72 | return data 73 | 74 | def set_order_status(self, orderid): 75 | # 76 | # Send a request to the server to set an order status as Awaiting Dispatch 77 | # 78 | params = urllib.parse.urlencode({'unitid': Config.scanner_id, 'orderid': str(orderid)}) 79 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 80 | data = None 81 | 82 | if (Config.use_https): 83 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 84 | else: 85 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 86 | try: 87 | conn.request("POST", Config.order_save_path, params, headers) 88 | response = conn.getresponse() 89 | data = response.getcode() 90 | conn.close() 91 | except Exception as ex: 92 | print(ex) 93 | pass 94 | 95 | return data 96 | 97 | def get_product_list(self): 98 | # 99 | # Request an xml dataset containing a list of products 100 | # 101 | params = urllib.parse.urlencode({'unitid': Config.scanner_id}) 102 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 103 | data = None 104 | try: 105 | if (Config.use_https): 106 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 107 | else: 108 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 109 | 110 | conn.request("POST", Config.product_list_url, params, headers) 111 | response = conn.getresponse() 112 | data = response.read() 113 | conn.close() 114 | except Exception as ex: 115 | print(ex.args[0]) 116 | pass 117 | 118 | return data 119 | 120 | def get_product_details(self, product_id = None, barcode = None): 121 | # 122 | # Request an xml dataset containing the details of a product based on its id or barcode 123 | # 124 | 125 | if (product_id != None): 126 | params = urllib.parse.urlencode({'unitid': Config.scanner_id, 'productid': str(product_id)}) 127 | elif (barcode != None): 128 | params = urllib.parse.urlencode({'unitid': Config.scanner_id, 'barcode': str(barcode)}) 129 | else: 130 | return None 131 | 132 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 133 | data = None 134 | if (Config.use_https): 135 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 136 | else: 137 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 138 | try: 139 | conn.request("POST", Config.product_details_url, params, headers) 140 | response = conn.getresponse() 141 | data = response.read() 142 | except Exception as ex: 143 | print(ex) 144 | pass 145 | 146 | conn.close() 147 | 148 | return data 149 | 150 | def set_product_quantity(self, optionid, stocklevel): 151 | # 152 | # Send a ID and quantity to be added to the stock level for a product 153 | # 154 | params = urllib.parse.urlencode({'unitid': Config.scanner_id, 'optionid': str(optionid), 'stocklevel': str(stocklevel)}) 155 | headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} 156 | data = None 157 | 158 | if (Config.use_https): 159 | conn = http.client.HTTPSConnection(Config.server_url, timeout=5) 160 | else: 161 | conn = http.client.HTTPConnection(Config.server_url, timeout=5) 162 | try: 163 | conn.request("POST", Config.product_quantity_path, params, headers) 164 | response = conn.getresponse() 165 | data = response.getcode() 166 | conn.close() 167 | except Exception as ex: 168 | print(ex) 169 | pass 170 | 171 | return data 172 | 173 | def get_part_list(self): 174 | # 175 | # Request an xml dataset containing a list of parts 176 | # 177 | return 178 | 179 | def get_part_details(self, partid): 180 | # 181 | # Request an xml dataset containing the details for a part 182 | # 183 | return 184 | 185 | -------------------------------------------------------------------------------- /ScannerApp/lib/Objects.py: -------------------------------------------------------------------------------- 1 | # Objects accessable from any class 2 | 3 | # Order Objects 4 | 5 | class objOrder(object): 6 | def __init__(self, id = None, date = None, status = None, name = None, country = None, total = None, items = None): 7 | self.id = id 8 | self.date = date 9 | self.status = status 10 | self.name = name 11 | self.country = country 12 | self.total = total 13 | self.items = items 14 | 15 | class objOrderItem(object): 16 | def __init__(self, orderid=None, productref=None, productname=None, quantity=None,unitprice=None,barcode=None, picked=0): 17 | self.orderid = orderid 18 | self.productref = productref 19 | self.productname = productname 20 | self.quantity = quantity 21 | self.unitprice = unitprice 22 | self.barcode = barcode 23 | self.picked = picked 24 | 25 | 26 | # Products Objects 27 | 28 | class objProduct(object): 29 | def __init__(self, productid = None, refid = None, name = None): 30 | self.productid = productid 31 | self.refid = refid 32 | self.name = name 33 | 34 | class objProductOption(object): 35 | def __init__(self,optionid = None, productid = None, name = None, stocklevel = None, price = None, barcode = None): 36 | self.optionid = optionid 37 | self.productid = productid 38 | self.name = name 39 | self.stocklevel = stocklevel 40 | self.price = price 41 | self.barcode = barcode 42 | 43 | # Parts Objects 44 | -------------------------------------------------------------------------------- /ScannerApp/lib/Orders.py: -------------------------------------------------------------------------------- 1 | # tkinter GUI library 2 | import tkinter as tk 3 | 4 | # date time library used for clock and time durations 5 | from datetime import datetime, timedelta 6 | 7 | # xml parser 8 | 9 | from xml.dom import minidom 10 | from xml.etree import ElementTree 11 | 12 | # Python Imaging Library 13 | from PIL import ImageTk, Image 14 | 15 | # communication library used for all network activity 16 | 17 | from lib import NetworkComms 18 | 19 | # common ui elements 20 | 21 | from lib import UICommon 22 | 23 | # Config global variables 24 | from lib import Config 25 | 26 | # object classes 27 | from lib import Objects 28 | 29 | class Orders(): 30 | 31 | comms = NetworkComms.Communication() 32 | uicommon = UICommon.UICommon() 33 | 34 | click_start_time = datetime.now() # used for detecting a click or scroll 35 | cursor_start_position = 0 36 | 37 | order_array = [] # stores the list of orders 38 | items_array = [] # stores the items within a single order 39 | 40 | current_order = Objects.objOrder() 41 | current_item = Objects.objOrderItem() 42 | 43 | root_frame = None 44 | parent_frame = None # the scroll frame 45 | itemlist_frame = None # used within the order details frame to list items 46 | 47 | true_image = None # used for the item pick status 48 | false_image = None # used for the item pick status 49 | 50 | 51 | 52 | def __init__(self, root, master): 53 | # 54 | # Initialise the orders class 55 | # 56 | self.root_frame = root 57 | self.parent_frame = master 58 | self.uicommon.root_frame = self.root_frame 59 | 60 | self.true_image = ImageTk.PhotoImage(Image.open(self.uicommon.system_path + "true.bmp")) 61 | self.false_image = ImageTk.PhotoImage(Image.open(self.uicommon.system_path + "false.bmp")) 62 | 63 | def process_barcode(self, barcode, frame=None): 64 | # 65 | # trim the first two numbers and the last number from the order barcode and convert it into an integer 66 | # 67 | 68 | if (frame != None): 69 | self.parent_frame = frame 70 | 71 | code = barcode[2:] 72 | order_id = int(code[:-1]) 73 | 74 | # get the order details 75 | self.__order_details(order_id) 76 | 77 | return 78 | 79 | def process_product_barcode(self, barcode, frame=None): 80 | # 81 | # search the items array for the product barcode 82 | # 83 | 84 | if (frame != None): 85 | self.parent_frame = frame 86 | 87 | found = False 88 | for i in self.items_array: 89 | if (i.barcode == barcode): 90 | self.current_item = i 91 | self.__item_quantity_changed(i.picked + 1) 92 | found = True 93 | break 94 | 95 | if (found == False): 96 | self.uicommon.message_box(self.root_frame, "Not Found", "The barcode does not\n match any of the\n ordered items.") 97 | return 98 | 99 | def orders_list(self, frame): 100 | # 101 | # Fetches and displays a list of the current orders 102 | # 103 | 104 | self.parent_frame = frame 105 | 106 | # set the scanning mode to default 107 | Config.scanning_mode = 0 108 | 109 | # clear the contents of the parent frame 110 | self.uicommon.clear_frame(self.parent_frame) 111 | 112 | # get the xml order list from the server and check that xml data was received 113 | order_data = self.comms.get_order_list() 114 | if (order_data != None): 115 | # parse the xml string and get a list of the orders 116 | xml_doc = ElementTree.fromstring(order_data) 117 | xml_orders_list = xml_doc.findall("order") 118 | print(str(len(xml_orders_list)) + " orders") 119 | 120 | self.order_array.clear() 121 | 122 | # loop through the orders 123 | for s in xml_orders_list: 124 | obj = Objects.objOrder() 125 | obj.id = int(s.find("id").text) 126 | obj.date = datetime.strptime(s.find("date").text, '%Y-%m-%dT%H:%M:%S') 127 | obj.country = s.find("country").text 128 | obj.name = s.find("name").text 129 | obj.status = s.find("status").text 130 | obj.total = float(s.find("total").text) 131 | self.order_array.append(obj) 132 | 133 | # build the table 134 | 135 | index = 0 136 | for i in self.order_array: #Rows 137 | 138 | # set the colour for the first cell to show the status of the order 139 | colour = "#ffffff" 140 | 141 | if (str(i.status) == "Quotation"): 142 | colour = "#b4c6e7" 143 | elif (str(i.status) == "Payment Error"): 144 | colour = "#8497b0" 145 | elif (str(i.status) == "Order Saved"): 146 | colour = "#fff600" 147 | elif (str(i.status) == "Payment Pending"): 148 | colour = "#00b0f0" 149 | elif (str(i.status) == "Card Payment Pending"): 150 | colour = "#00b0f0" 151 | elif (str(i.status) == "Account Pending"): 152 | colour = "#00b0f0" 153 | elif (str(i.status) == "Cheque Pending"): 154 | colour = "#00b0f0" 155 | elif (str(i.status) == "Payment Received"): 156 | colour = "#00cc00" 157 | elif (str(i.status) == "Below Min Qty"): 158 | colour = "#9bc2e6" 159 | elif (str(i.status) == "Age Verification"): 160 | colour = "#ff0000" 161 | elif (str(i.status) == "Awaiting Stock"): 162 | colour = "#bf8f00" 163 | elif (str(i.status) == "Being Processed"): 164 | colour = "#ffc000" 165 | elif (str(i.status) == "Awaiting Dispatch"): 166 | colour = "#57006d" 167 | 168 | ordercolourcell = tk.Label(frame, text=" ", background=colour, padx=5, pady=10) 169 | ordercolourcell.grid(row=index, column=0, sticky=tk.N+tk.S+tk.E+tk.W) 170 | 171 | orderidcell = self.uicommon.table_cell(frame, str(i.id), justify=tk.CENTER, row=index, column=1) 172 | self.uicommon.bind_children(orderidcell, '', self.__row_pressed) 173 | self.uicommon.bind_children(orderidcell, '', lambda event, arg1=i.id: self.__orders_list_click(event, arg1)) 174 | 175 | t = datetime.strftime(i.date, "%d/%m/%y") 176 | orderdatecell = self.uicommon.table_cell(frame, t, row=index, column=2) 177 | self.uicommon.bind_children(orderdatecell, '', self.__row_pressed) 178 | self.uicommon.bind_children(orderdatecell, '', lambda event, arg1=i.id: self.__orders_list_click(arg1)) 179 | 180 | ordertextcell = self.uicommon.table_cell(frame, str(i.name) + "\n" + str(i.country), row=index, column=3) 181 | self.uicommon.bind_children(ordertextcell, '', self.__row_pressed) 182 | self.uicommon.bind_children(ordertextcell, '', lambda event, arg1=i.id: self.__orders_list_click(arg1)) 183 | 184 | ordertotalcell = self.uicommon.table_cell(frame, str(i.total), justify=tk.RIGHT, row=index, column=4) 185 | self.uicommon.bind_children(ordertotalcell, '', self.__row_pressed) 186 | self.uicommon.bind_children(ordertotalcell, '', lambda event, arg1=i.id: self.__orders_list_click(arg1)) 187 | 188 | index+=1 189 | 190 | # configure the column weights 191 | self.uicommon.table_column_weighs(frame, [5, 4, 2, 1, 3], [5,60,80,120,60]) 192 | 193 | else: 194 | # Data could not be retrieved from the server so show an error message 195 | self.uicommon.message_box(self.root_frame, "Communication Error", "The order list could not be retrieved from the server") 196 | 197 | return 198 | 199 | 200 | def __orders_list_click(self, selected_id): 201 | # 202 | # check if the mouse has been moved more than 5 pixels 203 | # 204 | 205 | x = self.root_frame.winfo_pointery() - self.cursor_start_position 206 | if (x > -5) and (x < 5): # mouse has moved less than 5 pixels so detect it as a click 207 | # check the amount of time that has passed since the press started 208 | duration = datetime.now() - self.click_start_time 209 | if (duration < timedelta(seconds=1)): # less than 1 second has passed so detect as click instead of hold 210 | self.__order_details(selected_id) 211 | return 212 | 213 | 214 | def __order_details(self, order_id): 215 | # 216 | # set the scanning mode to be 1: Orders 217 | # 218 | 219 | Config.scanning_mode = 1 # orders mode 220 | 221 | # get the xml order list from the server 222 | order_data = self.comms.get_order_details(order_id) 223 | # parse the xml string and get a list of the orders 224 | xml_doc = ElementTree.fromstring(order_data) 225 | xml_order_overview = xml_doc.findall("order") 226 | xml_item_list = xml_doc.findall("item") 227 | print(str(len(xml_item_list)) + " items") 228 | 229 | self.items_array.clear() 230 | 231 | # get the order overview information 232 | for s in xml_order_overview: 233 | self.current_order.id = int(s.find("id").text) 234 | self.current_order.date = datetime.strptime(s.find("date").text, '%Y-%m-%dT%H:%M:%S') 235 | self.current_order.country = s.find("country").text 236 | self.current_order.name = s.find("name").text 237 | self.current_order.status = s.find("status").text 238 | self.current_order.total = float(s.find("total").text) 239 | 240 | print("Current Order: " + str(self.current_order.id)) 241 | 242 | # loop through the order items 243 | for s in xml_item_list: 244 | obj = Objects.objOrderItem() 245 | obj.orderid = self.current_order.id 246 | obj.productref = s.find("productref").text 247 | obj.productname = s.find("productname").text 248 | obj.quantity = int(s.find("quantity").text) 249 | obj.unitprice = float(s.find("unitprice").text) 250 | obj.barcode = s.find("barcode").text 251 | 252 | print(obj.productname) 253 | self.items_array.append(obj) 254 | 255 | # clear any existing elements from the parent frame 256 | self.uicommon.clear_frame(self.parent_frame) 257 | 258 | # build the overview frame 259 | overview_frame = tk.Frame(self.parent_frame, width=320) 260 | overview_frame.pack() 261 | 262 | id_title_label = self.uicommon.table_title(overview_frame, "Order ID:", row=0, column=0) 263 | id_label = self.uicommon.table_cell(overview_frame, str(self.current_order.id), row=0, column=1) 264 | 265 | date_title_label = self.uicommon.table_title(overview_frame, "Date:", row=1, column=0) 266 | date_label = self.uicommon.table_cell(overview_frame, str(self.current_order.date), row=1, column=1, columnspan=2) 267 | 268 | name_title_label = self.uicommon.table_title(overview_frame, "Name:", row=2, column=0) 269 | name_label = self.uicommon.table_cell(overview_frame, str(self.current_order.name), row=2, column=1, columnspan=2) 270 | 271 | country_title_label = self.uicommon.table_title(overview_frame, "Country:", row=3, column=0) 272 | country_label = self.uicommon.table_cell(overview_frame, str(self.current_order.country), row=3, column=1, columnspan=2) 273 | 274 | status_title_label = self.uicommon.table_title(overview_frame, "Status:", row=4, column=0) 275 | status_label = self.uicommon.table_cell(overview_frame, str(self.current_order.status), row=4, column=1, columnspan=2) 276 | 277 | # save button 278 | save_button = tk.Button(overview_frame, width=120, font="DejaVuSans 30 normal", foreground="white",pady=5, activeforeground="white", background="#588706",activebackground="#4b7206", text="Save", command=self.__save_order) 279 | save_button.grid(row=0, column=2) 280 | 281 | # set the column weights and widths 282 | self.uicommon.table_column_weighs(overview_frame, [3, 1, 2], [80, 120, 120]) 283 | 284 | self.itemlist_frame = tk.Frame(self.parent_frame, width=320) 285 | self.itemlist_frame.pack() 286 | 287 | # build the table frame 288 | self.__item_list_table() 289 | 290 | 291 | return 292 | 293 | 294 | def __item_list_table(self): 295 | # 296 | # clear the contents of the item list table 297 | # 298 | self.uicommon.clear_frame(self.itemlist_frame) 299 | 300 | index = 1 301 | 302 | # add the titles 303 | product_title = self.uicommon.table_title(self.itemlist_frame, "Product ID/Name", row=0, column=0) 304 | quantity_title = self.uicommon.table_title(self.itemlist_frame, "Qty", row=0, column=1) 305 | picked_title = self.uicommon.table_title(self.itemlist_frame, "Picked", row=0, column=2) 306 | 307 | # add the contents of the items_array to the table 308 | for i in self.items_array: 309 | product_cell = self.uicommon.table_cell(self.itemlist_frame, i.productref + "\n" + i.productname, row=index, column=0) 310 | 311 | quanitity_cell = self.uicommon.table_cell(self.itemlist_frame, i.quantity, row=index, column=1) 312 | 313 | if (i.picked == 0): 314 | picked_cell = self.uicommon.table_cell(self.itemlist_frame, image=self.false_image, row=index, column=2) 315 | elif(i.picked == i.quantity): 316 | picked_cell = self.uicommon.table_cell(self.itemlist_frame, image=self.true_image, row=index, column=2) 317 | else: 318 | picked_cell = self.uicommon.table_cell(self.itemlist_frame, image=None, celltext=str(i.picked), row=index, column=2) 319 | self.uicommon.bind_children(picked_cell, '', self.__row_pressed) 320 | self.uicommon.bind_children(picked_cell, '', lambda event, arg1=i: self.__item_click(arg1)) 321 | 322 | index+= 1 323 | 324 | self.uicommon.table_column_weighs(self.itemlist_frame, [1, 2], [210, 40, 40]) 325 | 326 | 327 | def __item_click(self, selected_item): 328 | # 329 | # Checks if a click is valid and then updates the picked quanitity 330 | # 331 | 332 | # check if the mouse has been moved more than 5 pixels 333 | x = self.root_frame.winfo_pointery() - self.cursor_start_position 334 | if (x > -5) and (x < 5): # mouse has moved less than 5 pixels so detect it as a click 335 | # check the amount of time that has passed since the press started 336 | duration = datetime.now() - self.click_start_time 337 | if (duration < timedelta(seconds=1)): # less than 1 second has passed so detect as click instead of hold 338 | self.current_item = selected_item 339 | 340 | # if selected item has already been picked reset it to be unpicked 341 | if (selected_item.picked == selected_item.quantity): 342 | selected_item.picked = 0 343 | self.__items_array_update(selected_item) 344 | self.__item_list_table() 345 | elif(selected_item.quantity == 1): 346 | # get the quantity for the selected item. If the quanitity is 1 update the picked status to be 1 else show the numeric keypad 347 | selected_item.picked = 1 348 | self.__items_array_update(selected_item) 349 | self.__item_list_table() 350 | else: 351 | self.uicommon.numeric_keypad(self.root_frame, self.__item_quantity_changed, "Quantity Picked: " + str(selected_item.quantity) + " required") 352 | 353 | 354 | return 355 | 356 | def __items_array_update(self, selected_item): 357 | # 358 | # update the picked status for the selected item 359 | # 360 | index = 0 361 | 362 | for i in self.items_array: 363 | if (i.productref == selected_item.productref): 364 | self.items_array[index] = selected_item 365 | break 366 | else: 367 | index+=1 368 | 369 | return 370 | 371 | 372 | 373 | def __item_quantity_changed(self, value): 374 | # 375 | # Callback for the numeric keypad 376 | # 377 | 378 | if (self.current_item!= None) and (value != None): 379 | self.current_item.picked = int(value) 380 | self.__items_array_update(self.current_item) 381 | self.__item_list_table() 382 | 383 | 384 | 385 | def __save_order(self): 386 | # 387 | # Saves the status of the order onto the server 388 | # 389 | 390 | # check if all of the items in the items_array have been picked 391 | all_picked = True 392 | for i in self.items_array: 393 | if (i.picked < i.quantity): 394 | all_picked = False 395 | 396 | # if all picked then send the response to the server otherwise show a message 397 | if (all_picked): 398 | status = self.comms.set_order_status(self.current_order.id) 399 | 400 | if (status == 200): 401 | self.uicommon.message_box(self.root_frame, "Order Saved", "The order status\n has been updated", target=self.orders_list(self.parent_frame)) 402 | return 403 | else: 404 | self.uicommon.message_box(self.root_frame, "Communication Error", "The order could\n not be saved.\nError Code:" + str(status)) 405 | return 406 | else: 407 | self.uicommon.message_box(self.root_frame, "Order Not Complete", "There are items which\n have not been picked.") 408 | 409 | return 410 | 411 | def __row_pressed(self, event): 412 | self.click_start_time = datetime.now() 413 | self.cursor_start_position = self.root_frame.winfo_pointery() 414 | 415 | 416 | -------------------------------------------------------------------------------- /ScannerApp/lib/Parts.py: -------------------------------------------------------------------------------- 1 | # tkinter GUI library 2 | import tkinter as tk 3 | 4 | # date time library used for clock and time durations 5 | from datetime import datetime, timedelta 6 | 7 | # Config global variables 8 | from lib import Config 9 | 10 | class Parts(): 11 | 12 | root_frame = None 13 | parent_frame = None 14 | 15 | def __init__(self, root, master): 16 | 17 | self.root_frame = root 18 | self.parent_frame = master 19 | 20 | def parts_list(self, frame): 21 | # 22 | # Fetches and displays a list of the parts 23 | # 24 | 25 | self.parent_frame = frame 26 | 27 | # set the scanning mode to default 28 | Config.scanning_mode = 0 29 | 30 | 31 | return 32 | 33 | def process_barcode(self, barcode, frame=None): 34 | 35 | if (frame != None): 36 | self.parent_frame = frame 37 | 38 | return 39 | -------------------------------------------------------------------------------- /ScannerApp/lib/Products.py: -------------------------------------------------------------------------------- 1 | # tkinter GUI library 2 | import tkinter as tk 3 | 4 | # date time library used for clock and time durations 5 | from datetime import datetime, timedelta 6 | 7 | # xml parser 8 | 9 | from xml.dom import minidom 10 | from xml.etree import ElementTree 11 | 12 | # Python Imaging Library 13 | from PIL import ImageTk, Image 14 | 15 | # communication library used for all network activity 16 | 17 | from lib import NetworkComms 18 | 19 | # common ui elements 20 | 21 | from lib import UICommon 22 | 23 | # Config global variables 24 | from lib import Config 25 | 26 | # object classes 27 | from lib import Objects 28 | 29 | class Products(): 30 | 31 | comms = NetworkComms.Communication() 32 | uicommon = UICommon.UICommon() 33 | 34 | click_start_time = datetime.now() # used for detecting a click or scroll 35 | cursor_start_position = 0 36 | 37 | products_array = [] # stores the list of products 38 | options_array = [] # stores the options within a single product 39 | 40 | current_product = Objects.objProduct() 41 | current_option = Objects.objProductOption() 42 | 43 | selected_option = None 44 | 45 | root_frame = None 46 | parent_frame = None # the scroll frame 47 | optionlist_frame = None # used within the order details frame to list items 48 | 49 | def __init__(self, root, master): 50 | # 51 | # Initialise the products class 52 | # 53 | self.root_frame = root 54 | self.parent_frame = master 55 | self.uicommon.root_frame = self.root_frame 56 | 57 | 58 | def process_barcode(self, barcode, frame=None): 59 | # 60 | # get the product details from the barcode 61 | # 62 | 63 | if (frame != None): 64 | self.parent_frame = frame 65 | 66 | self.__product_details(barcode = barcode) 67 | 68 | return 69 | 70 | def products_list(self, frame): 71 | # 72 | # Fetches and displays a list of the active products 73 | # 74 | 75 | self.parent_frame = frame 76 | 77 | # set the scanning mode to default 78 | Config.scanning_mode = 0 79 | 80 | # clear the contents of the parent frame 81 | self.uicommon.clear_frame(self.parent_frame) 82 | 83 | # get the xml product list from the server and check that xml data was received 84 | product_data = self.comms.get_product_list() 85 | if (product_data != None): 86 | # parse the xml string and get a list of the orders 87 | xml_doc = ElementTree.fromstring(product_data) 88 | xml_products_list = xml_doc.findall("product") 89 | print(str(len(xml_products_list)) + " products") 90 | 91 | self.products_array.clear() 92 | 93 | # loop through the products 94 | for s in xml_products_list: 95 | obj = Objects.objProduct() 96 | obj.name = s.find("name").text 97 | obj.productid = int(s.find("productid").text) 98 | obj.refid = s.find("refid").text 99 | self.products_array.append(obj) 100 | 101 | # build the table 102 | 103 | index = 0 104 | 105 | for i in self.products_array: #Rows 106 | refidcell = self.uicommon.table_cell(frame, str(i.refid), justify=tk.CENTER, row=index, column=0) 107 | self.uicommon.bind_children(refidcell, '', self.__row_pressed) 108 | self.uicommon.bind_children(refidcell, '', lambda event, arg1=i.productid: self.__product_list_click(arg1)) 109 | 110 | namecell = self.uicommon.table_cell(frame, str(i.name), justify=tk.CENTER, row=index, column=1) 111 | self.uicommon.bind_children(namecell, '', self.__row_pressed) 112 | self.uicommon.bind_children(namecell, '', lambda event, arg1=i.productid: self.__product_list_click(arg1)) 113 | 114 | index+=1 115 | 116 | # configure the column weights 117 | self.uicommon.table_column_weighs(frame, [1, 2], [100,220]) 118 | 119 | else: 120 | # Data could not be retrieved from the server so show an error message 121 | self.uicommon.message_box(self.root_frame, "Communication Error", "The order list could not be retrieved from the server") 122 | 123 | return 124 | 125 | def __product_list_click(self, product_id): 126 | # 127 | # check if the mouse has been moved more than 5 pixels 128 | # 129 | 130 | x = self.root_frame.winfo_pointery() - self.cursor_start_position 131 | if (x > -5) and (x < 5): # mouse has moved less than 5 pixels so detect it as a click 132 | # check the amount of time that has passed since the press started 133 | duration = datetime.now() - self.click_start_time 134 | if (duration < timedelta(seconds=1)): # less than 1 second has passed so detect as click instead of hold 135 | self.__product_details(product_id) 136 | return 137 | 138 | def __product_details(self, product_id = None, barcode = None): 139 | # 140 | # set the scanning mode to be 2: Products 141 | # 142 | 143 | Config.scanning_mode = 2 # products mode 144 | 145 | # clear the contents of the parent frame 146 | self.uicommon.clear_frame(self.parent_frame) 147 | 148 | # get the xml product list from the server and check that xml data was received 149 | 150 | product_data = None 151 | 152 | if (product_id != None): 153 | print("selected product id:" + str(product_id)) 154 | product_data = self.comms.get_product_details(product_id = product_id) 155 | elif(barcode != None): 156 | print("selected barcode:" + str(barcode)) 157 | product_data = self.comms.get_product_details(barcode = barcode) 158 | else: 159 | # No product id or barcode found so show an error message 160 | self.uicommon.message_box(self.root_frame, "Product Details Error", "Product details could not be retrieved from the server") 161 | 162 | if (product_data != None): 163 | 164 | # parse the xml string and get a list of the orders 165 | xml_doc = ElementTree.fromstring(product_data) 166 | xml_products_list = xml_doc.findall("product") 167 | print(str(len(xml_products_list)) + " products") 168 | 169 | self.products_array.clear() 170 | 171 | # get the products details 172 | s = xml_products_list[0] 173 | self.current_product = Objects.objProduct() 174 | self.current_product.name = s.find("name").text 175 | self.current_product.productid = int(s.find("productid").text) 176 | self.current_product.refid = s.find("refid").text 177 | 178 | # get the product options 179 | xml_options_list = s.findall(".//option") 180 | 181 | self.options_array.clear() 182 | 183 | for s in xml_options_list: 184 | obj = Objects.objProductOption() 185 | obj.optionid = int(s.find("optionid").text) 186 | obj.productid = int(s.find("productid").text) 187 | obj.name = s.find("name").text 188 | obj.stocklevel = int(s.find("stocklevel").text) 189 | obj.price = float(s.find("price").text) 190 | obj.barcode = s.find("barcode").text 191 | self.options_array.append(obj) 192 | 193 | # Build the Product Details Page 194 | overview_frame = tk.Frame(self.parent_frame, width=320) 195 | overview_frame.pack() 196 | 197 | id_title_label = self.uicommon.table_title(overview_frame, "ID:", row=0, column=0) 198 | id_label = self.uicommon.table_cell(overview_frame, str(self.current_product.refid), row=0, column=1) 199 | 200 | name_title_label = self.uicommon.table_title(overview_frame, "Name:", row=1, column=0) 201 | name_label = self.uicommon.table_cell(overview_frame, str(self.current_product.name), row=1, column=1) 202 | 203 | # set the column weights and widths 204 | self.uicommon.table_column_weighs(overview_frame, [1, 2], [80, 240]) 205 | 206 | self.optionlist_frame = tk.Frame(self.parent_frame, width=320) 207 | self.optionlist_frame.pack() 208 | 209 | 210 | self.__options_list_table() 211 | 212 | return 213 | 214 | def __options_list_table(self): 215 | # 216 | # clear the contents of the options list table 217 | # 218 | self.uicommon.clear_frame(self.optionlist_frame) 219 | 220 | index = 1 221 | 222 | # add the titles 223 | product_title = self.uicommon.table_title(self.optionlist_frame, "Product ID/Name", row=0, column=0) 224 | quantity_title = self.uicommon.table_title(self.optionlist_frame, "Stock", row=0, column=1) 225 | picked_title = self.uicommon.table_title(self.optionlist_frame, "Update", row=0, column=2) 226 | 227 | # add the contents of the options_array to the table 228 | for i in self.options_array: 229 | product_cell = self.uicommon.table_cell(self.optionlist_frame, i.name, row=index, column=0) 230 | quanitity_cell = self.uicommon.table_cell(self.optionlist_frame, i.stocklevel, row=index, column=1) 231 | self.uicommon.bind_children(quanitity_cell, '', self.__row_pressed) 232 | self.uicommon.bind_children(quanitity_cell, '', lambda event, arg1=i: self.__option_click(arg1)) 233 | 234 | # add stock button 235 | add_stock_button = tk.Button(self.optionlist_frame, font="DejaVuSans 22 normal", foreground="white",pady=10, padx=15, activeforeground="white", background="#588706",activebackground="#4b7206", text="Add", command=lambda arg1=i: self.__add_stock_clicked(arg1)) 236 | add_stock_button.grid(row=index, column=2) 237 | 238 | self.uicommon.table_column_weighs(self.optionlist_frame, [1, 2, 3], [190, 60, 70]) 239 | 240 | return 241 | 242 | def __option_click(self, option): 243 | # 244 | # click event from the option stock level cell 245 | # 246 | self.selected_option = option 247 | self.uicommon.numeric_keypad(self.root_frame, self.__option_stock_level_changed, "Update Stock Level", value = self.selected_option.stocklevel) 248 | return 249 | 250 | def __add_stock_clicked(self, option): 251 | # 252 | # click event from the option add stock button 253 | # 254 | self.selected_option = option 255 | self.uicommon.numeric_keypad(self.root_frame, self.__option_stock_level_add, "Add Stock") 256 | return 257 | 258 | def __option_stock_level_changed(self, value): 259 | # 260 | # Callback for the numeric keypad from __option_click 261 | # 262 | if (self.selected_option!= None) and (value != None): 263 | self.selected_option.stocklevel = int(value) 264 | self.__options_array_update(self.selected_option) 265 | self.__options_list_table() 266 | 267 | #send the new stock level to the server 268 | status = self.comms.set_product_quantity(self.selected_option.optionid, self.selected_option.stocklevel) 269 | 270 | if (status == 200): 271 | self.uicommon.message_box(self.root_frame, "Stock Updated", "The stock level\n has been updated") 272 | return 273 | else: 274 | self.uicommon.message_box(self.root_frame, "Communication Error", "The stock level could\n not be saved.\nError Code:" + str(status)) 275 | return 276 | return 277 | 278 | def __option_stock_level_add(self, value): 279 | # 280 | # Callback for the numeric keypad from __add_stock_clicked 281 | # 282 | if (self.selected_option!= None) and (value != None): 283 | self.selected_option.stocklevel += int(value) 284 | self.__options_array_update(self.selected_option) 285 | self.__options_list_table() 286 | 287 | #send the new stock level to the server 288 | status = self.comms.set_product_quantity(self.selected_option.optionid, self.selected_option.stocklevel) 289 | 290 | if (status == 200): 291 | self.uicommon.message_box(self.root_frame, "Stock Updated", "The stock level\n has been updated") 292 | return 293 | else: 294 | self.uicommon.message_box(self.root_frame, "Communication Error", "The stock level could\n not be saved.\nError Code:" + str(status)) 295 | return 296 | return 297 | 298 | def __options_array_update(self, selected_item): 299 | # 300 | # update the picked status for the selected item 301 | # 302 | index = 0 303 | 304 | for i in self.options_array: 305 | if (i.optionid== selected_item.optionid): 306 | self.options_array[index] = selected_item 307 | break 308 | else: 309 | index+=1 310 | 311 | return 312 | 313 | def __row_pressed(self, event): 314 | self.click_start_time = datetime.now() 315 | self.cursor_start_position = self.root_frame.winfo_pointery() 316 | -------------------------------------------------------------------------------- /ScannerApp/lib/UI.py: -------------------------------------------------------------------------------- 1 | # Threading library for timer events 2 | import time, threading 3 | 4 | # OS library for accessing os functions 5 | import os 6 | 7 | # tkinter GUI library 8 | import tkinter as tk 9 | from tkinter import messagebox 10 | 11 | # date time library used for clock and time durations 12 | from datetime import datetime, timedelta 13 | 14 | # Python Imaging Library 15 | from PIL import ImageTk, Image 16 | 17 | # Hardware library for accessing scanner hardware 18 | from lib import Hardware 19 | 20 | # NetworkComms library for all network communications 21 | 22 | from lib import NetworkComms 23 | 24 | # UI functions common across all libraries 25 | from lib import UICommon 26 | 27 | # Functions related to orders 28 | from lib import Orders 29 | 30 | # Functions related to Products 31 | from lib import Products 32 | 33 | # Functions related to Parts 34 | from lib import Parts 35 | 36 | # Config global variables 37 | from lib import Config 38 | 39 | 40 | class UI(): 41 | 42 | 43 | #region Variable and Object decloration 44 | 45 | root = tk.Tk() 46 | system_path = "" 47 | 48 | # UI component objects 49 | 50 | # titlebar objects 51 | title_frame = tk.Frame() 52 | clock_label = tk.Label() 53 | power_label = tk.Label() 54 | power_icon = tk.Label() 55 | wifi_icon = tk.Label() 56 | 57 | wifi_status = 0 58 | wifi_image = ImageTk.PhotoImage(Image.new("RGB", (25, 25), "black")) 59 | battery_status = 0 60 | battery_image = ImageTk.PhotoImage(Image.new("RGB", (25, 25), "black")) 61 | 62 | #tab bar objects 63 | tabbar_frame = tk.Frame() 64 | orders_button = tk.Label() 65 | products_button = tk.Label() 66 | parts_button = tk.Label() 67 | power_button = tk.Label() 68 | power_dialog = tk.Frame() 69 | ordersicon = ImageTk.PhotoImage(Image.new("RGB", (90, 50), "black")) 70 | productsicon = ImageTk.PhotoImage(Image.new("RGB", (90, 50), "black")) 71 | partsicon = ImageTk.PhotoImage(Image.new("RGB", (90, 50), "black")) 72 | 73 | #content objects 74 | content_frame = tk.Frame() 75 | content_scroll_frame = tk.Frame() 76 | 77 | #content variables 78 | cursor_start_position = 0 79 | frame_start_position = 0 80 | 81 | frame_end_position = 0 82 | scroll_enabled = False 83 | is_scrolling = False 84 | 85 | current_tab = "orders" 86 | 87 | #footer objects 88 | footer_frame = tk.Frame() 89 | 90 | # object initialisation 91 | 92 | hardware = Hardware.Hardware() 93 | uicommon = UICommon.UICommon(root) 94 | communication = NetworkComms.Communication() 95 | orders = Orders.Orders(root, content_scroll_frame) 96 | products = Products.Products(root, content_scroll_frame) 97 | parts = Parts.Parts(root, content_scroll_frame) 98 | 99 | 100 | def __init__(self): 101 | # 102 | # UI Class initialisation 103 | # 104 | 105 | # set the root frame to open full screen with cursor disabled 106 | w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight() 107 | self.root.overrideredirect(1) 108 | self.root.geometry("%dx%d+0+0" % (w, h)) 109 | self.root.config(cursor='none') 110 | 111 | # start timer to update the titlebar 112 | self.root.after(1000, self.__titlebar_update_event) 113 | 114 | # initialse the UI 115 | self.__init_ui() 116 | 117 | # check if there is a network connection 118 | 119 | if (self.communication.ping("google.com")): 120 | Config.network_status = True 121 | else: 122 | self.uicommon.message_box(self.root, "Communication Error", "No network connection") 123 | 124 | 125 | # set the orders tab to be active and get the latest orders 126 | self.__orders_tab_clicked() 127 | 128 | # run the main UI loop 129 | self.root.mainloop() 130 | 131 | #endregion 132 | 133 | #region UI initialisation 134 | 135 | def __init_ui(self): 136 | # 137 | # initialise the primary UI elements 138 | # 139 | 140 | self.system_path = os.path.dirname(os.path.abspath(__file__)).replace("lib", "") + "graphics/" 141 | #self.root.pack(fill=tk.BOTH, expand=1) 142 | 143 | # initialise the title bar objects 144 | self.title_frame = tk.Frame(self.root, height=25, width=320, background="black" ) 145 | self.title_frame.pack_propagate(0) 146 | self.title_frame.pack(fill=tk.X) 147 | 148 | self.clock_label = tk.Label(self.title_frame, text="00:00 01:01:2000", background="black", foreground="white") 149 | self.clock_label.place(x=3, y=3) 150 | 151 | self.wifi_icon = tk.Label(self.title_frame, image=self.wifi_image, borderwidth=0) 152 | self.wifi_icon.place(x=200, y=0) 153 | 154 | self.power_icon = tk.Label(self.title_frame, image=self.battery_image, borderwidth=0) 155 | self.power_icon.place(x=255, y=0) 156 | 157 | self.power_label = tk.Label(self.title_frame, text="", background="black", foreground="white") 158 | self.power_label.place(x=280, y=3) 159 | 160 | # initialise the tab bar objects 161 | self.tabbar_frame = tk.Frame(self.root, height=50, width=320, background="grey" ) 162 | self.tabbar_frame.pack_propagate(0) 163 | self.tabbar_frame.pack(fill=tk.X) 164 | 165 | # initialise the orders tab button 166 | self.ordersicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-orders.bmp")) 167 | self.orders_button = tk.Button(self.tabbar_frame, width=88, height=50, image=self.ordersicon,borderwidth=0, highlightthickness=0, command=self.__orders_tab_clicked) 168 | self.orders_button.image = self.ordersicon 169 | self.orders_button.grid(row=0, column=0) 170 | 171 | # initialise the products tab button 172 | self.productsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-products.bmp")) 173 | self.products_button = tk.Button(self.tabbar_frame, width=88, height=50, image=self.productsicon,borderwidth=0, highlightthickness=0, command=self.__products_tab_clicked) 174 | self.products_button.image = self.productsicon 175 | self.products_button.grid(row=0, column=1) 176 | 177 | # initialise the parts tab button 178 | self.partsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-parts.bmp")) 179 | self.parts_button = tk.Button(self.tabbar_frame, width=88, height=50, image=self.partsicon,borderwidth=0, highlightthickness=0, command=self.__parts_tab_clicked) 180 | self.parts_button.image = self.partsicon 181 | self.parts_button.grid(row=0, column=2) 182 | 183 | # initialise the power tab button 184 | power_icon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-power.bmp")) 185 | self.power_button = tk.Button(self.tabbar_frame, width=50, height=50, image=power_icon,borderwidth=0, highlightthickness=0, command=self.__power_tab_clicked) 186 | self.power_button.image = power_icon 187 | self.power_button.grid(row=0, column=3) 188 | 189 | # initialise the content frame objects 190 | self.content_frame = tk.Frame(self.root, height=330, width=320, background="white" ) 191 | self.content_frame.pack_propagate(0) 192 | self.content_frame.pack(fill=tk.X) 193 | 194 | # initialise the content scroll frame 195 | self.content_scroll_frame = tk.Frame(self.content_frame) 196 | self.content_scroll_frame.place(x=0, y=0, width=320) 197 | #self.orders.orders_list(self.content_scroll_frame) 198 | 199 | # initialise the footer bar objects 200 | self.footer_frame = tk.Frame(self.root, height=75, width=320, background="green" ) 201 | self.footer_frame.pack_propagate(0) 202 | self.footer_frame.pack(fill=tk.X) 203 | 204 | self.scan_button = tk.Button(self.footer_frame, height=75, width=320, font="DejaVuSans 36 normal", foreground="white", activeforeground="white", background="#7cbc0a",activebackground="#7cbc0a", text="SCAN", command=self.__scan_barcode) 205 | self.scan_button.pack(fill=tk.BOTH, expand=True) 206 | 207 | # add the button events for content scrolling 208 | self.root.bind('', self.__scroll_start) 209 | self.root.bind('', self.__scroll_end) 210 | 211 | #endregion 212 | 213 | #region primary UI events 214 | 215 | def __scan_barcode(self): 216 | # 217 | # Calls the barcode scanner hardware and processes the returned barcode 218 | # 219 | print("scanning") 220 | barcode = self.hardware.scan() 221 | print(barcode) 222 | code_type = self.uicommon.barcode_type(barcode) 223 | print(code_type) 224 | 225 | # Parse barcode 226 | if (Config.scanning_mode == 0): # default mode 227 | if (code_type == "order"): 228 | self.__select_tab_from_barcode("orders") 229 | self.orders.process_barcode(barcode, frame=self.content_scroll_frame) 230 | elif (code_type == "product"): 231 | self.__select_tab_from_barcode("products") 232 | self.products.process_barcode(barcode, frame=self.content_scroll_frame) 233 | else: 234 | self.parts.process_barcode(barcode) 235 | 236 | elif (Config.scanning_mode == 1): # orders mode 237 | if (code_type == "order"): 238 | self.__select_tab_from_barcode("orders") 239 | self.orders.process_barcode(barcode, frame=self.content_scroll_frame) 240 | elif (code_type == "product"): 241 | self.__select_tab_from_barcode("orders") 242 | self.orders.process_product_barcode(barcode, frame=self.content_scroll_frame) 243 | else: 244 | self.uicommon.message_box(self.root, "Error", "Unknown Barcode") 245 | 246 | elif (Config.scanning_mode == 2): # product mode 247 | if (code_type == "order"): 248 | self.uicommon.message_box(self.root, "Error", "Not a product barcode") 249 | elif (code_type == "product"): 250 | self.__select_tab_from_barcode("products") 251 | self.products.process_barcode(barcode, frame=self.content_scroll_frame) 252 | else: 253 | self.uicommon.message_box(self.root, "Error", "Unknown Barcode") 254 | 255 | elif (Config.scanning_mode == 3): # parts mode 256 | if (code_type == "order"): 257 | self.uicommon.message_box(self.root, "Error", "Not a parts barcode") 258 | elif (code_type == "product"): 259 | self.uicommon.message_box(self.root, "Error", "Not a parts barcode") 260 | else: 261 | self.__select_tab_from_barcode("parts") 262 | self.parts.process_barcode(barcode, frame=self.content_scroll_frame) 263 | else: # orders mode 264 | self.uicommon.message_box(self.root, "Error", "Unknown System Mode") 265 | 266 | def __titlebar_update_event(self): 267 | # 268 | # Update the UI elements in the title bar 269 | # 270 | 271 | # update titlebar clock 272 | self.clock_label.config(text=datetime.now().strftime('%d/%m/%Y %H:%M:%S')) 273 | # get the wifi status 274 | wifi_strength = int(self.hardware.get_wifi_strength()) 275 | 276 | # update the wifi icon if the value has changed beyond the current range 277 | if (wifi_strength == 0) and (self.wifi_status != 0): 278 | self.wifi_status = 0 279 | self.wifi_image = ImageTk.PhotoImage(Image.open(self.system_path + "wifi0.bmp")) 280 | self.wifi_icon.config(image = self.wifi_image) 281 | elif (wifi_strength > 0) and (wifi_strength < 17) and (self.wifi_status != 1): 282 | self.wifi_status = 1 283 | self.wifi_image = ImageTk.PhotoImage(Image.open(self.system_path + "wifi1.bmp")) 284 | self.wifi_icon.config(image = self.wifi_image) 285 | elif (wifi_strength >= 17) and (wifi_strength < 35) and (self.wifi_status != 2): 286 | self.wifi_status = 2 287 | self.wifi_image = ImageTk.PhotoImage(Image.open(self.system_path + "wifi2.bmp")) 288 | self.wifi_icon.config(image = self.wifi_image) 289 | elif (wifi_strength >= 35) and (wifi_strength < 52) and (self.wifi_status != 3): 290 | self.wifi_status = 3 291 | self.wifi_image = ImageTk.PhotoImage(Image.open(self.system_path + "wifi3.bmp")) 292 | self.wifi_icon.config(image = self.wifi_image) 293 | elif (wifi_strength >= 52) and (self.wifi_status != 4): 294 | self.wifi_status = 4 295 | self.wifi_image = ImageTk.PhotoImage(Image.open(self.system_path + "wifi4.bmp")) 296 | self.wifi_icon.config(image = self.wifi_image) 297 | 298 | # get the power status 299 | current_power_level = self.hardware.get_battery_level() 300 | s = str(current_power_level) + "%" 301 | self.power_label.config(text=s) 302 | int_current_power_level = int(int(current_power_level) / 10) 303 | if self.battery_status != int_current_power_level: 304 | self.battery_status = int_current_power_level 305 | self.battery_image = ImageTk.PhotoImage(Image.open(self.system_path + "battery" + str(self.battery_status) + ".bmp")) 306 | self.power_icon.config(image = self.battery_image) 307 | 308 | # reset the timer to trigger in 1 second 309 | self.root.after(1000, self.__titlebar_update_event) 310 | 311 | #region touch scroll functions 312 | 313 | def __scroll_start(self, event): 314 | # 315 | # Start the scroll event 316 | # 317 | self.is_scrolling = True 318 | self.cursor_start_position = self.root.winfo_pointery() 319 | self.frame_start_position = self.content_scroll_frame.winfo_y() 320 | self.click_start_time = datetime.now() 321 | threading.Timer(0.01, self.__scroll_event).start() 322 | return 323 | 324 | def __scroll_end(self, event): 325 | # 326 | # End the scroll event 327 | # 328 | self.is_scrolling = False 329 | 330 | def __scroll_event(self): 331 | # 332 | # Update the scroll frame position based on the touch location 333 | # 334 | if (self.is_scrolling): 335 | ypos = (self.root.winfo_pointery() - self.cursor_start_position) + self.frame_start_position 336 | max = 0 - self.content_scroll_frame.winfo_height() + self.content_frame.winfo_height() 337 | if (ypos < 0) and (ypos > max): 338 | self.content_scroll_frame.place(y = ypos) 339 | if (ypos > 0): 340 | self.content_scroll_frame.place(y = 0) 341 | threading.Timer(0.03, self.__scroll_event).start() 342 | 343 | 344 | 345 | #endregion 346 | 347 | #region tab bar events 348 | 349 | def __select_tab_from_barcode(self, section): 350 | # 351 | # Updates the tab bar from the barcode scan function 352 | # 353 | 354 | if (section == "orders") and (self.current_tab != "orders"): 355 | self.__orders_tab_clicked(from_barcode = True) 356 | elif (section == "products") and (self.current_tab != "products"): 357 | self.__products_tab_clicked(from_barcode = True) 358 | elif (section == "parts") and (self.current_tab != "parts"): 359 | self.__parts_tab_clicked(from_barcode = True) 360 | 361 | 362 | def __orders_tab_clicked(self, from_barcode = False): 363 | # 364 | # Orders tab click event 365 | # 366 | 367 | self.current_tab = "orders" 368 | 369 | # update the images in the tab bar to show the selected tab 370 | self.ordersicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-orders-selected.bmp")) 371 | self.orders_button.config(image = self.ordersicon) 372 | 373 | self.productsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-products.bmp")) 374 | self.products_button.config(image = self.productsicon) 375 | 376 | self.partsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-parts.bmp")) 377 | self.parts_button.config(image = self.partsicon) 378 | 379 | # clear any content from the content_scroll_frame and get a list of the current orders 380 | self.uicommon.clear_frame(self.content_scroll_frame) 381 | if (not from_barcode): 382 | self.orders.orders_list(self.content_scroll_frame) 383 | 384 | return() 385 | 386 | 387 | def __products_tab_clicked(self, from_barcode = False): 388 | # 389 | # Products tab click events 390 | # 391 | 392 | self.current_tab = "products" 393 | 394 | # update the images in the tab bar to show the selected tab 395 | self.ordersicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-orders.bmp")) 396 | self.orders_button.config(image = self.ordersicon) 397 | 398 | self.productsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-products-selected.bmp")) 399 | self.products_button.config(image = self.productsicon) 400 | 401 | self.partsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-parts.bmp")) 402 | self.parts_button.config(image = self.partsicon) 403 | 404 | # clear any content from the content_scroll_frame and get a list of the products 405 | self.uicommon.clear_frame(self.content_scroll_frame) 406 | if (not from_barcode): 407 | self.products.products_list(self.content_scroll_frame) 408 | 409 | return() 410 | 411 | 412 | def __parts_tab_clicked(self, from_barcode = False): 413 | # 414 | # Parts tab click event 415 | # 416 | 417 | self.current_tab = "parts" 418 | 419 | # update the images in the tab bar to show the selected tab 420 | self.ordersicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-orders.bmp")) 421 | self.orders_button.config(image = self.ordersicon) 422 | 423 | self.productsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-products.bmp")) 424 | self.products_button.config(image = self.productsicon) 425 | 426 | self.partsicon = ImageTk.PhotoImage(Image.open(self.system_path + "tabbar-parts-selected.bmp")) 427 | self.parts_button.config(image = self.partsicon) 428 | 429 | # clear any content from the content_scroll_frame and get a list of the parts 430 | self.uicommon.clear_frame(self.content_scroll_frame) 431 | if (not from_barcode): 432 | self.parts.parts_list(self.content_scroll_frame) 433 | 434 | return() 435 | 436 | 437 | def __power_tab_clicked(self): 438 | # 439 | # Power tab click events: show the overlay for shutdown, restart, exit... 440 | # 441 | 442 | # create overlay frame 443 | self.power_dialog = tk.Frame(self.root, width=320, height=480, background="grey") 444 | self.power_dialog.place(x=0, y=0, width=320, height=480) 445 | 446 | # title 447 | power_title = tk.Label(self.power_dialog, text="Options", font="DejaVuSans 36 normal", background="grey", foreground="white") 448 | power_title.pack(fill=tk.X, expand=1) 449 | 450 | # shutdown button 451 | power_shutdown_button = tk.Button(self.power_dialog, text="Shutdown", height=2, font="DejaVuSans 32 normal", command=self.hardware.shutdown) 452 | power_shutdown_button.pack(fill=tk.X) 453 | 454 | # restart button 455 | power_restart_button = tk.Button(self.power_dialog, text="Restart", height=2,font="DejaVuSans 32 normal", command=self.hardware.restart) 456 | power_restart_button.pack(fill=tk.X) 457 | # exit application button 458 | power_exit_button = tk.Button(self.power_dialog, text="Exit Application", height=2,font="DejaVuSans 32 normal", command=exit) 459 | power_exit_button.pack(fill=tk.X) 460 | # cancel button 461 | power_cancel_button = tk.Button(self.power_dialog, text="Cancel", height=2,font="DejaVuSans 32 normal", command=self.close_power_dialog) 462 | power_cancel_button.pack(fill=tk.BOTH) 463 | 464 | return() 465 | 466 | def close_power_dialog(self): 467 | self.power_dialog.place_forget() 468 | self.power_dialog.destroy() 469 | 470 | #endregion 471 | 472 | 473 | -------------------------------------------------------------------------------- /ScannerApp/lib/UICommon.py: -------------------------------------------------------------------------------- 1 | # tkinter GUI library 2 | 3 | import tkinter as tk 4 | from tkinter import font 5 | 6 | # date time library used for clock and time durations 7 | from datetime import datetime, timedelta 8 | 9 | # OS library for accessing os functions 10 | import os 11 | 12 | # Config global variables 13 | from lib import Config 14 | 15 | class UICommon(): 16 | # common images used with the application 17 | 18 | system_path = "" 19 | 20 | # Common functions related to the UI 21 | 22 | click_start_time = datetime.now() 23 | cursor_start_position = 0 24 | root_frame = None 25 | numeric_keypad_frame = None 26 | numeric_keypad_value = "" 27 | numeric_keypad_display = None 28 | numeric_keypad_target = None 29 | 30 | 31 | def __init__(self, root = None): 32 | self.root_frame = root 33 | self.system_path = os.path.dirname(os.path.abspath(__file__)).replace("lib", "") + "graphics/" 34 | 35 | 36 | 37 | def clear_frame(self, frame): 38 | # 39 | # clears all of the children from a frame 40 | # 41 | for widget in frame.winfo_children(): 42 | widget.destroy() 43 | 44 | def table(self, master, title, content, target=None, backgroundcolour="White", foregroundcolour="black", bordercolour="grey", borderwidth=1, fontstyle="DejaVuSans 18 normal"): 45 | # creates a table from a 2 dimensional array. 46 | # master: = this represents the parent window 47 | # content: a 2 dimensional array containing the table contents 48 | # First column in the array must be the row id which is returned on a click event. This will not be displayed in the table 49 | index = 0 50 | for i in range(len(content)): #Rows 51 | for j in range(len(content[i])): 52 | if j==0: 53 | index = content[i][j] 54 | else: 55 | b = tk.Label(master, text=str(content[i][j]), background=backgroundcolour, foreground=foregroundcolour,padx=5, pady=10, highlightthickness=borderwidth, highlightbackground=bordercolour, font=fontstyle) 56 | if (target is not None): 57 | b.bind('', self.__row_pressed) 58 | b.bind('', lambda event, arg1=index, arg2=target: self.__row_released(event, arg1, arg2)) 59 | b.grid(row=i, column=j-1, sticky=tk.N+tk.S+tk.E+tk.W) 60 | return 61 | 62 | def __row_pressed(self, event): 63 | # 64 | # detects a press event by starting a timer and saving the current position 65 | # 66 | self.click_start_time = datetime.now() 67 | self.cursor_start_position = self.root_frame.winfo_pointery() 68 | 69 | def __row_released(self, event, index, target): 70 | # 71 | # check if the mouse has been moved more than 5 pixels 72 | # 73 | x = self.root_frame.winfo_pointery() - self.cursor_start_position 74 | if (x > -5) and (x < 5): # mouse has moved less than 5 pixels so detect it as a click 75 | # check the amount of time that has passed since the press started 76 | duration = datetime.now() - self.click_start_time 77 | if (duration < timedelta(seconds=1)): # less than 1 second has passed so detect as click instead of hold 78 | target(index) 79 | 80 | def table_column_weighs(self, target, columns, minsize=None): 81 | # 82 | # set the column weights and minimum size for a grid 83 | # 84 | for i in range(len(columns)): 85 | if (minsize == None): 86 | target.columnconfigure(i, weight= columns[i]) 87 | else: 88 | target.columnconfigure(i, weight= columns[i], minsize=minsize[i]) 89 | 90 | def table_cell(self, cellframe = None, celltext = None, image=None, wraplength=0, justify=tk.LEFT, row=0, column=0, rowspan=1, columnspan=1, sticky=tk.N+tk.S+tk.E+tk.W): 91 | # 92 | # create a table cell frame and label and add it to a grid 93 | # 94 | cell = tk.Frame(cellframe, bg=Config.style_row_background_colour, highlightthickness=Config.style_row_border_width, highlightbackground=Config.style_row_border_colour) 95 | label = tk.Label(cell, text=celltext,wraplength=wraplength, image=image, justify=justify,background=Config.style_row_background_colour, foreground=Config.style_row_foreground_colour, padx=5, pady=10, font=Config.style_row_font) 96 | label.pack(side=tk.LEFT, fill=tk.Y) 97 | cell.grid(row=row, column=column, sticky=sticky, rowspan=rowspan, columnspan=columnspan) 98 | return cell 99 | 100 | def table_title(self, cellframe, celltext, wraplength=0, justify=tk.LEFT, row=0, column=0, rowspan=1, columnspan=1, sticky=tk.N+tk.S+tk.E+tk.W): 101 | # 102 | # create a table title frame and label and add it to a grid 103 | # 104 | cell = tk.Frame(cellframe, bg=Config.style_header_background_colour, highlightthickness=Config.style_header_border_width, highlightbackground=Config.style_header_border_colour) 105 | label = tk.Label(cell, text=celltext,wraplength=wraplength, justify=justify,background=Config.style_header_background_colour, foreground=Config.style_header_foreground_colour, padx=5, pady=10, font=Config.style_row_font) 106 | label.pack(side=tk.LEFT, fill=tk.Y) 107 | cell.grid(row=row, column=column, sticky=sticky, rowspan=rowspan, columnspan=columnspan) 108 | return cell 109 | 110 | def bind_children(self, widget, event, callback, add=""): 111 | # 112 | # bind the event to a widget and all of its children 113 | # 114 | widget.bind(event, callback, add) 115 | 116 | for child in widget.children.values(): 117 | self.bind_children(child, event, callback) 118 | 119 | def barcode_type(self, barcode): 120 | # 121 | # parse the barcode to check whether it is an order, product or unknown part 122 | # 123 | if (str(barcode).startswith("99")): # barcode is an order 124 | return("order") 125 | elif (str(barcode).startswith("742678787")): # barcode is a product 126 | return("product") 127 | else: # barcode is not an internal code. 128 | return("unknown") 129 | 130 | def message_box(self, master, title, content, target=None): 131 | # 132 | # replaces the standard tkinter message box 133 | # 134 | box = tk.Frame(master, highlightbackground="grey", highlightcolor="grey", highlightthickness=1, background="#FFFFFF") 135 | tk.Label(box, text=title, font="DejaVuSans 22 bold", background="#FFFFFF", pady=20).pack() 136 | tk.Label(box, text=content, font="DejaVuSans 22 normal", background="#FFFFFF", pady=30).pack() 137 | tk.Button(box, text="Close", font="DejaVuSans 28 normal",pady=20, command=lambda arg1=box, arg2=target: self.__message_box_close(arg1, arg2)).pack(side = tk.BOTTOM, fill=tk.X) 138 | box.place(x = 20, y=100, width=280) 139 | 140 | def __message_box_close(self, master, target): 141 | # 142 | # Closes and destroys the message box frame and calls a target function if there is one 143 | # 144 | master.place_forget() 145 | master.destroy() 146 | if (target != None): 147 | target() 148 | 149 | def numeric_keypad(self, master=None, target=None, title="Quanitity", value=None): 150 | # 151 | # draws a numeric keypad on the display 152 | # 153 | 154 | # save the return target 155 | self.numeric_keypad_target = target 156 | 157 | if (value == None): 158 | self.numeric_keypad_value = "" 159 | else: 160 | self.numeric_keypad_value = str(value) 161 | 162 | # master frame 163 | self.numeric_keypad_frame = tk.Frame(master, width=320, height=480, background="#000000") 164 | self.numeric_keypad_frame.place(x=0, y=0, width=320, height=480) 165 | # title 166 | tk.Label(self.numeric_keypad_frame, text=title, font="DejaVuSans 22 normal", background="#000000", foreground="#FFFFFF", pady=5).pack(side = tk.TOP,fill=tk.X) 167 | # display label 168 | self.numeric_keypad_display = tk.Label(self.numeric_keypad_frame, text=self.numeric_keypad_value, font="DejaVuSans 50 normal", background="#FFFFFF", pady=10) 169 | self.numeric_keypad_display.pack(side = tk.TOP,fill=tk.X) 170 | # number grid 171 | numbergrid = tk.Frame(self.numeric_keypad_frame, width=320, height=320) 172 | x = 0 173 | y = 0 174 | 175 | for i in range(1, 10): 176 | label = tk.Label(numbergrid, text=str(10-i), font="DejaVuSans 50 normal", background="#333333", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000", pady=20) 177 | self.bind_children(label, '', lambda event, arg1=10-i: self.__numeric_keypad_update(arg1)) 178 | label.grid(row=y, column=x, sticky=tk.N+tk.S+tk.E+tk.W) 179 | x+=1 180 | if (x >= 3): 181 | y+=1 182 | x=0 183 | 184 | number0 = tk.Label(numbergrid, text="0", font="DejaVuSans 50 normal", background="#333333", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000") 185 | self.bind_children(number0, '', lambda event, arg1=0: self.__numeric_keypad_update(arg1)) 186 | number0.grid(row=3, column=1, sticky=tk.N+tk.S+tk.E+tk.W) 187 | 188 | delete = tk.Label(numbergrid, text="<", font="DejaVuSans 50 normal", background="#333333", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000", pady=20) 189 | self.bind_children(delete, '', self.__numeric_keypad_delete) 190 | delete.grid(row=3, column=0, sticky=tk.N+tk.S+tk.E+tk.W) 191 | 192 | decimal = tk.Label(numbergrid, text=".", font="DejaVuSans 50 normal", background="#333333", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000") 193 | self.bind_children(decimal, '', lambda event, arg1=".": self.__numeric_keypad_update(arg1)) 194 | decimal.grid(row=3, column=2, sticky=tk.N+tk.S+tk.E+tk.W) 195 | 196 | save = tk.Label(numbergrid, text="Enter", font="DejaVuSans 20 normal", background="#29a329", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000") 197 | self.bind_children(save, '', lambda event, arg1=0: self.__numeric_keypad_save(arg1)) 198 | save.grid(row=1, column=3, sticky=tk.N+tk.S+tk.E+tk.W, rowspan=3) 199 | 200 | cancel = tk.Label(numbergrid, text="Cancel", font="DejaVuSans 20 normal", background="#b30000", foreground="#FFFFFF", highlightthickness=1, highlightbackground="#000000") 201 | self.bind_children(cancel, '', lambda event, arg1=0: self.__numeric_keypad_cancel(arg1)) 202 | cancel.grid(row=0, column=3, sticky=tk.N+tk.S+tk.E+tk.W) 203 | 204 | numbergrid.place(x=0, y=110, width=320, height=370) 205 | self.table_column_weighs(numbergrid, [1,1,1,1], minsize=[78,78,78,78]) 206 | 207 | 208 | def __numeric_keypad_update(self, value): 209 | # 210 | # append the selelected number or character to the keypad string 211 | # 212 | if (value == "."): # check if a decimal point already exists before adding one 213 | if (self.numeric_keypad_value.find(".")==-1): 214 | self.numeric_keypad_value += "." 215 | else: 216 | if (self.numeric_keypad_value == ""): 217 | if (value > 0): 218 | self.numeric_keypad_value = str(value) 219 | 220 | else: 221 | self.numeric_keypad_value += str(value) 222 | self.numeric_keypad_display.configure(text=str(self.numeric_keypad_value)) 223 | 224 | def __numeric_keypad_delete(self, value): 225 | # 226 | # remove the last character from the keypad value 227 | # 228 | if (len(self.numeric_keypad_value) > 0): 229 | self.numeric_keypad_value = self.numeric_keypad_value[:-1] 230 | self.numeric_keypad_display.configure(text=str(self.numeric_keypad_value)) 231 | return 232 | 233 | def __numeric_keypad_save(self, value): 234 | # 235 | # call the target function and return the value in float or int depending on a decimal point 236 | # 237 | 238 | # clear the frame 239 | if (self.numeric_keypad_frame != None): 240 | self.numeric_keypad_frame.destroy() 241 | 242 | 243 | if (self.numeric_keypad_target != None): 244 | # convert into an int or float and return the value 245 | if (self.numeric_keypad_value.find(".")==-1): 246 | self.numeric_keypad_target(int(self.numeric_keypad_value)) 247 | else: 248 | self.numeric_keypad_target(float(self.numeric_keypad_value)) 249 | 250 | return 251 | 252 | 253 | def __numeric_keypad_cancel(self, value): 254 | # 255 | # clear the contents of numeric_keypad_value and remove the frame 256 | # 257 | self.numeric_keypad_value = "" 258 | if (self.numeric_keypad_frame != None): 259 | self.numeric_keypad_frame.destroy() 260 | 261 | if (self.numeric_keypad_target != None): 262 | self.numeric_keypad_target(None) 263 | 264 | return 265 | -------------------------------------------------------------------------------- /ScannerApp/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/ScannerApp/lib/__init__.py -------------------------------------------------------------------------------- /Software-Flowchart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/briandorey/RaspberryPiBarcodeScanner/562c65b8c05305f055fd16578ffc5baacfde9533/Software-Flowchart.pdf -------------------------------------------------------------------------------- /bom.csv: -------------------------------------------------------------------------------- 1 | "RefDes","Value","Name","Quantity","Pattern","Description" 2 | "B1","","Battery Pack","1","Barcode Scanner Battery","" 3 | "C1","100nF","","1","CAP_0603","" 4 | "C2","22nF","C1608X7R1H223K","1","CAP_0603","" 5 | "C3","100nF","","1","CAP_0603","" 6 | "C4","100nF","","1","CAP_0603","" 7 | "C5","330nF","","1","CAP_0603","" 8 | "C6","22nF","C1608X7R1H223K","1","CAP_0603","" 9 | "C8","100uF","C1210C107M8PACTU","1","CAP_1210","" 10 | "C9","10uF","","1","CAP_0805","" 11 | "C11","100nF","CAP_0603","1","CAP_0603","" 12 | "D1","","1N4148W-7-F","1","SOD-123","Diode" 13 | "F1","","MF-MSMF075/24-2","1","CAP_1812","Fuse" 14 | "J1","","614104150121","1","614104150121","" 15 | "LS1","","BUZZER","1","HDR-2x1T/2.54x2.54/3x5","Buzzer" 16 | "Q1","","SI1424EDH-T1-GE3","1","SOT363","MOSFET " 17 | "Q5","","BCV47","1","SOT23","Bipolar NPN" 18 | "R1","2K2","RES_FIXED","1","RES_0603","Fixed Resistor" 19 | "R2","2K2","RES_FIXED","1","RES_0603","Fixed Resistor" 20 | "R3","2K2","RES_FIXED","1","RES_0603","Fixed Resistor" 21 | "R4","100R","RES_FIXED","1","RES_0603","Fixed Resistor" 22 | "R5","160R","RES_FIXED","1","RES_0603","Fixed Resistor" 23 | "R6","260R","RES_FIXED","1","RES_0603","Fixed Resistor" 24 | "R7","1K","RES_FIXED","1","RES_0603","Fixed Resistor" 25 | "R8","32K4","RES_FIXED","1","RES_0603","Fixed Resistor" 26 | "R9","39K","RES_FIXED","1","RES_0603","Fixed Resistor" 27 | "R10","100R","RES_FIXED","1","RES_0603","Fixed Resistor" 28 | "R11","5K36","RES_FIXED","1","RES_0603","Fixed Resistor" 29 | "R12","1K02","RES_FIXED","1","RES_0603","Fixed Resistor" 30 | "R13","10K","RES_FIXED","1","RES_0603","Fixed Resistor" 31 | "R14","1K","RES_FIXED","1","RES_0603","Fixed Resistor" 32 | "R15","10K","RES_FIXED","1","RES_0603","Fixed Resistor" 33 | "U1","","Raspberry Pi Zero","1","Raspberry Pi Zero","" 34 | "U2","","LTC2943-1","1","DFN-8/3x3x0.5","" 35 | "U3","","BQ29209","1","VSON 8","" 36 | "U4","","LMZ12002","1","LMZ12002","" 37 | "U5","","Laser Scanner","1","FH12-15S-0.5SH(55)","" 38 | "U6","","74HC4050","1","SOIC-16/150mil","" 39 | -------------------------------------------------------------------------------- /front lens.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $ACADVER 7 | 1 8 | AC1012 9 | 9 10 | $DWGCODEPAGE 11 | 3 12 | ansi_1252 13 | 9 14 | $INSBASE 15 | 10 16 | 0.0 17 | 20 18 | 0.0 19 | 30 20 | 0.0 21 | 9 22 | $EXTMIN 23 | 10 24 | 1.000000000000000E+20 25 | 20 26 | 1.000000000000000E+20 27 | 30 28 | 1.000000000000000E+20 29 | 9 30 | $EXTMAX 31 | 10 32 | -1.000000000000000E+20 33 | 20 34 | -1.000000000000000E+20 35 | 30 36 | -1.000000000000000E+20 37 | 9 38 | $LIMMIN 39 | 10 40 | 0.0 41 | 20 42 | 0.0 43 | 9 44 | $LIMMAX 45 | 10 46 | 12.0 47 | 20 48 | 9.0 49 | 9 50 | $ORTHOMODE 51 | 70 52 | 0 53 | 9 54 | $REGENMODE 55 | 70 56 | 1 57 | 9 58 | $FILLMODE 59 | 70 60 | 1 61 | 9 62 | $QTEXTMODE 63 | 70 64 | 0 65 | 9 66 | $MIRRTEXT 67 | 70 68 | 1 69 | 9 70 | $DRAGMODE 71 | 70 72 | 2 73 | 9 74 | $LTSCALE 75 | 40 76 | 1.0 77 | 9 78 | $OSMODE 79 | 70 80 | 37 81 | 9 82 | $ATTMODE 83 | 70 84 | 1 85 | 9 86 | $TEXTSIZE 87 | 40 88 | 0.2 89 | 9 90 | $TRACEWID 91 | 40 92 | 0.05 93 | 9 94 | $TEXTSTYLE 95 | 7 96 | STANDARD 97 | 9 98 | $CLAYER 99 | 8 100 | 0 101 | 9 102 | $CELTYPE 103 | 6 104 | BYLAYER 105 | 9 106 | $CECOLOR 107 | 62 108 | 256 109 | 9 110 | $CELTSCALE 111 | 40 112 | 1.0 113 | 9 114 | $DELOBJ 115 | 70 116 | 1 117 | 9 118 | $DISPSILH 119 | 70 120 | 0 121 | 9 122 | $DIMSCALE 123 | 40 124 | 1.0 125 | 9 126 | $DIMASZ 127 | 40 128 | 0.18 129 | 9 130 | $DIMEXO 131 | 40 132 | 0.0625 133 | 9 134 | $DIMDLI 135 | 40 136 | 0.38 137 | 9 138 | $DIMRND 139 | 40 140 | 0.0 141 | 9 142 | $DIMDLE 143 | 40 144 | 0.0 145 | 9 146 | $DIMEXE 147 | 40 148 | 0.18 149 | 9 150 | $DIMTP 151 | 40 152 | 0.0 153 | 9 154 | $DIMTM 155 | 40 156 | 0.0 157 | 9 158 | $DIMTXT 159 | 40 160 | 0.18 161 | 9 162 | $DIMCEN 163 | 40 164 | 0.09 165 | 9 166 | $DIMTSZ 167 | 40 168 | 0.0 169 | 9 170 | $DIMTOL 171 | 70 172 | 0 173 | 9 174 | $DIMLIM 175 | 70 176 | 0 177 | 9 178 | $DIMTIH 179 | 70 180 | 1 181 | 9 182 | $DIMTOH 183 | 70 184 | 1 185 | 9 186 | $DIMSE1 187 | 70 188 | 0 189 | 9 190 | $DIMSE2 191 | 70 192 | 0 193 | 9 194 | $DIMTAD 195 | 70 196 | 0 197 | 9 198 | $DIMZIN 199 | 70 200 | 0 201 | 9 202 | $DIMBLK 203 | 1 204 | 205 | 9 206 | $DIMASO 207 | 70 208 | 1 209 | 9 210 | $DIMSHO 211 | 70 212 | 1 213 | 9 214 | $DIMPOST 215 | 1 216 | 217 | 9 218 | $DIMAPOST 219 | 1 220 | 221 | 9 222 | $DIMALT 223 | 70 224 | 0 225 | 9 226 | $DIMALTD 227 | 70 228 | 2 229 | 9 230 | $DIMALTF 231 | 40 232 | 25.4 233 | 9 234 | $DIMLFAC 235 | 40 236 | 1.0 237 | 9 238 | $DIMTOFL 239 | 70 240 | 0 241 | 9 242 | $DIMTVP 243 | 40 244 | 0.0 245 | 9 246 | $DIMTIX 247 | 70 248 | 0 249 | 9 250 | $DIMSOXD 251 | 70 252 | 0 253 | 9 254 | $DIMSAH 255 | 70 256 | 0 257 | 9 258 | $DIMBLK1 259 | 1 260 | 261 | 9 262 | $DIMBLK2 263 | 1 264 | 265 | 9 266 | $DIMSTYLE 267 | 2 268 | STANDARD 269 | 9 270 | $DIMCLRD 271 | 70 272 | 0 273 | 9 274 | $DIMCLRE 275 | 70 276 | 0 277 | 9 278 | $DIMCLRT 279 | 70 280 | 0 281 | 9 282 | $DIMTFAC 283 | 40 284 | 1.0 285 | 9 286 | $DIMGAP 287 | 40 288 | 0.09 289 | 9 290 | $DIMJUST 291 | 70 292 | 0 293 | 9 294 | $DIMSD1 295 | 70 296 | 0 297 | 9 298 | $DIMSD2 299 | 70 300 | 0 301 | 9 302 | $DIMTOLJ 303 | 70 304 | 1 305 | 9 306 | $DIMTZIN 307 | 70 308 | 0 309 | 9 310 | $DIMALTZ 311 | 70 312 | 0 313 | 9 314 | $DIMALTTZ 315 | 70 316 | 0 317 | 9 318 | $DIMFIT 319 | 70 320 | 3 321 | 9 322 | $DIMUPT 323 | 70 324 | 0 325 | 9 326 | $DIMUNIT 327 | 70 328 | 2 329 | 9 330 | $DIMDEC 331 | 70 332 | 4 333 | 9 334 | $DIMTDEC 335 | 70 336 | 4 337 | 9 338 | $DIMALTU 339 | 70 340 | 2 341 | 9 342 | $DIMALTTD 343 | 70 344 | 2 345 | 9 346 | $DIMTXSTY 347 | 7 348 | STANDARD 349 | 9 350 | $DIMAUNIT 351 | 70 352 | 0 353 | 9 354 | $LUNITS 355 | 70 356 | 2 357 | 9 358 | $LUPREC 359 | 70 360 | 4 361 | 9 362 | $SKETCHINC 363 | 40 364 | 0.1 365 | 9 366 | $FILLETRAD 367 | 40 368 | 0.5 369 | 9 370 | $AUNITS 371 | 70 372 | 0 373 | 9 374 | $AUPREC 375 | 70 376 | 0 377 | 9 378 | $MENU 379 | 1 380 | . 381 | 9 382 | $ELEVATION 383 | 40 384 | 0.0 385 | 9 386 | $PELEVATION 387 | 40 388 | 0.0 389 | 9 390 | $THICKNESS 391 | 40 392 | 0.0 393 | 9 394 | $LIMCHECK 395 | 70 396 | 0 397 | 9 398 | $CHAMFERA 399 | 40 400 | 0.5 401 | 9 402 | $CHAMFERB 403 | 40 404 | 0.5 405 | 9 406 | $CHAMFERC 407 | 40 408 | 1.0 409 | 9 410 | $CHAMFERD 411 | 40 412 | 0.0 413 | 9 414 | $SKPOLY 415 | 70 416 | 0 417 | 9 418 | $TDCREATE 419 | 40 420 | 2457907.5520125 421 | 9 422 | $TDUPDATE 423 | 40 424 | 2457907.552012512 425 | 9 426 | $TDINDWG 427 | 40 428 | 0.0000000116 429 | 9 430 | $TDUSRTIMER 431 | 40 432 | 0.0000000116 433 | 9 434 | $USRTIMER 435 | 70 436 | 1 437 | 9 438 | $ANGBASE 439 | 50 440 | 0.0 441 | 9 442 | $ANGDIR 443 | 70 444 | 0 445 | 9 446 | $PDMODE 447 | 70 448 | 0 449 | 9 450 | $PDSIZE 451 | 40 452 | 0.0 453 | 9 454 | $PLINEWID 455 | 40 456 | 0.0 457 | 9 458 | $COORDS 459 | 70 460 | 1 461 | 9 462 | $SPLFRAME 463 | 70 464 | 0 465 | 9 466 | $SPLINETYPE 467 | 70 468 | 6 469 | 9 470 | $SPLINESEGS 471 | 70 472 | 8 473 | 9 474 | $ATTDIA 475 | 70 476 | 0 477 | 9 478 | $ATTREQ 479 | 70 480 | 1 481 | 9 482 | $HANDLING 483 | 70 484 | 1 485 | 9 486 | $HANDSEED 487 | 5 488 | 3F 489 | 9 490 | $SURFTAB1 491 | 70 492 | 6 493 | 9 494 | $SURFTAB2 495 | 70 496 | 6 497 | 9 498 | $SURFTYPE 499 | 70 500 | 6 501 | 9 502 | $SURFU 503 | 70 504 | 6 505 | 9 506 | $SURFV 507 | 70 508 | 6 509 | 9 510 | $UCSNAME 511 | 2 512 | 513 | 9 514 | $UCSORG 515 | 10 516 | 0.0 517 | 20 518 | 0.0 519 | 30 520 | 0.0 521 | 9 522 | $UCSXDIR 523 | 10 524 | 1.0 525 | 20 526 | 0.0 527 | 30 528 | 0.0 529 | 9 530 | $UCSYDIR 531 | 10 532 | 0.0 533 | 20 534 | 1.0 535 | 30 536 | 0.0 537 | 9 538 | $PUCSNAME 539 | 2 540 | 541 | 9 542 | $PUCSORG 543 | 10 544 | 0.0 545 | 20 546 | 0.0 547 | 30 548 | 0.0 549 | 9 550 | $PUCSXDIR 551 | 10 552 | 1.0 553 | 20 554 | 0.0 555 | 30 556 | 0.0 557 | 9 558 | $PUCSYDIR 559 | 10 560 | 0.0 561 | 20 562 | 1.0 563 | 30 564 | 0.0 565 | 9 566 | $USERI1 567 | 70 568 | 0 569 | 9 570 | $USERI2 571 | 70 572 | 0 573 | 9 574 | $USERI3 575 | 70 576 | 0 577 | 9 578 | $USERI4 579 | 70 580 | 0 581 | 9 582 | $USERI5 583 | 70 584 | 0 585 | 9 586 | $USERR1 587 | 40 588 | 0.0 589 | 9 590 | $USERR2 591 | 40 592 | 0.0 593 | 9 594 | $USERR3 595 | 40 596 | 0.0 597 | 9 598 | $USERR4 599 | 40 600 | 0.0 601 | 9 602 | $USERR5 603 | 40 604 | 0.0 605 | 9 606 | $WORLDVIEW 607 | 70 608 | 1 609 | 9 610 | $SHADEDGE 611 | 70 612 | 3 613 | 9 614 | $SHADEDIF 615 | 70 616 | 70 617 | 9 618 | $TILEMODE 619 | 70 620 | 1 621 | 9 622 | $MAXACTVP 623 | 70 624 | 64 625 | 9 626 | $PINSBASE 627 | 10 628 | 0.0 629 | 20 630 | 0.0 631 | 30 632 | 0.0 633 | 9 634 | $PLIMCHECK 635 | 70 636 | 0 637 | 9 638 | $PEXTMIN 639 | 10 640 | 1.000000000000000E+20 641 | 20 642 | 1.000000000000000E+20 643 | 30 644 | 1.000000000000000E+20 645 | 9 646 | $PEXTMAX 647 | 10 648 | -1.000000000000000E+20 649 | 20 650 | -1.000000000000000E+20 651 | 30 652 | -1.000000000000000E+20 653 | 9 654 | $PLIMMIN 655 | 10 656 | 0.0 657 | 20 658 | 0.0 659 | 9 660 | $PLIMMAX 661 | 10 662 | 12.0 663 | 20 664 | 9.0 665 | 9 666 | $UNITMODE 667 | 70 668 | 0 669 | 9 670 | $VISRETAIN 671 | 70 672 | 1 673 | 9 674 | $PLINEGEN 675 | 70 676 | 0 677 | 9 678 | $PSLTSCALE 679 | 70 680 | 1 681 | 9 682 | $TREEDEPTH 683 | 70 684 | 3020 685 | 9 686 | $PICKSTYLE 687 | 70 688 | 1 689 | 9 690 | $CMLSTYLE 691 | 2 692 | STANDARD 693 | 9 694 | $CMLJUST 695 | 70 696 | 0 697 | 9 698 | $CMLSCALE 699 | 40 700 | 1.0 701 | 9 702 | $SAVEIMAGES 703 | 70 704 | 1 705 | 0 706 | ENDSEC 707 | 0 708 | SECTION 709 | 2 710 | CLASSES 711 | 0 712 | CLASS 713 | 1 714 | ACDBDICTIONARYWDFLT 715 | 2 716 | AcDbDictionaryWithDefault 717 | 3 718 | ObjectDBX Classes 719 | 90 720 | 32768 721 | 280 722 | 0 723 | 281 724 | 0 725 | 0 726 | CLASS 727 | 1 728 | VISUALSTYLE 729 | 2 730 | AcDbVisualStyle 731 | 3 732 | ObjectDBX Classes 733 | 90 734 | 4095 735 | 280 736 | 0 737 | 281 738 | 0 739 | 0 740 | CLASS 741 | 1 742 | XRECORD 743 | 2 744 | AcDbXrecord 745 | 3 746 | AutoCAD 2000 747 | 90 748 | 32768 749 | 280 750 | 0 751 | 281 752 | 0 753 | 0 754 | CLASS 755 | 1 756 | LWPOLYLINE 757 | 2 758 | AcDbPolyline 759 | 3 760 | AutoCAD 2000 761 | 90 762 | 32768 763 | 280 764 | 0 765 | 281 766 | 1 767 | 0 768 | CLASS 769 | 1 770 | HATCH 771 | 2 772 | AcDbHatch 773 | 3 774 | AutoCAD 2000 775 | 90 776 | 32768 777 | 280 778 | 0 779 | 281 780 | 1 781 | 0 782 | CLASS 783 | 1 784 | ACDBPLACEHOLDER 785 | 2 786 | AcDbPlaceHolder 787 | 3 788 | ObjectDBX Classes 789 | 90 790 | 0 791 | 280 792 | 0 793 | 281 794 | 0 795 | 0 796 | CLASS 797 | 1 798 | LAYOUT 799 | 2 800 | AcDbLayout 801 | 3 802 | ObjectDBX Classes 803 | 90 804 | 0 805 | 280 806 | 0 807 | 281 808 | 0 809 | 0 810 | ENDSEC 811 | 0 812 | SECTION 813 | 2 814 | TABLES 815 | 0 816 | TABLE 817 | 2 818 | VPORT 819 | 5 820 | 8 821 | 330 822 | 0 823 | 100 824 | AcDbSymbolTable 825 | 70 826 | 1 827 | 0 828 | VPORT 829 | 5 830 | 29 831 | 330 832 | 8 833 | 100 834 | AcDbSymbolTableRecord 835 | 100 836 | AcDbViewportTableRecord 837 | 2 838 | *ACTIVE 839 | 70 840 | 0 841 | 10 842 | 0.0 843 | 20 844 | 0.0 845 | 11 846 | 1.0 847 | 21 848 | 1.0 849 | 12 850 | 0.0 851 | 22 852 | 0.0 853 | 13 854 | 0.0 855 | 23 856 | 0.0 857 | 14 858 | 0.5 859 | 24 860 | 0.5 861 | 15 862 | 0.5 863 | 25 864 | 0.5 865 | 16 866 | 0.0 867 | 26 868 | 0.0 869 | 36 870 | 1.0 871 | 17 872 | 105.0008259828644 873 | 27 874 | -148.4999796178229 875 | 37 876 | 0.0 877 | 40 878 | 296.9999592356459 879 | 41 880 | 0.7070763662937379 881 | 42 882 | 50.0 883 | 43 884 | 0.0 885 | 44 886 | 0.0 887 | 50 888 | 0.0 889 | 51 890 | 0.0 891 | 71 892 | 0 893 | 72 894 | 100 895 | 73 896 | 1 897 | 74 898 | 3 899 | 75 900 | 0 901 | 76 902 | 0 903 | 77 904 | 0 905 | 78 906 | 0 907 | 0 908 | ENDTAB 909 | 0 910 | TABLE 911 | 2 912 | LTYPE 913 | 5 914 | 5 915 | 330 916 | 0 917 | 100 918 | AcDbSymbolTable 919 | 70 920 | 1 921 | 0 922 | LTYPE 923 | 5 924 | 14 925 | 330 926 | 5 927 | 100 928 | AcDbSymbolTableRecord 929 | 100 930 | AcDbLinetypeTableRecord 931 | 2 932 | BYBLOCK 933 | 70 934 | 0 935 | 3 936 | 937 | 72 938 | 65 939 | 73 940 | 0 941 | 40 942 | 0.0 943 | 0 944 | LTYPE 945 | 5 946 | 15 947 | 330 948 | 5 949 | 100 950 | AcDbSymbolTableRecord 951 | 100 952 | AcDbLinetypeTableRecord 953 | 2 954 | BYLAYER 955 | 70 956 | 0 957 | 3 958 | 959 | 72 960 | 65 961 | 73 962 | 0 963 | 40 964 | 0.0 965 | 0 966 | LTYPE 967 | 5 968 | 16 969 | 330 970 | 5 971 | 100 972 | AcDbSymbolTableRecord 973 | 100 974 | AcDbLinetypeTableRecord 975 | 2 976 | CONTINUOUS 977 | 70 978 | 0 979 | 3 980 | Solid line 981 | 72 982 | 65 983 | 73 984 | 0 985 | 40 986 | 0.0 987 | 0 988 | ENDTAB 989 | 0 990 | TABLE 991 | 2 992 | LAYER 993 | 5 994 | 2 995 | 330 996 | 0 997 | 100 998 | AcDbSymbolTable 999 | 70 1000 | 2 1001 | 0 1002 | LAYER 1003 | 5 1004 | 10 1005 | 330 1006 | 2 1007 | 100 1008 | AcDbSymbolTableRecord 1009 | 100 1010 | AcDbLayerTableRecord 1011 | 2 1012 | 0 1013 | 70 1014 | 0 1015 | 62 1016 | 7 1017 | 6 1018 | CONTINUOUS 1019 | 0 1020 | LAYER 1021 | 5 1022 | 3B 1023 | 330 1024 | 2 1025 | 100 1026 | AcDbSymbolTableRecord 1027 | 100 1028 | AcDbLayerTableRecord 1029 | 2 1030 | LAYER_1 1031 | 70 1032 | 0 1033 | 62 1034 | 7 1035 | 6 1036 | CONTINUOUS 1037 | 0 1038 | ENDTAB 1039 | 0 1040 | TABLE 1041 | 2 1042 | STYLE 1043 | 5 1044 | 3 1045 | 330 1046 | 0 1047 | 100 1048 | AcDbSymbolTable 1049 | 70 1050 | 1 1051 | 0 1052 | STYLE 1053 | 5 1054 | 11 1055 | 330 1056 | 3 1057 | 100 1058 | AcDbSymbolTableRecord 1059 | 100 1060 | AcDbTextStyleTableRecord 1061 | 2 1062 | STANDARD 1063 | 70 1064 | 0 1065 | 40 1066 | 0.0 1067 | 41 1068 | 1.0 1069 | 50 1070 | 0.0 1071 | 71 1072 | 0 1073 | 42 1074 | 0.2 1075 | 3 1076 | txt 1077 | 4 1078 | 1079 | 0 1080 | ENDTAB 1081 | 0 1082 | TABLE 1083 | 2 1084 | VIEW 1085 | 5 1086 | 6 1087 | 330 1088 | 0 1089 | 100 1090 | AcDbSymbolTable 1091 | 70 1092 | 0 1093 | 0 1094 | ENDTAB 1095 | 0 1096 | TABLE 1097 | 2 1098 | UCS 1099 | 5 1100 | 7 1101 | 330 1102 | 0 1103 | 100 1104 | AcDbSymbolTable 1105 | 70 1106 | 0 1107 | 0 1108 | ENDTAB 1109 | 0 1110 | TABLE 1111 | 2 1112 | APPID 1113 | 5 1114 | 9 1115 | 330 1116 | 0 1117 | 100 1118 | AcDbSymbolTable 1119 | 70 1120 | 1 1121 | 0 1122 | APPID 1123 | 5 1124 | 12 1125 | 330 1126 | 9 1127 | 100 1128 | AcDbSymbolTableRecord 1129 | 100 1130 | AcDbRegAppTableRecord 1131 | 2 1132 | ACAD 1133 | 70 1134 | 0 1135 | 0 1136 | ENDTAB 1137 | 0 1138 | TABLE 1139 | 2 1140 | DIMSTYLE 1141 | 5 1142 | A 1143 | 330 1144 | 0 1145 | 100 1146 | AcDbSymbolTable 1147 | 70 1148 | 1 1149 | 0 1150 | DIMSTYLE 1151 | 105 1152 | 27 1153 | 330 1154 | A 1155 | 100 1156 | AcDbSymbolTableRecord 1157 | 100 1158 | AcDbDimStyleTableRecord 1159 | 2 1160 | STANDARD 1161 | 70 1162 | 0 1163 | 3 1164 | 1165 | 4 1166 | 1167 | 5 1168 | 1169 | 6 1170 | 1171 | 7 1172 | 1173 | 40 1174 | 1.0 1175 | 41 1176 | 0.18 1177 | 42 1178 | 0.0625 1179 | 43 1180 | 0.38 1181 | 44 1182 | 0.18 1183 | 45 1184 | 0.0 1185 | 46 1186 | 0.0 1187 | 47 1188 | 0.0 1189 | 48 1190 | 0.0 1191 | 140 1192 | 0.18 1193 | 141 1194 | 0.09 1195 | 142 1196 | 0.0 1197 | 143 1198 | 25.4 1199 | 144 1200 | 1.0 1201 | 145 1202 | 0.0 1203 | 146 1204 | 1.0 1205 | 147 1206 | 0.09 1207 | 71 1208 | 0 1209 | 72 1210 | 0 1211 | 73 1212 | 1 1213 | 74 1214 | 1 1215 | 75 1216 | 0 1217 | 76 1218 | 0 1219 | 77 1220 | 0 1221 | 78 1222 | 0 1223 | 170 1224 | 0 1225 | 171 1226 | 2 1227 | 172 1228 | 0 1229 | 173 1230 | 0 1231 | 174 1232 | 0 1233 | 175 1234 | 0 1235 | 176 1236 | 0 1237 | 177 1238 | 0 1239 | 178 1240 | 0 1241 | 270 1242 | 2 1243 | 271 1244 | 4 1245 | 272 1246 | 4 1247 | 273 1248 | 2 1249 | 274 1250 | 2 1251 | 340 1252 | 11 1253 | 275 1254 | 0 1255 | 280 1256 | 0 1257 | 281 1258 | 0 1259 | 282 1260 | 0 1261 | 283 1262 | 1 1263 | 284 1264 | 0 1265 | 285 1266 | 0 1267 | 286 1268 | 0 1269 | 287 1270 | 3 1271 | 288 1272 | 0 1273 | 0 1274 | ENDTAB 1275 | 0 1276 | TABLE 1277 | 2 1278 | BLOCK_RECORD 1279 | 5 1280 | 1 1281 | 330 1282 | 0 1283 | 100 1284 | AcDbSymbolTable 1285 | 70 1286 | 1 1287 | 0 1288 | BLOCK_RECORD 1289 | 5 1290 | 1F 1291 | 330 1292 | 1 1293 | 100 1294 | AcDbSymbolTableRecord 1295 | 100 1296 | AcDbBlockTableRecord 1297 | 2 1298 | *MODEL_SPACE 1299 | 0 1300 | BLOCK_RECORD 1301 | 5 1302 | 1B 1303 | 330 1304 | 1 1305 | 100 1306 | AcDbSymbolTableRecord 1307 | 100 1308 | AcDbBlockTableRecord 1309 | 2 1310 | *PAPER_SPACE 1311 | 0 1312 | ENDTAB 1313 | 0 1314 | ENDSEC 1315 | 0 1316 | SECTION 1317 | 2 1318 | BLOCKS 1319 | 0 1320 | BLOCK 1321 | 5 1322 | 20 1323 | 330 1324 | 1F 1325 | 100 1326 | AcDbEntity 1327 | 8 1328 | 0 1329 | 100 1330 | AcDbBlockBegin 1331 | 2 1332 | *MODEL_SPACE 1333 | 70 1334 | 0 1335 | 71 1336 | 0 1337 | 10 1338 | 0.0 1339 | 20 1340 | 0.0 1341 | 30 1342 | 0.0 1343 | 3 1344 | *MODEL_SPACE 1345 | 1 1346 | 1347 | 0 1348 | ENDBLK 1349 | 5 1350 | 21 1351 | 330 1352 | 1F 1353 | 100 1354 | AcDbEntity 1355 | 8 1356 | 0 1357 | 100 1358 | AcDbBlockEnd 1359 | 0 1360 | BLOCK 1361 | 5 1362 | 1C 1363 | 330 1364 | 1B 1365 | 100 1366 | AcDbEntity 1367 | 67 1368 | 1 1369 | 8 1370 | 0 1371 | 100 1372 | AcDbBlockBegin 1373 | 2 1374 | *PAPER_SPACE 1375 | 70 1376 | 0 1377 | 71 1378 | 0 1379 | 10 1380 | 0.0 1381 | 20 1382 | 0.0 1383 | 30 1384 | 0.0 1385 | 3 1386 | *PAPER_SPACE 1387 | 1 1388 | 1389 | 0 1390 | ENDBLK 1391 | 5 1392 | 1D 1393 | 330 1394 | 1B 1395 | 100 1396 | AcDbEntity 1397 | 67 1398 | 1 1399 | 8 1400 | 0 1401 | 100 1402 | AcDbBlockEnd 1403 | 0 1404 | ENDSEC 1405 | 0 1406 | SECTION 1407 | 2 1408 | ENTITIES 1409 | 0 1410 | SPLINE 1411 | 5 1412 | 3C 1413 | 330 1414 | 1F 1415 | 100 1416 | AcDbEntity 1417 | 8 1418 | LAYER_1 1419 | 62 1420 | 250 1421 | 100 1422 | AcDbSpline 1423 | 210 1424 | 0.0 1425 | 220 1426 | 0.0 1427 | 230 1428 | 1.0 1429 | 70 1430 | 11 1431 | 71 1432 | 3 1433 | 72 1434 | 29 1435 | 73 1436 | 25 1437 | 74 1438 | 0 1439 | 42 1440 | 0.0000000001 1441 | 43 1442 | 0.0000000001 1443 | 40 1444 | 0.0 1445 | 40 1446 | 0.0 1447 | 40 1448 | 0.0 1449 | 40 1450 | 0.0 1451 | 40 1452 | 1.0 1453 | 40 1454 | 1.0 1455 | 40 1456 | 1.0 1457 | 40 1458 | 2.0 1459 | 40 1460 | 2.0 1461 | 40 1462 | 2.0 1463 | 40 1464 | 3.0 1465 | 40 1466 | 3.0 1467 | 40 1468 | 3.0 1469 | 40 1470 | 4.0 1471 | 40 1472 | 4.0 1473 | 40 1474 | 4.0 1475 | 40 1476 | 5.0 1477 | 40 1478 | 5.0 1479 | 40 1480 | 5.0 1481 | 40 1482 | 6.0 1483 | 40 1484 | 6.0 1485 | 40 1486 | 6.0 1487 | 40 1488 | 7.0 1489 | 40 1490 | 7.0 1491 | 40 1492 | 7.0 1493 | 40 1494 | 8.0 1495 | 40 1496 | 8.0 1497 | 40 1498 | 8.0 1499 | 40 1500 | 8.0 1501 | 10 1502 | 56.64994437602849 1503 | 20 1504 | -17.65008544480623 1505 | 30 1506 | 0.0 1507 | 10 1508 | 56.64994437602849 1509 | 20 1510 | -19.30011392746664 1511 | 30 1512 | 0.0 1513 | 10 1514 | 55.29981145535908 1515 | 20 1516 | -20.65007459336179 1517 | 30 1518 | 0.0 1519 | 10 1520 | 53.64995522747293 1521 | 20 1522 | -20.65007459336179 1523 | 30 1524 | 0.0 1525 | 10 1526 | 53.64995522747293 1527 | 20 1528 | -20.65007459336179 1529 | 30 1530 | 0.0 1531 | 10 1532 | 3.850066459540956 1533 | 20 1534 | -20.65007459336179 1535 | 30 1536 | 0.0 1537 | 10 1538 | 3.850066459540956 1539 | 20 1540 | -20.65007459336179 1541 | 30 1542 | 0.0 1543 | 10 1544 | 2.200037976880546 1545 | 20 1546 | -20.65007459336179 1547 | 30 1548 | 0.0 1549 | 10 1550 | 0.8500773109853974 1551 | 20 1552 | -19.30011392746664 1553 | 30 1554 | 0.0 1555 | 10 1556 | 0.8500773109853974 1557 | 20 1558 | -17.65008544480623 1559 | 30 1560 | 0.0 1561 | 10 1562 | 0.8500773109853974 1563 | 20 1564 | -17.65008544480623 1565 | 30 1566 | 0.0 1567 | 10 1568 | 0.8500773109853974 1569 | 20 1570 | -3.850066459540956 1571 | 30 1572 | 0.0 1573 | 10 1574 | 0.8500773109853974 1575 | 20 1576 | -3.850066459540956 1577 | 30 1578 | 0.0 1579 | 10 1580 | 0.8500773109853974 1581 | 20 1582 | -2.200037976880546 1583 | 30 1584 | 0.0 1585 | 10 1586 | 2.200037976880546 1587 | 20 1588 | -0.8500773109853974 1589 | 30 1590 | 0.0 1591 | 10 1592 | 3.850066459540956 1593 | 20 1594 | -0.8500773109853974 1595 | 30 1596 | 0.0 1597 | 10 1598 | 3.850066459540956 1599 | 20 1600 | -0.8500773109853974 1601 | 30 1602 | 0.0 1603 | 10 1604 | 53.64995522747293 1605 | 20 1606 | -0.8500773109853974 1607 | 30 1608 | 0.0 1609 | 10 1610 | 53.64995522747293 1611 | 20 1612 | -0.8500773109853974 1613 | 30 1614 | 0.0 1615 | 10 1616 | 55.29981145535908 1617 | 20 1618 | -0.8500773109853974 1619 | 30 1620 | 0.0 1621 | 10 1622 | 56.64994437602849 1623 | 20 1624 | -2.200037976880546 1625 | 30 1626 | 0.0 1627 | 10 1628 | 56.64994437602849 1629 | 20 1630 | -3.850066459540956 1631 | 30 1632 | 0.0 1633 | 10 1634 | 56.64994437602849 1635 | 20 1636 | -3.850066459540956 1637 | 30 1638 | 0.0 1639 | 10 1640 | 56.64994437602849 1641 | 20 1642 | -17.65008544480623 1643 | 30 1644 | 0.0 1645 | 10 1646 | 56.64994437602849 1647 | 20 1648 | -17.65008544480623 1649 | 30 1650 | 0.0 1651 | 0 1652 | SPLINE 1653 | 5 1654 | 3D 1655 | 330 1656 | 1F 1657 | 100 1658 | AcDbEntity 1659 | 8 1660 | LAYER_1 1661 | 62 1662 | 250 1663 | 100 1664 | AcDbSpline 1665 | 210 1666 | 0.0 1667 | 220 1668 | 0.0 1669 | 230 1670 | 1.0 1671 | 70 1672 | 11 1673 | 71 1674 | 3 1675 | 72 1676 | 29 1677 | 73 1678 | 25 1679 | 74 1680 | 0 1681 | 42 1682 | 0.0000000001 1683 | 43 1684 | 0.0000000001 1685 | 40 1686 | 0.0 1687 | 40 1688 | 0.0 1689 | 40 1690 | 0.0 1691 | 40 1692 | 0.0 1693 | 40 1694 | 1.0 1695 | 40 1696 | 1.0 1697 | 40 1698 | 1.0 1699 | 40 1700 | 2.0 1701 | 40 1702 | 2.0 1703 | 40 1704 | 2.0 1705 | 40 1706 | 3.0 1707 | 40 1708 | 3.0 1709 | 40 1710 | 3.0 1711 | 40 1712 | 4.0 1713 | 40 1714 | 4.0 1715 | 40 1716 | 4.0 1717 | 40 1718 | 5.0 1719 | 40 1720 | 5.0 1721 | 40 1722 | 5.0 1723 | 40 1724 | 6.0 1725 | 40 1726 | 6.0 1727 | 40 1728 | 6.0 1729 | 40 1730 | 7.0 1731 | 40 1732 | 7.0 1733 | 40 1734 | 7.0 1735 | 40 1736 | 8.0 1737 | 40 1738 | 8.0 1739 | 40 1740 | 8.0 1741 | 40 1742 | 8.0 1743 | 10 1744 | 57.49984943223962 1745 | 20 1746 | -17.80011935318886 1747 | 30 1748 | 0.0 1749 | 10 1750 | 57.49984943223962 1751 | 20 1752 | -19.83513725632594 1753 | 30 1754 | 0.0 1755 | 10 1756 | 55.83483478421838 1757 | 20 1758 | -21.50015190434718 1759 | 30 1760 | 0.0 1761 | 10 1762 | 53.7998168810813 1763 | 20 1764 | -21.50015190434718 1765 | 30 1766 | 0.0 1767 | 10 1768 | 53.7998168810813 1769 | 20 1770 | -21.50015190434718 1771 | 30 1772 | 0.0 1773 | 10 1774 | 3.700032551158325 1775 | 20 1776 | -21.50015190434718 1777 | 30 1778 | 0.0 1779 | 10 1780 | 3.700032551158325 1781 | 20 1782 | -21.50015190434718 1783 | 30 1784 | 0.0 1785 | 10 1786 | 1.665014648021246 1787 | 20 1788 | -21.50015190434718 1789 | 30 1790 | 0.0 1791 | 10 1792 | 0.0 1793 | 20 1794 | -19.83513725632594 1795 | 30 1796 | 0.0 1797 | 10 1798 | 0.0 1799 | 20 1800 | -17.80011935318886 1801 | 30 1802 | 0.0 1803 | 10 1804 | 0.0 1805 | 20 1806 | -17.80011935318886 1807 | 30 1808 | 0.0 1809 | 10 1810 | 0.0 1811 | 20 1812 | -3.700032551158325 1813 | 30 1814 | 0.0 1815 | 10 1816 | 0.0 1817 | 20 1818 | -3.700032551158325 1819 | 30 1820 | 0.0 1821 | 10 1822 | 0.0 1823 | 20 1824 | -1.665014648021246 1825 | 30 1826 | 0.0 1827 | 10 1828 | 1.665014648021246 1829 | 20 1830 | 0.0 1831 | 30 1832 | 0.0 1833 | 10 1834 | 3.700032551158325 1835 | 20 1836 | 0.0 1837 | 30 1838 | 0.0 1839 | 10 1840 | 3.700032551158325 1841 | 20 1842 | 0.0 1843 | 30 1844 | 0.0 1845 | 10 1846 | 53.7998168810813 1847 | 20 1848 | 0.0 1849 | 30 1850 | 0.0 1851 | 10 1852 | 53.7998168810813 1853 | 20 1854 | 0.0 1855 | 30 1856 | 0.0 1857 | 10 1858 | 55.83483478421838 1859 | 20 1860 | 0.0 1861 | 30 1862 | 0.0 1863 | 10 1864 | 57.49984943223962 1865 | 20 1866 | -1.665014648021246 1867 | 30 1868 | 0.0 1869 | 10 1870 | 57.49984943223962 1871 | 20 1872 | -3.700032551158325 1873 | 30 1874 | 0.0 1875 | 10 1876 | 57.49984943223962 1877 | 20 1878 | -3.700032551158325 1879 | 30 1880 | 0.0 1881 | 10 1882 | 57.49984943223962 1883 | 20 1884 | -17.80011935318886 1885 | 30 1886 | 0.0 1887 | 10 1888 | 57.49984943223962 1889 | 20 1890 | -17.80011935318886 1891 | 30 1892 | 0.0 1893 | 0 1894 | ENDSEC 1895 | 0 1896 | SECTION 1897 | 2 1898 | OBJECTS 1899 | 0 1900 | DICTIONARY 1901 | 5 1902 | C 1903 | 330 1904 | 0 1905 | 100 1906 | AcDbDictionary 1907 | 3 1908 | ACAD_GROUP 1909 | 350 1910 | D 1911 | 3 1912 | ACAD_LAYOUT 1913 | 350 1914 | 1A 1915 | 3 1916 | ACAD_MLINESTYLE 1917 | 350 1918 | 17 1919 | 3 1920 | ACAD_PLOTSETTINGS 1921 | 350 1922 | 19 1923 | 3 1924 | ACAD_TABLESTYLE 1925 | 350 1926 | 3E 1927 | 3 1928 | ACAD_VISUALSTYLE 1929 | 350 1930 | 2A 1931 | 1001 1932 | ACAD 1933 | 1000 1934 | TREAT_AS_HARD 1935 | 1070 1936 | 0 1937 | 0 1938 | DICTIONARY 1939 | 5 1940 | D 1941 | 102 1942 | {ACAD_REACTORS 1943 | 330 1944 | C 1945 | 102 1946 | } 1947 | 330 1948 | C 1949 | 100 1950 | AcDbDictionary 1951 | 1001 1952 | ACAD 1953 | 1000 1954 | TREAT_AS_HARD 1955 | 1070 1956 | 0 1957 | 0 1958 | DICTIONARY 1959 | 5 1960 | 1A 1961 | 102 1962 | {ACAD_REACTORS 1963 | 330 1964 | C 1965 | 102 1966 | } 1967 | 330 1968 | C 1969 | 100 1970 | AcDbDictionary 1971 | 1001 1972 | ACAD 1973 | 1000 1974 | TREAT_AS_HARD 1975 | 1070 1976 | 0 1977 | 0 1978 | DICTIONARY 1979 | 5 1980 | 17 1981 | 102 1982 | {ACAD_REACTORS 1983 | 330 1984 | C 1985 | 102 1986 | } 1987 | 330 1988 | C 1989 | 100 1990 | AcDbDictionary 1991 | 3 1992 | STANDARD 1993 | 350 1994 | 18 1995 | 1001 1996 | ACAD 1997 | 1000 1998 | TREAT_AS_HARD 1999 | 1070 2000 | 0 2001 | 0 2002 | DICTIONARY 2003 | 5 2004 | 19 2005 | 102 2006 | {ACAD_REACTORS 2007 | 330 2008 | C 2009 | 102 2010 | } 2011 | 330 2012 | C 2013 | 100 2014 | AcDbDictionary 2015 | 1001 2016 | ACAD 2017 | 1000 2018 | TREAT_AS_HARD 2019 | 1070 2020 | 0 2021 | 0 2022 | DICTIONARY 2023 | 5 2024 | 3E 2025 | 102 2026 | {ACAD_REACTORS 2027 | 330 2028 | C 2029 | 102 2030 | } 2031 | 330 2032 | C 2033 | 100 2034 | AcDbDictionary 2035 | 1001 2036 | ACAD 2037 | 1000 2038 | TREAT_AS_HARD 2039 | 1070 2040 | 0 2041 | 0 2042 | DICTIONARY 2043 | 5 2044 | 2A 2045 | 102 2046 | {ACAD_REACTORS 2047 | 330 2048 | C 2049 | 102 2050 | } 2051 | 330 2052 | C 2053 | 100 2054 | AcDbDictionary 2055 | 3 2056 | 2DWIREFRAME 2057 | 350 2058 | 2F 2059 | 3 2060 | 3D_HIDDEN 2061 | 350 2062 | 31 2063 | 3 2064 | 3DWIREFRAME 2065 | 350 2066 | 30 2067 | 3 2068 | BASIC 2069 | 350 2070 | 32 2071 | 3 2072 | BRIGHTEN 2073 | 350 2074 | 36 2075 | 3 2076 | COLORCHANGE 2077 | 350 2078 | 3A 2079 | 3 2080 | CONCEPTUAL 2081 | 350 2082 | 34 2083 | 3 2084 | DIM 2085 | 350 2086 | 35 2087 | 3 2088 | FACEPATTERN 2089 | 350 2090 | 39 2091 | 3 2092 | FLAT 2093 | 350 2094 | 2B 2095 | 3 2096 | FLATWITHEDGES 2097 | 350 2098 | 2C 2099 | 3 2100 | GOURAUD 2101 | 350 2102 | 2D 2103 | 3 2104 | GOURAUDWITHEDGES 2105 | 350 2106 | 2E 2107 | 3 2108 | LINEPATTERN 2109 | 350 2110 | 38 2111 | 3 2112 | REALISTIC 2113 | 350 2114 | 33 2115 | 3 2116 | THICKEN 2117 | 350 2118 | 37 2119 | 1001 2120 | ACAD 2121 | 1000 2122 | TREAT_AS_HARD 2123 | 1070 2124 | 0 2125 | 0 2126 | MLINESTYLE 2127 | 5 2128 | 18 2129 | 102 2130 | {ACAD_REACTORS 2131 | 330 2132 | 17 2133 | 102 2134 | } 2135 | 330 2136 | 17 2137 | 100 2138 | AcDbMlineStyle 2139 | 2 2140 | Standard 2141 | 70 2142 | 0 2143 | 3 2144 | 2145 | 62 2146 | 256 2147 | 51 2148 | 90.0 2149 | 52 2150 | 90.0 2151 | 71 2152 | 2 2153 | 49 2154 | 0.5 2155 | 62 2156 | 256 2157 | 6 2158 | BYLAYER 2159 | 49 2160 | -0.5 2161 | 62 2162 | 256 2163 | 6 2164 | BYLAYER 2165 | 0 2166 | VISUALSTYLE 2167 | 5 2168 | 2F 2169 | 102 2170 | {ACAD_REACTORS 2171 | 330 2172 | 2A 2173 | 102 2174 | } 2175 | 330 2176 | 2A 2177 | 100 2178 | AcDbVisualStyle 2179 | 2 2180 | 2dWireframe 2181 | 70 2182 | 4 2183 | 71 2184 | 0 2185 | 72 2186 | 2 2187 | 73 2188 | 0 2189 | 90 2190 | 0 2191 | 40 2192 | -0.6 2193 | 41 2194 | -30.0 2195 | 62 2196 | 5 2197 | 63 2198 | 7 2199 | 74 2200 | 1 2201 | 91 2202 | 4 2203 | 64 2204 | 7 2205 | 65 2206 | 257 2207 | 75 2208 | 1 2209 | 175 2210 | 1 2211 | 42 2212 | 1.0 2213 | 92 2214 | 0 2215 | 66 2216 | 257 2217 | 43 2218 | 1.0 2219 | 76 2220 | 1 2221 | 77 2222 | 6 2223 | 78 2224 | 2 2225 | 67 2226 | 7 2227 | 79 2228 | 5 2229 | 170 2230 | 0 2231 | 171 2232 | 0 2233 | 290 2234 | 0 2235 | 174 2236 | 0 2237 | 93 2238 | 1 2239 | 44 2240 | 0.0 2241 | 173 2242 | 0 2243 | 291 2244 | 0 2245 | 45 2246 | 0.0 2247 | 1001 2248 | ACAD 2249 | 1000 2250 | AcDbSavedByObjectVersion 2251 | 1070 2252 | 0 2253 | 0 2254 | VISUALSTYLE 2255 | 5 2256 | 31 2257 | 102 2258 | {ACAD_REACTORS 2259 | 330 2260 | 2A 2261 | 102 2262 | } 2263 | 330 2264 | 2A 2265 | 100 2266 | AcDbVisualStyle 2267 | 2 2268 | 3D Hidden 2269 | 70 2270 | 6 2271 | 71 2272 | 1 2273 | 72 2274 | 2 2275 | 73 2276 | 2 2277 | 90 2278 | 0 2279 | 40 2280 | -0.6 2281 | 41 2282 | -30.0 2283 | 62 2284 | 5 2285 | 63 2286 | 7 2287 | 74 2288 | 2 2289 | 91 2290 | 2 2291 | 64 2292 | 7 2293 | 65 2294 | 257 2295 | 75 2296 | 2 2297 | 175 2298 | 1 2299 | 42 2300 | 40.0 2301 | 92 2302 | 0 2303 | 66 2304 | 257 2305 | 43 2306 | 1.0 2307 | 76 2308 | 1 2309 | 77 2310 | 6 2311 | 78 2312 | 2 2313 | 67 2314 | 7 2315 | 79 2316 | 3 2317 | 170 2318 | 0 2319 | 171 2320 | 0 2321 | 290 2322 | 0 2323 | 174 2324 | 0 2325 | 93 2326 | 1 2327 | 44 2328 | 0.0 2329 | 173 2330 | 0 2331 | 291 2332 | 0 2333 | 45 2334 | 0.0 2335 | 1001 2336 | ACAD 2337 | 1000 2338 | AcDbSavedByObjectVersion 2339 | 1070 2340 | 0 2341 | 0 2342 | VISUALSTYLE 2343 | 5 2344 | 30 2345 | 102 2346 | {ACAD_REACTORS 2347 | 330 2348 | 2A 2349 | 102 2350 | } 2351 | 330 2352 | 2A 2353 | 100 2354 | AcDbVisualStyle 2355 | 2 2356 | 3dWireframe 2357 | 70 2358 | 5 2359 | 71 2360 | 0 2361 | 72 2362 | 2 2363 | 73 2364 | 0 2365 | 90 2366 | 0 2367 | 40 2368 | -0.6 2369 | 41 2370 | -30.0 2371 | 62 2372 | 5 2373 | 63 2374 | 7 2375 | 74 2376 | 1 2377 | 91 2378 | 4 2379 | 64 2380 | 7 2381 | 65 2382 | 257 2383 | 75 2384 | 1 2385 | 175 2386 | 1 2387 | 42 2388 | 1.0 2389 | 92 2390 | 0 2391 | 66 2392 | 257 2393 | 43 2394 | 1.0 2395 | 76 2396 | 1 2397 | 77 2398 | 6 2399 | 78 2400 | 2 2401 | 67 2402 | 7 2403 | 79 2404 | 5 2405 | 170 2406 | 0 2407 | 171 2408 | 0 2409 | 290 2410 | 0 2411 | 174 2412 | 0 2413 | 93 2414 | 1 2415 | 44 2416 | 0.0 2417 | 173 2418 | 0 2419 | 291 2420 | 0 2421 | 45 2422 | 0.0 2423 | 1001 2424 | ACAD 2425 | 1000 2426 | AcDbSavedByObjectVersion 2427 | 1070 2428 | 0 2429 | 0 2430 | VISUALSTYLE 2431 | 5 2432 | 32 2433 | 102 2434 | {ACAD_REACTORS 2435 | 330 2436 | 2A 2437 | 102 2438 | } 2439 | 330 2440 | 2A 2441 | 100 2442 | AcDbVisualStyle 2443 | 2 2444 | Basic 2445 | 70 2446 | 7 2447 | 71 2448 | 1 2449 | 72 2450 | 0 2451 | 73 2452 | 1 2453 | 90 2454 | 0 2455 | 40 2456 | -0.6 2457 | 41 2458 | -30.0 2459 | 62 2460 | 5 2461 | 63 2462 | 7 2463 | 74 2464 | 0 2465 | 91 2466 | 4 2467 | 64 2468 | 7 2469 | 65 2470 | 257 2471 | 75 2472 | 1 2473 | 175 2474 | 1 2475 | 42 2476 | 1.0 2477 | 92 2478 | 8 2479 | 66 2480 | 7 2481 | 43 2482 | 1.0 2483 | 76 2484 | 1 2485 | 77 2486 | 6 2487 | 78 2488 | 2 2489 | 67 2490 | 7 2491 | 79 2492 | 5 2493 | 170 2494 | 0 2495 | 171 2496 | 0 2497 | 290 2498 | 0 2499 | 174 2500 | 0 2501 | 93 2502 | 1 2503 | 44 2504 | 0.0 2505 | 173 2506 | 0 2507 | 291 2508 | 1 2509 | 45 2510 | 0.0 2511 | 1001 2512 | ACAD 2513 | 1000 2514 | AcDbSavedByObjectVersion 2515 | 1070 2516 | 0 2517 | 0 2518 | VISUALSTYLE 2519 | 5 2520 | 36 2521 | 102 2522 | {ACAD_REACTORS 2523 | 330 2524 | 2A 2525 | 102 2526 | } 2527 | 330 2528 | 2A 2529 | 100 2530 | AcDbVisualStyle 2531 | 2 2532 | Brighten 2533 | 70 2534 | 12 2535 | 71 2536 | 2 2537 | 72 2538 | 2 2539 | 73 2540 | 0 2541 | 90 2542 | 0 2543 | 40 2544 | -0.6 2545 | 41 2546 | -30.0 2547 | 62 2548 | 5 2549 | 63 2550 | 7 2551 | 74 2552 | 1 2553 | 91 2554 | 4 2555 | 64 2556 | 7 2557 | 65 2558 | 257 2559 | 75 2560 | 1 2561 | 175 2562 | 1 2563 | 42 2564 | 1.0 2565 | 92 2566 | 8 2567 | 66 2568 | 7 2569 | 43 2570 | 1.0 2571 | 76 2572 | 1 2573 | 77 2574 | 6 2575 | 78 2576 | 2 2577 | 67 2578 | 7 2579 | 79 2580 | 5 2581 | 170 2582 | 0 2583 | 171 2584 | 0 2585 | 290 2586 | 0 2587 | 174 2588 | 0 2589 | 93 2590 | 1 2591 | 44 2592 | 50.0 2593 | 173 2594 | 0 2595 | 291 2596 | 1 2597 | 45 2598 | 0.0 2599 | 1001 2600 | ACAD 2601 | 1000 2602 | AcDbSavedByObjectVersion 2603 | 1070 2604 | 0 2605 | 0 2606 | VISUALSTYLE 2607 | 5 2608 | 3A 2609 | 102 2610 | {ACAD_REACTORS 2611 | 330 2612 | 2A 2613 | 102 2614 | } 2615 | 330 2616 | 2A 2617 | 100 2618 | AcDbVisualStyle 2619 | 2 2620 | ColorChange 2621 | 70 2622 | 16 2623 | 71 2624 | 2 2625 | 72 2626 | 2 2627 | 73 2628 | 3 2629 | 90 2630 | 0 2631 | 40 2632 | -0.6 2633 | 41 2634 | -30.0 2635 | 62 2636 | 5 2637 | 63 2638 | 8 2639 | 74 2640 | 1 2641 | 91 2642 | 4 2643 | 64 2644 | 7 2645 | 65 2646 | 257 2647 | 75 2648 | 1 2649 | 175 2650 | 1 2651 | 42 2652 | 1.0 2653 | 92 2654 | 8 2655 | 66 2656 | 8 2657 | 43 2658 | 1.0 2659 | 76 2660 | 1 2661 | 77 2662 | 6 2663 | 78 2664 | 2 2665 | 67 2666 | 7 2667 | 79 2668 | 5 2669 | 170 2670 | 0 2671 | 171 2672 | 0 2673 | 290 2674 | 0 2675 | 174 2676 | 0 2677 | 93 2678 | 1 2679 | 44 2680 | 0.0 2681 | 173 2682 | 0 2683 | 291 2684 | 1 2685 | 45 2686 | 0.0 2687 | 1001 2688 | ACAD 2689 | 1000 2690 | AcDbSavedByObjectVersion 2691 | 1070 2692 | 0 2693 | 0 2694 | VISUALSTYLE 2695 | 5 2696 | 34 2697 | 102 2698 | {ACAD_REACTORS 2699 | 330 2700 | 2A 2701 | 102 2702 | } 2703 | 330 2704 | 2A 2705 | 100 2706 | AcDbVisualStyle 2707 | 2 2708 | Conceptual 2709 | 70 2710 | 9 2711 | 71 2712 | 3 2713 | 72 2714 | 2 2715 | 73 2716 | 0 2717 | 90 2718 | 0 2719 | 40 2720 | -0.6 2721 | 41 2722 | -30.0 2723 | 62 2724 | 5 2725 | 63 2726 | 7 2727 | 74 2728 | 2 2729 | 91 2730 | 2 2731 | 64 2732 | 7 2733 | 65 2734 | 257 2735 | 75 2736 | 1 2737 | 175 2738 | 1 2739 | 42 2740 | 40.0 2741 | 92 2742 | 8 2743 | 66 2744 | 7 2745 | 43 2746 | 1.0 2747 | 76 2748 | 1 2749 | 77 2750 | 6 2751 | 78 2752 | 2 2753 | 67 2754 | 7 2755 | 79 2756 | 3 2757 | 170 2758 | 0 2759 | 171 2760 | 0 2761 | 290 2762 | 0 2763 | 174 2764 | 0 2765 | 93 2766 | 1 2767 | 44 2768 | 0.0 2769 | 173 2770 | 0 2771 | 291 2772 | 0 2773 | 45 2774 | 0.0 2775 | 1001 2776 | ACAD 2777 | 1000 2778 | AcDbSavedByObjectVersion 2779 | 1070 2780 | 0 2781 | 0 2782 | VISUALSTYLE 2783 | 5 2784 | 35 2785 | 102 2786 | {ACAD_REACTORS 2787 | 330 2788 | 2A 2789 | 102 2790 | } 2791 | 330 2792 | 2A 2793 | 100 2794 | AcDbVisualStyle 2795 | 2 2796 | Dim 2797 | 70 2798 | 11 2799 | 71 2800 | 2 2801 | 72 2802 | 2 2803 | 73 2804 | 0 2805 | 90 2806 | 0 2807 | 40 2808 | -0.6 2809 | 41 2810 | -30.0 2811 | 62 2812 | 5 2813 | 63 2814 | 7 2815 | 74 2816 | 1 2817 | 91 2818 | 4 2819 | 64 2820 | 7 2821 | 65 2822 | 257 2823 | 75 2824 | 1 2825 | 175 2826 | 1 2827 | 42 2828 | 1.0 2829 | 92 2830 | 8 2831 | 66 2832 | 7 2833 | 43 2834 | 1.0 2835 | 76 2836 | 1 2837 | 77 2838 | 6 2839 | 78 2840 | 2 2841 | 67 2842 | 7 2843 | 79 2844 | 5 2845 | 170 2846 | 0 2847 | 171 2848 | 0 2849 | 290 2850 | 0 2851 | 174 2852 | 0 2853 | 93 2854 | 1 2855 | 44 2856 | -50.0 2857 | 173 2858 | 0 2859 | 291 2860 | 1 2861 | 45 2862 | 0.0 2863 | 1001 2864 | ACAD 2865 | 1000 2866 | AcDbSavedByObjectVersion 2867 | 1070 2868 | 0 2869 | 0 2870 | VISUALSTYLE 2871 | 5 2872 | 39 2873 | 102 2874 | {ACAD_REACTORS 2875 | 330 2876 | 2A 2877 | 102 2878 | } 2879 | 330 2880 | 2A 2881 | 100 2882 | AcDbVisualStyle 2883 | 2 2884 | Facepattern 2885 | 70 2886 | 15 2887 | 71 2888 | 2 2889 | 72 2890 | 2 2891 | 73 2892 | 0 2893 | 90 2894 | 0 2895 | 40 2896 | -0.6 2897 | 41 2898 | -30.0 2899 | 62 2900 | 5 2901 | 63 2902 | 7 2903 | 74 2904 | 1 2905 | 91 2906 | 4 2907 | 64 2908 | 7 2909 | 65 2910 | 257 2911 | 75 2912 | 1 2913 | 175 2914 | 1 2915 | 42 2916 | 1.0 2917 | 92 2918 | 8 2919 | 66 2920 | 7 2921 | 43 2922 | 1.0 2923 | 76 2924 | 1 2925 | 77 2926 | 6 2927 | 78 2928 | 2 2929 | 67 2930 | 7 2931 | 79 2932 | 5 2933 | 170 2934 | 0 2935 | 171 2936 | 0 2937 | 290 2938 | 0 2939 | 174 2940 | 0 2941 | 93 2942 | 1 2943 | 44 2944 | 0.0 2945 | 173 2946 | 0 2947 | 291 2948 | 1 2949 | 45 2950 | 0.0 2951 | 1001 2952 | ACAD 2953 | 1000 2954 | AcDbSavedByObjectVersion 2955 | 1070 2956 | 0 2957 | 0 2958 | VISUALSTYLE 2959 | 5 2960 | 2B 2961 | 102 2962 | {ACAD_REACTORS 2963 | 330 2964 | 2A 2965 | 102 2966 | } 2967 | 330 2968 | 2A 2969 | 100 2970 | AcDbVisualStyle 2971 | 2 2972 | Flat 2973 | 70 2974 | 0 2975 | 71 2976 | 2 2977 | 72 2978 | 1 2979 | 73 2980 | 1 2981 | 90 2982 | 2 2983 | 40 2984 | -0.6 2985 | 41 2986 | 30.0 2987 | 62 2988 | 5 2989 | 63 2990 | 7 2991 | 74 2992 | 0 2993 | 91 2994 | 4 2995 | 64 2996 | 7 2997 | 65 2998 | 257 2999 | 75 3000 | 1 3001 | 175 3002 | 1 3003 | 42 3004 | 1.0 3005 | 92 3006 | 8 3007 | 66 3008 | 7 3009 | 43 3010 | 1.0 3011 | 76 3012 | 1 3013 | 77 3014 | 6 3015 | 78 3016 | 2 3017 | 67 3018 | 7 3019 | 79 3020 | 5 3021 | 170 3022 | 0 3023 | 171 3024 | 0 3025 | 290 3026 | 0 3027 | 174 3028 | 0 3029 | 93 3030 | 13 3031 | 44 3032 | 0.0 3033 | 173 3034 | 0 3035 | 291 3036 | 1 3037 | 45 3038 | 0.0 3039 | 1001 3040 | ACAD 3041 | 1000 3042 | AcDbSavedByObjectVersion 3043 | 1070 3044 | 0 3045 | 0 3046 | VISUALSTYLE 3047 | 5 3048 | 2C 3049 | 102 3050 | {ACAD_REACTORS 3051 | 330 3052 | 2A 3053 | 102 3054 | } 3055 | 330 3056 | 2A 3057 | 100 3058 | AcDbVisualStyle 3059 | 2 3060 | FlatWithEdges 3061 | 70 3062 | 1 3063 | 71 3064 | 2 3065 | 72 3066 | 1 3067 | 73 3068 | 1 3069 | 90 3070 | 2 3071 | 40 3072 | -0.6 3073 | 41 3074 | 30.0 3075 | 62 3076 | 5 3077 | 63 3078 | 7 3079 | 74 3080 | 1 3081 | 91 3082 | 4 3083 | 64 3084 | 7 3085 | 65 3086 | 257 3087 | 75 3088 | 1 3089 | 175 3090 | 1 3091 | 42 3092 | 1.0 3093 | 92 3094 | 0 3095 | 66 3096 | 257 3097 | 43 3098 | 1.0 3099 | 76 3100 | 1 3101 | 77 3102 | 6 3103 | 78 3104 | 2 3105 | 67 3106 | 7 3107 | 79 3108 | 5 3109 | 170 3110 | 0 3111 | 171 3112 | 0 3113 | 290 3114 | 0 3115 | 174 3116 | 0 3117 | 93 3118 | 13 3119 | 44 3120 | 0.0 3121 | 173 3122 | 0 3123 | 291 3124 | 1 3125 | 45 3126 | 0.0 3127 | 1001 3128 | ACAD 3129 | 1000 3130 | AcDbSavedByObjectVersion 3131 | 1070 3132 | 0 3133 | 0 3134 | VISUALSTYLE 3135 | 5 3136 | 2D 3137 | 102 3138 | {ACAD_REACTORS 3139 | 330 3140 | 2A 3141 | 102 3142 | } 3143 | 330 3144 | 2A 3145 | 100 3146 | AcDbVisualStyle 3147 | 2 3148 | Gouraud 3149 | 70 3150 | 2 3151 | 71 3152 | 2 3153 | 72 3154 | 2 3155 | 73 3156 | 1 3157 | 90 3158 | 2 3159 | 40 3160 | -0.6 3161 | 41 3162 | 30.0 3163 | 62 3164 | 5 3165 | 63 3166 | 7 3167 | 74 3168 | 0 3169 | 91 3170 | 4 3171 | 64 3172 | 7 3173 | 65 3174 | 257 3175 | 75 3176 | 1 3177 | 175 3178 | 1 3179 | 42 3180 | 1.0 3181 | 92 3182 | 0 3183 | 66 3184 | 7 3185 | 43 3186 | 1.0 3187 | 76 3188 | 1 3189 | 77 3190 | 6 3191 | 78 3192 | 2 3193 | 67 3194 | 7 3195 | 79 3196 | 5 3197 | 170 3198 | 0 3199 | 171 3200 | 0 3201 | 290 3202 | 0 3203 | 174 3204 | 0 3205 | 93 3206 | 13 3207 | 44 3208 | 0.0 3209 | 173 3210 | 0 3211 | 291 3212 | 1 3213 | 45 3214 | 0.0 3215 | 1001 3216 | ACAD 3217 | 1000 3218 | AcDbSavedByObjectVersion 3219 | 1070 3220 | 0 3221 | 0 3222 | VISUALSTYLE 3223 | 5 3224 | 2E 3225 | 102 3226 | {ACAD_REACTORS 3227 | 330 3228 | 2A 3229 | 102 3230 | } 3231 | 330 3232 | 2A 3233 | 100 3234 | AcDbVisualStyle 3235 | 2 3236 | GouraudWithEdges 3237 | 70 3238 | 3 3239 | 71 3240 | 2 3241 | 72 3242 | 2 3243 | 73 3244 | 1 3245 | 90 3246 | 2 3247 | 40 3248 | -0.6 3249 | 41 3250 | 30.0 3251 | 62 3252 | 5 3253 | 63 3254 | 7 3255 | 74 3256 | 1 3257 | 91 3258 | 4 3259 | 64 3260 | 7 3261 | 65 3262 | 257 3263 | 75 3264 | 1 3265 | 175 3266 | 1 3267 | 42 3268 | 1.0 3269 | 92 3270 | 0 3271 | 66 3272 | 257 3273 | 43 3274 | 1.0 3275 | 76 3276 | 1 3277 | 77 3278 | 6 3279 | 78 3280 | 2 3281 | 67 3282 | 7 3283 | 79 3284 | 5 3285 | 170 3286 | 0 3287 | 171 3288 | 0 3289 | 290 3290 | 0 3291 | 174 3292 | 0 3293 | 93 3294 | 13 3295 | 44 3296 | 0.0 3297 | 173 3298 | 0 3299 | 291 3300 | 1 3301 | 45 3302 | 0.0 3303 | 1001 3304 | ACAD 3305 | 1000 3306 | AcDbSavedByObjectVersion 3307 | 1070 3308 | 0 3309 | 0 3310 | VISUALSTYLE 3311 | 5 3312 | 38 3313 | 102 3314 | {ACAD_REACTORS 3315 | 330 3316 | 2A 3317 | 102 3318 | } 3319 | 330 3320 | 2A 3321 | 100 3322 | AcDbVisualStyle 3323 | 2 3324 | Linepattern 3325 | 70 3326 | 14 3327 | 71 3328 | 2 3329 | 72 3330 | 2 3331 | 73 3332 | 0 3333 | 90 3334 | 0 3335 | 40 3336 | -0.6 3337 | 41 3338 | -30.0 3339 | 62 3340 | 5 3341 | 63 3342 | 7 3343 | 74 3344 | 1 3345 | 91 3346 | 4 3347 | 64 3348 | 7 3349 | 65 3350 | 257 3351 | 75 3352 | 7 3353 | 175 3354 | 7 3355 | 42 3356 | 1.0 3357 | 92 3358 | 8 3359 | 66 3360 | 7 3361 | 43 3362 | 1.0 3363 | 76 3364 | 1 3365 | 77 3366 | 6 3367 | 78 3368 | 2 3369 | 67 3370 | 7 3371 | 79 3372 | 5 3373 | 170 3374 | 0 3375 | 171 3376 | 0 3377 | 290 3378 | 0 3379 | 174 3380 | 0 3381 | 93 3382 | 1 3383 | 44 3384 | 0.0 3385 | 173 3386 | 0 3387 | 291 3388 | 1 3389 | 45 3390 | 0.0 3391 | 1001 3392 | ACAD 3393 | 1000 3394 | AcDbSavedByObjectVersion 3395 | 1070 3396 | 0 3397 | 0 3398 | VISUALSTYLE 3399 | 5 3400 | 33 3401 | 102 3402 | {ACAD_REACTORS 3403 | 330 3404 | 2A 3405 | 102 3406 | } 3407 | 330 3408 | 2A 3409 | 100 3410 | AcDbVisualStyle 3411 | 2 3412 | Realistic 3413 | 70 3414 | 8 3415 | 71 3416 | 2 3417 | 72 3418 | 2 3419 | 73 3420 | 0 3421 | 90 3422 | 0 3423 | 40 3424 | -0.6 3425 | 41 3426 | -30.0 3427 | 62 3428 | 5 3429 | 63 3430 | 7 3431 | 74 3432 | 1 3433 | 91 3434 | 0 3435 | 64 3436 | 7 3437 | 65 3438 | 257 3439 | 75 3440 | 1 3441 | 175 3442 | 1 3443 | 42 3444 | 1.0 3445 | 92 3446 | 8 3447 | 66 3448 | 8 3449 | 43 3450 | 1.0 3451 | 76 3452 | 1 3453 | 77 3454 | 6 3455 | 78 3456 | 2 3457 | 67 3458 | 7 3459 | 79 3460 | 5 3461 | 170 3462 | 0 3463 | 171 3464 | 0 3465 | 290 3466 | 0 3467 | 174 3468 | 0 3469 | 93 3470 | 13 3471 | 44 3472 | 0.0 3473 | 173 3474 | 0 3475 | 291 3476 | 0 3477 | 45 3478 | 0.0 3479 | 1001 3480 | ACAD 3481 | 1000 3482 | AcDbSavedByObjectVersion 3483 | 1070 3484 | 0 3485 | 0 3486 | VISUALSTYLE 3487 | 5 3488 | 37 3489 | 102 3490 | {ACAD_REACTORS 3491 | 330 3492 | 2A 3493 | 102 3494 | } 3495 | 330 3496 | 2A 3497 | 100 3498 | AcDbVisualStyle 3499 | 2 3500 | Thicken 3501 | 70 3502 | 13 3503 | 71 3504 | 2 3505 | 72 3506 | 2 3507 | 73 3508 | 0 3509 | 90 3510 | 0 3511 | 40 3512 | -0.6 3513 | 41 3514 | -30.0 3515 | 62 3516 | 5 3517 | 63 3518 | 7 3519 | 74 3520 | 1 3521 | 91 3522 | 4 3523 | 64 3524 | 7 3525 | 65 3526 | 257 3527 | 75 3528 | 1 3529 | 175 3530 | 1 3531 | 42 3532 | 1.0 3533 | 92 3534 | 12 3535 | 66 3536 | 7 3537 | 43 3538 | 1.0 3539 | 76 3540 | 1 3541 | 77 3542 | 6 3543 | 78 3544 | 2 3545 | 67 3546 | 7 3547 | 79 3548 | 5 3549 | 170 3550 | 0 3551 | 171 3552 | 0 3553 | 290 3554 | 0 3555 | 174 3556 | 0 3557 | 93 3558 | 1 3559 | 44 3560 | 0.0 3561 | 173 3562 | 0 3563 | 291 3564 | 1 3565 | 45 3566 | 0.0 3567 | 1001 3568 | ACAD 3569 | 1000 3570 | AcDbSavedByObjectVersion 3571 | 1070 3572 | 0 3573 | 0 3574 | ENDSEC 3575 | 0 3576 | EOF 3577 | --------------------------------------------------------------------------------