renumberblock.c

00001 /* RenumberBlock plug-in for PCB
00002    http://www.delorie.com/pcb/renumberblock.c
00003 
00004    Copyright (C) 2006 DJ Delorie <dj@delorie.com>
00005 
00006    Licensed under the terms of the GNU General Public License, version
00007    2 or later.
00008 
00009    Compile like this:
00010 
00011    gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared renumberblock.c -o renumberblock.so
00012 
00013    The resulting renumberblock.so goes in $HOME/.pcb/plugins/renumberblock.so.
00014 
00015    Usage: RenumberBlock(oldnum,newnum)
00016 
00017    All selected elements are renumbered by adding (newnum-oldnum) to
00018    the existing number.  I.e. RenumberBlock(100,200) will change R213
00019    to R313.
00020 
00021    Usage: RenumberBuffer(oldnum,newnum)
00022 
00023    Same, but the paste buffer is renumbered.
00024 
00025 */
00026 
00027 #include <stdio.h>
00028 #include <math.h>
00029 
00030 #include "global.h"
00031 #include "data.h"
00032 #include "hid.h"
00033 #include "misc.h"
00034 #include "create.h"
00035 #include "rtree.h"
00036 #include "undo.h"
00037 #include "error.h"
00038 #include "change.h"
00039 
00040 static int
00041 renumber_block (int argc, char **argv, int x, int y)
00042 {
00043   char num_buf[15];
00044   int old_base, new_base;
00045 
00046   if (argc < 2) {
00047     Message("Usage: RenumberBlock oldnum newnum");
00048     return 1;
00049   }
00050 
00051   old_base = atoi (argv[0]);
00052   new_base = atoi (argv[1]);
00053 
00054   SET_FLAG (NAMEONPCBFLAG, PCB);
00055 
00056   ELEMENT_LOOP (PCB->Data);
00057   {
00058     char *refdes_split, *cp;
00059     char *old_ref, *new_ref;
00060     int num;
00061 
00062     if (!TEST_FLAG (SELECTEDFLAG, element))
00063       continue;
00064 
00065     old_ref = element->Name[1].TextString;
00066     for (refdes_split=cp=old_ref; *cp; cp++)
00067       if (!isdigit(*cp))
00068         refdes_split = cp+1;
00069 
00070     num = atoi (refdes_split);
00071     num += (new_base - old_base);
00072     sprintf(num_buf, "%d" ,num);
00073     new_ref = (char *) malloc (refdes_split - old_ref + strlen(num_buf) + 1);
00074     memcpy (new_ref, old_ref, refdes_split - old_ref);
00075     strcpy (new_ref + (refdes_split - old_ref), num_buf);
00076 
00077     AddObjectToChangeNameUndoList (ELEMENT_TYPE, NULL, NULL,
00078                                    element,
00079                                    NAMEONPCB_NAME (element));
00080     
00081     ChangeObjectName (ELEMENT_TYPE, element, NULL, NULL, new_ref);
00082   }
00083   END_LOOP;
00084   IncrementUndoSerialNumber ();
00085   return 0;
00086 }
00087 
00088 static int
00089 renumber_buffer (int argc, char **argv, int x, int y)
00090 {
00091   char num_buf[15];
00092   int old_base, new_base;
00093 
00094   if (argc < 2) {
00095     Message("Usage: RenumberBuffer oldnum newnum");
00096     return 1;
00097   }
00098 
00099   old_base = atoi (argv[0]);
00100   new_base = atoi (argv[1]);
00101 
00102   SET_FLAG (NAMEONPCBFLAG, PCB);
00103 
00104   ELEMENT_LOOP (PASTEBUFFER->Data);
00105   {
00106     char *refdes_split, *cp;
00107     char *old_ref, *new_ref;
00108     int num;
00109 
00110     old_ref = element->Name[1].TextString;
00111     for (refdes_split=cp=old_ref; *cp; cp++)
00112       if (!isdigit(*cp))
00113         refdes_split = cp+1;
00114 
00115     num = atoi (refdes_split);
00116     num += (new_base - old_base);
00117     sprintf(num_buf, "%d" ,num);
00118     new_ref = (char *) malloc (refdes_split - old_ref + strlen(num_buf) + 1);
00119     memcpy (new_ref, old_ref, refdes_split - old_ref);
00120     strcpy (new_ref + (refdes_split - old_ref), num_buf);
00121     
00122     ChangeObjectName (ELEMENT_TYPE, element, NULL, NULL, new_ref);
00123   }
00124   END_LOOP;
00125   return 0;
00126 }
00127 
00128 static HID_Action renumber_block_action_list[] = {
00129   {"RenumberBlock", NULL, renumber_block,
00130    NULL, NULL},
00131   {"RenumberBuffer", NULL, renumber_buffer,
00132    NULL, NULL}
00133 };
00134 
00135 REGISTER_ACTIONS (renumber_block_action_list)
00136 
00137 void
00138 pcb_plugin_init()
00139 {
00140   register_renumber_block_action_list();
00141 }

Generated on Tue Aug 17 15:28:04 2010 for pcb-plugins by  doxygen 1.4.6-NO