Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 31069) +++ trunk/src/change.c (revision 31070) @@ -145,7 +145,7 @@ NULL, /* common_post */ pcb_lineop_change_clear_size, NULL, - pcb_polyop_change_clear_size, /* just to tell the user not to :-) */ + pcb_polyop_change_clear_size, NULL, NULL, pcb_arcop_change_clear_size, @@ -157,6 +157,23 @@ 0 /* extobj_inhibit_regen */ }; +pcb_opfunc_t ChangeEnforceClearSizeFunctions = { + NULL, /* common_pre */ + NULL, /* common_post */ + NULL, + NULL, + pcb_polyop_change_enforce_clear_size, + NULL, + NULL, + NULL, + NULL, /* gfx */ + NULL, + NULL, + NULL, + NULL, + 0 /* extobj_inhibit_regen */ +}; + static pcb_opfunc_t ChangeNameFunctions = { NULL, /* common_pre */ NULL, /* common_post */ @@ -653,6 +670,25 @@ return change; } +rnd_bool pcb_chg_obj_enforce_clear_size(int Type, void *Ptr1, void *Ptr2, void *Ptr3, rnd_coord_t Difference, rnd_bool fixIt) +{ + rnd_bool change; + pcb_opctx_t ctx; + + ctx.chgsize.pcb = PCB; + ctx.chgsize.is_primary = 1; + ctx.chgsize.is_absolute = fixIt; + ctx.chgsize.value = Difference; + + change = (pcb_object_operation(&ChangeEnforceClearSizeFunctions, &ctx, Type, Ptr1, Ptr2, Ptr3) != NULL); + if (change) { + pcb_draw(); + pcb_undo_inc_serial(); + } + return change; +} + + /* --------------------------------------------------------------------------- * changes the thermal of the passed object * Returns rnd_true if anything is changed Index: trunk/src/change.h =================================================================== --- trunk/src/change.h (revision 31069) +++ trunk/src/change.h (revision 31070) @@ -86,6 +86,7 @@ rnd_bool pcb_chg_obj_1st_size(int, void *, void *, void *, rnd_coord_t, rnd_bool); rnd_bool pcb_chg_obj_thermal(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int therm_type, unsigned long lid); rnd_bool pcb_chg_obj_clear_size(int, void *, void *, void *, rnd_coord_t, rnd_bool); +rnd_bool pcb_chg_obj_enforce_clear_size(int Type, void *Ptr1, void *Ptr2, void *Ptr3, rnd_coord_t Difference, rnd_bool fixIt); rnd_bool pcb_chg_obj_2nd_size(int, void *, void *, void *, rnd_coord_t, rnd_bool, rnd_bool); rnd_bool pcb_chg_obj_rot(int, void *, void *, void *, double, rnd_bool, rnd_bool); rnd_bool pcb_chg_obj_join(int, void *, void *, void *); Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 31069) +++ trunk/src/obj_poly.c (revision 31070) @@ -716,6 +716,33 @@ return NULL; } +/* Handle attempts to change the enforce_clearance of a polygon. */ +void *pcb_polyop_change_enforce_clear_size(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *poly) +{ + rnd_coord_t value = (ctx->chgsize.is_absolute) ? ctx->chgsize.value : poly->Clearance + ctx->chgsize.value; + + if (PCB_FLAG_TEST(PCB_FLAG_LOCK, poly)) + return NULL; + + if (!ctx->chgsize.is_absolute && ctx->chgsize.value < 0) + value = 0; + if (value != poly->enforce_clearance) { +TODO("undo: enforce_clearance in poly"); +/* pcb_undo_add_obj_to_clear_size(PCB_OBJ_POLY, Layer, poly, poly);*/ + pcb_poly_restore_to_poly(ctx->chgsize.pcb->Data, PCB_OBJ_POLY, Layer, poly); + pcb_poly_invalidate_erase(poly); + rnd_r_delete_entry(Layer->polygon_tree, (rnd_rnd_box_t *)poly); + poly->enforce_clearance = value; + pcb_poly_bbox(poly); + rnd_r_insert_entry(Layer->polygon_tree, (rnd_rnd_box_t *)poly); + pcb_poly_clear_from_poly(ctx->chgsize.pcb->Data, PCB_OBJ_POLY, Layer, poly); + pcb_poly_invalidate_draw(Layer, poly); + return poly; + } + + return poly; +} + /* changes the CLEARPOLY flag of a polygon */ void *pcb_polyop_change_clear(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon) { Index: trunk/src/obj_poly_op.h =================================================================== --- trunk/src/obj_poly_op.h (revision 31069) +++ trunk/src/obj_poly_op.h (revision 31070) @@ -33,6 +33,7 @@ void *pcb_polyop_add_to_buffer(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon); void *pcb_polyop_move_buffer(pcb_opctx_t *ctx, pcb_layer_t * layer, pcb_poly_t * polygon); void *pcb_polyop_change_clear_size(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *poly); +void *pcb_polyop_change_enforce_clear_size(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *poly); void *pcb_polyop_change_clear(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon); void *pcb_polyop_insert_point(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon); void *pcb_polyop_move(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_poly_t *Polygon);