#usage "Change all objects from one layer to an other\n"
"
"
"Author: support@cadsoft.de"
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
string Help = "\nObjects in copper layers can be exchanged for\n" +
"other copper layers, but not for non-copper layers.\n" +
"Objects in non-copper layers can be exchanged for\n" +
"other non-copper layers, but not for copper layers.";
string Version = "1.1";
int isLayer = 1, toLayer = 16 ;
int swapLayer = 0;
string usedLayer[] = { "NONE" };
int usedLayerN[] = { 0 };
string cmd;
string c;
// check problem by crossing layer
int checkLayer(int is1, int to1, int swap) {
int err;
if (is1 == 0 || to1 == 0) return 1;
// do not change in Via - Pad - Signal - layer
for (int l = 17; l < 20; l++) {
if (is1 == l || to1 == l ) return l;
if (swap == l) return 3;
}
// you can not swap other to copper layer and back
if ( (is1 >= 20 || to1 >= 20) && (swap < 20 && swap > 0) ) return 3;
// do not use duble
if (is1 == to1 ) return 2;
// not use Originlayer
if (is1 == 23 || to1 == 23 ) return 23;
if (is1 == 24 || to1 == 24 ) return 23;
if (is1 < 17 && to1 > 16) return 4;
if (is1 > 19 && to1 < 20) return 4;
if (is1 == to1) return 2;
if (is1 == swap || to1 == swap ) err = 3;
if ( (is1 < 20 || to1 < 20) && swap > 16) return 3;
if ( (is1 > 19 || to1 > 19) && swap < 20) return 3;
return err;
}
void change(real x, real y) {
sprintf(c, " (%.2f %.2f) ", x, y );
cmd += c;
return;
}
void ch_layer(int islay, int tolay, int display) {
sprintf(c, ";\nCHANGE LAYER %d;\n", tolay);
cmd += c;
sprintf(c, "DISPLAY NONE %d;\n", display);
cmd += c;
sprintf(c, "CHANGE LAYER %d ", tolay);
cmd += c;
real dx, dy;
board(B) {
B.signals(S) {
S.wires(W) {
if (W.layer == islay) {
dx = u2mm((W.x1 + W.x2) / 2);
dy = u2mm((W.y1 + W.y2) / 2);
change(dx, dy);
}
}
S.polygons(P) {
P.contours(W) {
if (W.layer == islay) {
dx = u2mm(W.x1);
dy = u2mm(W.y1);
change(dx, dy);
break;
}
}
}
}
B.wires(W) {
if (W.layer == islay) {
dx = u2mm((W.x1 + W.x2) / 2);
dy = u2mm((W.y1 + W.y2) / 2);
change(dx, dy);
}
}
B.polygons(P) {
P.contours(W) {
if (W.layer == islay) {
dx = u2mm(W.x1);
dy = u2mm(W.y1);
change(dx, dy);
break;
}
}
}
B.circles(C) {
if (C.layer == islay) {
dx = u2mm(C.x + C.radius);
dy = u2mm(C.y);
change(dx, dy);
}
}
B.arcs(A) {
if (A.layer == islay) {
dx = u2mm(A.x1);
dy = u2mm(A.y1);
change(dx, dy);
}
}
B.rectangles(R) {
if (R.layer == islay) {
dx = u2mm(R.x1);
dy = u2mm(R.y1);
change(dx, dy);
}
}
B.texts(T) {
if (T.layer == islay) {
dx = u2mm(T.x);
dy = u2mm(T.y);
change(dx, dy);
}
}
}
return;
}
void menue(void) {
int err = 0;
int isLay = 0;
int toLay = 0;
int swapLay = 0;
dlgDialog("Swap Layer to Layer") {
dlgGroup("Change layer") {
dlgHBoxLayout {
dlgLabel("&From A");
dlgComboBox(usedLayer, isLay);
}
dlgHBoxLayout {
dlgLabel("&to B");
dlgComboBox(usedLayer, toLay);
}
}
dlgLabel("If you want to swap layer A <-> B,");
dlgHBoxLayout {
dlgLabel("select an empty temporary &swap layer");
dlgComboBox(usedLayer, swapLay);
}
dlgLabel(Help);
dlgHBoxLayout {
dlgPushButton("+&OK") {
isLayer = usedLayerN[isLay];
toLayer = usedLayerN[toLay];
swapLayer = usedLayerN[swapLay];
int error = checkLayer(isLayer, toLayer, swapLayer);
if (error) {
string h;
switch (error) {
case 1 : h = "Error: Select layer";
break;
case 2 : h = "Error: Select different layer";
break;
case 3 : h = "Error: Swap layer";
break;
case 4 : h = "Error: Do not mix copper layers with drawing layers";
break;
case 5 : h = "Error: Missing Layer";
break;
case 6 : h = "Error: Same 'From' layer";
break;
case 7 : h = "Error: Same 'To' layer";
break;
case 17 : h = "Error: Do not use PAD layer";
break;
case 18 : h = "Error: Do not use VIA layer";
break;
case 19 : h = "Error: Do not use Signal layer";
break;
case 23 : h = "Error: Do not use Origin layer";
break;
default : sprintf(h, "Error select layer. #%d", error);
}
dlgMessageBox(h, "OK");
}
else {
dlgAccept();
return;
}
}
dlgStretch(1);
dlgPushButton("-&Cancel") { dlgReject(); exit (0);}
}
};
}
// main
if (board) board(B) {
string displayLayer = ";\nDISPLAY NONE ";
int lay = 0;
B.layers(L) {
string l;
if (L.visible) {
lay++;
usedLayer[lay] = L.name;
usedLayerN[lay] = L.number;
sprintf( l, "%d", L.number);
displayLayer += " " + l;
}
}
menue();
sprintf(c, "GRID mm FINEST;\n");
cmd += c;
sprintf(c, "SET UNDO_LOG OFF;\n");
cmd += c;
if (swapLayer) {
ch_layer(isLayer, swapLayer, isLayer);
ch_layer(toLayer, isLayer, toLayer);
ch_layer(isLayer, toLayer, swapLayer );
}
else {
ch_layer(isLayer, toLayer, isLayer);
}
sprintf(c, "%s;\n", displayLayer);
cmd += c;
sprintf(c, ";\nGRID LAST;\nSET UNDO_LOG ON;\n");
cmd += c;
exit (cmd);
}
else {
dlgMessageBox("Run this ULP from a Board", "OK");
exit (0);
}