Index: trunk/src/extobj.h =================================================================== --- trunk/src/extobj.h (revision 28887) +++ trunk/src/extobj.h (revision 28888) @@ -39,6 +39,12 @@ typedef struct pcb_extobj_s pcb_extobj_t; +typedef enum pcb_extobj_del_e { + PCB_EXTODEL_NOOP, /* do not do anything (floater is not removed either) */ + PCB_EXTODEL_FLOATER, /* remove the floater only */ + PCB_EXTODEL_SUBC /* remove the whole subcircuit */ +} pcb_extobj_del_t; + struct pcb_extobj_s { /* static data - filled in by the extobj code */ const char *name; @@ -46,6 +52,7 @@ 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 */ 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_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 */ @@ -145,6 +152,7 @@ { pcb_subc_t *subc; pcb_extobj_t *eo; + pcb_extobj_del_t act = PCB_EXTODEL_SUBC; if (!PCB_FLAG_TEST(PCB_FLAG_FLOATER, flt)) return 0; @@ -157,8 +165,19 @@ if (eo == NULL) return 0; /* do not delete non-extobjs */ - pcb_subc_remove(subc); - return 1; + if (eo->float_del != NULL) + act = eo->float_del(subc, flt); + + switch(act) { + case PCB_EXTODEL_NOOP: + return 1; + case PCB_EXTODEL_FLOATER: + return 0; + case PCB_EXTODEL_SUBC: + pcb_subc_remove(subc); + return 1; + } + return 0; } PCB_INLINE void pcb_extobj_float_new(pcb_any_obj_t *flt) Index: trunk/src_plugins/exto_std/dimension.c =================================================================== --- trunk/src_plugins/exto_std/dimension.c (revision 28887) +++ trunk/src_plugins/exto_std/dimension.c (revision 28888) @@ -309,6 +309,12 @@ pcb_trace("dim: float new %ld %ld\n", subc->ID, floater->ID); } +static pcb_extobj_del_t pcb_dimension_float_del(pcb_subc_t *subc, pcb_any_obj_t *floater) +{ + pcb_trace("dim: float del %ld %ld\n", subc->ID, floater->ID); + return PCB_EXTODEL_SUBC; +} + static void pcb_dimension_chg_attr(pcb_subc_t *subc, const char *key, const char *value) { pcb_trace("dim chg_attr\n"); @@ -374,6 +380,7 @@ pcb_dimension_float_pre, pcb_dimension_float_geo, pcb_dimension_float_new, + pcb_dimension_float_del, pcb_dimension_chg_attr, pcb_dimension_del_pre, pcb_dimension_conv_objs Index: trunk/src_plugins/exto_std/line_of_vias.c =================================================================== --- trunk/src_plugins/exto_std/line_of_vias.c (revision 28887) +++ trunk/src_plugins/exto_std/line_of_vias.c (revision 28888) @@ -200,7 +200,13 @@ pcb_trace("LoV: float new %ld %ld\n", subc->ID, floater->ID); } +static pcb_extobj_del_t pcb_line_of_vias_float_del(pcb_subc_t *subc, pcb_any_obj_t *floater) +{ + pcb_trace("LoV: float del %ld %ld\n", subc->ID, floater->ID); + return PCB_EXTODEL_FLOATER; +} + static void pcb_line_of_vias_chg_attr(pcb_subc_t *subc, const char *key, const char *value) { pcb_trace("LoV chg_attr\n"); @@ -266,6 +272,7 @@ pcb_line_of_vias_float_pre, pcb_line_of_vias_float_geo, pcb_line_of_vias_float_new, + pcb_line_of_vias_float_del, pcb_line_of_vias_chg_attr, pcb_line_of_vias_del_pre, pcb_line_of_vias_conv_objs