Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 15603) +++ trunk/src/buffer.c (revision 15604) @@ -409,6 +409,7 @@ pcb_layergrp_id_t sgroup, cgroup; pcb_layer_t swap; +#if 0 PCB_ELEMENT_LOOP(Buffer->Data); { r_delete_element(Buffer->Data, element); @@ -415,6 +416,7 @@ pcb_element_mirror(Buffer->Data, element, 0); } PCB_END_LOOP; +#endif #warning subc TODO Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 15603) +++ trunk/src/draw.c (revision 15604) @@ -314,9 +314,7 @@ } gid = pcb_layergrp_get_top_paste(); - if (gid < 0) - paste_empty = pcb_layer_is_paste_auto_empty(PCB, PCB_COMPONENT_SIDE); - else + if (gid >= 0) paste_empty = pcb_layergrp_is_empty(PCB, gid); if ((gid >= 0) && (pcb_layer_gui_set_glayer(PCB, gid, paste_empty))) { pcb_draw_paste(PCB_COMPONENT_SIDE, drawn_area); @@ -324,9 +322,7 @@ } gid = pcb_layergrp_get_bottom_paste(); - if (gid < 0) - paste_empty = pcb_layer_is_paste_auto_empty(PCB, PCB_SOLDER_SIDE); - else + if (gid >= 0) paste_empty = pcb_layergrp_is_empty(PCB, gid); if ((gid >= 0) && (pcb_layer_gui_set_glayer(PCB, gid, paste_empty))) { pcb_draw_paste(PCB_SOLDER_SIDE, drawn_area); Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 15603) +++ trunk/src/layer.h (revision 15604) @@ -148,10 +148,6 @@ PCB_COMPONENT_SIDE = 1 } pcb_side_t; -/* Returns whether an auto paste layer is empty - it may be nonempty - only because of element-side-effects */ -pcb_bool pcb_layer_is_paste_auto_empty(pcb_board_t *pcb, pcb_side_t side); - /* Cached lookup of the first silk layer in the bottom or top group */ pcb_layer_id_t pcb_layer_get_bottom_silk(); pcb_layer_id_t pcb_layer_get_top_silk(); Index: trunk/src/obj_elem.c =================================================================== --- trunk/src/obj_elem.c (revision 15603) +++ trunk/src/obj_elem.c (revision 15604) @@ -59,11 +59,11 @@ #include "obj_elem_draw.h" /*** utility ***/ -/* loads element data from file/library into buffer - * parse the file with disabled 'PCB mode' (see parser) + +#warning subc TODO: move this to obj_subc.c +/* loads footprint data from file/library into buffer (as subcircuit) * returns pcb_false on error - * if successful, update some other stuff and reposition the pastebuffer - */ + * if successful, update some other stuff and reposition the pastebuffer */ pcb_bool pcb_element_load_to_buffer(pcb_buffer_t *Buffer, const char *Name, const char *fmt) { pcb_buffer_clear(PCB, Buffer); @@ -76,12 +76,7 @@ Buffer->Y = 0; Buffer->from_outside = 1; - if (elementlist_length(&Buffer->Data->Element)) { - pcb_element_t *element = elementlist_first(&Buffer->Data->Element); - Buffer->X = element->MarkX; - Buffer->Y = element->MarkY; - } - else if (pcb_subclist_length(&Buffer->Data->subc)) { + if (pcb_subclist_length(&Buffer->Data->subc)) { pcb_subc_t *subc = pcb_subclist_first(&Buffer->Data->subc); pcb_subc_get_origin(subc, &Buffer->X, &Buffer->Y); } @@ -93,7 +88,7 @@ return pcb_false; } - +#warning subc TODO: is this function needed? /* Searches for the given element by "footprint" name, and loads it into the buffer. Returns zero on success, non-zero on error. */ int pcb_element_load_footprint_by_name(pcb_buffer_t *Buffer, const char *Footprint) @@ -101,107 +96,6 @@ return !pcb_element_load_to_buffer(Buffer, Footprint, NULL); } - -/* break buffer element into pieces */ -pcb_bool pcb_element_smash_buffer(pcb_buffer_t *Buffer) -{ - pcb_element_t *element; - pcb_layergrp_id_t group, gbottom, gtop; - pcb_layer_t *clayer, *slayer; - char tmp[128]; - - if (elementlist_length(&Buffer->Data->Element) != 1) - return pcb_false; - - /* - * At this point the buffer should contain just a single element. - * Now we detach the single element from the buffer and then clear the - * buffer, ready to receive the smashed elements. As a result of detaching - * it the single element is orphaned from the buffer and thus will not be - * free()'d by pcb_data_free(called via ClearBuffer). This leaves it - * around for us to smash bits off it. It then becomes our responsibility, - * however, to free the single element when we're finished with it. - */ - element = elementlist_first(&Buffer->Data->Element); - elementlist_remove(element); - pcb_buffer_clear(PCB, Buffer); - PCB_ELEMENT_PCB_LINE_LOOP(element); - { - pcb_line_new(&Buffer->Data->SILKLAYER, - line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y, line->Thickness, 0, pcb_no_flags()); - if (line) - line->Number = pcb_strdup_null(PCB_ELEM_NAME_REFDES(element)); - } - PCB_END_LOOP; - PCB_ARC_LOOP(element); - { - pcb_arc_new(&Buffer->Data->SILKLAYER, - arc->X, arc->Y, arc->Width, arc->Height, arc->StartAngle, arc->Delta, arc->Thickness, 0, pcb_no_flags()); - } - PCB_END_LOOP; - PCB_PIN_LOOP(element); - { - pcb_pin_t *via; - pcb_flag_t f = pcb_no_flags(); - pcb_flag_add(f, PCB_FLAG_VIA); - if (PCB_FLAG_TEST(PCB_FLAG_HOLE, pin)) - f = pcb_flag_add(f, PCB_FLAG_HOLE); - - if (PCB_FLAG_TEST(PCB_FLAG_SQUARE, pin)) - f = pcb_flag_add(f, PCB_FLAG_SQUARE); - if (PCB_FLAG_TEST(PCB_FLAG_OCTAGON, pin)) - f = pcb_flag_add(f, PCB_FLAG_OCTAGON); - - via = pcb_via_new(Buffer->Data, pin->X, pin->Y, pin->Thickness, pin->Clearance, pin->Mask, pin->DrillingHole, pin->Number, f); - if (pin->Number != NULL) - pcb_attribute_put(&via->Attributes, "term", pin->Number); - if (pin->Flags.q != 0) { - char tmp[16]; - sprintf(tmp, "%d", pin->Flags.q); - pcb_attribute_put(&via->Attributes, "elem_smash_shape_id", tmp); - } - pcb_attribute_put(&via->Attributes, "elem_smash_pad", "1"); - pcb_sprintf(tmp, "%$mm", pin->Mask); - pcb_attribute_put(&pin->Attributes, "elem_smash_pad_mask", tmp); - } - PCB_END_LOOP; - - gbottom = gtop = -1; - pcb_layergrp_list(PCB, PCB_LYT_BOTTOM | PCB_LYT_COPPER, &gbottom, 1); - pcb_layergrp_list(PCB, PCB_LYT_TOP | PCB_LYT_COPPER, >op, 1); - - group = (PCB_SWAP_IDENT ? gbottom : gtop); - clayer = &Buffer->Data->Layer[PCB->LayerGroups.grp[group].lid[0]]; - group = (PCB_SWAP_IDENT ? gtop : gbottom); - slayer = &Buffer->Data->Layer[PCB->LayerGroups.grp[group].lid[0]]; - PCB_PAD_LOOP(element); - { - pcb_line_t *line; - line = pcb_line_new(PCB_FLAG_TEST(PCB_FLAG_ONSOLDER, pad) ? slayer : clayer, - pad->Point1.X, pad->Point1.Y, - pad->Point2.X, pad->Point2.Y, pad->Thickness, pad->Clearance, pcb_no_flags()); - if (line) { - line->Number = pcb_strdup_null(pad->Number); - if (pad->Number != NULL) - pcb_attribute_put(&line->Attributes, "term", pad->Number); - if (pad->Flags.q != 0) { - char tmp[16]; - sprintf(tmp, "%d", pad->Flags.q); - pcb_attribute_put(&line->Attributes, "elem_smash_shape_id", tmp); - } - if (PCB_FLAG_TEST(PCB_FLAG_SQUARE, pad)) - pcb_attribute_put(&line->Attributes, "elem_smash_shape_square", "1"); - if (PCB_FLAG_TEST(PCB_FLAG_NOPASTE, pad)) - pcb_attribute_put(&line->Attributes, "elem_smash_nopaste", "1"); - pcb_attribute_put(&line->Attributes, "elem_smash_pad", "1"); - pcb_sprintf(tmp, "%$mm", pad->Mask); - pcb_attribute_put(&line->Attributes, "elem_smash_pad_mask", tmp); - } - } - PCB_END_LOOP; - return pcb_true; -} - /* see if a polygon is a rectangle. If so, canonicalize it. */ static int polygon_is_rectangle(pcb_poly_t *poly) { @@ -231,511 +125,6 @@ return 0; } - -/* changes the side of the board an element is on; returns pcb_true if done */ -pcb_bool pcb_element_change_side(pcb_element_t *Element, pcb_coord_t yoff) -{ - if (PCB_FLAG_TEST(PCB_FLAG_LOCK, Element)) - return pcb_false; - pcb_elem_invalidate_erase(Element); -abort(); -/* pcb_undo_add_obj_to_mirror(PCB_TYPE_ELEMENT, Element, Element, Element, yoff);*/ -/* pcb_element_mirror(PCB->Data, Element, yoff);*/ - pcb_elem_invalidate_draw(Element); - return pcb_true; -} - -/* changes the side of all selected and visible elements; - returns pcb_true if anything has changed */ -pcb_bool pcb_selected_element_change_side(void) -{ - pcb_bool change = pcb_false; - - if (PCB->PinOn && pcb_silk_on(PCB)) - PCB_ELEMENT_LOOP(PCB->Data); - { - if (PCB_FLAG_TEST(PCB_FLAG_SELECTED, element)) { - change |= pcb_element_change_side(element, 0); - } - } - PCB_END_LOOP; - return change; -} - -/* changes the layout-name of an element */ -char *pcb_element_text_change(pcb_board_t * pcb, pcb_data_t * data, pcb_element_t *Element, int which, char *new_name) -{ - char *old = Element->Name[which].TextString; - - Element->Name[which].type = PCB_OBJ_ETEXT; - PCB_SET_PARENT(&Element->Name[which], element, Element); -#ifdef DEBUG - printf("In ChangeElementText, updating old TextString %s to %s\n", old, new_name); -#endif - - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_erase(Element); - - pcb_r_delete_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - - Element->Name[which].TextString = new_name; - pcb_text_bbox(pcb_font(PCB, 0, 1), &Element->Name[which]); - - pcb_r_insert_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_draw(Element); - - return old; -} - -void pcb_element_text_update(pcb_board_t *pcb, pcb_data_t *data, pcb_element_t *Element, int which) -{ - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_erase(Element); - - pcb_r_delete_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - pcb_text_bbox(pcb_font(PCB, 0, 1), &Element->Name[which]); - pcb_r_insert_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_draw(Element); -} - -void pcb_element_text_set_font(pcb_board_t *pcb, pcb_data_t *data, pcb_element_t *Element, int which, pcb_font_id_t fid) -{ - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_erase(Element); - - pcb_r_delete_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - Element->Name[which].fid = fid; - pcb_text_bbox(pcb_font(PCB, 0, 1), &Element->Name[which]); - pcb_r_insert_entry(data->name_tree[which], &Element->Name[which].BoundingBox); - - if (pcb && which == PCB_ELEMNAME_IDX_VISIBLE()) - pcb_elem_name_invalidate_draw(Element); -} - -/* creates a new textobject as part of an element - copies the values to the appropriate text object */ -void pcb_element_text_set(pcb_text_t *Text, pcb_font_t *PCBFont, pcb_coord_t X, pcb_coord_t Y, - unsigned Direction, const char *TextString, int Scale, pcb_flag_t Flags) -{ - free(Text->TextString); - Text->TextString = (TextString && *TextString) ? pcb_strdup(TextString) : NULL; - Text->X = X; - Text->Y = Y; - Text->Direction = Direction; - Text->Flags = Flags; - Text->Scale = Scale; - - /* calculate size of the bounding box */ - pcb_text_bbox(PCBFont, Text); - Text->ID = pcb_create_ID_get(); -} - -/* mirrors the coordinates of an element; an additional offset is passed */ -void pcb_element_mirror(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t yoff) -{ - r_delete_element(Data, Element); - PCB_ELEMENT_PCB_LINE_LOOP(Element); - { - line->Point1.X = PCB_SWAP_X(line->Point1.X); - line->Point1.Y = PCB_SWAP_Y(line->Point1.Y) + yoff; - line->Point2.X = PCB_SWAP_X(line->Point2.X); - line->Point2.Y = PCB_SWAP_Y(line->Point2.Y) + yoff; - } - PCB_END_LOOP; - PCB_PIN_LOOP(Element); - { - pcb_poly_restore_to_poly(Data, PCB_TYPE_PIN, Element, pin); - pin->X = PCB_SWAP_X(pin->X); - pin->Y = PCB_SWAP_Y(pin->Y) + yoff; - } - PCB_END_LOOP; - PCB_PAD_LOOP(Element); - { - pcb_poly_restore_to_poly(Data, PCB_TYPE_PAD, Element, pad); - pad->Point1.X = PCB_SWAP_X(pad->Point1.X); - pad->Point1.Y = PCB_SWAP_Y(pad->Point1.Y) + yoff; - pad->Point2.X = PCB_SWAP_X(pad->Point2.X); - pad->Point2.Y = PCB_SWAP_Y(pad->Point2.Y) + yoff; - PCB_FLAG_TOGGLE(PCB_FLAG_ONSOLDER, pad); - } - PCB_END_LOOP; - PCB_ARC_LOOP(Element); - { - arc->X = PCB_SWAP_X(arc->X); - arc->Y = PCB_SWAP_Y(arc->Y) + yoff; - arc->StartAngle = PCB_SWAP_ANGLE(arc->StartAngle); - arc->Delta = PCB_SWAP_DELTA(arc->Delta); - } - PCB_END_LOOP; - PCB_ELEMENT_PCB_TEXT_LOOP(Element); - { - text->X = PCB_SWAP_X(text->X); - text->Y = PCB_SWAP_Y(text->Y) + yoff; - PCB_FLAG_TOGGLE(PCB_FLAG_ONSOLDER, text); - } - PCB_END_LOOP; - Element->MarkX = PCB_SWAP_X(Element->MarkX); - Element->MarkY = PCB_SWAP_Y(Element->MarkY) + yoff; - - /* now toggle the solder-side flag */ - PCB_FLAG_TOGGLE(PCB_FLAG_ONSOLDER, Element); - /* this inserts all of the rtree data too */ - pcb_element_bbox(Data, Element, pcb_font(PCB, 0, 1)); - pcb_poly_clear_from_poly(Data, PCB_TYPE_ELEMENT, Element, Element); -} - -int pcb_element_is_empty(pcb_element_t *Element) -{ - return - (pinlist_length(&Element->Pin) == 0) - && (padlist_length(&Element->Pad) == 0) - && (linelist_length(&Element->Line) == 0) - && (arclist_length(&Element->Arc) == 0); -} - -/* sets the bounding box of an elements */ -void pcb_element_bbox(pcb_data_t *Data, pcb_element_t *Element, pcb_font_t *Font) -{ - pcb_box_t *box, *vbox; - - if (Data && Data->element_tree) - pcb_r_delete_entry(Data->element_tree, (pcb_box_t *) Element); - - if (pcb_element_is_empty(Element)) { - pcb_message(PCB_MSG_ERROR, "Internal error: can not calculate bounding box of empty element. Please report this bug.\n"); - assert(!"empty elem"); - return; - } - - /* first update the text objects */ - PCB_ELEMENT_PCB_TEXT_LOOP(Element); - { - if (Data && Data->name_tree[n]) - pcb_r_delete_entry(Data->name_tree[n], (pcb_box_t *) text); - pcb_text_bbox(Font, text); - if (Data && !Data->name_tree[n]) - Data->name_tree[n] = pcb_r_create_tree(); - if (Data) - pcb_r_insert_entry(Data->name_tree[n], (pcb_box_t *) text); - } - PCB_END_LOOP; - - /* do not include the elementnames bounding box which - * is handled separately - */ - box = &Element->BoundingBox; - vbox = &Element->VBox; - box->X1 = box->Y1 = PCB_MAX_COORD; - box->X2 = box->Y2 = 0; - PCB_ELEMENT_PCB_LINE_LOOP(Element); - { - pcb_line_bbox(line); - PCB_MAKE_MIN(box->X1, line->Point1.X - (line->Thickness + 1) / 2); - PCB_MAKE_MIN(box->Y1, line->Point1.Y - (line->Thickness + 1) / 2); - PCB_MAKE_MIN(box->X1, line->Point2.X - (line->Thickness + 1) / 2); - PCB_MAKE_MIN(box->Y1, line->Point2.Y - (line->Thickness + 1) / 2); - PCB_MAKE_MAX(box->X2, line->Point1.X + (line->Thickness + 1) / 2); - PCB_MAKE_MAX(box->Y2, line->Point1.Y + (line->Thickness + 1) / 2); - PCB_MAKE_MAX(box->X2, line->Point2.X + (line->Thickness + 1) / 2); - PCB_MAKE_MAX(box->Y2, line->Point2.Y + (line->Thickness + 1) / 2); - } - PCB_END_LOOP; - PCB_ARC_LOOP(Element); - { - pcb_arc_bbox(arc); - PCB_MAKE_MIN(box->X1, arc->BoundingBox.X1); - PCB_MAKE_MIN(box->Y1, arc->BoundingBox.Y1); - PCB_MAKE_MAX(box->X2, arc->BoundingBox.X2); - PCB_MAKE_MAX(box->Y2, arc->BoundingBox.Y2); - } - PCB_END_LOOP; - *vbox = *box; - PCB_PIN_LOOP(Element); - { - if (Data && Data->pin_tree) - pcb_r_delete_entry(Data->pin_tree, (pcb_box_t *) pin); - pcb_pin_bbox(pin); - if (Data) { - if (!Data->pin_tree) - Data->pin_tree = pcb_r_create_tree(); - pcb_r_insert_entry(Data->pin_tree, (pcb_box_t *) pin); - } - PCB_MAKE_MIN(box->X1, pin->BoundingBox.X1); - PCB_MAKE_MIN(box->Y1, pin->BoundingBox.Y1); - PCB_MAKE_MAX(box->X2, pin->BoundingBox.X2); - PCB_MAKE_MAX(box->Y2, pin->BoundingBox.Y2); - PCB_MAKE_MIN(vbox->X1, pin->X - pin->Thickness / 2); - PCB_MAKE_MIN(vbox->Y1, pin->Y - pin->Thickness / 2); - PCB_MAKE_MAX(vbox->X2, pin->X + pin->Thickness / 2); - PCB_MAKE_MAX(vbox->Y2, pin->Y + pin->Thickness / 2); - } - PCB_END_LOOP; - PCB_PAD_LOOP(Element); - { - if (Data && Data->pad_tree) - pcb_r_delete_entry(Data->pad_tree, (pcb_box_t *) pad); - pcb_pad_bbox(pad); - if (Data) { - if (!Data->pad_tree) - Data->pad_tree = pcb_r_create_tree(); - pcb_r_insert_entry(Data->pad_tree, (pcb_box_t *) pad); - } - PCB_MAKE_MIN(box->X1, pad->BoundingBox.X1); - PCB_MAKE_MIN(box->Y1, pad->BoundingBox.Y1); - PCB_MAKE_MAX(box->X2, pad->BoundingBox.X2); - PCB_MAKE_MAX(box->Y2, pad->BoundingBox.Y2); - PCB_MAKE_MIN(vbox->X1, MIN(pad->Point1.X, pad->Point2.X) - pad->Thickness / 2); - PCB_MAKE_MIN(vbox->Y1, MIN(pad->Point1.Y, pad->Point2.Y) - pad->Thickness / 2); - PCB_MAKE_MAX(vbox->X2, MAX(pad->Point1.X, pad->Point2.X) + pad->Thickness / 2); - PCB_MAKE_MAX(vbox->Y2, MAX(pad->Point1.Y, pad->Point2.Y) + pad->Thickness / 2); - } - PCB_END_LOOP; - /* now we set the PCB_FLAG_EDGE2 of the pad if Point2 - * is closer to the outside edge than Point1 - */ - PCB_PAD_LOOP(Element); - { - if (pad->Point1.Y == pad->Point2.Y) { - /* horizontal pad */ - if (box->X2 - pad->Point2.X < pad->Point1.X - box->X1) - PCB_FLAG_SET(PCB_FLAG_EDGE2, pad); - else - PCB_FLAG_CLEAR(PCB_FLAG_EDGE2, pad); - } - else { - /* vertical pad */ - if (box->Y2 - pad->Point2.Y < pad->Point1.Y - box->Y1) - PCB_FLAG_SET(PCB_FLAG_EDGE2, pad); - else - PCB_FLAG_CLEAR(PCB_FLAG_EDGE2, pad); - } - } - PCB_END_LOOP; - - /* mark pins with component orientation */ - if ((box->X2 - box->X1) > (box->Y2 - box->Y1)) { - PCB_PIN_LOOP(Element); - { - PCB_FLAG_SET(PCB_FLAG_EDGE2, pin); - } - PCB_END_LOOP; - } - else { - PCB_PIN_LOOP(Element); - { - PCB_FLAG_CLEAR(PCB_FLAG_EDGE2, pin); - } - PCB_END_LOOP; - } - pcb_close_box(box); - pcb_close_box(vbox); - if (Data && !Data->element_tree) - Data->element_tree = pcb_r_create_tree(); - if (Data) - pcb_r_insert_entry(Data->element_tree, box); -} - -static char *BumpName(char *Name) -{ - int num; - char c, *start; - static char temp[256]; - - start = Name; - /* seek end of string */ - while (*Name != 0) - Name++; - /* back up to potential number */ - for (Name--; isdigit((int) *Name); Name--); - Name++; - if (*Name) - num = atoi(Name) + 1; - else - num = 1; - c = *Name; - *Name = 0; - sprintf(temp, "%s%d", start, num); - /* if this is not our string, put back the blown character */ - if (start != temp) - *Name = c; - return temp; -} - - -/* make a unique name for the name on board - * this can alter the contents of the input string */ -char *pcb_element_uniq_name(pcb_data_t *Data, char *Name) -{ - pcb_bool unique = pcb_true; - /* null strings are ok */ - if (!Name || !*Name) - return Name; - - for (;;) { - PCB_ELEMENT_LOOP(Data); - { - if (PCB_ELEM_NAME_REFDES(element) && PCB_NSTRCMP(PCB_ELEM_NAME_REFDES(element), Name) == 0) { - Name = BumpName(Name); - unique = pcb_false; - break; - } - } - PCB_END_LOOP; - if (unique) - return Name; - unique = pcb_true; - } -} - -void r_delete_element(pcb_data_t * data, pcb_element_t * element) -{ - pcb_r_delete_entry(data->element_tree, (pcb_box_t *) element); - PCB_PIN_LOOP(element); - { - pcb_r_delete_entry(data->pin_tree, (pcb_box_t *) pin); - } - PCB_END_LOOP; - PCB_PAD_LOOP(element); - { - pcb_r_delete_entry(data->pad_tree, (pcb_box_t *) pad); - } - PCB_END_LOOP; - PCB_ELEMENT_PCB_TEXT_LOOP(element); - { - pcb_r_delete_entry(data->name_tree[n], (pcb_box_t *) text); - } - PCB_END_LOOP; -} - -/* Returns a best guess about the orientation of an element. The - * value corresponds to the rotation; a difference is the right value - * to pass to RotateElementLowLevel. However, the actual value is no - * indication of absolute rotation; only relative rotation is - * meaningful. - */ -int pcb_element_get_orientation(pcb_element_t * e) -{ - pcb_coord_t pin1x, pin1y, pin2x, pin2y, dx, dy; - pcb_bool found_pin1 = 0; - pcb_bool found_pin2 = 0; - - /* in case we don't find pin 1 or 2, make sure we have initialized these variables */ - pin1x = 0; - pin1y = 0; - pin2x = 0; - pin2y = 0; - - PCB_PIN_LOOP(e); - { - if (PCB_NSTRCMP(pin->Number, "1") == 0) { - pin1x = pin->X; - pin1y = pin->Y; - found_pin1 = 1; - } - else if (PCB_NSTRCMP(pin->Number, "2") == 0) { - pin2x = pin->X; - pin2y = pin->Y; - found_pin2 = 1; - } - } - PCB_END_LOOP; - - PCB_PAD_LOOP(e); - { - if (PCB_NSTRCMP(pad->Number, "1") == 0) { - pin1x = (pad->Point1.X + pad->Point2.X) / 2; - pin1y = (pad->Point1.Y + pad->Point2.Y) / 2; - found_pin1 = 1; - } - else if (PCB_NSTRCMP(pad->Number, "2") == 0) { - pin2x = (pad->Point1.X + pad->Point2.X) / 2; - pin2y = (pad->Point1.Y + pad->Point2.Y) / 2; - found_pin2 = 1; - } - } - PCB_END_LOOP; - - if (found_pin1 && found_pin2) { - dx = pin2x - pin1x; - dy = pin2y - pin1y; - } - else if (found_pin1 && (pin1x || pin1y)) { - dx = pin1x; - dy = pin1y; - } - else if (found_pin2 && (pin2x || pin2y)) { - dx = pin2x; - dy = pin2y; - } - else - return 0; - - if (coord_abs(dx) > coord_abs(dy)) - return dx > 0 ? 0 : 2; - return dy > 0 ? 3 : 1; -} - -/* moves a element by +-X and +-Y */ -void pcb_element_move(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t DX, pcb_coord_t DY) -{ - if (Data) - pcb_r_delete_entry(Data->element_tree, (pcb_box_t *) Element); - PCB_ELEMENT_PCB_LINE_LOOP(Element); - { - pcb_line_move(line, DX, DY); - } - PCB_END_LOOP; - PCB_PIN_LOOP(Element); - { - if (Data) { - pcb_r_delete_entry(Data->pin_tree, (pcb_box_t *) pin); - pcb_poly_restore_to_poly(Data, PCB_TYPE_PIN, Element, pin); - } - pcb_pin_move(pin, DX, DY); - if (Data) { - pcb_r_insert_entry(Data->pin_tree, (pcb_box_t *) pin); - pcb_poly_clear_from_poly(Data, PCB_TYPE_PIN, Element, pin); - } - } - PCB_END_LOOP; - PCB_PAD_LOOP(Element); - { - if (Data) { - pcb_r_delete_entry(Data->pad_tree, (pcb_box_t *) pad); - pcb_poly_restore_to_poly(Data, PCB_TYPE_PAD, Element, pad); - } - pcb_pad_move(pad, DX, DY); - if (Data) { - pcb_r_insert_entry(Data->pad_tree, (pcb_box_t *) pad); - pcb_poly_clear_from_poly(Data, PCB_TYPE_PAD, Element, pad); - } - } - PCB_END_LOOP; - PCB_ARC_LOOP(Element); - { - pcb_arc_move(arc, DX, DY); - } - PCB_END_LOOP; - PCB_ELEMENT_PCB_TEXT_LOOP(Element); - { - if (Data && Data->name_tree[n]) - pcb_r_delete_entry(PCB->Data->name_tree[n], (pcb_box_t *) text); - pcb_text_move(text, DX, DY); - if (Data && Data->name_tree[n]) - pcb_r_insert_entry(PCB->Data->name_tree[n], (pcb_box_t *) text); - } - PCB_END_LOOP; - PCB_BOX_MOVE_LOWLEVEL(&Element->BoundingBox, DX, DY); - PCB_BOX_MOVE_LOWLEVEL(&Element->VBox, DX, DY); - PCB_MOVE(Element->MarkX, Element->MarkY, DX, DY); - if (Data) - pcb_r_insert_entry(Data->element_tree, (pcb_box_t *) Element); -} - void *pcb_element_remove(pcb_element_t *Element) { void *res; @@ -799,17 +188,3 @@ return; pcb_text_invalidate_draw(NULL, &PCB_ELEM_TEXT_VISIBLE(PCB, Element)); } - -pcb_bool pcb_layer_is_paste_auto_empty(pcb_board_t *pcb, pcb_side_t side) -{ - pcb_bool paste_empty = pcb_true; - PCB_PAD_ALL_LOOP(pcb->Data); - { - if (PCB_ON_SIDE(pad, side) && !PCB_FLAG_TEST(PCB_FLAG_NOPASTE, pad) && pad->Mask > 0) { - paste_empty = pcb_false; - break; - } - } - PCB_ENDALL_LOOP; - return paste_empty; -} Index: trunk/src/obj_elem.h =================================================================== --- trunk/src/obj_elem.h (revision 15603) +++ trunk/src/obj_elem.h (revision 15604) @@ -52,52 +52,7 @@ gdl_elem_t link; }; -/* returns non-zero if the element has no objects in it */ -int pcb_element_is_empty(pcb_element_t *Element); - -void pcb_element_bbox(pcb_data_t *Data, pcb_element_t *Element, pcb_font_t *Font); -void pcb_element_rotate90(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t X, pcb_coord_t Y, unsigned Number); -void pcb_element_rotate(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t X, pcb_coord_t Y, double cosa, double sina, pcb_angle_t angle); - -pcb_bool pcb_element_change_side(pcb_element_t *Element, pcb_coord_t yoff); -pcb_bool pcb_selected_element_change_side(void); -/* Return a relative rotation for an element, useful only for - comparing two similar footprints. */ -int pcb_element_get_orientation(pcb_element_t * e); - -#if 0 -/* hash */ -unsigned int pcb_element_hash(const pcb_element_t *e); -int pcb_element_eq(const pcb_element_t *e1, const pcb_element_t *e2); -#endif - -pcb_bool pcb_element_load_to_buffer(pcb_buffer_t *Buffer, const char *Name, const char *fmt); -int pcb_element_load_footprint_by_name(pcb_buffer_t *Buffer, const char *Footprint); -pcb_bool pcb_element_smash_buffer(pcb_buffer_t *Buffer); -pcb_bool pcb_element_convert_from_buffer(pcb_buffer_t *Buffer); -pcb_element_t *pcb_element_copy(pcb_data_t *Data, pcb_element_t *Dest, pcb_element_t *Src, pcb_bool uniqueName, pcb_coord_t dx, pcb_coord_t dy); -char *pcb_element_uniq_name(pcb_data_t *Data, char *Name); - -void r_delete_element(pcb_data_t * data, pcb_element_t * element); - -void pcb_element_move(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t DX, pcb_coord_t DY); void *pcb_element_remove(pcb_element_t *Element); -void pcb_element_mirror(pcb_data_t *Data, pcb_element_t *Element, pcb_coord_t yoff); - -pcb_line_t *pcb_element_line_new(pcb_element_t *Element, pcb_coord_t X1, pcb_coord_t Y1, pcb_coord_t X2, pcb_coord_t Y2, pcb_coord_t Thickness); - -void pcb_element_text_set(pcb_text_t *Text, pcb_font_t *PCBFont, pcb_coord_t X, pcb_coord_t Y, - unsigned Direction, const char *TextString, int Scale, pcb_flag_t Flags); - - -/* Change the specified text on an element, either on the board (give - PCB, PCB->Data) or in a buffer (give NULL, Buffer->Data). The old - string is returned, and must be properly freed by the caller. */ -char *pcb_element_text_change(pcb_board_t * pcb, pcb_data_t * data, pcb_element_t *Element, int which, char *new_name); - -void pcb_element_text_set_font(pcb_board_t *pcb, pcb_data_t *data, pcb_element_t *Element, int which, pcb_font_id_t fid); -void pcb_element_text_update(pcb_board_t *pcb, pcb_data_t *data, pcb_element_t *Element, int which); - /* returns whether the silk group of the element's is visible */ #define pcb_element_silk_vis(elem) \ (PCB->LayerGroups.grp[((PCB_FLAG_TEST(PCB_FLAG_ONSOLDER, (elem))) ? pcb_layergrp_get_bottom_silk() : pcb_layergrp_get_top_silk())].vis) Index: trunk/src/obj_pad.c =================================================================== --- trunk/src/obj_pad.c (revision 15603) +++ trunk/src/obj_pad.c (revision 15604) @@ -280,7 +280,6 @@ Pad->Mask += value - Pad->Thickness; Pad->Thickness = value; /* SetElementBB updates all associated rtrees */ - pcb_element_bbox(PCB->Data, Element, pcb_font(PCB, 0, 1)); pcb_poly_clear_from_poly(PCB->Data, PCB_TYPE_PAD, Element, Pad); pcb_pad_invalidate_draw(Pad); return Pad; @@ -311,7 +310,6 @@ pcb_r_delete_entry(PCB->Data->pad_tree, &Pad->BoundingBox); Pad->Clearance = value; /* SetElementBB updates all associated rtrees */ - pcb_element_bbox(PCB->Data, Element, pcb_font(PCB, 0, 1)); pcb_poly_clear_from_poly(PCB->Data, PCB_TYPE_PAD, Element, Pad); pcb_pad_invalidate_draw(Pad); return Pad; Index: trunk/src/obj_pinvia.c =================================================================== --- trunk/src/obj_pinvia.c (revision 15603) +++ trunk/src/obj_pinvia.c (revision 15604) @@ -535,7 +535,6 @@ Pin->Mask += value - Pin->Thickness; Pin->Thickness = value; /* SetElementBB updates all associated rtrees */ - pcb_element_bbox(PCB->Data, Element, pcb_font(PCB, 0, 1)); pcb_poly_clear_from_poly(PCB->Data, PCB_TYPE_PIN, Element, Pin); pcb_pin_invalidate_draw(Pin); return Pin; @@ -565,7 +564,6 @@ pcb_r_delete_entry(PCB->Data->pin_tree, &Pin->BoundingBox); Pin->Clearance = value; /* SetElementBB updates all associated rtrees */ - pcb_element_bbox(PCB->Data, Element, pcb_font(PCB, 0, 1)); pcb_poly_clear_from_poly(PCB->Data, PCB_TYPE_PIN, Element, Pin); pcb_pin_invalidate_draw(Pin); return Pin; @@ -779,7 +777,6 @@ pcb_pin_invalidate_erase(Pin); pcb_r_delete_entry(PCB->Data->pin_tree, &Pin->BoundingBox); Pin->Mask = value; - pcb_element_bbox(PCB->Data, Element, pcb_font(PCB, 0, 1)); pcb_pin_invalidate_draw(Pin); return Pin; } Index: trunk/src/object_act.c =================================================================== --- trunk/src/object_act.c (revision 15603) +++ trunk/src/object_act.c (revision 15604) @@ -312,7 +312,6 @@ case F_SelectedElements: pcb_undo_save_serial(); pcb_selected_subc_change_side(); - pcb_selected_element_change_side(); pcb_undo_inc_serial(); pcb_draw(); break;