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
Beispiel #6
0
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
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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
Beispiel #14
0
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
Beispiel #21
0
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
Beispiel #27
0
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