Index: src/action.c =================================================================== --- src/action.c (revision 964) +++ src/action.c (revision 965) @@ -4816,9 +4816,10 @@ static const char changename_syntax[] = "ChangeName(Object)\n" + "ChangeName(Object|\"Number\")\n" "ChangeName(Layout|Layer)"; -static const char changename_help[] = "Sets the name of objects."; +static const char changename_help[] = "Sets the name (or pin number) of objects."; /* %start-doc actions ChangeName @@ -4859,7 +4860,7 @@ &ptr1, &ptr2, &ptr3)) != NO_TYPE) { SaveUndoSerialNumber (); - if (QueryInputAndChangeObjectName (type, ptr1, ptr2, ptr3)) + if (QueryInputAndChangeObjectName (type, ptr1, ptr2, ptr3, 0)) { SetChangedFlag (true); if (type == ELEMENT_TYPE) Index: src/change.c =================================================================== --- src/change.c (revision 964) +++ src/change.c (revision 965) @@ -90,6 +90,8 @@ static void *ChangeElementClearSize (ElementTypePtr); static void *ChangePinName (ElementTypePtr, PinTypePtr); static void *ChangePadName (ElementTypePtr, PadTypePtr); +static void *ChangePinNum (ElementTypePtr, PinTypePtr); +static void *ChangePadNum (ElementTypePtr, PadTypePtr); static void *ChangeViaName (PinTypePtr); static void *ChangeLineName (LayerTypePtr, LineTypePtr); static void *ChangeElementName (ElementTypePtr); @@ -217,6 +219,20 @@ NULL, NULL }; +static ObjectFunctionType ChangePinnumFunctions = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ChangePinNum, + ChangePadNum, + NULL, + NULL, + NULL, + NULL +}; static ObjectFunctionType ChangeSquareFunctions = { NULL, NULL, @@ -1138,6 +1154,46 @@ } /* --------------------------------------------------------------------------- + * changes the number of a pin + */ +static void * +ChangePinNum (ElementTypePtr Element, PinTypePtr Pin) +{ + char *old = Pin->Name; + + Element = Element; /* get rid of 'unused...' warnings */ + if (TEST_FLAG (DISPLAYNAMEFLAG, Pin)) + { +// ErasePinName (Pin); + Pin->Number = NewName; +// DrawPinName (Pin); + } + else + Pin->Number = NewName; + return (old); +} + +/* --------------------------------------------------------------------------- + * changes the number of a pad + */ +static void * +ChangePadNum (ElementTypePtr Element, PadTypePtr Pad) +{ + char *old = Pad->Name; + + Element = Element; /* get rid of 'unused...' warnings */ + if (TEST_FLAG (DISPLAYNAMEFLAG, Pad)) + { +// ErasePadName (Pad); + Pad->Number = NewName; +// DrawPadName (Pad); + } + else + Pad->Number = NewName; + return (old); +} + +/* --------------------------------------------------------------------------- * changes the name of a line */ static void * @@ -2364,6 +2420,25 @@ } /* --------------------------------------------------------------------------- + * changes the pin number of the passed object + * returns the old name + * + * The allocated memory isn't freed because the old string is used + * by the undo module. + */ +void * +ChangeObjectPinnum (int Type, void *Ptr1, void *Ptr2, void *Ptr3, char *Name) +{ + void *result; + /* setup identifier */ + NewName = Name; + if ((result = + ObjectOperation (&ChangePinnumFunctions, Type, Ptr1, Ptr2, Ptr3))); + Draw (); + return (result); +} + +/* --------------------------------------------------------------------------- * changes the clearance-flag of the passed object * Returns true if anything is changed */ @@ -2534,7 +2609,7 @@ * by the undo module. */ void * -QueryInputAndChangeObjectName (int Type, void *Ptr1, void *Ptr2, void *Ptr3) +QueryInputAndChangeObjectName (int Type, void *Ptr1, void *Ptr2, void *Ptr3, int pinnum) { char *name = NULL; char msg[513]; @@ -2559,12 +2634,18 @@ break; case PIN_TYPE: - sprintf (msg, _("%s Pin Name:"), EMPTY (((PinTypePtr) Ptr2)->Number)); + if (pinnum) + sprintf (msg, _("%s Pin Number:"), EMPTY (((PinTypePtr) Ptr2)->Number)); + else + sprintf (msg, _("%s Pin Name:"), EMPTY (((PinTypePtr) Ptr2)->Number)); name = gui->prompt_for (msg, EMPTY (((PinTypePtr) Ptr2)->Name)); break; case PAD_TYPE: - sprintf (msg, _("%s Pad Name:"), EMPTY (((PadTypePtr) Ptr2)->Number)); + if (pinnum) + sprintf (msg, _("%s Pad Number:"), EMPTY (((PinTypePtr) Ptr2)->Number)); + else + sprintf (msg, _("%s Pad Name:"), EMPTY (((PadTypePtr) Ptr2)->Number)); name = gui->prompt_for (msg, EMPTY (((PadTypePtr) Ptr2)->Name)); break; @@ -2582,10 +2663,18 @@ if (name) { /* NB: ChangeObjectName takes ownership of the passed memory */ - char *old = (char *)ChangeObjectName (Type, Ptr1, Ptr2, Ptr3, name); + char *old; + if (pinnum) + old = (char *)ChangeObjectPinnum (Type, Ptr1, Ptr2, Ptr3, name); + else + old = (char *)ChangeObjectName (Type, Ptr1, Ptr2, Ptr3, name); + if (old != (char *) -1) { - AddObjectToChangeNameUndoList (Type, Ptr1, Ptr2, Ptr3, old); + if (pinnum) + AddObjectToChangePinnumUndoList (Type, Ptr1, Ptr2, Ptr3, old); + else + AddObjectToChangeNameUndoList (Type, Ptr1, Ptr2, Ptr3, old); IncrementUndoSerialNumber (); } Draw (); Index: src/change.h =================================================================== --- src/change.h (revision 964) +++ src/change.h (revision 965) @@ -111,7 +111,7 @@ bool SetObjectOctagon (int, void *, void *, void *); bool ClrObjectOctagon (int, void *, void *, void *); void *ChangeObjectName (int, void *, void *, void *, char *); -void *QueryInputAndChangeObjectName (int, void *, void *, void *); +void *QueryInputAndChangeObjectName (int, void *, void *, void *, int); void ChangePCBSize (Coord, Coord); /* Change the specified text on an element, either on the board (give Index: src/global.h =================================================================== --- src/global.h (revision 964) +++ src/global.h (revision 965) @@ -854,8 +854,10 @@ #define UNDO_LAYERCHANGE 0x20000 /* layer new/delete/move */ #define UNDO_CLEAR 0x40000 /* clear/restore to polygons */ #define UNDO_NETLISTCHANGE 0x80000 /* netlist change */ +#define UNDO_CHANGEPINNUM 0x100000 /* change of pin number */ + /* --------------------------------------------------------------------------- * add a macro for wrapping RCS ID's in so that ident will still work * but we won't get as many compiler warnings Index: src/gpcb-menu.res =================================================================== --- src/gpcb-menu.res (revision 964) +++ src/gpcb-menu.res (revision 965) @@ -97,6 +97,7 @@ - {"Edit name of" {"text on layout" ChangeName(Object) a={"N" "n"}} + {"pin on layout" ChangeName(Object, Number) a={"Shift-Ctrl-N" "Shift Ctrln"}} {"layout" ChangeName(Layout)} {"active layer" ChangeName(Layer)} } Index: src/pcb-menu.res =================================================================== --- src/pcb-menu.res (revision 964) +++ src/pcb-menu.res (revision 965) @@ -149,6 +149,7 @@ - {"Edit Names..." foreground=grey50 sensitive=false} {" Change text on layout" ChangeName(Object) a={"N" "n"}} + {" Change text on layout" ChangeName(Object, Number) a={"Shift-Ctrl-N" "Shift Ctrln"}} {" Edit name of layout" ChangeName(Layout)} {" Edit name of active layer" ChangeName(Layer)} {"Edit Attributes..." foreground=grey50 sensitive=false} Index: src/undo.c =================================================================== --- src/undo.c (revision 964) +++ src/undo.c (revision 965) @@ -240,6 +240,7 @@ switch (ptr->Type) { case UNDO_CHANGENAME: + case UNDO_CHANGEPINNUM: free (ptr->Data.ChangeName.Name); break; case UNDO_REMOVE: @@ -356,6 +357,29 @@ } /* --------------------------------------------------------------------------- + * recovers an object from a 'change oinnum' operation + * returns true if anything has been recovered + */ +static bool +UndoChangePinnum (UndoListTypePtr Entry) +{ + void *ptr1, *ptr2, *ptr3; + int type; + + /* lookup entry by it's ID */ + type = + SearchObjectByID (PCB->Data, &ptr1, &ptr2, &ptr3, Entry->ID, Entry->Kind); + if (type != NO_TYPE) + { + Entry->Data.ChangeName.Name = + (char *)(ChangeObjectPinnum (type, ptr1, ptr2, ptr3, + Entry->Data.ChangeName.Name)); + return (true); + } + return (false); +} + +/* --------------------------------------------------------------------------- * recovers an object from a 2ndSize change operation */ static bool @@ -1010,6 +1034,11 @@ return (UNDO_CHANGENAME); break; + case UNDO_CHANGEPINNUM: + if (UndoChangePinnum (ptr)) + return (UNDO_CHANGEPINNUM); + break; + case UNDO_CREATE: if (UndoCopyOrCreate (ptr)) return (UNDO_CREATE); @@ -1230,7 +1259,7 @@ /* release memory allocated by objects in undo list */ for (undo = UndoList; UndoN; undo++, UndoN--) { - if (undo->Type == UNDO_CHANGENAME) + if ((undo->Type == UNDO_CHANGENAME) || (undo->Type == UNDO_CHANGEPINNUM)) free (undo->Data.ChangeName.Name); } free (UndoList); @@ -1445,7 +1474,22 @@ undo->Data.ChangeName.Name = OldName; } } +/* --------------------------------------------------------------------------- + * adds an object to the list of objects with changed pinnums + */ +void +AddObjectToChangePinnumUndoList (int Type, void *Ptr1, void *Ptr2, void *Ptr3, + char *OldName) +{ + UndoListTypePtr undo; + if (!Locked) + { + undo = GetUndoSlot (UNDO_CHANGEPINNUM, OBJECT_ID (Ptr3), Type); + undo->Data.ChangeName.Name = OldName; + } +} + /* --------------------------------------------------------------------------- * adds an object to the list of objects moved to another layer */ Index: src/undo.h =================================================================== --- src/undo.h (revision 964) +++ src/undo.h (revision 965) @@ -52,6 +52,7 @@ void AddObjectToMoveUndoList (int, void *, void *, void *, Coord, Coord); void AddObjectToChangeNameUndoList (int, void *, void *, void *, char *); +void AddObjectToChangePinnumUndoList (int, void *, void *, void *, char *); void AddObjectToRotateUndoList (int, void *, void *, void *, Coord, Coord, BYTE); void AddObjectToCreateUndoList (int, void *, void *, void *);