Index: trunk/src/extobj.c =================================================================== --- trunk/src/extobj.c (revision 28895) +++ trunk/src/extobj.c (revision 28896) @@ -105,7 +105,7 @@ return NULL; } -void pcb_extobj_new_subc(pcb_any_obj_t *edit_obj, pcb_subc_t *subc_copy_from) +pcb_extobj_float_new_spawn(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; @@ -115,15 +115,16 @@ if (pcb == NULL) return; - if (subc_copy_from == NULL) { - sc = pcb_subc_new(); - sc->ID = pcb_create_ID_get(); - pcb_subc_reg(pcb->Data, sc); - pcb_obj_id_reg(pcb->Data, sc); - } - else - sc = pcb_subc_dup_at(pcb, pcb->Data, subc_copy_from, 0, 0, pcb_false); + sc = pcb_subc_new(); + sc->ID = pcb_create_ID_get(); + pcb_subc_reg(pcb->Data, sc); + pcb_obj_id_reg(pcb->Data, sc); +TODO("copy layers"); + + if (subc_copy_from != NULL) + pcb_attribute_copy_all(&sc->Attributes, &subc_copy_from->Attributes); + pcb_undo_add_obj_to_create(PCB_OBJ_SUBC, sc, sc, sc); TODO("put edit_obj within the new subc, set subc attributes"); @@ -132,6 +133,7 @@ pcb_extobj_float_geo(edit_obj); } + void pcb_extobj_del_pre(pcb_subc_t *sc) { pcb_extobj_t *eo = pcb_extobj_get(sc); @@ -197,3 +199,4 @@ return res; } + Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28895) +++ trunk/src/extobj.h (revision 28896) @@ -45,6 +45,11 @@ PCB_EXTODEL_SUBC /* remove the whole subcircuit */ } pcb_extobj_del_t; +typedef enum pcb_extobj_new_e { + PCB_EXTONEW_FLOATER, /* new floater created normally */ + PCB_EXTONEW_SPAWN /* spawn a new subc the new floater will be in */ +} pcb_extobj_new_t; + struct pcb_extobj_s { /* static data - filled in by the extobj code */ const char *name; @@ -51,7 +56,7 @@ void (*draw_mark)(pcb_draw_info_t *info, pcb_subc_t *obj); /* called when drawing the subc marks (instead of drawing the dashed outline and diamond origin) */ void (*float_pre)(pcb_subc_t *subc, pcb_any_obj_t *floater); /* called before an extobj floater is edited in any way - must not free() the floater */ void (*float_geo)(pcb_subc_t *subc, pcb_any_obj_t *floater); /* called after the geometry of an extobj floater is changed - must not free() the floater; floater may be NULL (post-floater-deletion update on the parent subc) */ - void (*float_new)(pcb_subc_t *subc, pcb_any_obj_t *floater); /* called when a floater object is split so a new floater is created */ + pcb_extobj_new_t (*float_new)(pcb_subc_t *subc, pcb_any_obj_t *floater); /* called when a floater object is split so a new floater is created; defaults to PCB_EXTONEW_SPAWN if NULL */ 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 */ @@ -70,10 +75,6 @@ pcb_extobj_t *pcb_extobj_lookup(const char *name); -/* Create a new subc for for new the edit_obj; if subc_copy_from is not NULL, - copy all data from there (including objects). */ -void pcb_extobj_new_subc(pcb_any_obj_t *edit_obj, pcb_subc_t *subc_copy_from); - /* Called to remove the subc of an edit object floater; returns 0 on no action, 1 if it removed an extobj subc */ PCB_INLINE int pcb_extobj_del_floater(pcb_any_obj_t *edit_obj); @@ -89,7 +90,11 @@ 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); +/* for internal use: when an extobj needs to be cloned becase a new floater + is added */ +void pcb_extobj_float_new_spawn(pcb_subc_t *subc, pcb_any_obj_t *flt); + int pcb_extobj_lookup_idx(const char *name); extern int pcb_extobj_invalid; /* this changes upon each new extobj reg, forcing the caches to be invalidated eventually */ @@ -184,6 +189,7 @@ { pcb_subc_t *subc = pcb_obj_parent_subc(flt); pcb_extobj_t *eo; + pcb_extobj_new_t act = PCB_EXTONEW_SPAWN; if (subc == NULL) return; @@ -191,7 +197,16 @@ eo = pcb_extobj_get(subc); if ((eo != NULL) && (eo->float_new != NULL)) - eo->float_new(subc, flt); + act = eo->float_new(subc, flt); + + switch(act) { + case PCB_EXTONEW_FLOATER: + /* no action required, the new floater got created already and got registered in the hook above */ + break; + case PCB_EXTONEW_SPAWN: + pcb_extobj_float_new_spawn(subc, flt); + break; + } } PCB_INLINE pcb_any_obj_t *pcb_extobj_float_pre(pcb_any_obj_t *flt) Index: trunk/src/obj_common.c =================================================================== --- trunk/src/obj_common.c (revision 28895) +++ trunk/src/obj_common.c (revision 28896) @@ -133,22 +133,6 @@ for (i = 0; i < src->Number; i++) pcb_attribute_put(dest, src->List[i].name, src->List[i].value); - -TODO("extobj: this code used to dup the subc if a new object got added - check if we still need it with floaters"); -#if 0 - if (copy_from_any != NULL) { - if (PCB_FLAG_TEST(PCB_FLAG_FLOATER, copy_from_any)) - copy_from = pcb_obj_parent_subc(copy_from_any); - else if (copy_from_any->type == PCB_OBJ_SUBC) - copy_from = (pcb_subc_t *)copy_from_any; - - if (pcb_extobj_get(copy_from) == NULL) - copy_from = NULL; - } - - if (copy_from != NULL) - pcb_extobj_new_subc(dstobj, copy_from); -#endif } Index: trunk/src_plugins/exto_std/dimension.c =================================================================== --- trunk/src_plugins/exto_std/dimension.c (revision 28895) +++ trunk/src_plugins/exto_std/dimension.c (revision 28896) @@ -304,9 +304,10 @@ } -static void pcb_dimension_float_new(pcb_subc_t *subc, pcb_any_obj_t *floater) +static pcb_extobj_new_t pcb_dimension_float_new(pcb_subc_t *subc, pcb_any_obj_t *floater) { pcb_trace("dim: float new %ld %ld\n", subc->ID, floater->ID); + return PCB_EXTONEW_SPAWN; } static pcb_extobj_del_t pcb_dimension_float_del(pcb_subc_t *subc, pcb_any_obj_t *floater) Index: trunk/src_plugins/exto_std/line_of_vias.c =================================================================== --- trunk/src_plugins/exto_std/line_of_vias.c (revision 28895) +++ trunk/src_plugins/exto_std/line_of_vias.c (revision 28896) @@ -195,9 +195,10 @@ line_of_vias_gen(subc, edit_obj); } -static void pcb_line_of_vias_float_new(pcb_subc_t *subc, pcb_any_obj_t *floater) +static pcb_extobj_new_t pcb_line_of_vias_float_new(pcb_subc_t *subc, pcb_any_obj_t *floater) { pcb_trace("LoV: float new %ld %ld\n", subc->ID, floater->ID); + return PCB_EXTONEW_FLOATER; } static pcb_extobj_del_t pcb_line_of_vias_float_del(pcb_subc_t *subc, pcb_any_obj_t *floater)