diff --git a/.scripts/foot_gen.py b/.scripts/foot_gen.py index a392155..89d8c83 100644 --- a/.scripts/foot_gen.py +++ b/.scripts/foot_gen.py @@ -47,12 +47,16 @@ for item in pcb.GetDrawings(): continue # Path to substitue footprint ref = sp[0] - foot_sp = sp[1].split(',') + foot_sp = sp[1].split(';') foot = foot_sp[0].strip() offset = (0,0) # Optional offset tuple 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] # pins = sp[1] @@ -118,6 +122,8 @@ for foot in saved: # Flip the net assignments of the pads pad_map = {} for pad in load_foot.Pads(): + if len(pad.GetNumber()) == 0: + continue # Check position diff from old # to new new_cent = pad.GetCenter() @@ -133,6 +139,11 @@ for foot in saved: match_pad = pads[i][2:] pad.SetNet(match_pad[0]) 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]) 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)) # create pads +print(sorted_foots) pad_cnt = 0 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(): cent = ToMM(pad.GetCenter() - brd_cent) pad_size = ToMM(pad.GetSize()) @@ -200,7 +220,10 @@ for [foot, pad_map] in sorted_foots: pad_layers = Pad.LAYERS_THT if attr_type == pcbnew.PAD_ATTRIB_SMD: 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: pad_type = Pad.TYPE_NPTH pad_layers = Pad.LAYERS_NPTH @@ -208,6 +231,10 @@ for [foot, pad_map] in sorted_foots: pad_type = Pad.TYPE_CONNECT pad_layers = Pad.LAYERS_NPTH + if pad.IsAperturePad(): + pad_layers = ["F.Paste"] + + primitives = [] pad_shape = Pad.SHAPE_RECT if shape_type == pcbnew.PAD_SHAPE_CIRCLE: pad_shape = Pad.SHAPE_CIRCLE @@ -219,9 +246,21 @@ for [foot, pad_map] in sorted_foots: pad_shape = Pad.SHAPE_ROUNDRECT elif shape_type == pcbnew.PAD_SHAPE_CUSTOM: pad_shape = Pad.SHAPE_CUSTOM - - 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)) - pad_cnt += len(foot.Pads()) + # print(dir(pad.GetPrimitives())) + # for prim in pad.GetPrimitives(): + # 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"