Update footprint gen script to better deal with mounting holes

This commit is contained in:
ac
2024-03-13 22:17:22 +10:00
parent e2cbf1696c
commit e927efbc22

View File

@@ -47,12 +47,16 @@ for item in pcb.GetDrawings():
continue continue
# Path to substitue footprint # Path to substitue footprint
ref = sp[0] ref = sp[0]
foot_sp = sp[1].split(',') foot_sp = sp[1].split(';')
foot = foot_sp[0].strip() foot = foot_sp[0].strip()
offset = (0,0) offset = (0,0)
# Optional offset tuple # Optional offset tuple
if len(foot_sp) == 2: if len(foot_sp) == 2:
offset = tuple(foot_sp[1]) print("Foot sp: ", foot_sp)
offset = foot_sp[1].strip(" ()").split(',')
print("Offset: ", offset)
offset[0] = FromMM(float(offset[0]))
offset[1] = FromMM(float(offset[1]))
new_foots[ref] = [foot, offset] new_foots[ref] = [foot, offset]
# pins = sp[1] # pins = sp[1]
@@ -118,6 +122,8 @@ for foot in saved:
# Flip the net assignments of the pads # Flip the net assignments of the pads
pad_map = {} pad_map = {}
for pad in load_foot.Pads(): for pad in load_foot.Pads():
if len(pad.GetNumber()) == 0:
continue
# Check position diff from old # Check position diff from old
# to new # to new
new_cent = pad.GetCenter() new_cent = pad.GetCenter()
@@ -133,6 +139,11 @@ for foot in saved:
match_pad = pads[i][2:] match_pad = pads[i][2:]
pad.SetNet(match_pad[0]) pad.SetNet(match_pad[0])
pad_map[pad.GetNumber()] = match_num pad_map[pad.GetNumber()] = match_num
elif "mounting" in str(foot.GetKeywords()).lower():
match_num = pads[0][0]
match_pad = pads[0][2:]
pad.SetNet(match_pad[0])
pad_map[pad.GetNumber()] = match_num
sorted_foots.append([load_foot, pad_map]) sorted_foots.append([load_foot, pad_map])
pcb.Add(load_foot) pcb.Add(load_foot)
@@ -186,8 +197,17 @@ kicad_mod.append(RectLine(start=[-brd_width/2,-brd_height/2], end=[brd_width/2,b
kicad_mod.append(RectLine(start=[-brd_width/2,-brd_height/2], end=[brd_width/2,brd_height/2], layer='F.CrtYd', width=0.05, offset=0.5)) kicad_mod.append(RectLine(start=[-brd_width/2,-brd_height/2], end=[brd_width/2,brd_height/2], layer='F.CrtYd', width=0.05, offset=0.5))
# create pads # create pads
print(sorted_foots)
pad_cnt = 0 pad_cnt = 0
for [foot, pad_map] in sorted_foots: for [foot, pad_map] in sorted_foots:
mounting_flag = "mounting" in str(foot.GetKeywords()).lower()
custom_paste_flag = False
if mounting_flag:
for pad in foot.Pads():
if pad.IsAperturePad():
custom_paste_flag = True
real_pads = 0
for pad in foot.Pads(): for pad in foot.Pads():
cent = ToMM(pad.GetCenter() - brd_cent) cent = ToMM(pad.GetCenter() - brd_cent)
pad_size = ToMM(pad.GetSize()) pad_size = ToMM(pad.GetSize())
@@ -200,7 +220,10 @@ for [foot, pad_map] in sorted_foots:
pad_layers = Pad.LAYERS_THT pad_layers = Pad.LAYERS_THT
if attr_type == pcbnew.PAD_ATTRIB_SMD: if attr_type == pcbnew.PAD_ATTRIB_SMD:
pad_type = Pad.TYPE_SMT pad_type = Pad.TYPE_SMT
pad_layers = Pad.LAYERS_SMT if custom_paste_flag:
pad_layers = ["F.Cu", "F.Mask"]
else:
pad_layers = Pad.LAYERS_SMT
elif attr_type == pcbnew.PAD_ATTRIB_NPTH: elif attr_type == pcbnew.PAD_ATTRIB_NPTH:
pad_type = Pad.TYPE_NPTH pad_type = Pad.TYPE_NPTH
pad_layers = Pad.LAYERS_NPTH pad_layers = Pad.LAYERS_NPTH
@@ -208,6 +231,10 @@ for [foot, pad_map] in sorted_foots:
pad_type = Pad.TYPE_CONNECT pad_type = Pad.TYPE_CONNECT
pad_layers = Pad.LAYERS_NPTH pad_layers = Pad.LAYERS_NPTH
if pad.IsAperturePad():
pad_layers = ["F.Paste"]
primitives = []
pad_shape = Pad.SHAPE_RECT pad_shape = Pad.SHAPE_RECT
if shape_type == pcbnew.PAD_SHAPE_CIRCLE: if shape_type == pcbnew.PAD_SHAPE_CIRCLE:
pad_shape = Pad.SHAPE_CIRCLE pad_shape = Pad.SHAPE_CIRCLE
@@ -219,9 +246,21 @@ for [foot, pad_map] in sorted_foots:
pad_shape = Pad.SHAPE_ROUNDRECT pad_shape = Pad.SHAPE_ROUNDRECT
elif shape_type == pcbnew.PAD_SHAPE_CUSTOM: elif shape_type == pcbnew.PAD_SHAPE_CUSTOM:
pad_shape = Pad.SHAPE_CUSTOM pad_shape = Pad.SHAPE_CUSTOM
# print(dir(pad.GetPrimitives()))
kicad_mod.append(Pad(number=pad_cnt + int(pad_map[curr_pad_num]), type=pad_type, shape=pad_shape, at=list(cent), size=list(pad_size), drill=list(drill_size), layers=pad_layers)) # for prim in pad.GetPrimitives():
pad_cnt += len(foot.Pads()) # shape = prim.GetEffectiveShape()
# print("Shape: ", shape)
pad_number = ""
if len(pad.GetNumber()) > 0:
pad_number = pad_cnt + int(pad_map[curr_pad_num])
final_pad = Pad(number=pad_number, type=pad_type, shape=pad_shape, at=list(cent), size=list(pad_size), drill=list(drill_size), layers=pad_layers)
for prim in primitives:
final_pad.addPrimitive(prim)
kicad_mod.append(final_pad)
real_pads += len(pad.GetNumber()) > 0
pad_cnt += real_pads
final_model_path = "${KIPRJMOD}/../libs/melon3d/" + foot_path + ".3dshapes/" + foot_name + ".step" final_model_path = "${KIPRJMOD}/../libs/melon3d/" + foot_path + ".3dshapes/" + foot_name + ".step"