Example #1
0
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, &copy_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, &copy_pp, NULL);
  debug_log("Used translation-only replacement.\n");
  return True;
}
Example #2
0
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;
}
Example #3
0
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;
  }
}