static Boolean replace_one_footprint_translate_only(ElementTypePtr old_element, ElementTypePtr new_element) { /* Just requires one corresponding pad/pin. Does no rotations. */ if (! have_any_corresponding_pad_or_pin(old_element, new_element, NULL, NULL)) { return False; } /* Create copy of new element. */ ElementTypePtr copy_element = CopyElementLowLevel(PCB->Data, NULL, new_element, False, 0, 0); PadOrPinType old_pp = make_pad_or_pin(NULL, NULL); PadOrPinType copy_pp = make_pad_or_pin(NULL, NULL); if (! have_any_corresponding_pad_or_pin(old_element, copy_element, &old_pp, ©_pp)) { base_log("Error: Couldn't find any corresponding pads or pins."); return False; } replace_one_footprint_aux(old_element, &old_pp, NULL, copy_element, ©_pp, NULL); debug_log("Used translation-only replacement.\n"); return True; }
static bool have_two_corresponding_aux (ElementType *old_element, ElementType *new_element, bool unique, bool non_coincident, PadOrPinType* old1_pp_ptr, PadOrPinType* old2_pp_ptr, PadOrPinType* new1_pp_ptr, PadOrPinType* new2_pp_ptr) { PadOrPinType old1_pp = make_pad_or_pin(NULL, NULL); PadOrPinType new1_pp = make_pad_or_pin(NULL, NULL); bool first_found = false; PAD_OR_PIN_LOOP_HYG(old_element, _old); { if (! unique || is_number_unique(old_element, pad_or_pin_number(&pp_old))) { CheapPointType old_pt = pad_or_pin_center(&pp_old); PAD_OR_PIN_LOOP_HYG(new_element, _new); { if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0 && (! unique || is_number_unique(new_element, pad_or_pin_number(&pp_new)))) { CheapPointType new_pt = pad_or_pin_center(&pp_new); if (! non_coincident || point_distance2(old_pt, new_pt)) { if (! first_found) { old1_pp = pp_old; new1_pp = pp_new; first_found = true; } else { if (old1_pp_ptr) { *old1_pp_ptr = old1_pp; } if (new1_pp_ptr) { *new1_pp_ptr = new1_pp; } if (old2_pp_ptr) { *old2_pp_ptr = pp_old; } if (new2_pp_ptr) { *new2_pp_ptr = pp_new; } return true; } } } } END_LOOP; } } END_LOOP; return false; }
bool find_pad_or_pin(ElementType *element, const char* number, PadOrPinType* pp_ptr) { PadOrPinType pp = make_pad_or_pin(NULL, NULL); if (number && ((pp.pad = find_pad(element, number)) || (pp.pin = find_pin(element, number)))) { *pp_ptr = pp; return true; } else { return false; } }