#usage "en:Generate a one-sided stop mask in layer tStop or bStop with a given width beginning at the drill's edge.\n" "
" "In order to delete all mask data objects in the stop layer, which may result from a previous run of this ULP, display none " "except the Stop layer and use GROUP and DELETE." "
"
"
" "Um bereits vorhandene Maskendaten z.B. aus einem vorhergehenden Start des ULPs zu löschen, schalten Sie alle Layer bis auf den " "gewünschten aus, und löschen sie mit GROUP und DELETE." "
"
"
DRC Parameter for Limit = %smm
" +
"Set Limit in DRC to %s",
delkommanull(vdrill), delkommanull(vLabmlViaStopLimit), delkommanull(vdrill)
);
}
int selt = -1;
int selb = -1;
int srt = 1;
int Result = dlgDialog("Generate stop mask for VIA") {
/*
dlgHBoxLayout {
dlgLabel("Layer-Stack");
dlgLabel(LayerStack);
dlgStretch(1);
}
dlgHBoxLayout {
dlgLabel(sMaxViaDrill);
dlgStretch(1);
}
*/
dlgHBoxLayout {
dlgLabel("Mask Stop-Limit");
dlgRealEdit(LabmlViaStopLimit);
dlgLabel("mm");
dlgStretch(1);
}
if (LabmlViaStopLimit < MaxViaDrill) {
dlgGroup("DRC settings") {
dlgHBoxLayout {
dlgLabel(info);
dlgStretch(1);
dlgPushButton("Set, Save and Load DRU") {
LabmlViaStopLimit = MaxViaDrill;
savedru();
}
}
}
}
dlgGroup("Set stop mask") {
dlgHBoxLayout {
dlgVBoxLayout {
dlgRadioButton("tStop", StopMaskLayer);
dlgListView("Top Drill\toversize", ListVDrillsT, selt, srt) ListVDrillsT[selt] = changeoversize(ListVDrillsT[selt]);
}
dlgVBoxLayout {
dlgRadioButton("bStop", StopMaskLayer);
dlgListView("Bot.Drill\toversize", ListVDrillsB, selb, srt) ListVDrillsB[selb] = changeoversize(ListVDrillsB[selb]);
}
}
}
dlgHBoxLayout {
dlgPushButton("+OK") dlgAccept();
dlgPushButton("-Cancel") dlgReject();
dlgStretch(1);
dlgPushButton("Help") dlgMessageBox(usage);
}
};
if (!Result) exit(0);
return;
}
real oversize(string line) {
string s[];
int cnt = strsplit(s, line, '\t');
return strtod(s[1]);
}
real getoversize(int drill, int lay) {
int n;
if (lay == 29) {
for (int n = 0; n < CntVdrillsT; n++) {
if (drill == VDrillsT[n]) return oversize(ListVDrillsT[n]);
}
}
else if (lay = 30) {
for (int n = 0; n < CntVdrillsB; n++) {
if (drill == VDrillsB[n]) return oversize(ListVDrillsB[n]);
}
}
dlgMessageBox("Error, no drills found!", "OK");
exit(-230);
}
void drawmask(int x, int y, int diameter, int lay) {
real stopmaskoversize = getoversize(diameter, lay);
real radius = u2mm(diameter) / 2 + stopmaskoversize;
string s;
sprintf(s, "CIRCLE 0 (%.4fmm %.4fmm) (%.4fmm %.4fmm) ;\n",
u2mm(x), u2mm(y), u2mm(x) + radius, u2mm(y) );
Cmd += s;
return;
}
void adddrill(int drill, int lay) {
if (lay == 1) {
for (int n = 0; n < CntVdrillsT; n++) {
if (drill == VDrillsT[n]) return;
}
VDrillsT[CntVdrillsT++] = drill;
return;
}
else if (lay = 16) {
for (int n = 0; n < CntVdrillsB; n++) {
if (drill == VDrillsB[n]) return;
}
VDrillsB[CntVdrillsB++] = drill;
return;
}
return;
}
if (board) board(B) {
B.signals(S) {
S.vias(V) {
if(V.start == 1 || V.end == 16 ) {
if (MaxViaDrill < u2mm(V.drill)) MaxViaDrill = u2mm(V.drill);
if (V.start == 1 ) adddrill(V.drill, 1);
else if (V.end == 16) adddrill(V.drill, 16);
}
}
}
int n;
string v;
for (n = 0; n < CntVdrillsT; n++) {
sprintf(v, "%f", u2mm(VDrillsT[n]));
sprintf(ListVDrillsT[n], "%s\t0.0", delkommanull(v));
}
for (n = 0; n < CntVdrillsB; n++) {
sprintf(v, "%f", u2mm(VDrillsB[n]));
sprintf(ListVDrillsB[n], "%s\t0.0", delkommanull(v));
}
string dru_file = get_DesignRules(B.name); // read Designrules
getvaluemenu();
int masklayer;
if (!StopMaskLayer) masklayer = 29;
else masklayer = 30;
sprintf(Cmd, "Layer %d ;\nchange layer %d;\n", masklayer, masklayer);
B.signals(S) {
S.vias(V) {
if(V.start == 1 && StopMaskLayer == 0 || V.end == 16 && StopMaskLayer == 1) {
drawmask(V.x, V.y, V.drill, masklayer);
}
}
}
exit(Cmd);
}
else dlgMessageBox("Start this ULP in a Board!", "OK");
exit(0);