def connector_samtec_erm8(cols=20, mask=0.1, paste=-0.05): pcb = alterpcb_core.Pcb() (pad_w, pad_h, row_pitch, col_pitch, pin_w, pin_h) = (0.5, 1.1, 3.8, 0.8, 0.3, 0.9) body_w1 = cols * col_pitch + 6.0 body_w2 = cols * col_pitch + 4.2 body_h1 = 5.6 body_h2 = 3.2 hole_x = cols * col_pitch / 2 + 1.4 hole_y = 1.5 hole_diameter = 1.45 shapes = [] for i in range(cols): xx = col_pitch * (i - (cols - 1) / 2) pcb.add("pad_rect_smd", x=xx, y=-row_pitch/2, width=pad_w, height=pad_h, mask=mask, paste=paste) pcb.add("pad_rect_smd", x=xx, y= row_pitch/2, width=pad_w, height=pad_h, mask=mask, paste=paste) xx1 = cols * col_pitch / 2 + 0.2 xx2 = body_w1 / 2 pcb.add("mechanical_hole", x=-hole_x, y=-hole_y, drill_diameter=hole_diameter, hole_diameter=hole_diameter+0.6) pcb.add("mechanical_hole", x= hole_x, y=-hole_y, drill_diameter=hole_diameter, hole_diameter=hole_diameter+0.6) pcb.add("polygon", layer="silk-top", x=[-xx1, -xx2, -xx2, -xx1], y=[-body_h1/2, -body_h1/2, body_h1/2, body_h1/2], closed=False, outline=0.2) pcb.add("polygon", layer="silk-top", x=[ xx1, xx2, xx2, xx1], y=[-body_h1/2, -body_h1/2, body_h1/2, body_h1/2], closed=False, outline=0.2) pcb.add("line", layer="silk-top", x1=-body_w1/2, y1=body_h1/2-1.6, x2=-body_w1/2+1.6, y2=body_h1/2, width=0.2) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=body_w1+1.0, height=body_h1+1.0, outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=body_w1, height=body_h1) pcb.add("rectangle", layer="mech2-top", x=0.0, y=0.0, width=body_w2, height=body_h2) for i in range(cols): xx = col_pitch * (i - (cols - 1) / 2) pcb.add("rectangle", layer="mech2-top", x=xx, y=-row_pitch/2, width=pin_w, height=pin_h) pcb.add("rectangle", layer="mech2-top", x=xx, y= row_pitch/2, width=pin_w, height=pin_h) return pcb
def mechanical_hole(drill_diameter=1.0, hole_diameter=1.8, mask=0.1): pcb = alterpcb_core.Pcb() pcb.add("circle", layer="drill-unplated", x=0.0, y=0.0, radius=drill_diameter / 2, pad=True) for layer in layers_copper: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=hole_diameter / 2, hole=True, order=-1, pad=True) pcb.add("circle", layer="mask-top", x=0.0, y=0.0, radius=drill_diameter / 2 + mask, pad=True) pcb.add("circle", layer="mask-bot", x=0.0, y=0.0, radius=drill_diameter / 2 + mask, pad=True) return pcb
def pad_oval_th(drill_diameter=1.0, width=1.8, height=1.8, hole_diameter=1.8, layers_pad=["copper1-top", "copper1-bot"], mask=0.1): pcb = alterpcb_core.Pcb() pcb.add("circle", layer="drill-plated", x=0.0, y=0.0, radius=drill_diameter / 2, pad=True) for layer in layers_copper: if layer in layers_pad: pcb.add("oval", layer=layer, x=0.0, y=0.0, width=width, height=height, pad=True) else: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=hole_diameter / 2, hole=True, order=-1, pad=True) pcb.add("oval", layer="copper1-top", x=0.0, y=0.0, width=width, height=height, pad=True) pcb.add("oval", layer="copper1-bot", x=0.0, y=0.0, width=width, height=height, pad=True) pcb.add("oval", layer="mask-top", x=0.0, y=0.0, width=width + mask * 2, height=height + mask * 2, pad=True) pcb.add("oval", layer="mask-bot", x=0.0, y=0.0, width=width + mask * 2, height=height + mask * 2, pad=True) return pcb
def pad_oval_smd(width=1.0, height=1.0, mask=0.1, paste=0.0): pcb = alterpcb_core.Pcb() pcb.add("oval", layer="copper1-top", x=0.0, y=0.0, width=width, height=height, pad=True) pcb.add("oval", layer="mask-top", x=0.0, y=0.0, width=width + mask * 2, height=height + mask * 2, pad=True) if paste is not None: pcb.add("oval", layer="paste-top", x=0.0, y=0.0, width=width + min(mask * 2, 0) + paste * 2, height=height + min(mask * 2, 0) + paste * 2, pad=True) return pcb
def mounting_hole_m25(layers_pad=["copper1-top", "copper1-bot"]): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_th", x=0.0, y=0.0, drill_diameter=2.7, width=5.0, height=5.0, hole_diameter=4.2, layers_pad=layers_pad) for layer in layers_copper: if layer not in layers_pad: pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=6.0, height=6.0, hole=True, order=-1) for sx in [-1, 1]: for sy in [-1, 1]: pcb.add("via", x=sx * 1.9, y=sy * 1.9, drill_diameter=0.8, outer_diameter=1.2, inner_diameter=1.2, hole_diameter=1.6, layers_pad=layers_pad) return pcb
def ic_generic_dfn_rect(package_w=6.0, package_h=6.0, center_w=4.6, center_h=4.6, pad_w=0.3, pad_l=0.8, pad_offset=3.0, pad_pitch=0.5, pad_num=10, center_mask=0.1, pad_mask=0.1, center_paste=-0.15, pad_paste=-0.025, silk=True): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=0.0, y=0.0, width=center_w, height=center_h, mask=center_mask, paste=center_paste) for i in range(pad_num): pcb.add("pad_rect_smd", y=pad_pitch * (i - (pad_num - 1) / 2), x=-pad_offset, height=pad_w, width=pad_l, mask=pad_mask, paste=pad_paste) pcb.add("pad_rect_smd", y=pad_pitch * (i - (pad_num - 1) / 2), x=pad_offset, height=pad_w, width=pad_l, mask=pad_mask, paste=pad_paste) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=package_w + 0.9, height=package_h + 0.5, outline=0.1) if silk: pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=package_w + 0.9, height=package_h + 0.5, outline=0.2) #pcb.add("circle", layer="silk-top", x=-package_w/2, y=package_h/2+0.4, radius=0.2) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=package_w, height=package_h) return pcb
def ic_generic_dip(pins=8, row_pitch=2.54 * 3, pin_pitch=2.54, drill_diameter=1.0, outer_diameter=1.8, inner_diameter=1.8, hole_diameter=1.8): pcb = alterpcb_core.Pcb() for i in range(pins // 2): pcb.add("pad_circ_th", x=-row_pitch / 2, y=pin_pitch * (i - (pins // 2 - 1) / 2), drill_diameter=drill_diameter, outer_diameter=outer_diameter, inner_diameter=inner_diameter, hole_diameter=hole_diameter) pcb.add("pad_circ_th", x=row_pitch / 2, y=pin_pitch * (i - (pins // 2 - 1) / 2), drill_diameter=drill_diameter, outer_diameter=outer_diameter, inner_diameter=inner_diameter, hole_diameter=hole_diameter) sw = row_pitch - outer_diameter - 0.6 sh = pin_pitch * (pins // 2) - 1.0 pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=sw, height=sh, outline=0.2) pcb.add("circle", layer="silk-top", x=-sw / 2 + 0.5, y=sh / 2 - 0.5, radius=0.2) pcb.add("arc", layer="silk-top", x=0.0, y=sh / 2, radius=0.8, angle1=-180.0, angle2=0.0, width=0.2) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=row_pitch + pin_pitch, height=pin_pitch * (pins // 2), outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=row_pitch - 0.4, height=pin_pitch * (pins // 2) - 0.8) return pcb
def connector_generic_sma_edge_cde(w1=3.0, h1=4.0, w2=0.8, h2=3.5, w3=1.35, h3=2.75, s1=3.5, hole=True, hole_w=11.0, hole_h=5.0, edge_space=0.5): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=0.0, y=-edge_space-h2/2, width=w2, height=h2, paste=None) pcb.add("pad_rect_smd", x=-s1, y=-edge_space-h1/2, width=w1, height=h1, paste=None) pcb.add("pad_rect_smd", x=s1, y=-edge_space-h1/2, width=w1, height=h1, paste=None) if hole: pcb.add("rectangle", layer="copper1-bot", x=0.0, y=-edge_space-h2+h3/2, width=w3, height=h3, hole=True) return pcb
def smd_dual_generic(package_w=3.9, package_h=4.9, pin_w=0.43, pin_l=1.05, pad_w=0.6, pad_l=1.6, pad_offset=2.7, pad_pitch=1.27, pad_num=4): pcb = alterpcb_core.Pcb() for i in range(pad_num): yy = pad_pitch * (i - (pad_num - 1) / 2) pcb.add("pad_oval_smd", x=-pad_offset, y=yy, width=pad_l, height=pad_w) pcb.add("pad_oval_smd", x=pad_offset, y=yy, width=pad_l, height=pad_w) sw = pad_offset * 2 - pad_l - 0.6 sh = package_h - 0.2 pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=sw, height=sh, outline=0.2) pcb.add("circle", layer="silk-top", x=-sw / 2 + 0.5, y=sh / 2 - 0.5, radius=0.2) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=pad_offset * 2 + pad_l + 0.6, height=pad_pitch * pad_num, outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=package_w, height=package_h) for i in range(pad_num): yy = pad_pitch * (i - (pad_num - 1) / 2) pcb.add("rectangle", layer="mech1-top", x=-package_w / 2 - pin_l / 2, y=yy, width=pin_l, height=pin_w) pcb.add("rectangle", layer="mech1-top", x=package_w / 2 + pin_l / 2, y=yy, width=pin_l, height=pin_w) return pcb
def connector_generic_sma_edge(w1=2.0, h1=4.0, w2=0.8, h2=3.5, w3=1.35, h3=2.75, s1=3.0, hole=True, hole_w=9.0, hole_h=5.0, edge_space=0.5): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=0.0, y=-edge_space-h2/2, width=w2, height=h2, paste=None) pcb.add("pad_rect_smd_vias", x=-s1, y=-edge_space-h1/2, width=w1, height=h1, rows=3, cols=2, row_pitch=1.6, col_pitch=1.2, drill_diameter=0.4, outer_diameter=0.8, inner_diameter=0.8, hole_diameter=1.2, layers_pad=["copper1-top", "copper1-bot", "copper2-top"]) pcb.add("pad_rect_smd_vias", x=s1, y=-edge_space-h1/2, width=w1, height=h1, rows=3, cols=2, row_pitch=1.6, col_pitch=1.2, drill_diameter=0.4, outer_diameter=0.8, inner_diameter=0.8, hole_diameter=1.2, layers_pad=["copper1-top", "copper1-bot", "copper2-top"]) if hole: pcb.add("rectangle", layer="copper2-top", x=0.0, y=-edge_space-h2+h3/2, width=w3, height=h3, hole=True) pcb.add("rectangle", layer="copper2-bot", x=0.0, y=-hole_h/2, width=hole_w, height=hole_h, hole=True) return pcb
def inductor_wurth_rfh_1008(): pcb = alterpcb_core.Pcb() pcb.add("chip_generic_parametric", package_w=2.6, package_h=2.1, courtyard_w=3.8, courtyard_h=2.8, pad_w=1.0, pad_h=2.2, pad_offset=1.1) return pcb
def inductor_murata_lqh3np_1212(): pcb = alterpcb_core.Pcb() pcb.add("chip_generic_parametric", package_w=3.0, package_h=3.0, courtyard_w=3.8, courtyard_h=3.8, pad_w=1.0, pad_h=3.2, pad_offset=1.0) return pcb
def inductor_murata_lqh66s_2525(): pcb = alterpcb_core.Pcb() pcb.add("chip_generic_parametric", package_w=6.3, package_h=6.3, courtyard_w=7.2, courtyard_h=7.2, pad_w=2.0, pad_h=3.8, pad_offset=2.0) return pcb
def connector_generic_pin_header_vertical(rows=1, cols=4): (row_pitch, col_pitch) = (2.54, 2.54) pcb = alterpcb_core.Pcb() for i in range(rows): for j in range(cols): pcb.add("pad_circ_th", x=col_pitch*(j-(cols-1)/2), y=row_pitch*(i-(rows-1)/2), drill_diameter=1.0, outer_diameter=1.8, inner_diameter=1.8, hole_diameter=1.8) sw = col_pitch * cols sh = row_pitch * rows pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=sw, height=sh, outline=0.2) pcb.add("line", layer="silk-top", x1=-sw/2, y1=sh/2-0.8, x2=-sw/2+0.8, y2=sh/2, width=0.2) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=col_pitch*cols+0.8, height=row_pitch*rows+0.8, outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=col_pitch*cols, height=row_pitch*rows) return pcb
def pad_circ_th(drill_diameter=1.0, outer_diameter=1.8, inner_diameter=1.8, hole_diameter=1.8, layers_pad=["copper1-top", "copper1-bot"], mask=0.1): pcb = alterpcb_core.Pcb() pcb.add("circle", layer="drill-plated", x=0.0, y=0.0, radius=drill_diameter / 2, pad=True) for layer in layers_copper: if layer in layers_pad: if layer.startswith("copper1-"): pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=outer_diameter / 2, pad=True) else: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=inner_diameter / 2, pad=True) else: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=hole_diameter / 2, hole=True, order=-1, pad=True) pcb.add("circle", layer="mask-top", x=0.0, y=0.0, radius=outer_diameter / 2 + mask, pad=True) pcb.add("circle", layer="mask-bot", x=0.0, y=0.0, radius=outer_diameter / 2 + mask, pad=True) return pcb
def line(layer="copper1-top", x1=0.0, y1=0.0, x2=1.0, y2=1.0, width=1.0, hole=False, order=0): pcb = alterpcb_core.Pcb() pcb.add("polygon", layer=layer, x=[x1, x2], y=[y1, y2], closed=False, outline=width, hole=hole, order=order) return pcb
def chip_generic_parametric(package_w=2.0, package_h=1.0, courtyard_w=4.0, courtyard_h=2.0, pad_w=1.4, pad_h=1.4, pad_offset=1.0, mask=0.1, silk=True): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=-pad_offset, y=0.0, width=pad_w, height=pad_h, mask=mask) pcb.add("pad_rect_smd", x=pad_offset, y=0.0, width=pad_w, height=pad_h, mask=mask) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=courtyard_w, height=courtyard_h, outline=0.1) if silk: pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=courtyard_w, height=courtyard_h, outline=0.2) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=package_w, height=package_h) return pcb
def via_array(width=2.0, height=2.0, rows=2, cols=2, row_pitch=1.0, col_pitch=1.0, drill_diameter=0.4, outer_diameter=1.0, inner_diameter=1.0, hole_diameter=1.0, layers_pad=["copper1-top", "copper1-bot"], merge=True): pcb = alterpcb_core.Pcb() for i in range(rows): for j in range(cols): pcb.add("via", x=col_pitch * (j - (cols - 1) / 2), y=row_pitch * (i - (rows - 1) / 2), drill_diameter=drill_diameter, outer_diameter=outer_diameter, inner_diameter=inner_diameter, hole_diameter=hole_diameter, layers_pad=layers_pad) if merge: for layer in layers_copper: if layer in layers_pad: pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=width, height=height) else: pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=col_pitch * (cols - 1) + hole_diameter, height=row_pitch * (rows - 1) + hole_diameter, hole=True, order=-1) return pcb
def connector_samtec_fmc_hpc(mask=0.1, paste=0.1): pcb = alterpcb_core.Pcb() (rows, cols, row_pitch, col_pitch, pad_diameter) = (10, 40, 1.27, 1.27, 0.635) for i in range(rows): for j in range(cols): pcb.add("pad_circ_smd", x=col_pitch*(j-(cols-1)/2), y=row_pitch*(i-(rows-1)/2), diameter=pad_diameter, mask=mask, paste=paste) pcb.add("mechanical_hole", x=-2.141*25.4/2, y=-0.12*25.4, drill_diameter=1.27, hole_diameter=1.27+0.6) pcb.add("mechanical_hole", x= 2.141*25.4/2, y= 0.00*25.4, drill_diameter=1.27, hole_diameter=1.27+0.6) pcb.add("pad_circ_th", x=-31.5, y=-2.0, drill_diameter=3.2, outer_diameter=5.5, hole_diameter=5.2) pcb.add("pad_circ_th", x= 31.5, y=-2.0, drill_diameter=3.2, outer_diameter=5.5, hole_diameter=5.2) pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=2.196*25.4, height=0.578*25.4, outline=0.2) pcb.add("rectangle", layer="silk-top", x=(2.196+0.035)*25.4/2, y=0.0, width=0.035*25.4, height=0.060*25.4, outline=0.2) pcb.add("rectangle", layer="courtyard-top", x=0.45, y=0.0, width=58.7, height=16.7, outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=2.196*25.4, height=0.578*25.4) pcb.add("rectangle", layer="mech1-top", x=(2.196+0.035)*25.4/2, y=0.0, width=0.035*25.4, height=0.060*25.4) for i in range(rows): pcb.add("text", x=col_pitch*(cols/2+0.25), y=row_pitch*(i-(rows-1)/2), layer="mech2-top", text=alphabet[9-i], font="DejaVuSans", size=0.6, halign="center", valign="center", steps=4) for j in range(cols): pcb.add("text", x=col_pitch*(j-(cols-1)/2), y=row_pitch*(rows/2+0.25), layer="mech2-top", text=str(cols - j), font="DejaVuSans", size=0.6, halign="center", valign="center", steps=4) return pcb
def mark_copper_2(size=2.0): pcb = alterpcb_core.Pcb() pcb.add("rectangle", layer="mask-top", x=0.0, y=0.0, width=2.6 * size, height=size, hole=True, order=-1) pcb.add("rectangle", layer="mask-bot", x=0.0, y=0.0, width=2.6 * size, height=size, hole=True, order=-1) pcb.add("text", x=0.0, y=0.0, mirror=False, layer="copper1-top", text="TOP", font="DejaVuSans-Bold", size=size, halign="center", valign="center", spacing=0.05) pcb.add("text", x=0.0, y=0.0, mirror=True, layer="copper1-bot", text="BOT", font="DejaVuSans-Bold", size=size, halign="center", valign="center", spacing=0.05) return pcb
def lineartechnology_ltc2000(mask=0.05, paste=-0.025): pcb = alterpcb_core.Pcb() (rows, cols, row_pitch, col_pitch, pad_diameter) = (17, 10, 0.8, 0.8, 0.4) (package_w, package_h) = (9.0, 15.0) for i in range(rows): for j in range(cols): pcb.add("pad_circ_smd", x=col_pitch*(j-(cols-1)/2), y=row_pitch*(i-(rows-1)/2), diameter=pad_diameter, mask=mask, paste=paste) for sx in [-1, 1]: for sy in [-1, 1]: xx = list(sx * (package_w / 2 + numpy.array([ 0.2, 0.2, -0.2]))) yy = list(sy * (package_h / 2 + numpy.array([-0.2, 0.2, 0.2]))) pcb.add("polygon", layer="copper1-top", x=xx, y=yy, closed=False, outline=0.2) pcb.add("polygon", layer="mask-top", x=xx, y=yy, closed=False, outline=0.4) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=package_w+2.0, height=package_h+2.0, outline=0.1) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=package_w, height=package_h) for i in range(rows): pcb.add("text", layer="mech2-top", text=alphabet[rows-1-i], font="DejaVuSans", size=0.4, x=-col_pitch*(cols/2+0.25), y=row_pitch*(i-(rows-1)/2), halign="center", valign="center", steps=4) for j in range(cols): pcb.add("text", layer="mech2-top", text=str(j+1), font="DejaVuSans", size=0.4, x=col_pitch*(j-(cols-1)/2), y=row_pitch*(rows/2+0.25), halign="center", valign="center", steps=4) return pcb
def pad_circ_smd(diameter=1.0, mask=0.1, paste=0.0): pcb = alterpcb_core.Pcb() pcb.add("circle", layer="copper1-top", x=0.0, y=0.0, radius=diameter / 2, pad=True) pcb.add("circle", layer="mask-top", x=0.0, y=0.0, radius=diameter / 2 + mask, pad=True) if paste is not None: pcb.add("circle", layer="paste-top", x=0.0, y=0.0, radius=diameter / 2 + min(mask, 0) + paste, pad=True) return pcb
def via(drill_diameter=0.3, outer_diameter=0.6, inner_diameter=0.6, hole_diameter=0.9, layers_pad=["copper1-top", "copper1-bot"]): pcb = alterpcb_core.Pcb() pcb.add("circle", layer="drill-plated", x=0.0, y=0.0, radius=drill_diameter / 2, pad=True) for layer in layers_copper: if layer in layers_pad: if layer.startswith("copper1-"): pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=outer_diameter / 2, pad=True) else: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=inner_diameter / 2, pad=True) else: pcb.add("circle", layer=layer, x=0.0, y=0.0, radius=hole_diameter / 2, hole=True, order=-1, pad=True) return pcb
def arc(layer="copper1-top", x=0.0, y=0.0, radius=4.0, angle1=0.0, angle2=90.0, width=1.0, hole=False, order=0): pcb = alterpcb_core.Pcb() steps = max( 2, 1 + int(round(abs(angle1 - angle2) / alterpcb_core.circle_step))) angle = numpy.linspace(angle1 * math.pi / 180, angle2 * math.pi / 180, steps) pcb.add("polygon", layer=layer, x=list(x + radius * numpy.cos(angle)), y=list(y + radius * numpy.sin(angle)), closed=False, outline=width, hole=hole, order=order) return pcb
def inductor_panasonic_ell8tp(): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=2.9, y=2.9, width=3.0, height=1.65, angle=-45.0) pcb.add("pad_rect_smd", x=-2.9, y=-2.9, width=3.0, height=1.65, angle=-45.0) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=9.0, height=9.0, outline=0.1) pcb.add("polygon", layer="silk-top", x=[-1.3, 4.0, 4.0], y=[-4.0, -4.0, 1.3], closed=False, outline=0.2) pcb.add("polygon", layer="silk-top", x=[1.3, -4.0, -4.0], y=[4.0, 4.0, -1.3], closed=False, outline=0.2) #pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=9.0, height=9.0, outline=0.2) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=8.0, height=8.0) return pcb
def path(layer="copper1-top", x=[0.0, 0.0, 1.0, 1.0], y=[0.0, 1.0, 2.0, 3.0], width=[1.0], space=[], steps=16, centerline=0, hole=False, order=0): pcb = alterpcb_core.Pcb() (px, py) = alterpcb_core.equalize_arrays(x, y) if len(px) < 2: return pcb t = numpy.arange(steps + 1) / steps pathx = decasteljau(t, px) pathy = decasteljau(t, py) (tx1, ty1) = normalize(px[1] - px[0], py[1] - py[0]) (tx2, ty2) = normalize(px[-1] - px[-2], py[-1] - py[-2]) tracks = min(len(width), len(space) + 1) if tracks < 1: return pcb path_width = [ decasteljau(t, w) if type(w) == list else numpy.repeat(w, steps + 1) for w in width ] path_space = [ decasteljau(t, s) if type(s) == list else numpy.repeat(s, steps + 1) for s in space ] #span = numpy.zeros(steps + 1) #for track in range(tracks): #span += path_width[track] #if track != tracks - 1: #span += path_space[track] #path_shift = -span / 2 #for track in range(tracks): #path_shift += path_width[track] / 2 #(qx, qy) = shift_path(pathx, pathy, tx1, ty1, tx2, ty2, path_shift) #for i in range(len(qx)): #pcb.add("circle", layer=layer, x=qx[i], y=qy[i], radius=path_width[track][i]/2, hole=hole, order=order) ##(qx, qy) = stroke_path(pathx, pathy, tx1, ty1, tx2, ty2, path_width[track], path_shift) ##pcb.add("polygon", layer=layer, x=list(qx), y=list(qy), closed=True, hole=hole, order=order) #path_shift += path_width[track] / 2 #if track != tracks - 1: #path_shift += path_space[track] #(qx, qy) = shift_path(pathx, pathy, tx1, ty1, tx2, ty2, path_shift) # center line ci = max(0, min(tracks * 4 - 2, centerline + tracks * 2 - 1)) if ci % 4 == 1: (rx, ry) = stroke_path(pathx, pathy, tx1, ty1, tx2, ty2, path_width[ci // 4], numpy.zeros(steps + 1)) pcb.add("polygon", layer=layer, x=list(rx), y=list(ry), closed=True, hole=hole, order=order) # positive side (qx, qy) = (pathx, pathy) for ii in range(ci, tracks * 4 - 3): if ii % 4 == 0: (qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, path_width[ii // 4] / 2) (rx, ry) = stroke_path(qx, qy, tx1, ty1, tx2, ty2, path_width[ii // 4], numpy.zeros(steps + 1)) pcb.add("polygon", layer=layer, x=list(rx), y=list(ry), closed=True, hole=hole, order=order) elif ii % 4 == 1: (qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, path_width[ii // 4] / 2) elif ii % 4 == 2: (qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, path_space[ii // 4] / 2) else: (qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, path_space[ii // 4] / 2) # negative size (qx, qy) = (pathx, pathy) for ii in range(ci, 1, -1): if ii % 4 == 0: (qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, -path_space[ii // 4 - 1] / 2) elif ii % 4 == 1: (qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, -path_width[ii // 4] / 2) elif ii % 4 == 2: (qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, -path_width[ii // 4] / 2) (rx, ry) = stroke_path(qx, qy, tx1, ty1, tx2, ty2, path_width[ii // 4], numpy.zeros(steps + 1)) pcb.add("polygon", layer=layer, x=list(rx), y=list(ry), closed=True, hole=hole, order=order) else: (qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, -path_space[ii // 4] / 2) #for track in range(tracks): ##pcb.add("polygon", layer=layer, x=list(qx), y=list(qy), closed=False, outline=0.01, hole=hole, order=order) #(qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, path_width[track] / 2) #(rx, ry) = stroke_path(qx, qy, tx1, ty1, tx2, ty2, path_width[track], numpy.zeros(steps + 1)) #pcb.add("polygon", layer=layer, x=list(rx), y=list(ry), closed=True, hole=hole, order=order) #(qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, path_width[track] / 2) #if track != tracks - 1: #(qx, qy) = shift_path1(qx, qy, tx1, ty1, tx2, ty2, path_space[track] / 2) #(qx, qy) = shift_path2(qx, qy, tx1, ty1, tx2, ty2, path_space[track] / 2) return pcb
def ic_generic_qfn( package_w=6.0, package_h=6.0, center_w=4.6, center_h=4.6, pad_w=0.3, pad_l=0.8, pad_offset_x=3.0, pad_offset_y=3.0, pad_pitch_x=0.5, pad_pitch_y=0.5, pad_num_x=10, pad_num_y=10, # via_pitch_x=1.2, via_pitch_y=1.2, via_num_x=4, via_num_y=4, paste_num=3, center_mask=0.1, pad_mask=0.1, center_paste=-0.15, pad_paste=-0.025): pcb = alterpcb_core.Pcb() pcb.add("pad_rect_smd", x=0.0, y=0.0, width=center_w, height=center_h, mask=center_mask, paste=None) #for i in range(via_num_y): #for j in range(via_num_x): #(vx, vy) = (via_pitch_x*(j-(via_num_x-1)/2), via_pitch_y*(i-(via_num_y-1)/2)) # TODO: GND via here for i in range(paste_num): for j in range(paste_num): pcb.add("rectangle", layer="paste-top", x=center_w / paste_num * (j - (paste_num - 1) / 2), y=center_h / paste_num * (i - (paste_num - 1) / 2), width=center_w / paste_num + center_paste * 2, height=center_h / paste_num + center_paste * 2) for i in range(pad_num_x): pcb.add("pad_oval_smd", x=pad_pitch_x * (i - (pad_num_x - 1) / 2), y=-pad_offset_y, width=pad_w, height=pad_l, mask=pad_mask, paste=pad_paste) pcb.add("pad_oval_smd", x=pad_pitch_x * (i - (pad_num_x - 1) / 2), y=pad_offset_y, width=pad_w, height=pad_l, mask=pad_mask, paste=pad_paste) for i in range(pad_num_y): pcb.add("pad_oval_smd", y=pad_pitch_y * (i - (pad_num_y - 1) / 2), x=-pad_offset_x, height=pad_w, width=pad_l, mask=pad_mask, paste=pad_paste) pcb.add("pad_oval_smd", y=pad_pitch_y * (i - (pad_num_y - 1) / 2), x=pad_offset_x, height=pad_w, width=pad_l, mask=pad_mask, paste=pad_paste) pcb.add("rectangle", layer="courtyard-top", x=0.0, y=0.0, width=package_w + 1.4, height=package_h + 1.4, outline=0.1) pcb.add("rectangle", layer="silk-top", x=0.0, y=0.0, width=package_w + 1.4, height=package_h + 1.4, outline=0.2) pcb.add("circle", layer="silk-top", x=-package_w / 2 - 0.2, y=package_h / 2 + 0.2, radius=0.2) pcb.add("rectangle", layer="mech1-top", x=0.0, y=0.0, width=package_w, height=package_h) return pcb
def pad_rect_smd_vias(width=2.0, height=2.0, rows=2, cols=2, row_pitch=1.0, col_pitch=1.0, drill_diameter=0.4, outer_diameter=1.0, inner_diameter=1.0, hole_diameter=1.0, layers_pad=["copper1-top", "copper1-bot"], merge=True): pcb = alterpcb_core.Pcb() for i in range(rows): for j in range(cols): pcb.add("via", x=col_pitch * (j - (cols - 1) / 2), y=row_pitch * (i - (rows - 1) / 2), drill_diameter=drill_diameter, outer_diameter=outer_diameter, inner_diameter=inner_diameter, hole_diameter=hole_diameter, layers_pad=layers_pad) for layer in layers_copper: if layer in layers_pad: if layer == "copper1-top": pcb.add("pad_rect_smd", x=0.0, y=0.0, flip=False, width=width, height=height, paste=None) elif layer == "copper1-bot": pcb.add("pad_rect_smd", x=0.0, y=0.0, flip=True, width=width, height=height, paste=None) elif merge: #pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=col_pitch*(cols-1)+inner_diameter, height=row_pitch*(rows-1)+inner_diameter, pad=True) pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=width, height=height, pad=True) elif merge: pcb.add("rectangle", layer=layer, x=0.0, y=0.0, width=col_pitch * (cols - 1) + hole_diameter, height=row_pitch * (rows - 1) + hole_diameter, hole=True, order=-1, pad=True) return pcb
def solder_jumper(): pcb = alterpcb_core.Pcb() pcb.add("pad_oval_smd", x=-0.4, y=0.0, width=0.5, height=1.0) pcb.add("pad_oval_smd", x=0.4, y=0.0, width=0.5, height=1.0) return pcb
def text(x=0.0, y=0.0, angle=0.0, mirror=False, layer="silk-top", text="Text", font="DejaVuSans", size=2.0, halign="left", valign="baseline", spacing=0.0, steps=8, hole=False, order=0): pcb = alterpcb_core.Pcb() # load font if font not in loaded_fonts: loaded_fonts[font] = freetype.Face("fonts/%s.ttf" % (font)) face = loaded_fonts[font] xscale = size / face.units_per_EM yscale = size / face.units_per_EM # calculate total width total_width = 0.0 for ch in range(len(text)): face.load_char(text[ch], freetype.FT_LOAD_NO_HINTING | freetype.FT_LOAD_NO_SCALE) if ch != 0: kerning = face.get_kerning(text[ch - 1], text[ch], freetype.FT_KERNING_UNSCALED) total_width += kerning.x * xscale + spacing total_width += face.glyph.advance.x * xscale # calculate start position if halign == "left": pos_x = 0.0 elif halign == "center": pos_x = -total_width / 2 elif halign == "right": pos_x = -total_width else: raise Exception("Unknown horizontal alignment!") if valign == "baseline": pos_y = 0.0 elif valign == "top": pos_y = -face.ascender * yscale elif valign == "center": pos_y = -(face.ascender + face.descender) / 2 * yscale elif valign == "bottom": pos_y = -face.descender * yscale else: raise Exception("Unknown vertical alignment!") # convert to polygons for ch in range(len(text)): # load one glyph face.load_char(text[ch], freetype.FT_LOAD_NO_HINTING | freetype.FT_LOAD_NO_SCALE) outline = face.glyph.outline # move position if ch != 0: kerning = face.get_kerning(text[ch - 1], text[ch], freetype.FT_KERNING_UNSCALED) pos_x += kerning.x * xscale + spacing # add polygons start = 0 for contour in outline.contours: end = contour + 1 points = outline.points[start:end] tags = outline.tags[start:end] start = end oncurve = [bool((tags[i] >> 0) & 1) for i in range(len(points))] thirdorder = [bool((tags[i] >> 1) & 1) for i in range(len(points))] hasmode = [bool((tags[i] >> 2) & 1) for i in range(len(points))] mode = [(tags[i] >> 5) & 0x7 for i in range(len(points))] t = (numpy.arange(steps) + 1) / steps n = len(oncurve) px = [] py = [] for i in range(len(points)): if oncurve[i]: if oncurve[i - 1]: px.append(points[i][0]) py.append(points[i][1]) else: assert(not thirdorder[i]) x1 = points[i - 1][0] if oncurve[i - 1] else (points[i][0] + points[i - 1][0]) / 2 y1 = points[i - 1][1] if oncurve[i - 1] else (points[i][1] + points[i - 1][1]) / 2 x2 = points[i + 1 - n][0] if oncurve[i + 1 - n] else (points[i][0] + points[i + 1 - n][0]) / 2 y2 = points[i + 1 - n][1] if oncurve[i + 1 - n] else (points[i][1] + points[i + 1 - n][1]) / 2 xx = bezier2(x1, points[i][0], x2, t) yy = bezier2(y1, points[i][1], y2, t) px.extend(xx) py.extend(yy) hh = (1 if hole else 0) + (1 if polygon_direction(px, py) == "ccw" else 0) px = pos_x + numpy.array(px) * xscale py = pos_y + numpy.array(py) * yscale (px, py) = alterpcb_core.transform_point(px, py, 0.0, 0.0, x, y, angle, False, mirror) pcb.add("polygon", layer=layer, x=px, y=py, hole=bool(hh % 2), order=order + hh // 2) # move position again pos_x += face.glyph.advance.x * xscale return pcb