Index: trunk/src/extobj.c =================================================================== --- trunk/src/extobj.c (revision 28899) +++ trunk/src/extobj.c (revision 28900) @@ -105,7 +105,7 @@ return NULL; } -pcb_extobj_float_new_spawn(pcb_extobj_t *eo, pcb_subc_t *subc_copy_from, pcb_any_obj_t *edit_obj) +void pcb_extobj_float_new_spawn(pcb_extobj_t *eo, pcb_subc_t *subc_copy_from, pcb_any_obj_t *edit_obj) { pcb_data_t *data = pcb_extobj_parent_data(edit_obj); pcb_board_t *pcb; @@ -119,7 +119,7 @@ save = subc_copy_from->extobj; subc_copy_from->extobj = NULL; PCB_FLAG_CLEAR(PCB_FLAG_FLOATER, edit_obj); - sc = pcb_extobj_conv_obj(pcb, eo, pcb->Data, edit_obj, 1); + sc = pcb_extobj_conv_obj_using(pcb, eo, pcb->Data, edit_obj, 1, subc_copy_from); pcb_subc_copy_meta(sc, subc_copy_from); subc_copy_from->extobj = save; } @@ -133,7 +133,7 @@ eo->del_pre(sc); } -static pcb_subc_t *pcb_extobj_conv_list(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, vtp0_t *list, pcb_bool remove) +static pcb_subc_t *pcb_extobj_conv_list(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, vtp0_t *list, pcb_bool remove, pcb_subc_t *copy_from) { pcb_subc_t *res; @@ -140,7 +140,7 @@ if ((eo->conv_objs == NULL) || (list->used == 0)) return NULL; - res = eo->conv_objs(dst, list); + res = eo->conv_objs(dst, list, copy_from); if ((res != NULL) && remove) { long n; @@ -153,7 +153,7 @@ return res; } -static pcb_subc_t *pcb_extobj_conv_flag_objs(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove, pcb_flag_values_t flg) +static pcb_subc_t *pcb_extobj_conv_flag_objs_using(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove, pcb_flag_values_t flg, pcb_subc_t *copy_from) { vtp0_t list; pcb_subc_t *res; @@ -160,7 +160,7 @@ vtp0_init(&list); pcb_data_list_by_flag(src, &list, PCB_OBJ_ANY, flg); - res = pcb_extobj_conv_list(pcb, eo, dst, &list, remove); + res = pcb_extobj_conv_list(pcb, eo, dst, &list, remove, copy_from); vtp0_uninit(&list); return res; @@ -168,16 +168,16 @@ pcb_subc_t *pcb_extobj_conv_selected_objs(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove) { - return pcb_extobj_conv_flag_objs(pcb, eo, dst, src, remove, PCB_FLAG_SELECTED); + return pcb_extobj_conv_flag_objs_using(pcb, eo, dst, src, remove, PCB_FLAG_SELECTED, NULL); } pcb_subc_t *pcb_extobj_conv_all_objs(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove) { - return pcb_extobj_conv_flag_objs(pcb, eo, dst, src, remove, 0); + return pcb_extobj_conv_flag_objs_using(pcb, eo, dst, src, remove, 0, NULL); } -pcb_subc_t *pcb_extobj_conv_obj(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_any_obj_t *src, pcb_bool remove) +pcb_subc_t *pcb_extobj_conv_obj_using(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_any_obj_t *src, pcb_bool remove, pcb_subc_t *copy_from) { vtp0_t list; pcb_subc_t *res; @@ -184,7 +184,7 @@ vtp0_init(&list); vtp0_append(&list, src); - res = pcb_extobj_conv_list(pcb, eo, dst, &list, remove); + res = pcb_extobj_conv_list(pcb, eo, dst, &list, remove, copy_from); vtp0_uninit(&list); return res; @@ -191,3 +191,7 @@ } +pcb_subc_t *pcb_extobj_conv_obj(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_any_obj_t *src, pcb_bool remove) +{ + return pcb_extobj_conv_obj_using(pcb, eo, dst, src, remove, NULL); +} Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28899) +++ trunk/src/extobj.h (revision 28900) @@ -60,7 +60,7 @@ pcb_extobj_del_t (*float_del)(pcb_subc_t *subc, pcb_any_obj_t *floater); /* called when a floater object is to be removed; returns what the core should do; if not specified: remove the subc */ void (*chg_attr)(pcb_subc_t *subc, const char *key, const char *value); /* called after an attribute changed; value == NULL means attribute is deleted */ void (*del_pre)(pcb_subc_t *subc); /* called before the extobj subcircuit is deleted - should free any internal cache, but shouldn't delete the subcircuit */ - pcb_subc_t *(*conv_objs)(pcb_data_t *dst, vtp0_t *objs); /* called to convert objects into an extobj subc; returns NULL on error; objects should not be changed */ + pcb_subc_t *(*conv_objs)(pcb_data_t *dst, vtp0_t *objs, pcb_subc_t *copy_from); /* called to convert objects into an extobj subc; returns NULL on error; objects should not be changed; if copy_from is not NULL, the new extobj is being created by copying copy_from (the implementation should pick up info from there, not from PCB) */ /* dynamic data - filled in by core */ int idx; @@ -85,10 +85,12 @@ /* Creates and returns a new extended object on dst, using (selected|all) object(s) of src. If the operation was successful and remove is true, - remove selected objects. */ + remove selected objects. The "using" variant carries an existing extobj + of the same type that is used as a source of metadata */ pcb_subc_t *pcb_extobj_conv_selected_objs(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove); pcb_subc_t *pcb_extobj_conv_all_objs(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_data_t *src, pcb_bool remove); pcb_subc_t *pcb_extobj_conv_obj(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_any_obj_t *src, pcb_bool remove); +pcb_subc_t *pcb_extobj_conv_obj_using(pcb_board_t *pcb, const pcb_extobj_t *eo, pcb_data_t *dst, pcb_any_obj_t *src, pcb_bool remove, pcb_subc_t *copy_from); /* for internal use: when an extobj needs to be cloned becase a new floater is added */ Index: trunk/src/extobj_helper.h =================================================================== --- trunk/src/extobj_helper.h (revision 28899) +++ trunk/src/extobj_helper.h (revision 28900) @@ -74,7 +74,7 @@ return 0; } -PCB_INLINE pcb_subc_t *pcb_exto_create(pcb_data_t *dst, const char *eoname, const pcb_dflgmap_t *layers, pcb_coord_t ox, pcb_coord_t oy, pcb_bool on_bottom) +PCB_INLINE pcb_subc_t *pcb_exto_create(pcb_data_t *dst, const char *eoname, const pcb_dflgmap_t *layers, pcb_coord_t ox, pcb_coord_t oy, pcb_bool on_bottom, pcb_subc_t *copy_from) { pcb_subc_t *subc = pcb_subc_alloc(); pcb_board_t *pcb = NULL; Index: trunk/src_plugins/exto_std/dimension.c =================================================================== --- trunk/src_plugins/exto_std/dimension.c (revision 28899) +++ trunk/src_plugins/exto_std/dimension.c (revision 28900) @@ -326,12 +326,12 @@ } } -static pcb_subc_t *pcb_dimension_conv_objs(pcb_data_t *dst, vtp0_t *objs) +static pcb_subc_t *pcb_dimension_conv_objs(pcb_data_t *dst, vtp0_t *objs, pcb_subc_t *copy_from) { long n; pcb_subc_t *subc; pcb_line_t *l; - pcb_layer_t *ly; + pcb_layer_t *ly, *targetly = NULL; pcb_dflgmap_t layers[] = { {"edit", PCB_LYT_DOC, "extobj", 0, 0}, {"target", PCB_LYT_DOC, "fab", 0, 0}, @@ -350,16 +350,20 @@ layers[0].lyt = pcb_layer_flags_(l->parent.layer); pcb_layer_purpose_(l->parent.layer, &layers[0].purpose); - if (dst->parent_type == PCB_PARENT_BOARD) { + if ((copy_from != NULL) && (copy_from->data->LayerN > LID_TARGET) && (copy_from->data->Layer[LID_TARGET].meta.bound.real != NULL)) { + targetly = copy_from->data->Layer[LID_TARGET].meta.bound.real; + } + else if (dst->parent_type == PCB_PARENT_BOARD) { pcb_board_t *pcb = dst->parent.board; - pcb_layer_t *curr = PCB_CURRLAYER(pcb); - if (curr != NULL) { - layers[1].lyt = pcb_layer_flags_(curr); - pcb_layer_purpose_(curr, &layers[1].purpose); - } + targetly = PCB_CURRLAYER(pcb); } - subc = pcb_exto_create(dst, "dimension", layers, l->Point1.X, l->Point1.Y, 0); + if (targetly != NULL) { + layers[1].lyt = pcb_layer_flags_(targetly); + pcb_layer_purpose_(targetly, &layers[1].purpose); + } + + subc = pcb_exto_create(dst, "dimension", layers, l->Point1.X, l->Point1.Y, 0, copy_from); pcb_attribute_put(&subc->Attributes, "extobj::displace", "4mm"); /* create edit-objects */ Index: trunk/src_plugins/exto_std/line_of_vias.c =================================================================== --- trunk/src_plugins/exto_std/line_of_vias.c (revision 28899) +++ trunk/src_plugins/exto_std/line_of_vias.c (revision 28900) @@ -223,7 +223,7 @@ } -static pcb_subc_t *pcb_line_of_vias_conv_objs(pcb_data_t *dst, vtp0_t *objs) +static pcb_subc_t *pcb_line_of_vias_conv_objs(pcb_data_t *dst, vtp0_t *objs, pcb_subc_t *copy_from) { long n; pcb_subc_t *subc; @@ -248,8 +248,9 @@ layers[0].lyt = pcb_layer_flags_(l->parent.layer); pcb_layer_purpose_(l->parent.layer, &layers[0].purpose); - subc = pcb_exto_create(dst, "line-of-vias", layers, l->Point1.X, l->Point1.Y, 0); - pcb_attribute_put(&subc->Attributes, "extobj::pitch", "4mm"); + subc = pcb_exto_create(dst, "line-of-vias", layers, l->Point1.X, l->Point1.Y, 0, copy_from); + if (copy_from == NULL) + pcb_attribute_put(&subc->Attributes, "extobj::pitch", "4mm"); /* create edit-objects */ ly = &subc->data->Layer[LID_EDIT];