Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 9016) +++ trunk/src/buffer.c (revision 9017) @@ -104,7 +104,7 @@ { if (Buffer && Buffer->Data) { pcb_data_free(Buffer->Data); - Buffer->Data->pcb = pcb; + PCB_SET_PARENT(Buffer->Data, board, pcb); } } @@ -215,7 +215,7 @@ Buffer->X = newPCB->CursorX; Buffer->Y = newPCB->CursorY; pcb_board_remove(newPCB); - Buffer->Data->pcb = pcb; + PCB_SET_PARENT(Buffer->Data, board, pcb); pcb_data_set_layer_parents(Buffer->Data); pcb_event(PCB_EVENT_LAYERS_CHANGED, NULL); /* undo the events generated on load */ return (pcb_true); @@ -224,7 +224,7 @@ /* release unused memory */ pcb_board_remove(newPCB); if (Buffer->Data != NULL) - Buffer->Data->pcb = pcb; + PCB_SET_PARENT(Buffer->Data, board, pcb); pcb_event(PCB_EVENT_LAYERS_CHANGED, NULL); /* undo the events generated on load */ return (pcb_false); } Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 9016) +++ trunk/src/data.c (revision 9017) @@ -347,7 +347,15 @@ { pcb_data_t *data; data = (pcb_data_t *) calloc(1, sizeof(pcb_data_t)); - data->pcb = (pcb_board_t *)parent; + if (parent != NULL) + PCB_SET_PARENT(data, board, parent); pcb_data_set_layer_parents(data); return data; } + +pcb_board_t *pcb_data_get_top(pcb_data_t *data) +{ + if (data->parent_type == PCB_PARENT_BOARD) + return data->parent.board; + return NULL; +} Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 9016) +++ trunk/src/data.h (revision 9017) @@ -54,7 +54,6 @@ ratlist_t Rat; /**/ - pcb_board_t *pcb; /* points to the top level board, across parents - used only for settings */ pcb_parenttype_t parent_type; pcb_parent_t parent; }; @@ -128,4 +127,9 @@ /* Make sure all layers of data has their .parent field pointing to the data */ void pcb_data_set_layer_parents(pcb_data_t *data); +/* Returns the top level pcb related to a data, or NULL if the data is floating + (e.g. is a global buffer) */ +pcb_board_t *pcb_data_get_top(pcb_data_t *data); + + #endif Index: trunk/src/data_parent.h =================================================================== --- trunk/src/data_parent.h (revision 9016) +++ trunk/src/data_parent.h (revision 9017) @@ -33,7 +33,8 @@ PCB_PARENT_INVALID = 0, /* invalid or unknown */ PCB_PARENT_LAYER, /* object is on a layer */ PCB_PARENT_ELEMENT, /* object is part of an element */ - PCB_PARENT_DATA /* global objects like via */ + PCB_PARENT_DATA, /* global objects like via */ + PCB_PARENT_BOARD /* directly under a board (typical for pcb_data_t of a board) */ } pcb_parenttype_t; /* class is e.g. PCB_OBJ_CLASS_OBJ */ @@ -44,11 +45,13 @@ pcb_layer_t *layer; pcb_data_t *data; pcb_element_t *element; + pcb_board_t *board; }; #define PCB_PARENT_TYPENAME_layer PCB_PARENT_LAYER #define PCB_PARENT_TYPENAME_data PCB_PARENT_DATA #define PCB_PARENT_TYPENAME_element PCB_PARENT_ELEMENT +#define PCB_PARENT_TYPENAME_board PCB_PARENT_BOARD #define PCB_SET_PARENT(obj, ptype, parent_ptr) \ do { \ Index: trunk/src/layer_grp.h =================================================================== --- trunk/src/layer_grp.h (revision 9016) +++ trunk/src/layer_grp.h (revision 9017) @@ -141,11 +141,12 @@ #define PCB_COPPER_GROUP_LOOP(data, group) do { \ pcb_cardinal_t entry; \ - for (entry = 0; entry < ((pcb_board_t *)(data->pcb))->LayerGroups.grp[(group)].len; entry++) \ + pcb_board_t *cgl__pcb = pcb_data_get_top(data); \ + for (entry = 0; entry < ((pcb_board_t *)(cgl__pcb))->LayerGroups.grp[(group)].len; entry++) \ { \ pcb_layer_t *layer; \ pcb_layer_id_t number; \ - number = ((pcb_board_t *)(data->pcb))->LayerGroups.grp[(group)].lid[entry]; \ + number = ((pcb_board_t *)(cgl__pcb))->LayerGroups.grp[(group)].lid[entry]; \ if (!(pcb_layer_flags(PCB, number) & PCB_LYT_COPPER)) \ continue; \ layer = &data->Layer[number]; Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 9016) +++ trunk/src/polygon.c (revision 9017) @@ -807,7 +807,7 @@ if (pin->Clearance == 0) return 0; i = pcb_layer_id(d, l); - np = pin_clearance_poly(i, d->pcb, pin); + np = pin_clearance_poly(i, pcb_data_get_top(d), pin); if (PCB_FLAG_THERM_TEST(i, pin)) { if (!np) @@ -910,7 +910,7 @@ return PCB_R_DIR_NOT_FOUND; i = pcb_layer_id(info->data, info->layer); if (PCB_FLAG_THERM_TEST(i, pin)) { - np = ThermPoly((pcb_board_t *) (info->data->pcb), pin, i); + np = ThermPoly(pcb_data_get_top(info->data), pin, i); if (!np) return PCB_R_DIR_FOUND_CONTINUE; } Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 9016) +++ trunk/src_plugins/io_pcb/file.c (revision 9017) @@ -641,7 +641,7 @@ yyFont = &yyPCB->fontkit.dflt; yyData = yyPCB->Data; - yyData->pcb = yyPCB; + PCB_SET_PARENT(yyData, board, yyPCB); yyData->LayerN = 0; } Index: trunk/src_plugins/io_pcb/parse_y.c =================================================================== --- trunk/src_plugins/io_pcb/parse_y.c (revision 9016) +++ trunk/src_plugins/io_pcb/parse_y.c (revision 9017) @@ -1804,7 +1804,7 @@ yyFont = &yyPCB->fontkit.dflt; yyFontkitValid = &yyPCB->fontkit.valid; yyData = yyPCB->Data; - yyData->pcb = yyPCB; + PCB_SET_PARENT(yyData, board, yyPCB); yyData->LayerN = 0; yyPCB->NetlistPatches = yyPCB->NetlistPatchLast = NULL; layer_group_string = NULL; Index: trunk/src_plugins/io_pcb/parse_y.y =================================================================== --- trunk/src_plugins/io_pcb/parse_y.y (revision 9016) +++ trunk/src_plugins/io_pcb/parse_y.y (revision 9017) @@ -180,7 +180,7 @@ yyFont = &yyPCB->fontkit.dflt; yyFontkitValid = &yyPCB->fontkit.valid; yyData = yyPCB->Data; - yyData->pcb = yyPCB; + PCB_SET_PARENT(yyData, board, yyPCB); yyData->LayerN = 0; yyPCB->NetlistPatches = yyPCB->NetlistPatchLast = NULL; layer_group_string = NULL; Index: trunk/src_plugins/lib_gtk_common/dlg_propedit.c =================================================================== --- trunk/src_plugins/lib_gtk_common/dlg_propedit.c (revision 9016) +++ trunk/src_plugins/lib_gtk_common/dlg_propedit.c (revision 9017) @@ -322,8 +322,8 @@ preview_pcb.LayerGroups.grp[0].lid[0] = 0; preview_pcb.LayerGroups.grp[0].len = 1; preview_pcb.LayerGroups.len = 1; - preview_pcb.Data->pcb = &preview_pcb; - preview_pcb.Data->Layer[0].parent = &preview_pcb.Data; + PCB_SET_PARENT(preview_pcb.Data, board, &preview_pcb); + preview_pcb.Data->Layer[0].parent = preview_pcb.Data; #warning TODO: preview_pcb is never freed