boardflip.c

00001 /* BoardFlip plug-in for PCB
00002    http://www.delorie.com/pcb/boardflip.c
00003 
00004    Copyright (C) 2008 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 boardflip.c -o boardflip.so
00012 
00013    The resulting boardflip.so goes in $HOME/.pcb/plugins/boardflip.so.
00014 
00015    Usage: Boardflip()
00016 
00017    All objects on the board are up-down flipped.
00018 
00019    Command line board flipping:
00020 
00021    pcb --action-string "BoardFlip() SaveTo(LayoutAs,$OUTFILE) Quit()" $INFILE
00022 
00023    To flip the board physically, use BoardFlip(sides)
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 
00038 /* Things that need to be flipped:
00039 
00040    lines
00041    text
00042    polygons
00043    arcs
00044    vias
00045    elements
00046        elementlines
00047        elementarcs
00048        pins
00049        pads
00050    rats
00051 */
00052 
00053 #define FLIP(y) (y) = h - (y)
00054 #define NEG(y) (y) = - (y)
00055 
00056 static int
00057 boardflip (int argc, char **argv, int x, int y)
00058 {
00059   int h = PCB->MaxHeight;
00060   int sides = 0;
00061 
00062   if (argc > 0 && strcasecmp (argv[0], "sides") == 0)
00063     sides = 1;
00064   printf("argc %d argv %s sides %d\n", argc, argv[0], sides);
00065 
00066   LAYER_LOOP (PCB->Data, max_layer + 2);
00067   {
00068     LINE_LOOP (layer);
00069     {
00070       FLIP (line->Point1.Y);
00071       FLIP (line->Point2.Y);
00072     }
00073     END_LOOP;
00074 
00075     TEXT_LOOP (layer);
00076     {
00077       FLIP (text->Y);
00078       TOGGLE_FLAG(ONSOLDERFLAG, text);
00079     }
00080     END_LOOP;
00081 
00082     POLYGON_LOOP (layer);
00083     {
00084       int i, j;
00085       POLYGONPOINT_LOOP (polygon);
00086       {
00087         FLIP (point->Y);
00088       }
00089       END_LOOP;
00090       i = 0;
00091       j = polygon->PointN - 1;
00092       while (i < j)
00093         {
00094           PointType p = polygon->Points[i];
00095           polygon->Points[i] = polygon->Points[j];
00096           polygon->Points[j] = p;
00097           i++;
00098           j--;
00099         }
00100     }
00101     END_LOOP;
00102 
00103     ARC_LOOP (layer);
00104     {
00105       FLIP (arc->Y);
00106       NEG (arc->StartAngle);
00107       NEG (arc->Delta);
00108     }
00109     END_LOOP;
00110   }
00111   END_LOOP;
00112 
00113   VIA_LOOP(PCB->Data);
00114   {
00115     FLIP (via->Y);
00116   }
00117   END_LOOP;
00118 
00119   ELEMENT_LOOP (PCB->Data);
00120   {
00121     FLIP (element->MarkY);
00122     if (sides)
00123       TOGGLE_FLAG (ONSOLDERFLAG, element);
00124 
00125     ELEMENTTEXT_LOOP (element);
00126     {
00127       FLIP (text->Y);
00128       TOGGLE_FLAG (ONSOLDERFLAG, text);
00129     }
00130     END_LOOP;
00131 
00132     ELEMENTLINE_LOOP (element);
00133     {
00134       FLIP (line->Point1.Y);
00135       FLIP (line->Point2.Y);
00136     }
00137     END_LOOP;
00138 
00139     ELEMENTARC_LOOP (element);
00140     {
00141       FLIP (arc->Y);
00142       NEG (arc->StartAngle);
00143       NEG (arc->Delta);
00144     }
00145     END_LOOP;
00146 
00147     PIN_LOOP (element);
00148     {
00149       FLIP (pin->Y);
00150     }
00151     END_LOOP;
00152 
00153     PAD_LOOP (element);
00154     {
00155       FLIP (pad->Point1.Y);
00156       FLIP (pad->Point2.Y);
00157       if (sides)
00158         TOGGLE_FLAG (ONSOLDERFLAG, pad);
00159     }
00160     END_LOOP;
00161   }
00162   END_LOOP;
00163 
00164   RAT_LOOP (PCB->Data);
00165   {
00166     FLIP (line->Point1.Y);
00167     FLIP (line->Point2.Y);
00168   }
00169   END_LOOP;
00170 
00171   return 0;
00172 }
00173 
00174 static HID_Action boardflip_action_list[] = {
00175   {"BoardFlip", NULL, boardflip,
00176    NULL, NULL}
00177 };
00178 
00179 REGISTER_ACTIONS (boardflip_action_list)
00180 
00181 void
00182 pcb_plugin_init()
00183 {
00184   register_boardflip_action_list();
00185 }

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