Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 3426) +++ trunk/src/change.c (revision 3427) @@ -114,6 +114,8 @@ static void *SetTextJoin(LayerTypePtr, TextTypePtr); static void *ClrTextJoin(LayerTypePtr, TextTypePtr); static void *ChangePolyClear(LayerTypePtr, PolygonTypePtr); +static void *ChangeArcRadius(LayerTypePtr, ArcTypePtr); +static void *ChangeArcAngle(LayerTypePtr, ArcTypePtr); /* --------------------------------------------------------------------------- * some local identifiers @@ -120,7 +122,11 @@ */ static Coord Delta; /* change of size */ static Coord Absolute; /* Absolute size */ +static int is_primary; /* whether the primary parameter should be changed */ static char *NewName; /* new name */ + +static Angle ADelta, AAbsolute; /* same as above, but for angles */ + static ObjectFunctionType ChangeSizeFunctions = { ChangeLineSize, ChangeTextSize, @@ -395,6 +401,37 @@ NULL }; +static ObjectFunctionType ChangeRadiusFunctions = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ChangeArcRadius, + NULL +}; + +static ObjectFunctionType ChangeAngleFunctions = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ChangeArcAngle, + NULL +}; + + /* --------------------------------------------------------------------------- * changes the thermal on a via * returns TRUE if changed @@ -930,6 +967,63 @@ } /* --------------------------------------------------------------------------- + * changes the radius of an arc (is_primary 0=width or 1=height or 2=both) + * returns TRUE if changed + */ +static void *ChangeArcRadius(LayerTypePtr Layer, ArcTypePtr Arc) +{ + Coord value, *dst; + void *a0, *a1; + + if (TEST_FLAG(PCB_FLAG_LOCK, Arc)) + return (NULL); + + switch(is_primary) { + case 0: dst = &Arc->Width; break; + case 1: dst = &Arc->Height; break; + case 2: + is_primary = 0; a0 = ChangeArcRadius(Layer, Arc); + is_primary = 1; a1 = ChangeArcRadius(Layer, Arc); + if ((a0 != NULL) || (a1 != NULL)) + return Arc; + return NULL; + } + + value = (Absolute) ? Absolute : (*dst) + Delta; +#warning TODO: check arc radius bounds? +/* value = MIN(MAX_LINESIZE, MAX(value, PCB->Bloat * 2 + 2));*/ + if (value != *dst) { +#warning TODO: +/* AddObjectToRadiusUndoList(PCB_TYPE_ARC, Layer, Arc, Arc);*/ + EraseArc(Arc); + r_delete_entry(Layer->arc_tree, (BoxTypePtr) Arc); + RestoreToPolygon(PCB->Data, PCB_TYPE_ARC, Layer, Arc); + *dst = value; +/* if (*dst == 0) { + CLEAR_FLAG(PCB_FLAG_CLEARLINE, Arc); + *dst = PCB_MIL_TO_COORD(10); + }*/ + SetArcBoundingBox(Arc); + r_insert_entry(Layer->arc_tree, (BoxTypePtr) Arc, 0); + ClearFromPolygon(PCB->Data, PCB_TYPE_ARC, Layer, Arc); + DrawArc(Layer, Arc); + return (Arc); + } + return (NULL); + +} + +/* --------------------------------------------------------------------------- + * changes the angle of an arc (is_primary 0=start or 1=end) + * returns TRUE if changed + */ +static void *ChangeArcAngle(LayerTypePtr Layer, ArcTypePtr Arc) +{ + +} + + +/* --------------------------------------------------------------------------- * changes the scaling factor of a text object * returns TRUE if changed */ @@ -2119,6 +2213,47 @@ } /* --------------------------------------------------------------------------- + * changes the radius of the passed object (e.g. arc width/height) + * Returns pcb_true if anything is changed + */ +pcb_bool ChangeObjectRadius(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_x, Coord r, pcb_bool fixIt) +{ + pcb_bool change; + + /* setup identifier */ + Absolute = (fixIt) ? r : 0; + Delta = r; + is_primary = is_x; + change = (ObjectOperation(&ChangeRadiusFunctions, Type, Ptr1, Ptr2, Ptr3) != NULL); + if (change) { + Draw(); + IncrementUndoSerialNumber(); + } + return (change); +} + +/* --------------------------------------------------------------------------- + * changes the angles of the passed object (e.g. arc start/delta) + * Returns pcb_true if anything is changed + */ +pcb_bool ChangeObjectAngle(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_start, Angle a, pcb_bool fixIt) +{ + pcb_bool change; + + /* setup identifier */ + AAbsolute = (fixIt) ? a : 0; + ADelta = a; + is_primary = is_start; + change = (ObjectOperation(&ChangeAngleFunctions, Type, Ptr1, Ptr2, Ptr3) != NULL); + if (change) { + Draw(); + IncrementUndoSerialNumber(); + } + return (change); +} + + +/* --------------------------------------------------------------------------- * changes the clearance size of the passed object * Returns pcb_true if anything is changed */ Index: trunk/src/change.h =================================================================== --- trunk/src/change.h (revision 3426) +++ trunk/src/change.h (revision 3427) @@ -109,7 +109,10 @@ void *QueryInputAndChangeObjectName(int, void *, void *, void *, int); void ChangePCBSize(Coord, Coord); void *ChangeObjectPinnum(int Type, void *Ptr1, void *Ptr2, void *Ptr3, char *Name); +pcb_bool ChangeObjectRadius(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_x, Coord r, pcb_bool absolute); +pcb_bool ChangeObjectAngle(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_start, Angle a, pcb_bool absolute); + /* Change the specified text on an element, either on the board (give PCB, PCB->Data) or in a buffer (give NULL, Buffer->Data). The old string is returned, and must be properly freed by the caller. */ Index: trunk/src/global.h =================================================================== --- trunk/src/global.h (revision 3426) +++ trunk/src/global.h (revision 3427) @@ -510,6 +510,7 @@ #define UNDO_CLEAR 0x40000 /* clear/restore to polygons */ #define UNDO_NETLISTCHANGE 0x80000 /* netlist change */ #define UNDO_CHANGEPINNUM 0x100000 /* change of pin number */ +#define UNDO_CHANGERADII 0x200000 /* change arc radii */ Index: trunk/src/misc.c =================================================================== --- trunk/src/misc.c (revision 3426) +++ trunk/src/misc.c (revision 3427) @@ -853,7 +853,7 @@ } -/* doesn't this belong in change.c ?? */ +/* doesn't these belong in change.c ?? */ void ChangeArcAngles(LayerTypePtr Layer, ArcTypePtr a, Angle new_sa, Angle new_da) { if (new_da >= 360) { @@ -870,6 +870,19 @@ ClearFromPolygon(PCB->Data, PCB_TYPE_ARC, Layer, a); } + +void ChangeArcRadii(LayerTypePtr Layer, ArcTypePtr a, Coord new_width, Coord new_height) +{ + RestoreToPolygon(PCB->Data, PCB_TYPE_ARC, Layer, a); + r_delete_entry(Layer->arc_tree, (BoxTypePtr) a); + AddObjectToChangeRadiiUndoList(PCB_TYPE_ARC, a, a, a); + a->Width = new_width; + a->Height = new_height; + SetArcBoundingBox(a); + r_insert_entry(Layer->arc_tree, (BoxTypePtr) a, 0); + ClearFromPolygon(PCB->Data, PCB_TYPE_ARC, Layer, a); +} + static char *BumpName(char *Name) { int num; Index: trunk/src/misc.h =================================================================== --- trunk/src/misc.h (revision 3426) +++ trunk/src/misc.h (revision 3427) @@ -66,6 +66,7 @@ void RestoreStackAndVisibility(void); BoxTypePtr GetArcEnds(ArcTypePtr); void ChangeArcAngles(LayerTypePtr, ArcTypePtr, Angle, Angle); +void ChangeArcRadii(LayerTypePtr, ArcTypePtr, Coord, Coord); char *UniqueElementName(DataTypePtr, char *); void AttachForCopy(Coord, Coord); Index: trunk/src/undo.c =================================================================== --- trunk/src/undo.c (revision 3426) +++ trunk/src/undo.c (revision 3427) @@ -171,6 +171,7 @@ static pcb_bool UndoChangeSize(UndoListTypePtr); static pcb_bool UndoChange2ndSize(UndoListTypePtr); static pcb_bool UndoChangeAngles(UndoListTypePtr); +static pcb_bool UndoChangeRadii(UndoListTypePtr); static pcb_bool UndoChangeClearSize(UndoListTypePtr); static pcb_bool UndoChangeMaskSize(UndoListTypePtr); static pcb_bool UndoClearPoly(UndoListTypePtr); @@ -376,8 +377,8 @@ a->Delta = Entry->Data.AngleChange.angle[1]; SetArcBoundingBox(a); r_insert_entry(Layer->arc_tree, (BoxTypePtr) a, 0); - Entry->Data.Move.DX = old_sa; - Entry->Data.Move.DY = old_da; + Entry->Data.AngleChange.angle[0] = old_sa; + Entry->Data.AngleChange.angle[1] = old_da; DrawObject(type, ptr1, a); return (pcb_true); } @@ -385,6 +386,37 @@ } /* --------------------------------------------------------------------------- + * recovers an object from a ChangeRadii change operation + */ +static pcb_bool UndoChangeRadii(UndoListTypePtr Entry) +{ + void *ptr1, *ptr2, *ptr3; + int type; + Coord old_w, old_h; + + /* lookup entry by ID */ + type = SearchObjectByID(PCB->Data, &ptr1, &ptr2, &ptr3, Entry->ID, Entry->Kind); + if (type == PCB_TYPE_ARC) { + LayerTypePtr Layer = (LayerTypePtr) ptr1; + ArcTypePtr a = (ArcTypePtr) ptr2; + r_delete_entry(Layer->arc_tree, (BoxTypePtr) a); + old_w = a->Width; + old_h = a->Height; + if (andDraw) + EraseObject(type, Layer, a); + a->Width = Entry->Data.Move.DX; + a->Height = Entry->Data.Move.DY; + SetArcBoundingBox(a); + r_insert_entry(Layer->arc_tree, (BoxTypePtr) a, 0); + Entry->Data.Move.DX = old_w; + Entry->Data.Move.DY = old_h; + DrawObject(type, ptr1, a); + return (pcb_true); + } + return (pcb_false); +} + +/* --------------------------------------------------------------------------- * recovers an object from a clearance size change operation */ static pcb_bool UndoChangeClearSize(UndoListTypePtr Entry) @@ -988,6 +1020,11 @@ return (UNDO_CHANGEANGLES); break; + case UNDO_CHANGERADII: + if (UndoChangeRadii(ptr)) + return (UNDO_CHANGERADII); + break; + case UNDO_LAYERCHANGE: if (UndoLayerChange(ptr)) return (UNDO_LAYERCHANGE); @@ -1462,6 +1499,22 @@ } /* --------------------------------------------------------------------------- + * adds an object to the list of changed radii. Note that you must + * call this before changing the radii, passing the new width/height. + */ +void AddObjectToChangeRadiiUndoList(int Type, void *Ptr1, void *Ptr2, void *Ptr3) +{ + UndoListTypePtr undo; + ArcTypePtr a = (ArcTypePtr) Ptr3; + + if (!Locked) { + undo = GetUndoSlot(UNDO_CHANGERADII, OBJECT_ID(Ptr3), Type); + undo->Data.Move.DX = a->Width; + undo->Data.Move.DY = a->Height; + } +} + +/* --------------------------------------------------------------------------- * adds a layer change (new, delete, move) to the undo list. */ void AddLayerChangeToUndoList(int old_index, int new_index) @@ -1584,6 +1637,7 @@ case UNDO_CHANGECLEARSIZE: return "chngeclearsize"; case UNDO_CHANGEMASKSIZE: return "changemasksize"; case UNDO_CHANGEANGLES: return "changeangles"; + case UNDO_CHANGERADII: return "changeradii"; case UNDO_LAYERCHANGE: return "layerchange"; case UNDO_CLEAR: return "clear"; case UNDO_NETLISTCHANGE: return "netlistchange"; Index: trunk/src/undo.h =================================================================== --- trunk/src/undo.h (revision 3426) +++ trunk/src/undo.h (revision 3427) @@ -60,6 +60,7 @@ void AddObjectToClearSizeUndoList(int, void *, void *, void *); void AddObjectToMaskSizeUndoList(int, void *, void *, void *); void AddObjectToChangeAnglesUndoList(int, void *, void *, void *); +void AddObjectToChangeRadiiUndoList(int, void *, void *, void *); void AddObjectToClearPolyUndoList(int, void *, void *, void *, pcb_bool); void AddLayerChangeToUndoList(int, int); void AddNetlistLibToUndoList(LibraryTypePtr);