00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
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 }