def draw(filename, data, fontname='Times-Roman', images=[], fontsize= DEFAULT_FONT_SIZE, reverse=False, case=string.upper, seven_seg=False, ): PCB_W = (11.3) * inch PCB_H = (14 + 7./8) *inch H = 16 * inch W = 11.75 * inch W = 11.324 * inch H = 16 * inch W = 16 * inch PAGE_MARGIN = 1*inch can = canvas.Canvas(filename, pagesize=(W + 2 * PAGE_MARGIN, H + 2 * PAGE_MARGIN)) can.translate(1.5 * inch + dx, 1 * inch) ## PCB Lower left is origen data = [[case(char) for char in line] for line in data] YS = arange(N_ROW) * DY + (3 + 7/16.) * inch + dy / 4 XS = arange(N_COL) * DX ys = arange(n_row) * dy + (3 + 7/16.) * inch xs = arange(n_col) * dx + dx/2 for x in xs[:-1]: for y in ys[:1]: # can.circle(x, y, 2.5 * mm, fill=False) pass for x in xs: for y in ys: # can.circle(x, y, 2.5 * mm, fill=False) pass led_xs = XS + DX / 2. led_ys = YS + DY / 2. can.setTitle("Peggy2 Faceplate: %s" % fontname) can.setFont(fontname, 15) can.drawCentredString(4.5 * inch, -.75* inch, 'Peggy2 Faceplate, %s, 0.25" Painted/Etched Acrylic' % fontname) # can.setFont(fontname, 80) # can.drawCentredString(PCB_W/2, 1.5 * inch, 'Peggy2.0') can.setFont(fontname, fontsize) # label font can.drawString(1.25*inch, H + .25 * inch , fontname) if reverse: can.translate(9 * inch, 0 * inch) can.scale(-1, 1) ldr_x = 48.8 * mm + 1 * inch ldr_y = 9*inch - 6.38*mm ldr_r = 2.5*mm # can.circle(ldr_x, ldr_y, ldr_r, fill=True) # ldr can.setLineWidth(1) margin = 10*mm letter_bbox = (XS[0], YS[0], XS[-1] - XS[0] + DX, YS[-1] - YS[0] + DY) bbox = (0, 0, W, H) faceplate = MyPath() # faceplate.rect(bbox) backplate = MyPath() backplate.rect(bbox) keyhole = Keyhole() backplate.route(keyhole) keyhole.translate((9 - .75 - .75) * inch, 0 * inch) backplate.route(keyhole) pcb_bbox = (0, 0, PCB_W, PCB_H) pcb = MyPath() pcb.rect(pcb_bbox) W = DX * 12 + 2 * inch H = DY * 12 + 5 * inch # can.circle(XS[-1] + 1 * DX + 1 * inch, YS[0], DX * 1.3) # can.circle(XS[0] - 1 * inch, YS[0], DX * 1.3) # can.circle(W / 2, H, 1 * inch) # can.circle(W / 2, H -.5 * inch, 1 * inch) # can.circle(W / 2, -.5 * inch, 4 * inch) bbox = (XS[0] - 1 * inch, 0 * inch, W, H) edge = MyPath() edge.rect(bbox) edge.drawOn(can, 1) ################################################################################ encName = 'winansi' decoder = codecs.lookup(encName)[1] def decodeFunc(txt): if txt is None: return ' ' else: return case(decoder(txt, errors='replace')[0]) data = [[decodeFunc(case(char)) for char in line] for line in data] ################################################################################ for y, l in zip(YS + DY * .27, data[::-1]): for x, c in zip(XS + DX / 2., l): can.drawCentredString(x, y, c) can.drawCentredString(XS[-2] + DX/2, YS[1] + DY/4, decodeFunc(chr(186) + 'C')) can.drawCentredString(XS[-1] + DX/2, YS[1] + DY/4, decodeFunc(chr(186) + 'F')) can.drawCentredString(XS[6] + DX * .6, YS[4] + DY * .3, "o'") for x in xs[:-1]: can.drawCentredString(x, ys[0] - .41* inch, decodeFunc(chr(186))) mount_r = 1.8 * mm magnet_r = 6 * mm pcb_mounts = array([[ 1. * inch / 4, 1. * inch / 4], [PCB_W - 1. * inch / 4, 1. * inch / 4], [PCB_W - 1. * inch / 4, PCB_H - 1. * inch / 4], [ 1. * inch / 4, PCB_H - 1. * inch / 4] ]) fp_mounts = array([[ - 1. * inch / 2, 1. * inch / 4], [PCB_W - 1. * inch / 4, 1. * inch / 4], [PCB_W - 1. * inch / 4, H - 1. * inch / 2], [ 1. * inch / 4, H - 1. * inch / 2] ]) for x, y in fp_mounts: pcb.drill(x, y, mount_r) pcb.drill(x, y, magnet_r) backplate.drill(x, y, mount_r) for x, y in pcb_mounts: pcb.drill(x, y, mount_r) backplate.drill(x, y, mount_r) pcb.drawOn(can, 1) faceplate.drawOn(can) can.showPage() can.save() print 'wrote', filename
pcb_bbox = (0, 0, PCB_W, PCB_H) pcb = MyPath() pcb.rect(pcb_bbox) W = DX * 12 + 2 * inch H = DY * 12 + 5 * inch # can.circle(XS[-1] + 1 * DX + 1 * inch, YS[0], DX * 1.3) # can.circle(XS[0] - 1 * inch, YS[0], DX * 1.3) # can.circle(W / 2, H, 1 * inch) # can.circle(W / 2, H -.5 * inch, 1 * inch) # can.circle(W / 2, -.5 * inch, 4 * inch) bbox = (XS[0] - 1 * inch, 0 * inch, W, H) edge = MyPath() edge.rect(bbox) edge.drawOn(can, 1) ################################################################################ encName = 'winansi' decoder = codecs.lookup(encName)[1] def decodeFunc(txt): if txt is None: return ' ' else: return case(decoder(txt, errors='replace')[0]) data = [[decodeFunc(case(char)) for char in line] for line in data] ################################################################################ for y, l in zip(YS + DY * .27, data[::-1]):