├── 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 |
--------------------------------------------------------------------------------