static void replace_one_footprint_aux(ElementTypePtr old_element, PadOrPinType* old1_pp, PadOrPinType* old2_pp, ElementTypePtr copy_element, PadOrPinType* copy1_pp, PadOrPinType* copy2_pp) { Boolean two_points = (old2_pp && copy2_pp); Boolean reflect = IS_REFLECTED(copy_element, old_element); debug_log("Reflect?: %s\n", (reflect ? "yes" : "no")); if (reflect) { /* Change side of board */ ChangeElementSide(copy_element, 0); } CheapPointType copy1_pt = pad_or_pin_center(copy1_pp); CheapPointType old1_pt = pad_or_pin_center(old1_pp); BYTE rot_steps = 0; if (two_points) { /* Calculate nearest rotation steps */ CheapPointType copy2_pt = pad_or_pin_center(copy2_pp); CheapPointType old2_pt = pad_or_pin_center(old2_pp); rot_steps = calculate_rotation_steps(copy1_pt, copy2_pt, old1_pt, old2_pt); } if (rot_steps) { /* Rotate copy */ RotateElementLowLevel(PCB->Data, copy_element, 0, 0, rot_steps); /* Recalculate since copy_element has changed. */ copy1_pt = pad_or_pin_center(copy1_pp); } /* Calculate translation */ LocationType dx = old1_pt.X - copy1_pt.X; LocationType dy = old1_pt.Y - copy1_pt.Y; /* Move element */ MoveElementLowLevel(PCB->Data, copy_element, dx, dy); /* Transfer pad/pin text and names. */ transfer_text(old_element, copy_element); transfer_names(old_element, copy_element); transfer_flags(old_element, copy_element); SetElementBoundingBox(PCB->Data, copy_element, &PCB->Font); AddObjectToCreateUndoList(ELEMENT_TYPE, copy_element, copy_element, copy_element); /* Remove old element. */ MoveObjectToRemoveUndoList(ELEMENT_TYPE, old_element, old_element, old_element); }
void read_program() { while(pc<ending) { if (*pc++!=1) pc+=2; else { transfer_text(pc,buff); if (print2!=print_it) abort(); if (print_it || all_print=='V') { printf(" "); puts(buff); if (print_it) puts("<print>"); } pc=strchr(pc,0)+1; } } }