You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
491 lines
15 KiB
Plaintext
491 lines
15 KiB
Plaintext
#usage "<b>Change shape, diameter, flags and drill of all pads in a library</b>\n"
|
|
"<p>"
|
|
"<author>Author: support@cadsoft.de</author>"
|
|
|
|
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
|
|
// Version 4.2 -- 20.04.2004 alf@cadsoft.de
|
|
// Version 4.3 -- 04.03.2005 alf@cadsoft.de
|
|
// Change Drill gerundet auf 1/10 mm
|
|
// wenn angegebenes Toleranzfenster eingehalten wird.
|
|
// Change Restring wenn angegebenes Toleranzfenster eingehalten wird.
|
|
|
|
string drill_help = "<nobr>Changes the drill diameter for all pads within the tolerances.<br>" +
|
|
"</nobr>";
|
|
|
|
string rounddrill_help = "<nobr>Rounding the drill diameter to 1/10 mm.<br>Only for drill diameter of pads that are within the given tolerances.<br>" +
|
|
"</nobr>";
|
|
|
|
string restring_help = "<nobr>Changes the restring of pads that are within the given range.<br>" +
|
|
"</nobr>";
|
|
|
|
|
|
if (language() == "de") {
|
|
drill_help = "<nobr>Ändert nur Bohrdurchmesser von PADs deren Wert innerhalb des Toleranzfensters liegt.<br>" +
|
|
"</nobr>";
|
|
|
|
rounddrill_help = "<nobr>Bohrdurchmesser auf 1/10 mm runden.<br>Rundet nur Bohrdurchmesser von PADs deren Wert innerhalb des Toleranzfensters liegt.<br>" +
|
|
"</nobr>";
|
|
|
|
restring_help = "<nobr>Ändert nur Restringe von Pads deren Wert innerhalb des Bereiches liegt.<br>" +
|
|
"</nobr>";
|
|
}
|
|
|
|
|
|
string script_change = "";
|
|
|
|
int Result = 0;
|
|
string grid = "GRID MM FINEST;\n";
|
|
string cmd, s;
|
|
|
|
// *** flags for changes
|
|
int change_pac;
|
|
int cntPac = 0, cntContact = 0;
|
|
|
|
int to_change[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
int begin = - 1; // *** pointer of flags
|
|
int P_firstpad = begin + 1;
|
|
int P_shape = P_firstpad + 1;
|
|
int P_drill = P_shape + 1;
|
|
int P_rounddrill = P_drill + 1;
|
|
int P_diameter = P_rounddrill + 1;
|
|
int P_restring = P_diameter + 1;
|
|
int P_stopmask = P_restring + 1;
|
|
int P_creammask = P_stopmask + 1;
|
|
int last = P_creammask + 1;
|
|
|
|
int changefrom = P_drill;
|
|
int changeto = last - 1;
|
|
|
|
|
|
real change_values[] = {
|
|
0, // Pad-First-Pin
|
|
0, // Pad-Shape
|
|
0, // Pad-Drill
|
|
0, // Pad-Drill round
|
|
0, // Pad-Diameter
|
|
0, // Pad-Restring
|
|
0, // Pad-Stop-Mask
|
|
0, // Pad-Cream-Mask
|
|
0 };
|
|
|
|
string tochange[] = {
|
|
"Change pad flag '&First' ",
|
|
"Change pad &shape",
|
|
"Change pad &drill",
|
|
"Round pad drill 1/&10 mm",
|
|
"Change pad dia&meter",
|
|
"Change pad &restring",
|
|
"Change pad s&top mask ON/OFF",
|
|
"Change pad &cream mask ON/OFF",
|
|
"" };
|
|
|
|
string menuchange[] = {
|
|
"Change Pad Flag 'First' ",
|
|
"Change Pad Shape",
|
|
"Change Pad Drill",
|
|
"Rounding Pad Drill 1/10 mm",
|
|
"Change Pad Diameter",
|
|
"Change Pad Restring",
|
|
"Change Pad Stop Mask ON/OFF",
|
|
"Change Pad Cream Mask ON/OFF",
|
|
"" };
|
|
|
|
real min_val[] = {
|
|
0.0, // Pad-First-Pin
|
|
0.0, // Pad-Shape
|
|
0.0, // Pad-Drill
|
|
0.0, // Pad-Drill round
|
|
0.0, // Pad-Diameter
|
|
0.0, // Pad-Restring
|
|
0.0, // Pad-Stop-Mask
|
|
0.0 // Pad-Cream-Mask
|
|
};
|
|
|
|
real max_val[] = {
|
|
0, // Pad-First-Pin
|
|
13.1, // Pad-Shape
|
|
13.1, // Pad-Drill
|
|
13.1, // Pad-Drill round
|
|
13.1, // Pad-Diameter
|
|
13.1, // Pad-Restring
|
|
1, // Pad-Stop-Mask
|
|
1, // Pad-Cream-Mask
|
|
0
|
|
};
|
|
|
|
string min_max[] = {
|
|
"", // Pad-First-Pin
|
|
"in the range of 0.0...13.1 mm", // Pad-Shape
|
|
"in the range of 0.0...13.1 mm", // Pad-Drill
|
|
"", // Pad-Drill round
|
|
"in the range of 0.0...13.1 mm", // Pad-Diameter
|
|
"in the range of 0.0...13.1 mm", // Pad-Restring
|
|
"in the range of 0 Off / 1 On", // Pad-Stop-Mask
|
|
"in the range of 0 Off / 1 On", // Pad-Cream-Mask
|
|
""
|
|
};
|
|
|
|
string fist_pad_name = "1"; // change to A-Z alphabetical (example: for transistor emitter = E)
|
|
string first_onoff[] = { "OFF", "ON" };
|
|
int flag_offon = 1;
|
|
string stop_onoff = "ON";
|
|
string cream_onoff = "ON";
|
|
int shape = 0;
|
|
int shape1 = 0;
|
|
int round_drill = 0; // to round pad drills to 1/10 mm
|
|
int mpercent = 2, ppercent = 5;
|
|
real minrestring = 0.0, maxrestring = 0.3;
|
|
|
|
string pad1, padx;
|
|
|
|
string shape_form[] = { // change Shape
|
|
"NONE",
|
|
"SQUARE",
|
|
"ROUND",
|
|
"OCTAGON",
|
|
"" };
|
|
|
|
int cntchrestring = 0;
|
|
int cntchdrill = 0;
|
|
|
|
|
|
|
|
// *** function ***
|
|
void get_changemenue(string lib) {
|
|
Result = dlgDialog("Change PAD in Library") {
|
|
dlgLabel("(" + lib + ")");
|
|
dlgStretch(0);
|
|
dlgHBoxLayout {
|
|
dlgGroup("Change") {
|
|
dlgCheckBox(tochange[P_firstpad], to_change[P_firstpad]);
|
|
dlgCheckBox(tochange[P_shape], to_change[P_shape]);
|
|
dlgHBoxLayout {
|
|
dlgCheckBox(tochange[P_drill], to_change[P_drill]) if (to_change[P_rounddrill]) to_change[P_rounddrill] = 0;
|
|
dlgSpacing(45);
|
|
dlgCheckBox(tochange[P_rounddrill], to_change[P_rounddrill]) if (to_change[P_drill]) to_change[P_drill] = 0;
|
|
dlgStretch(1);
|
|
}
|
|
dlgHBoxLayout {
|
|
dlgCheckBox(tochange[P_diameter], to_change[P_diameter]) if (to_change[P_restring]) to_change[P_restring] = 0;
|
|
dlgSpacing(20);
|
|
dlgCheckBox(tochange[P_restring], to_change[P_restring]) if (to_change[P_diameter]) to_change[P_diameter] = 0;
|
|
dlgStretch(1);
|
|
}
|
|
dlgCheckBox(tochange[P_stopmask], to_change[P_stopmask]);
|
|
dlgCheckBox(tochange[P_creammask], to_change[P_creammask]);
|
|
}
|
|
dlgStretch(1);
|
|
}
|
|
dlgStretch(1);
|
|
dlgHBoxLayout {
|
|
dlgStretch(0);
|
|
dlgPushButton("+Change") dlgAccept();
|
|
dlgStretch(1);
|
|
dlgPushButton("-ESC") dlgReject();
|
|
dlgStretch(0);
|
|
}
|
|
dlgStretch(0);
|
|
};
|
|
if (Result == 0) exit (0);
|
|
|
|
if (to_change[P_shape] || to_change[P_firstpad]) {
|
|
Result = dlgDialog("Change Pad Shape") {
|
|
if (to_change[P_firstpad]) {
|
|
dlgHBoxLayout {
|
|
dlgCheckBox(tochange[0], to_change[P_firstpad]);
|
|
dlgLabel(" b&y name ");
|
|
dlgStringEdit(fist_pad_name);
|
|
dlgLabel("&On/Off");
|
|
dlgComboBox(first_onoff, flag_offon);
|
|
dlgStretch(1);
|
|
}
|
|
dlgStretch(1);
|
|
}
|
|
dlgHBoxLayout {
|
|
dlgGroup("Shape of Pin 1") {
|
|
dlgGridLayout {
|
|
dlgCell(2, 1) dlgRadioButton(shape_form[0], shape1);
|
|
dlgCell(3, 1) dlgRadioButton(shape_form[1], shape1);
|
|
dlgCell(4, 1) dlgRadioButton(shape_form[2], shape1);
|
|
dlgCell(5, 1) dlgRadioButton(shape_form[3], shape1);
|
|
}
|
|
}
|
|
dlgLabel(pad1);
|
|
dlgGroup("Shape of other pin(s)") {
|
|
dlgGridLayout {
|
|
dlgCell(2, 1) dlgRadioButton(shape_form[0], shape);
|
|
dlgCell(3, 1) dlgRadioButton(shape_form[1], shape);
|
|
dlgCell(4, 1) dlgRadioButton(shape_form[2], shape);
|
|
dlgCell(5, 1) dlgRadioButton(shape_form[3], shape);
|
|
}
|
|
}
|
|
dlgLabel(padx);
|
|
dlgStretch(1);
|
|
}
|
|
dlgHBoxLayout {
|
|
dlgStretch(0);
|
|
dlgPushButton("+OK") dlgAccept();
|
|
dlgStretch(1);
|
|
dlgPushButton("-ESC") dlgReject();
|
|
dlgStretch(0);
|
|
}
|
|
};
|
|
if (Result == 0) exit (0);
|
|
}
|
|
|
|
for (int n = changefrom; n <= changeto; n++) {
|
|
if (to_change[n]) {
|
|
int todo = 1;
|
|
Result = dlgDialog(menuchange[n]) {
|
|
if (n == P_drill) {
|
|
dlgLabel(drill_help);
|
|
dlgHBoxLayout {
|
|
dlgGroup("Tolerance") {
|
|
dlgHBoxLayout {
|
|
dlgLabel(" &- %");
|
|
dlgIntEdit(mpercent);
|
|
dlgLabel(" &+ %");
|
|
dlgIntEdit(ppercent);
|
|
dlgStretch(1);
|
|
}
|
|
}
|
|
dlgStretch(1);
|
|
}
|
|
dlgHBoxLayout {
|
|
dlgLabel("&Drill diameter ");
|
|
dlgRealEdit(change_values[n], min_val[n], max_val[n]);
|
|
dlgStretch(1);
|
|
}
|
|
todo = 0;
|
|
}
|
|
|
|
if( n == P_rounddrill) {
|
|
dlgLabel(rounddrill_help);
|
|
dlgHBoxLayout {
|
|
dlgLabel(" &- %");
|
|
dlgIntEdit(mpercent);
|
|
dlgLabel(" &+ %");
|
|
dlgIntEdit(ppercent);
|
|
dlgStretch(1);
|
|
todo = 0;
|
|
}
|
|
}
|
|
|
|
if( n == P_restring) {
|
|
dlgLabel(restring_help);
|
|
dlgHBoxLayout {
|
|
dlgGroup("Range") {
|
|
dlgHBoxLayout {
|
|
dlgLabel(" m&in ");
|
|
dlgRealEdit(minrestring);
|
|
dlgLabel(" m&ax ");
|
|
dlgRealEdit(maxrestring);
|
|
}
|
|
}
|
|
dlgLabel(" New &Restring ");
|
|
dlgRealEdit(change_values[n], min_val[n], max_val[n]);
|
|
dlgStretch(1);
|
|
}
|
|
todo = 0;
|
|
}
|
|
|
|
if (todo) {
|
|
dlgHBoxLayout {
|
|
dlgRealEdit(change_values[n], min_val[n], max_val[n]);
|
|
dlgStretch(1);
|
|
}
|
|
}
|
|
|
|
dlgVBoxLayout {
|
|
if (min_max[n]) dlgLabel(min_max[n]);
|
|
dlgHBoxLayout {
|
|
dlgStretch(0);
|
|
dlgPushButton("+OK") dlgAccept();
|
|
dlgStretch(1);
|
|
dlgSpacing(100);
|
|
dlgPushButton("-Cancel") dlgReject();
|
|
dlgStretch(0);
|
|
}
|
|
}
|
|
};
|
|
if (Result == 0) exit (0);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
// change First flag
|
|
void change_first(string onoff, int x, int y) {
|
|
sprintf(s, "Change FIRST %s (%.4f %.4f);\n", onoff, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
return;
|
|
}
|
|
|
|
|
|
// change Pad Shape
|
|
void change_shape(string shape, int x, int y) {
|
|
sprintf(s, "Change SHAPE %s (%.4f %.4f);\n", shape, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
return;
|
|
}
|
|
|
|
|
|
// change Drill Diameter
|
|
void change_prill(real diameter, int x, int y, int drill, string pac) {
|
|
real isdrill = u2mm(drill);
|
|
if (isdrill >= diameter - (diameter / 100 * mpercent) && isdrill <= diameter + (diameter / 100 * ppercent)) {
|
|
if (abs(diameter - isdrill) < 0.000001 ) return;
|
|
sprintf(s, "Change DRILL %.4f (%.4f %.4f);\n", diameter, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
cntchdrill++;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
// change Drill Diameter rounded 1/10 mm
|
|
void change_prillround(real diameter, int x, int y, int drill) {
|
|
real isdrill = u2mm(drill);
|
|
real rval = round(isdrill * 10.0) / 10.0;
|
|
|
|
if (abs(rval - isdrill) < 0.000001 ) return;
|
|
|
|
if (isdrill >= rval - ((rval / 100) * mpercent) && isdrill <= rval + ((rval / 100) * ppercent)) {
|
|
cntchdrill++;
|
|
sprintf(s, "Change DRILL %.4f (%.4f %.4f);\n", rval, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
// change Pad Diameter
|
|
void change_pdiameter(real diameter, int x, int y) {
|
|
sprintf(s, "Change DIAMETER %.4f (%.4f %.4f);\n", diameter, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
return;
|
|
}
|
|
|
|
|
|
// change Pad Restring
|
|
void change_restring(real mRestring, int diam, int x, int y, int drill) {
|
|
real isrestring = u2mm(diam) - u2mm(drill);
|
|
if (isrestring) isrestring /= 2; // ** do not device by zerro **
|
|
if (isrestring < 0) isrestring = 0; // negativ parameter not allowed
|
|
if (isrestring >= minrestring && isrestring <= maxrestring) {
|
|
sprintf(s, "CHANGE DIAMETER %.4f (%.4f %.4f);\n", u2mm(drill) + 2 * mRestring, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
cntchrestring++;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
// change Stop mask flag
|
|
void change_mask(string onoff, int x, int y) {
|
|
sprintf(s, "Change %s (%.4f %.4f);\n", onoff, u2mm(x), u2mm(y));
|
|
cmd += s;
|
|
return;
|
|
}
|
|
|
|
|
|
// ********************************************************
|
|
if (library) {
|
|
pad1 = "<img src=change-pad-in-lbr-1.bmp>";
|
|
padx = "<img src=change-pad-in-lbr-x.bmp>";
|
|
int n = 0;
|
|
library(L) {
|
|
get_changemenue(L.name);
|
|
|
|
// *** check if a change parameter activ ***
|
|
if (!to_change[P_shape] &&
|
|
!to_change[P_drill] &&
|
|
!to_change[P_rounddrill] &&
|
|
!to_change[P_diameter] &&
|
|
!to_change[P_restring] &&
|
|
!to_change[P_stopmask] &&
|
|
!to_change[P_creammask] &&
|
|
!to_change[P_firstpad]) exit (0);
|
|
|
|
if (change_values[P_stopmask]) stop_onoff = "ON";
|
|
else stop_onoff = "OFF";
|
|
if (change_values[P_creammask]) cream_onoff = "ON";
|
|
else cream_onoff = "OFF";
|
|
|
|
script_change = filesetext(L.name, "~~~.scr");
|
|
|
|
output(script_change, "wtD") {
|
|
printf("DISPLAY NONE 1 16 17;\n");
|
|
int firstf = 1;
|
|
L.packages(P) {
|
|
cntPac++;
|
|
change_pac = 0;
|
|
cmd = "";
|
|
P.contacts(C) {
|
|
cntContact++;
|
|
if (C.pad) {
|
|
if (to_change[P_shape] && (shape || shape1)){
|
|
if (C.name == "1" && shape1) change_shape(shape_form[shape1], C.pad.x, C.pad.y);
|
|
else { if (shape) change_shape(shape_form[shape], C.pad.x, C.pad.y); }
|
|
}
|
|
if (to_change[P_firstpad]) {
|
|
if (C.name == fist_pad_name) {
|
|
change_first(first_onoff[flag_offon], C.x, C.y);
|
|
}
|
|
}
|
|
if (to_change[P_drill]) {
|
|
change_prill(change_values[P_drill], C.pad.x, C.pad.y, C.pad.drill, P.name);
|
|
}
|
|
if (to_change[P_rounddrill]) {
|
|
change_prillround(change_values[P_drill], C.pad.x, C.pad.y, C.pad.drill);
|
|
}
|
|
if (to_change[P_diameter]) {
|
|
change_pdiameter(change_values[P_diameter], C.pad.x, C.pad.y);
|
|
}
|
|
if (to_change[P_restring]) {
|
|
change_restring(change_values[P_restring], C.pad.diameter[LAYER_BOTTOM], C.pad.x, C.pad.y, C.pad.drill);
|
|
}
|
|
if (to_change[P_stopmask]) {
|
|
change_mask("STOP " + stop_onoff, C.pad.x, C.pad.y);
|
|
}
|
|
}
|
|
else if (C.smd) {
|
|
if (to_change[P_stopmask]) {
|
|
change_mask("STOP " + stop_onoff, C.smd.x, C.smd.y);
|
|
}
|
|
if (to_change[P_creammask]) {
|
|
change_mask("CREAM " + cream_onoff, C.smd.x, C.smd.y);
|
|
}
|
|
}
|
|
}
|
|
if (cmd) {
|
|
printf("EDIT %s.PAC;\n", P.name);
|
|
printf("%s",grid);
|
|
printf("%s",cmd);
|
|
}
|
|
}
|
|
// printf("GRID DEFAULT;\n");
|
|
printf("DISPLAY NONE 1 16 17 20 21 29 31;\n");
|
|
}
|
|
}
|
|
string sc;
|
|
s = "";
|
|
if (cntchdrill) {
|
|
sprintf(s, "%d Drills to change!\n", cntchdrill);
|
|
sc += s;
|
|
}
|
|
if (cntchrestring) {
|
|
sprintf(s, "%d Pad-Restring to change!", cntchrestring);
|
|
sc += s;
|
|
}
|
|
if (sc) if (dlgMessageBox(sc, "Ok", "Cancel") != 0) exit(0);
|
|
|
|
exit ("SCRIPT '" + script_change + "';\n");
|
|
}
|
|
|
|
else {
|
|
dlgMessageBox("! Start this ULP in a Library");
|
|
exit (0);
|
|
} |