#usage "en:This ULP deletes unused package variants in the referring library of a device you placed " "in the schematic and finally executes the UPDATE command.

" "Attention: Copy the library into a separate directory and adjust the library path setting in " "Options - Directories before.
" "Otherwise the original libraries will be modified.
" "Example:
" "RUN remove-unused-package [Prefix | Partname]" "

" "Author: alf@cadsoft.de" , "de:Nicht benutzte Packagevarianten eines benutzen Device im Schaltplan werden in der " "Bibliothek gelöscht
und anschliesend ein UPDATE durchgeführt.

" "ACHTUNG: Kopieren Sie evtl. die Bibliothek in einen entsprechenden Ordner, " "setzen Sie den Pfad unter Optionen - Bibliotheken auf diesen Ordner, da sonst die original Bibliothek " "entsprechend bearbeitet wird.

" "Beispiel:
" "RUN remove-unused-package [Prefix | Bauteilname]" "

" "Author: support@cadsoft.de" // THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED string Version = "1.0.0"; // 2011-05-25 alf@cadsoft.de string Removename = filesetext(argv[0], "~remove_unused_pac.lst"); string DeviceName = ""; string DevicePackage = ""; string DevSetList[]; string DevList[]; string PacList[]; string LbrList[]; int Cnt = 0; string Lines[]; string Use_in; string Object = strupr(argv[1]); // use in schematic (Device) or board (Element) int Olen = strlen(Object); if (!Object) { dlgMessageBox(usage, "OK"); exit(0); } void splitlist(void) { string s[]; for (int n = 0; Lines[n]; n++) { strsplit(s, Lines[n], '\t'); LbrList[n] = s[0]; // devicesetlibrary; DevSetList[n] = s[1]; // devicesetname; DevList[n] = s[2]; // devicename; PacList[n] = s[3]; // devicepackagename; } return; } void addlist(string devicesetlibrary, string devicesetname, string devicename, string devicepackagename, string tech, string ename) { for (int n = 0; n < Cnt; n++) { if (LbrList[n] == devicesetlibrary && DevSetList[n] == devicesetname && DevList[n] == devicename && PacList[n] == devicepackagename) { return; } } LbrList[Cnt] = devicesetlibrary; DevSetList[Cnt] = devicesetname; DevList[Cnt] = devicename; PacList[Cnt] = devicepackagename; sprintf(Lines[Cnt], "%s\t%s\t%s\t%s", LbrList[Cnt], DevSetList[Cnt], DevList[Cnt], PacList[Cnt]); Cnt++; return; } if (schematic) { schematic(SCH) { SCH.sheets(S) { S.parts(PA) { string pname = PA.name; if (strstr(PA.name, Object) == 0 && isdigit(pname[Olen]) || PA.name == Object) { addlist(PA.deviceset.library, PA.deviceset.name, PA.device.name, PA.device.package.name, PA.device.technologies, PA.name); } } } int index[]; sort(Cnt, Lines); output(Removename, "wtD") for (int n = 0; Lines[n]; n++) printf("%s\n", Lines[n]); exit("OPEN '" + LbrList[0] + "' ;\n RUN '"+ argv[0] + "' '" + Removename + "' '" + SCH.name + "'"); } } else if (library) { if (argv[1] == Removename) { int Cnt = fileread(Lines, Removename); splitlist(); string lname[]; string devsetname[]; string devname[]; string pacname[]; string variant[]; int checkdevset[]; // mark checked deviseset int usedpac[]; // mark used package variant library(L) { int cnt = 0; int doit = 0; L.devicesets(DEV) { DEV.devices(D) { lname[cnt] = filename(L.name); devsetname[cnt] = DEV.name; devname[cnt] = D.name; pacname[cnt] = D.package.name; cnt++; } } // check used package variants for (int n = 0; Lines[n]; n++) { for (int n1 = 0; n1 < cnt; n1++) { if (filename(LbrList[n]) == filesetext(lname[n1], "")) { if ( DevSetList[n] == devsetname[n1]) { checkdevset[n1] = 1; // mark checked if (PacList[n] == pacname[n1] ) { // wenn die Packagevariante benutzt ist, wird sie markiert usedpac[n1] = 1; //break; } } } } } for (int u = 0; u < cnt; u++) { if (checkdevset[u]) { if (usedpac[u]) { // package is used sprintf(variant[u], "# %s %s PAC %s %s ; used in sch.", lname[u], devsetname[u], devname[u], pacname[u]); // Kommentar benutzte Variante. } else { sprintf(variant[u], "EDIT %s.DEV; PAC -%s # %s;", devsetname[u], devname[u], pacname[u]); // Delete unbenutzte Variante. } } else { sprintf(variant[u], "# %s nicht im SCH %s %s %s", lname[u], devsetname[u], devname[u], pacname[u]); // nicht benutztes Device im SCH } } string fscript = filesetext(L.name, "~del-variants.scr"); output(fscript, "wtD") { for (int n = 0; n < cnt; n++) { printf("SET CONFIRM YES;\n"); printf("%s\n", variant[n]); printf("SET CONFIRM OFF;\n"); } printf("WRITE;\nEDIT '%s';\n UPDATE '%s';\n", argv[2], L.name); } exit("SCRIPT '" + fscript + "'"); } } } dlgMessageBox("!Start this ULP in a schematic.", "OK"); exit(0);