#usage "en: nobrFind elements in schematic/board and zoom in\n"
"
"
"Centers the object and zooms into the drawing."
"
"
"
You can also run this ULP from the command line:
"
"Usage: RUN find [ name [ pin | pad | [value CH new_value] [ count | * ]]"
"
"
"RUN find
"
"RUN find name
"
"RUN find name [counter]
"
"RUN find [DEV | GATE | PIN | PAD | POLYGON width | DRILL diameter | VIA stack | value [-S|+|-] [counter | *]] **
"
"RUN find DRILL diameter [counter | *] **
"
"RUN find current-value CH new-value [counter]
"
"RUN find value -S
"
"RUN find value + | - (step option)
"
""
"Search string is the name of the Device/Package/Net/Bus/Pin/Pad/Signal/Value
"
"counter specifies the number of elements that shall be found before ending the search
"
"* sets the counter to 1000
"
"PIN | PAD | DEV | GATE additionally searches for PIN, PAD, GATE, DEVICE names
"
"GATE without a given name, places the foremost found, unused gate
"
"GATE * lists all unused gates, select one of them to place it
"
"VIA start end searches for blind, buried, and micro vias with a certain length
"
"valueCHvalue replaces the value of an element with the given new one, if found (CH is case sensitive)
"
"value -S displays all elements with the same value at the same time (highlighted like with SHOW), in BRD only
"
"value - + shows step by step the previous or next found element, in BRD and SCH
"
"
"
"Searching order:
"
""
"Schematic: | Board: | |
"
"1. Part name | 1. Element | |
"
"2. Net name | 2. Signal/Wires/Vias | |
"
"3. Bus name | 3. Pads | |
"
"4. Value | 4. Value | Searching for values is not case sensitive. |
"
"5. Device ** | 5. Polygon width ** | |
"
"6. Gate ** | 6. Drill | |
"
"7. Pin ** | 7. Via stack | |
"
"8. Pad ** | | |
"
"
"
"** Device name, Gate name, Pin name, Pad name, Polygon width, or Drill diameter will be searched, if one of the options DEV, GATE, PIN, PAD, POLYGON or DRILL is given."
""
"In symbol editor you can search at PIN name, in package editor you can search at PAD/SMD name
"
"Author: support@cadsoft.de"
,
"de: Findet Elemente in Schaltplan und Board"
""
"Zoomt das gefundene Element in die Fenstermitte"
"
"
"
Sie können das ULP auch aus der Kommandozeile starten mit:
"
"RUN find [ name [ pin | pad | value [CH new_value] [ count | * ]]"
"
"
"RUN find
"
"RUN find name
"
"RUN find name [Zähler]
"
"RUN find [DEV | GATE | PIN | PAD | POLYGON width | DRILL diameter | VIA stack | value [-S|+|-] [Zähler | *]] **
"
"RUN find DRILL Durchmesser [Zähler | *] **
"
"RUN find alter-value CH neuer-value [Zähler]
"
"RUN find value -S
"
"RUN find value + | - (Step-Option)
"
"
"
"Suchbegriff ist der name des Device/Package/Net/Bus/Pin/Pad/Signal/Value
"
"Zähler legt die Anzahl der gefundenen Elemente fest, nach der die Suche beendet wird
"
"* setzt den Zähler auf 1000
"
"PIN | PAD | DEV | GATE sucht zusätzlich nach PIN-, PAD-, GATE-, DEVICE-Namen
"
"GATE ohne Namen, platziert das zuerst gefundene, nicht benutzte Gate.
"
"GATE * listet alle nicht benutzen Gates, das aus der Liste gewählte Gate wird plaziert.
"
"VIA start end sucht Blind- Buried- und Micro-Via einer bestimmten Länge
"
"value CH value ersetzt den Value des gefundenen Elements (CH beachtet die Gross-/Klein-Schreibung)
"
"value -S zeigt alle Elemente mit gleichen Values gleichzeitig (gehighlightet wie bei SHOW), nur in BRD.
"
"- + zeigt die gefundenen Elemente Schritt für Schritt (+ vor, - zurück), in BRD und SCH
"
"
"
"Such-Reihenfolge:
"
""
"Schematic: | Board: | |
"
"1. Part name | 1. Element | |
"
"2. Net name | 2. Signal/Wires/Vias | |
"
"3. Bus name | 3. Pads | |
"
"4. Value | 4. Value | Keine Unterscheidung der Groß-/Kleinschreibung. |
"
"5. Device ** | 5. Polygon width ** | |
"
"6. Gate ** | 6. Drill | |
"
"7. Pin ** | 7. Via stack | |
"
"8. Pad ** | | |
"
"
"
"** nach Device-, Gate-, Pin-, Pad-Namen, Polygon-Width und Drill-Durchmesser wird gesucht, falls DEV, GATE, PIN, PAD, POLYGON oder DRILL gesetzt ist.
"
""
"Im Symbol-Editor kann nach Pin-Name, im Package-Editor kann nach Pad/Smd-Name gesucht werden.
"
"Author: support@cadsoft.de";
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
// Version 1.1 2005.06.15 - CH : search and replace Value / Suchen und ersetzen das Value alf@cadsoft.de
// Zuweisung von vfind berichtigt, es konnten nur Values mit Großschreibung gefunden werden.
// durchsuchen von Netz-Namen in Bussen berichtigt.
// Version 1.2 2005.07.19 - Search also in Polygon - contour - wire
//
// Version 1.3 2005.11.14 - Search Part_Name
//
// Version 1.4 2006.04.25 - Show all parts with same Value in Board
//
// Version 1.5 2006.05.08 - Clip zoom coordinate for show to maximum
//
// Version 1.6 2006.09.26 - Find also (Device+)GATE-name
//
// Version 1.7 2006.11.09 - +/- Trace step by step with value
// ein neuer Suchbegriff setzt den Trace-counter auf 0
//
// Version 1.8 2007.02.13 - Find Net without Segment-Wire, but with Pinref
//
// Version 1.9 2007.02.23 - Find Polygons with Wire-Width
// Zuweisung von vfind als Kommadozeileneingabe berichtigt
// In Bus-Namen werden jetzt auch Netze in der Schreibweise "D[0..7],A[0..15]" gefunden
// Falls der Layer des gefundenen Element nicht Visible ist wird er eingeschaltet
//
// Version 2.0 2007.04.23 - Find Drills (Pad, Via, Hole - Diameter)
// GATE
// VIA stack, sucht Vias von Layer bis Layer
//
// Version 2.1 2007.06.27 - Erst die Anzahl der gefundenen Elemente anzeigen, dann mit SHOW markieren,
// damit man anschliessend mit WINDOW bzw. Scroll-Rad zoomen kann ohne daß die
// Markierung (highlighten) aufgehoben wird.
// Abfrage des Zähler argc für die zu suchende Anzahl berichtigt.
//
// Version 2.2 2007.07.05 - Hilfe in #usage en: de: integriert.
//
// Version 2.3 2007.10.16 - Find PIN in Symbol
// - Find PAD/SMD in Package
//
// Version 2.4 2008.06.10 - Window-Befehl für SCH angepasst,
// Zoomfenster in SCH über Area berechnet
// Zähler für Option PAD/PIN/DEV berichtigt
// require 5.0.1
//
#require 5.0001;
string Version = "Version 2.4";
string find;
string vfind;
string NewValue;
string ChangeValue;
int change_value = 0;
string again;
string fpin;
string fndpin = "Element";
string foundelement = "";
enum { sNull, sPin, sPad, sDevice, sGate, sValue };
string SCHfPinPad[] = { "", "PIN", "PAD", "DEV", "GATE", "VALUE"};
enum { bNull, bPad, bValue, bPolygon, bDrill, bVia };
string BRDfPinPad[] = { "", "PAD", "VALUE", "POLYGON", "DRILL", "VIA" };
// for "POLYGON", "DRILL", "VIA" see also function returnfind() and function show_B()
string Invoke[] ; // invoke list of not placed gates
int Vstart;
int Vend;
int fcnt = 0;
int cntstep = 0;
string stepfile = "";
int all;
int cnt;
int StepMode = 0; // for trace vorward/backward of elements for show
int Result;
real lastZoom = 0;
int lastSheet = 0;
real PolyWidth = 0;
real DrillDiam = 0;
int optshow = 0; // Only board. Option to manually placing 2006.04.25
int display_layer[];
int test = 0;
string fileName = argv[0];
string scriptfile = filesetext(fileName, "$$$.scr");
int gridunit;
string unit[] = { "Micron", "mm", "Mil", "Inch" };
string repeat = "";
// ### Functions ###
real u2u(int val) {
switch (gridunit) {
case GRID_UNIT_MIC : return u2mic(val);
case GRID_UNIT_MM : return u2mm(val);
case GRID_UNIT_MIL : return u2mil(val);
case GRID_UNIT_INCH : return u2inch(val);
}
}
string dpbacksl(string fs) {
int l = 0;
do {
if (fs[l] == '\\') {
string fs1 = strsub(fs, 0 , l + 1);
string fs2 = strsub(fs, l + 1 );
fs = fs1 + "\\" + fs2;
l += 2;
}
l++;
} while (fs[l]);
return fs;
}
string check_layer(void) {
board(B) {
B.layers(L) {
display_layer[L.number] = L.visible;
string s;
if (L.number == 21 || L.number == 22 || L.number == 25 || L.number == 26 || L.number == 27 || L.number == 28 || L.number == 51 || L.number == 52 ) {
if (L.visible) return "DISPLAY NONE 21 -23 25 27 51 22 -24 26 28 52;\n"; // display only Top layer
}
else if (L.visible) return "DISPLAY NONE 21 -23 25 27 51 22 -24 26 28 52;\n"; // display only Top layer
}
}
return "";
}
void showrepeat(string text) {
dlgDialog("FIND.ULP") {
dlgHBoxLayout dlgSpacing(600);
dlgHBoxLayout {
dlgVBoxLayout dlgSpacing(300);
dlgTextEdit(text);
}
dlgHBoxLayout {
dlgPushButton("+&OK") dlgAccept();
dlgStretch(1);
}
};
return;
}
string returnfind(void) {
string rs;
if (!fpin) fndpin = "Element";
if (fpin == "POLYGON") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin);
else if (fpin == "DRILL") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin);
else if (fpin == "VIA") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin);
else if (StepMode){
if (StepMode == fcnt) exit(repeat);
else repeat = ""; // no message while step mode
return "";
}
else sprintf(rs, "run ulpmessage.ulp '%d %s(s) %s found!' '%s';\n", fcnt, fndpin, find, foundelement); // 2007.03.23 alf
if (find) {
if (cntstep) {
if (cntstep > fcnt) {
output(stepfile, "wt") printf("%d\n%s\n%d", fcnt, vfind, cntstep); // write actual counter in file
}
else return ""; // for Trace step by step disply no message
}
}
return dpbacksl(rs);
}
void check(string repeat) {
if (optshow) {
if (test) showrepeat(repeat);
if (fcnt) {
exit(repeat);
}
return;
}
repeat = returnfind() + repeat;
if (test) showrepeat(repeat);
exit (repeat); // first messagebox than show 2007.06.27 alf
}
void helpULP(void) {
dlgDialog("find.ulp") {
dlgHBoxLayout dlgSpacing(550);
dlgLabel(usage);
dlgHBoxLayout {
dlgStretch(1);
dlgPushButton("+OK") dlgAccept();
dlgStretch(1);
}
};
return;
}
string getfind() {
real Dmin = 0.0, Dmax = u2u(13100);
string f;
all = 0;
int sel_m = 0;
int findpoly = 0;
Result = dlgDialog("Find Element"){
dlgHBoxLayout {
dlgVBoxLayout {
dlgHBoxLayout {
dlgLabel("&Name ");
dlgStringEdit(f);
dlgLabel(" (Value) ");
dlgSpacing(30);
dlgStretch(1);
dlgPushButton("&Help") helpULP();
}
dlgHBoxLayout {
dlgLabel("&Counts");
dlgIntEdit(all, 0, 10000);
dlgSpacing(200);
dlgStretch(1);
dlgLabel(Version);
dlgSpacing(12);
}
dlgHBoxLayout {
if (schematic) {
dlgGroup("Find options") {
dlgRadioButton("&...", sel_m) fpin = "";
dlgRadioButton("P&IN", sel_m) { fpin = "PIN"; }
dlgRadioButton("P&AD", sel_m) { fpin = "PAD"; }
dlgRadioButton("&DEV", sel_m) { fpin = "DEV"; }
dlgRadioButton("&GATE", sel_m) { fpin = "GATE"; }
dlgHBoxLayout {
dlgRadioButton("&VALUE", sel_m) fpin = "";
dlgSpacing(22);
dlgCheckBox(" &change to ", change_value);
dlgLabel(" Val&ue ");
dlgStringEdit(NewValue);
dlgStretch(1);
}
}
}
if (board) {
dlgGroup("Find options") {
dlgRadioButton("&...", sel_m) fpin = "";
dlgRadioButton("P&AD", sel_m) fpin = "PAD";
dlgHBoxLayout {
dlgRadioButton("&VALUE", sel_m) fpin = "";
dlgSpacing(12);
dlgCheckBox(" &change to", change_value) if (change_value) optshow = 0;
dlgLabel("Val&ue ");
dlgStringEdit(NewValue);
dlgSpacing(32);
dlgCheckBox("Sh&ow all ", optshow) if (optshow) change_value = 0;
}
dlgHBoxLayout {
dlgRadioButton("POL&YGON", sel_m) fpin = "PPOLYGON";
dlgSpacing(65);
dlgLabel(" &Width ");
dlgRealEdit(PolyWidth, 0, 10000);
dlgSpacing(90);
dlgStretch(1);
}
dlgHBoxLayout {
dlgRadioButton("&DRILL", sel_m) fpin = "DRILL";
dlgSpacing(73);
dlgLabel(" Diamete&r ");
dlgRealEdit(DrillDiam, Dmin, Dmax);
dlgSpacing(90);
dlgStretch(1);
}
dlgHBoxLayout {
dlgRadioButton("V&IA layer stack", sel_m) fpin = "VIA";
dlgSpacing(50);
dlgLabel(" &Start ");
dlgIntEdit(Vstart, 0, 16);
dlgSpacing(12);
dlgLabel(" &End ");
dlgIntEdit(Vend, 0, 16);
dlgSpacing(90);
dlgStretch(1);
}
}
dlgStretch(1);
}
}
dlgStretch(0);
dlgHBoxLayout {
dlgPushButton("+&Find") {
dlgAccept();
all--;
}
dlgStretch(1);
dlgPushButton("-Cancel") { dlgReject(); exit(-1); }
}
dlgStretch(1);
}
}
};
if (!f && fpin == "GATE") f = "0";
return f;
}
real clip_zoom(real v) { // clip value to max. coordinate 2006.05.08
switch (gridunit) {
case GRID_UNIT_MIC : if (v > 838200) return 838200;
if (v < -838200) return -838200;
break;
case GRID_UNIT_MM : if (v > 838.2) return 838.2;
if (v < -838.2) return -838.2;
break;
case GRID_UNIT_MIL : if (v > 33000.0) return 33000;
if (v < -33000.0) return -33000;
break;
case GRID_UNIT_INCH : if (v > 33.0) return 33;
if (v < -33.0) return -33;
break;
}
return v;
}
// #### make script line for show in board ####
string show_B(real x, real y, real zoom1, real zoom2, string findb, int fist, int layer) {
fcnt++;
string cmd = "";
string cmd_show;
// sprintf(cmd_show, "SHOW '%s';\n", findb);
sprintf(cmd_show, ";SHOW '%s' ", findb); // 2007.06.27 alf
if (fpin == "PAD") cmd_show = ""; // can not show pads
if (fpin == "POLYGON") sprintf(cmd_show, ";SHOW (%.4f %.4f);\n", x, y); // do not show polygons
// ### can not show drills ###
if (fpin == "DRILL") cmd_show = ""; // do not change this line
// ### can not show vias, only complete signal ###
if (fpin == "VIA") { cmd_show = ""; layer = 0; } // do not change this line
if (optshow) {
sprintf(cmd, "%s", cmd_show);
}
else {
if (lastZoom) {
if (StepMode) {
sprintf(cmd, "\n;WINDOW (%.6f %.6f) ;\n%s",
x, y,
cmd_show
);
}
else {
sprintf(cmd, "\n;WINDOW (%.6f %.6f) (%.6f %.6f) (%.6f %.6f);\n%s;\n",
x, y,
x, y,
x, y,
cmd_show
);
}
}
else {
if (StepMode) {
sprintf(cmd,
";\nWINDOW (%.6f %.6f);\n%s",
x, y,
cmd_show
);
}
else {
sprintf(cmd, ";WINDOW FIT;\n"
";WINDOW (%.6f %.6f) (%.6f %.6f) (%.6f %.6f);\n%s",
x, y,
clip_zoom(x + zoom1), y,
clip_zoom(x + zoom2), y,
cmd_show
);
lastZoom = zoom2;
}
}
if (ChangeValue == "CH") {
string chval;
sprintf(chval, "VALUE %s '%s';\n", findb, NewValue);
cmd += chval;
}
}
if (!display_layer[layer] && layer != 0) {
sprintf(cmd_show, "DISPLAY %d;\n%s", layer, cmd);
cmd += cmd_show;
}
if (fpin == "VIA") {
sprintf(cmd_show, "DISPLAY %d %d 18;\n", Vstart, Vend);
cmd += cmd_show;
}
return cmd;
}
// #### make script line for show in schematic ####
string show_S(int s, real x1area, real y1area, real x2area, real y2area, string finds) {
fcnt++;
string cmd_show;
sprintf(cmd_show, ";SHOW '%s' ", finds); // 2007.06.27 alf
string cmd = "";
if (s != lastSheet) {
lastSheet = s;
if (StepMode) {
sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s,
x1area, y1area,
x2area, y2area,
cmd_show
);
}
else {
sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s,
x1area, y1area,
x2area, y2area,
cmd_show
);
}
}
else {
if (StepMode) {
sprintf(cmd, ";\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s,
x1area, y1area,
x2area, y2area,
cmd_show
);
}
else {
sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s,
x1area, y1area,
x2area, y2area,
cmd_show
);
}
}
if (ChangeValue == "CH") {
string chval;
sprintf(chval, "VALUE %s '%s';\n", finds, NewValue);
cmd += chval;
}
if (StepMode) {
if (cntstep != fcnt) cmd = "";
}
return cmd;
}
real zfactor(real x1, real y1, real x2, real y2) {
return sqrt( pow(x2 - x1, 2) + pow(y2 - y1, 2) );
}
// *** split bus-name from net-name ***
int findBus(string name, string sfind) {
string bn[];
int b;
b = strsplit(bn, name, ':');
string nn[];
if (b == 2) {
b = strsplit(nn, bn[1], ',');
}
else {
b = strsplit(nn, name, ',');
}
for (int x = 0; x < b; x++) {
if(nn[x] == sfind) return 1;
}
// *** search for name[n..n] ***
string nm;
for (x = 0; x < b; x++) {
int pos1 = strchr(nn[x], '[');
int pos2 = strchr(nn[x], '.');
int pos3 = strchr(nn[x], ']');
string Pref = strsub(nn[x], 0 , pos1);
string n1 = strsub(nn[x], pos1+1, pos2-pos1-1);
string n2 = strsub(nn[x], pos2+2, pos3-pos2-2);
for (int n = strtol(n1); n <= strtol(n2); n++) {
sprintf(nm, "%s%d", Pref, n);
if (nm == sfind) return 1;
}
}
return 0;
}
// *** trace elemete step by step ***
string get_step(int step) {
StepMode = 1;
cntstep = 0;
string s = "";
string lastvalue;
stepfile = filesetext(argv[0], ".stp");
string sf[];
int isfile = fileglob(sf, stepfile);
if (isfile) {
string t[];
int ct = fileread(t, stepfile);
cntstep = strtod(t[0]);
if (vfind != t[1]) cntstep = 0;
}
cntstep += step;
if (cntstep < 1) {
cntstep = 1;
dlgMessageBox("!This is the first Element", "OK");
}
output(stepfile, "wt") printf("%d\n%s", cntstep, vfind); // write actual counter in file
sprintf(s, "%d", cntstep);
return s;
}
string get_invoke(void) {
int sel;
int Result = dlgDialog("Invoke unused gates") {
dlgListView("Gates to Invoke", Invoke, sel) { dlgAccept(); return Invoke[sel]; }
dlgHBoxLayout {
dlgPushButton("OK") dlgAccept();
dlgPushButton("-Cancel") dlgReject();
dlgStretch(1);
}
};
if (Result) return Invoke[sel];
return "";
}
// ****** Main ******
vfind = argv[1];
if (argc > 2) again = strupr(argv[argc-1]); // 2007.06.27 alf
if (argv[2] == "+") { again = get_step(1); StepMode = strtod(again); }
if (argv[2] == "-") { again = get_step(-1); StepMode = strtod(again); }
if (symbol) symbol(S) { // 2007.10.16
vfind = strupr(argv[1]);
if (!vfind) {
dlgMessageBox(usage + "
" + Version);
exit(0);
}
library(L) gridunit = (L.grid.unit);
S.pins(P) {
if (P.name == vfind) {
sprintf(vfind, "WIN (%.4f %.4f);", u2u(P.x), u2u(P.y) );
exit(vfind);
}
}
exit("run ulpmessage.ulp '" + vfind + " not found!';\n");
}
else if (package) package(P) { // 2007.10.16
vfind = strupr(argv[1]);
if (!vfind) {
dlgMessageBox(usage + "
" + Version);
exit(0);
}
library(L) gridunit = (L.grid.unit);
P.contacts(C) {
if (C.name == vfind) {
sprintf(vfind, "WIN (%.4f %.4f);", u2u(C.x), u2u(C.y) );
exit(vfind);
}
}
exit("run ulpmessage.ulp '" + vfind + " not found!';\n");
}
else if (schematic) {
if ( strupr(argv[1]) == SCHfPinPad[1]) { fpin = SCHfPinPad[1]; vfind = argv[2]; } // "PIN"
else if ( strupr(argv[1]) == SCHfPinPad[2]) { fpin = SCHfPinPad[2]; vfind = argv[2]; } // "PAD"
else if ( strupr(argv[1]) == SCHfPinPad[3]) { fpin = SCHfPinPad[3]; vfind = argv[2]; } // "DEV"
else if ( strupr(argv[1]) == SCHfPinPad[4]) { // "GATE"
fpin = SCHfPinPad[4];
vfind = argv[2];
if (!vfind) { // found Gates are not placed in schematic
vfind = "0";
}
}
else if ( strupr(argv[1]) == SCHfPinPad[5]) { fpin = SCHfPinPad[5]; vfind = argv[2]; } // "VALUE"
if (argc > 2) again = strupr(argv[argc-1]);
else again = "";
}
else if (board) {
if ( strupr(argv[1]) == BRDfPinPad[bPad]) { fpin = BRDfPinPad[bPad]; vfind = argv[2]; } // "PAD"
else if ( strupr(argv[1]) == BRDfPinPad[bValue]) { fpin = BRDfPinPad[bValue]; vfind = argv[2]; } // "VALUE"
else if ( strupr(argv[1]) == BRDfPinPad[bPolygon]) { // "POLYGON"
fpin = BRDfPinPad[bPolygon];
find = BRDfPinPad[bPolygon];
PolyWidth = strtod(argv[2]);
if (argc > 3) again = strupr(argv[argc-1]);
else again = "";
}
else if ( strupr(argv[1]) == BRDfPinPad[bDrill]) { // "DRILL"
fpin = BRDfPinPad[bDrill];
find = BRDfPinPad[bDrill];
DrillDiam = strtod(argv[2]);
if (argc > 3) again = strupr(argv[argc-1]);
else again = "";
}
else if ( strupr(argv[1]) == BRDfPinPad[bVia]) { // "VIA"
fpin = BRDfPinPad[bVia];
find = BRDfPinPad[bVia];
Vstart = strtod(argv[2]);
Vend = strtod(argv[3]);
if (argc > 4) again = strupr(argv[argc-1]);
else again = "";
}
}
else {
if (language() == "de") dlgMessageBox("Starten Sie dieses ULP in einem Schaltplan, Board, Symbol oder Package Editor", "OK");
else dlgMessageBox("Start this ULP in Schematic, Board, Symbol or Package Editor", "OK");
exit(0);
}
if (argv[3] == "CH") {
ChangeValue = argv[2];
change_value = 1;
NewValue = argv[4];
}
if (again == "*") all = 1000;
else all = strtol(again) - 1;
if (!vfind) {
vfind = getfind();
}
find = strupr(vfind);
if (!find && change_value) exit (0);
cnt = all + 1;
if (!fpin && !find) {
dlgMessageBox("Missing options", "OK");
exit(-1);
}
// *** Board coord. ***
if (board) {
int mx, my; // 2008.06.10 alf
if (argv[2] == "-S") optshow = 1; // Show option 2006.04.25
board(B) {
gridunit = (B.grid.unit);
if (optshow) {
all = 10000;
repeat = check_layer();
repeat += ";SHOW;\nWIN;\nSHOW "; // refresh window clear showed elements // 2007.06.27 alf
}
mx = B.area.x2 + (B.area.x1 * -1);
my = B.area.y2 + (B.area.y1 * -1);
if (!fpin && find) {
B.elements(E) {
if (E.name == find) {
fndpin = "Element";
repeat += show_B(u2u(E.x), u2u(E.y), 2, 5, find, all, E.mirror);
sprintf(foundelement, "Element %s on (%.4f %.4f)", E.name, u2u(E.x), u2u(E.y) );
check(repeat);
}
}
B.signals(S) {
if (S.name == find) {
fndpin = "Signal";
S.contactrefs(C) {
repeat += show_B(u2u(C.contact.x), u2u(C.contact.y), 2, 5, find, all, 0); // 0 = dummy for Layer
if (all <= 0) check(repeat);
all--;
}
}
}
B.signals(S) {
if (S.name == find ) {
S.wires(W) {
fndpin = "Wire";
real z = zfactor(u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2) );
repeat += show_B( u2u((W.x1 + W.x2)/2), u2u((W.y1 + W.y2)/2), z/(z/2) , z/(z/5), find, all, W.layer);
if (all <= 0) check(repeat);
all--;
}
}
}
B.signals(S) {
if (S.name == find ) {
S.polygons(P) {
fndpin = "Polygon";
P.contours(W) {
real z = zfactor(u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2) );
repeat += show_B( u2u((W.x1 + W.x2)/2), u2u((W.y1 + W.y2)/2), z/(z/2) , z/(z/5), find, all, W.layer);
if (all <= 0) check(repeat);
all--;
break;
}
}
}
}
B.signals(S) {
if (S.name == find ) {
S.vias(V) {
fndpin = "Via";
repeat += show_B(u2u(V.x), u2u(V.y), 1, 5, find, all, 18); // 18 dummy layer for via
sprintf(foundelement, "Element on (%.4f %.4f) %s
VIA
Layer | Diameter | Restring |
Top | %.4f | %.4f |
Inner | %.4f | %.4f |
Bottom | %.4f | %.4f |
Drill | %.4f |
",
u2u(V.x), u2u(V.y),
unit[gridunit],
u2u(V.diameter[1]),
u2u( (V.diameter[1] - V.drill) / 2),
u2u(V.diameter[2]),
u2u( (V.diameter[2] - V.drill) / 2),
u2u(V.diameter[16]),
u2u( (V.diameter[16] - V.drill) / 2),
u2u(V.drill) );
if (all <= 0) check(repeat);
all--;
}
}
}
B.elements(E) {
if (E.value == vfind || E.value == find) {
fndpin = "Value";
if (StepMode && all > 0) {
; // do nothing
}
else {
repeat += show_B(u2u(E.x), u2u(E.y), 2, 5, E.name, all, E.mirror);
sprintf(foundelement, "Element %s on (%.4f %.4f)", E.name ,u2u(E.x), u2u(E.y) );
}
if (all <= 0) check(repeat);
all--;
}
}
}
B.elements(E) {
if (fpin == BRDfPinPad[bPad]) { // "PAD"
E.package.contacts(C) {
if (C.pad) {
if (C.pad.name == find) {
fndpin = "Pad/Smd";
repeat += show_B(u2u(C.pad.x), u2u(C.pad.y), 2, 5, E.name, all, E.mirror);
sprintf(foundelement, "
PAD %s on (%.4f %.4f) %s [Element %s]
Layer | Diameter | Restring |
Top | %.4f | %.4f |
Inner | %.4f | %.4f |
Bottom | %.4f | %.4f |
Drill | %.4f |
",
C.pad.name,
u2u(C.pad.x), u2u(C.pad.y),
unit[gridunit],
E.name,
u2u(C.pad.diameter[1]),
u2u( (C.pad.diameter[1] - C.pad.drill) / 2),
u2u(C.pad.diameter[2]),
u2u( (C.pad.diameter[2] - C.pad.drill) / 2),
u2u(C.pad.diameter[16]),
u2u( (C.pad.diameter[16] - C.pad.drill) / 2),
u2u(C.pad.drill) );
if (all <= 0) check(repeat);
all--;
}
}
if (C.smd) {
if (C.smd.name == find) {
fndpin = "Pad/Smd";
repeat += show_B(u2u(C.smd.x), u2u(C.smd.y), 2, 5, E.name, all, E.mirror);
sprintf(foundelement, "
SMD %s on (%.4f %.4f) %s [Element %s]",
C.smd.name,
u2u(C.smd.x), u2u(C.smd.y),
unit[gridunit],
E.name );
if (all <= 0) check(repeat);
all--;
}
}
}
}
}
if (fpin == BRDfPinPad[bPolygon]) { // "POLYGON"
B.signals(S) S.polygons(P) {
if (PolyWidth == u2u(P.width)) {
fndpin = "Polygon";
P.contours(W) {
sprintf(fndpin, " Polygon with WIRE-Width %.4f", PolyWidth);
repeat += show_B(u2u(W.x1), u2u(W.y1), 2, 5, S.name, all, P.layer);
sprintf(foundelement, "
POLYGON in Layer %d on (%.4f %.4f) %s",
P.layer,
u2u(W.x1), u2u(W.y1),
unit[gridunit] );
break;
}
if (all <= 0) check(repeat);
all--;
}
}
B.polygons(P) {
if (PolyWidth == u2u(P.width)) {
fndpin = "Polygon";
P.contours(W) {
sprintf(fndpin, " Polygon with WIRE-Width %.4f", PolyWidth);
repeat += show_B(u2u(W.x1), u2u(W.y1), 2, 5, "POLYGON", all, P.layer);
sprintf(foundelement, "
POLYGON in Layer %d on (%.4f %.4f) %s",
P.layer,
u2u(W.x1), u2u(W.y1),
unit[gridunit] );
break;
}
if (all <= 0) check(repeat);
all--;
}
}
}
if (fpin == BRDfPinPad[bDrill]) { // "DRILL"
B.elements(E) {
E.package.contacts(C) {
if (C.pad) {
if (u2u(C.pad.drill) == DrillDiam) {
sprintf(fndpin, " Drill %.4f", DrillDiam);
repeat += show_B(u2u(C.x), u2u(C.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 17);
sprintf(foundelement, "
Drill %.4f on (%.4f %.4f) %s",
DrillDiam, u2u(C.x), u2u(C.y), unit[gridunit]);
if (all <= 0) check(repeat);
all--;
}
}
}
E.package.holes(H) {
if (u2u(H.drill) == DrillDiam) {
sprintf(fndpin, " Drill %.4f", DrillDiam);
repeat += show_B(u2u(H.x), u2u(H.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 45);
sprintf(foundelement, "
Hole %.4f on (%.4f %.4f) %s",
DrillDiam, u2u(H.x), u2u(H.y), unit[gridunit]);
if (all <= 0) check(repeat);
all--;
}
}
}
B.signals(S) {
S.vias(V) {
if (u2u(V.drill) == DrillDiam) {
sprintf(fndpin, " Drill %.4f", DrillDiam);
repeat += show_B(u2u(V.x), u2u(V.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 18);
sprintf(foundelement, "
Dril %.4f in Via on (%.4f %.4f) %s",
DrillDiam, u2u(V.x), u2u(V.y), unit[gridunit]);
if (all <= 0) check(repeat);
all--;
}
}
}
B.holes(H) {
if (u2u(H.drill) == DrillDiam) {
sprintf(fndpin, " Drill %.4f", DrillDiam);
repeat += show_B(u2u(H.x), u2u(H.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 45);
sprintf(foundelement, "
Hole %.4f on (%.4f %.4f) %s",
DrillDiam, u2u(H.x), u2u(H.y), unit[gridunit]);
if (all <= 0) check(repeat);
all--;
}
}
}
if (fpin == BRDfPinPad[bVia]) { // "VIA"
B.signals(S) {
sprintf(fndpin, "VIA stack %d-%d", Vstart, Vend);
S.vias(V) {
if (V.start == Vstart && V.end == Vend) {
repeat += show_B(u2u(V.x), u2u(V.y), 2, 5, find, all, 0);
if (all <= 0) check(repeat);
all--;
}
}
}
}
}
if (repeat) check(repeat);
string StepFound = " not found!";
if (fpin == "VIA") sprintf(StepFound, " %d-%d not found!", Vstart, Vend);
if (StepMode) {
get_step(-1); // do not count upper while not found
StepFound = " no more found!";
}
dlgMessageBox("" + dpbacksl(find) + StepFound, "OK");
exit (0);
}
// *** search and find in Schematic ***
if (schematic) {
lastSheet = 0;
schematic(S) {
gridunit = (S.grid.unit);
if (fpin == "GATE" && find == "0" || fpin == "GATE" && find == "*") { // 2007.04.03 find not placed GATEs
S.parts(PA) {
PA.instances(I) {
if (!I.sheet) {
if (find == "0") {
sprintf(repeat, "INVOKE %s %s\n", PA.name, I.gate.name);
exit(repeat);
}
else {
sprintf(Invoke[fcnt], "INVOKE %s %s\n", PA.name, I.gate.name);
fcnt++;
}
}
}
}
exit(get_invoke());
}
S.sheets(SH) {
SH.parts(PA) {
if (fpin == "DEV") {
if (PA.device.name == find) { // 2005.11.14 alf@cadsoft.de
PA.instances(IN) {
IN.gate.symbol.pins(P) {
fndpin = "Dev";
sprintf(foundelement, "DEVice %s : sheet %d on (%.4f %.4f)", IN.name , IN.sheet, u2u(IN.x), u2u(IN.y) );
repeat += show_S(IN.sheet,
u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1),
u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2),
PA.name
);
if (all <= 0) check(repeat);
all--;
break;
}
break;
}
}
}
else if (fpin == "GATE") {
PA.instances(IN) {
if (PA.name+IN.gate.name == find || IN.gate.name == find) {
fndpin = "Gate";
sprintf(foundelement, "GATE %s : sheet %d on (%.4f %.4f)", IN.gate.name , IN.sheet, u2u(IN.x), u2u(IN.y) );
repeat += show_S(IN.sheet,
u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1),
u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2),
PA.name
);
if (all <= 0) check(repeat);
all--;
break;
}
}
}
else if (fpin == "PIN") {
PA.instances(IN) {
status("Pin:"+PA.name);
IN.gate.symbol.pins(P) { // Pin
if (P.name == find) {
fndpin = "Pin";
sprintf(foundelement, "PIN %s : sheet %d on (%.4f %.4f)", P.name , IN.sheet, u2u(P.x), u2u(P.y) );
repeat += show_S(IN.sheet,
u2u(P.x)-u2u(50000), u2u(P.y)-u2u(50000),
u2u(P.x)+u2u(50000), u2u(P.y)+u2u(50000),
PA.name
);
if (all <= 0) check(repeat);
all--;
break;
}
}
}
}
else if (fpin == "PAD") {
status("Pad:"+PA.name);
PA.instances(IN) {
IN.gate.symbol.pins(P) {
if (P.contact) {
if (P.contact.name == find) {
fndpin = "Pad";
sprintf(foundelement, "PAD %s (PIN %s) : sheet %d on (%.4f %.4f)", PA.name, P.name , IN.sheet, u2u(IN.x), u2u(IN.y) );
repeat += show_S(IN.sheet,
u2u(P.x)-u2u(100000), u2u(P.y)-u2u(100000),
u2u(P.x)+u2u(100000), u2u(P.y)+u2u(100000),
PA.name
);
if (all <= 0) check(repeat);
all--;
break;
}
}
}
}
}
}
SH.nets(N) {
status("Net:"+N.name);
if (N.name == find) {
fndpin = "Net";
N.segments(SEG) {
SEG.wires(W) {
real ox, oy; // 2008.06.10 alf neue Berechnung des Zoomausschnitt
if (W.x1 < W.x2) {
ox = -0.1 * (u2u(W.x1 + W.x2) / 2);
}
else {
ox = 0.1 * (u2u(W.x1 + W.x2) / 2);
}
if (W.y1 < W.y2) {
oy = -0.1 * (u2u(W.y1 + W.y2) / 2);
}
else {
oy = 0.1 * (u2u(W.y1 + W.y2) / 2);
}
repeat += show_S(SH.number,
u2u(W.x1) - ox, u2u(W.y1) - oy,
u2u(W.x2) + ox, u2u(W.y2) + oy,
find
);
if (all <= 0) check(repeat);
all--;
}
}
}
}
}
S.sheets(SH) {
SH.parts(PA) {
status("Part:"+PA.name);
if (PA.name == find) {
PA.instances(IN) { // Gate
if (IN.sheet) {
fndpin = "Part";
sprintf(foundelement, "Device %s : sheet %d on (%.4f %.4f)", PA.name , IN.sheet, u2u(IN.x), u2u(IN.y) );
repeat += show_S(IN.sheet,
u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1),
u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2),
PA.name
);
if (all <= 0) check(repeat);
all--;
}
}
}
}
SH.busses(B) {
status("Bus:"+B.name);
if (findBus(B.name, find)) {
fndpin = "Bus";
B.segments(SEG) {
SEG.wires(W) {
real ox, oy; // 2008.06.10 alf neue Berechnung des Zoomausschnitt
if (W.x1 < W.x2) {
ox = -0.1 * (u2u(W.x1 + W.x2) / 2);
}
else {
ox = 0.1 * (u2u(W.x1 + W.x2) / 2);
}
if (W.y1 < W.y2) {
oy = -0.1 * (u2u(W.y1 + W.y2) / 2);
}
else {
oy = 0.1 * (u2u(W.y1 + W.y2) / 2);
}
repeat += show_S(SH.number,
u2u(W.x1) - ox, u2u(W.y1) - oy,
u2u(W.x2) + ox, u2u(W.y2) + oy,
find
);
if (all <= 0) check(repeat);
all--;
}
}
}
}
SH.parts(PA) {
status("Value:" + PA.name);
PA.instances(IN) { // Gate
if (PA.value == vfind) {
fndpin = "Value";
sprintf(foundelement, "Value %s | %s : sheet %d on (%.4f %.4f)", PA.value, PA.name , IN.sheet, u2u(IN.x), u2u(IN.y) );
repeat += show_S(IN.sheet,
u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1),
u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2),
PA.name
);
if (all <= 0) check(repeat);
all--;
}
}
}
}
}
check(repeat);
}
else {
dlgMessageBox("Start this ULP from schematic or board!", "OK");
exit (0);
}