#usage "en: DesignLink Library Tool\n" "

" "ULP for embedding Farnell and/or Newark order codes and related data to EAGLE library devices." "

" "Usage: run designlink-lbr [-both_oc]|[-sop]\n" "

" "Options:" "

" "-both_oc: This lets you search both in Farnell and Newark databases and embed both order codes.
\n" "-sop : Search option package. By default searching for Farnell parts " "is done with device name and technology. With this option the " "package name is taken additionally for getting more accurate results.\n" "

" "Author: support@cadsoft.de", "de: DesignLink Library Tool\n" "

" "ULP für die Zuweisung von Farnell- und/oder Newark-Ordercodes und verwandte Daten zu EAGLE-Devices." "

" "Usage: run designlink-lbr [-both_oc]|[-sop]\n" "

" "Optionen:" "

" "-both_oc: Damit können Sie sowohl in der Farnell- als auch in der Newark-Datenbank suchen" " und Ordercodes zuweisen.
\n" "-sop : Search option package. Fuer die Produktsuche zu einem Bauteil wird " "standardmässig der Value verwendet. Mit dieser Option wird mit " "Value und Packagebezeichnung gesucht, um genauere Ergebnisse zu erzielen.\n" "

" "Author: support@cadsoft.de" #require 5.1001 // THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED #include "designlink-inc.ulp" string Version = "1.0.7"; string NotAssigned = "not assigned"; string LibName; int NrDev = 0; string DevFullName[]; string DevSet[]; string DevName[]; string DevPkg[]; string DevTech[]; string DevDesc[]; int DevOCIdx[]; string DevOC[]; string DevMF[]; string DevMPN[]; string DevProdDesc[]; string DevImgLink[]; numeric string DevList[]; // For transferring OCs to other library int Transfer = 0; string NewLibPath; if (DIVersion != Version) { dlgMessageBox(tr("Verschiedene Versionen von ") + filename(argv[0]) + " (" + Version + ") " + tr("und Include ") + "designlink-inc.ulp (" + DIVersion + ") !\n"); } InitCountryData(); InitCfg(); DIAdvice = "\n " + tr("Bitte manuell suchen oder Part überspringen !") + "\n"; DISkipRem = 0; // For processing the libraries we don't want to skip the unfound parts by default // Cool string replace function... string StrRep(string str, string a, string b) { int la = strlen(a), lb = strlen(b); if (la == 0) return str; // Makes no sense. Should be treated as an error ! for (int pos = strstr(str, a); pos >= 0; pos = strstr(str, a, pos + lb)) { str = strsub(str, 0, pos) + b + strsub(str, pos + la); } return str; } // Windows uses backslashes for directories which have to be backslashed which have to be backslashed... string SetWeirdBackSlashesForWindows(string ReasonblePathWithSlashes) { return StrRep(ReasonblePathWithSlashes, "/", "\\\\"); } string ImgFile(string s) { return StrRep(s, "/", "@") + ".png"; } void InitFarnellNewark(int idx) { DILanguage = "en"; DICountry = (idx == 0) ? "UK" : "US"; InitCountryData(); } void FillDevListRow(int idx) { sprintf(DevList[idx], "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", DevSet[idx], DevPkg[idx], DevTech[idx], DevFullName[idx], DICompany, DevOC[idx], DevMPN[idx], DevProdDesc[idx]); } void SearchDev(int sel_idx) { DISkipRem = 0; Clear(); // Prepare country settings, Farnell/Newark InitFarnellNewark(DevOCIdx[sel_idx]); // Go ahead ! // translate to German !!! string product = SingleSearch(DIModeLbrSearch, tr(" DesignLink Devicesuche und -anzeige - ") + LibName, DevDesc[sel_idx], DevImgLink[sel_idx], (DevOC[sel_idx] == NotAssigned) ? DISearchByKeyword : DISearchByOC, (DevOC[sel_idx] == NotAssigned) ? DevFullName[sel_idx] : DevOC[sel_idx], DevFullName[sel_idx]); // Cancel: Nothing to do. Reset Flag. if (DICancelSearch) { DICancelSearch = 0; return; } if (product != "") { string s[]; strsplit(s, product, '\t'); DevOC[sel_idx] = s[0]; DevMF[sel_idx] = s[1]; DevMPN[sel_idx] = s[2]; DevProdDesc[sel_idx] = s[5]; } else { DevOC[sel_idx] = DIUnknown; DevMF[sel_idx] = ""; DevMPN[sel_idx] = ""; DevProdDesc[sel_idx] = ""; } FillDevListRow(sel_idx); } // Save the stuff ! string SaveAttributes() { string cmds, cmd; // Transfer option if (Transfer) sprintf(cmd, "OPEN '%s';\n", NewLibPath); cmds += cmd; //------------------------------------------------------------------- for (int i = 0; i < NrDev; i++) { if (DevOC[i] != NotAssigned) { InitFarnellNewark(DevOCIdx[i]); sprintf(cmd, "EDIT %s.dev;\n", DevSet[i]); cmds += cmd; sprintf(cmd, "PACKAGE '%s';\n", (DevName[i] == "''") ? "" : DevName[i]); cmds += cmd; sprintf(cmd, "TECHNOLOGY '%s';\n", (DevTech[i] == "''") ? "" : DevTech[i]); cmds += cmd; sprintf(cmd, "ATTRIBUTE %s '%s';\n", DIAttOC, DevOC[i]); cmds += cmd; sprintf(cmd, "ATTRIBUTE %s '%s';\n", DIAttMF, DevMF[i]); cmds += cmd; sprintf(cmd, "ATTRIBUTE %s '%s';\n", DIAttMPN, DevMPN[i]); cmds += cmd; } } cmds += "WRITE;\n"; return cmds; } // ------------ Library Device -------------------- if (!library) { dlgMessageBox(tr("Bitte starten Sie vom Bibliotheks-Editor aus !")); exit(EXIT_FAILURE); } library(L) { // Parsing arguments: int both_oc, export, skip_exp; // Statistic stuff int statistics; string st_opt_list = "-st_list"; string st_opt_idx = "-st_idx"; string st_opt_nr_dev = "-st_nr_dev"; string st_opt_nr_oc_f = "-st_nr_oc_f"; string st_opt_nr_oc_n = "-st_nr_oc_n"; string st_opt_nr_not_ass = "-st_nr_not_ass"; // The parameters themselves string st_list; int st_idx = -1; int st_all_nr_dev; int st_all_nr_oc_f; int st_all_nr_oc_n; int st_all_nr_not_ass; int st_nr_oc_f; int st_nr_oc_n; int st_nr_not_ass; for (int i = 1; i <= argc; ++i) { if (argv[i] == "-sop") DISearchOptPac = 1; if (argv[i] == "-both_oc") both_oc = 1; if (argv[i] == "-skip_exp") skip_exp = 1; // Transfer option: Not supported officially. Used internally. if (strsub(argv[i], 0, 9) == "-transfer") { Transfer = 1; NewLibPath = strsub(argv[i], 9); // Full path } // Statistic function: Also for internal use. if (strsub(argv[i], 0, strlen(st_opt_list)) == st_opt_list) { statistics = 1; both_oc = 1; // In that case we want it for both order codes skip_exp = 1; // In that case we don't want the images exported st_list = strsub(argv[i], strlen(st_opt_list)); // Full path } if (strsub(argv[i], 0, strlen(st_opt_idx)) == st_opt_idx) st_idx = strtol(strsub(argv[i], strlen(st_opt_idx))); if (strsub(argv[i], 0, strlen(st_opt_nr_dev)) == st_opt_nr_dev) st_all_nr_dev = strtol(strsub(argv[i], strlen(st_opt_nr_dev))); if (strsub(argv[i], 0, strlen(st_opt_nr_oc_f)) == st_opt_nr_oc_f) st_all_nr_oc_f = strtol(strsub(argv[i], strlen(st_opt_nr_oc_f))); if (strsub(argv[i], 0, strlen(st_opt_nr_oc_n)) == st_opt_nr_oc_n) st_all_nr_oc_n = strtol(strsub(argv[i], strlen(st_opt_nr_oc_n))); if (strsub(argv[i], 0, strlen(st_opt_nr_not_ass)) == st_opt_nr_not_ass) st_all_nr_not_ass = strtol(strsub(argv[i], strlen(st_opt_nr_not_ass))); } if (Transfer && !NewLibPath) { dlgMessageBox("Missing transfer library path !"); exit(EXIT_FAILURE); } if (statistics && !st_list) { dlgMessageBox("Missing library list for statistics !"); exit(EXIT_FAILURE); } // Optional generation of image files // If not specified to skip the export check if it's necessary: if (!skip_exp) { string cmds, cmd; string img_dir = filesetext(L.name, ""); string matches[]; int dir_error; if (!fileglob(matches, img_dir)) { // Need to use CMD for Windows (?) if (system("CMD /C \"mkdir \"" + SetWeirdBackSlashesForWindows(img_dir) + "\"\"") != 0) { dlgMessageBox("Creating image directory " + SetWeirdBackSlashesForWindows(img_dir) + " failed !"); dir_error = 1; } export = 1; } L.packages(P) { string img_file = ImgFile(P.name); if (!fileglob(matches, img_dir + "/" + img_file)) { export = 1; real large = u2inch(P.area.x2 - P.area.x1); if (P.area.y2 - P.area.y1 > large) large = u2inch(P.area.y2 - P.area.y1); large = max(0.01, large); // use a minimum size to avoid 0 (in case of empty package) real f = max(50, min(1.0 / large * 150, 2400.0)); // max. 2 Inch long sprintf(cmd, "EDIT %s.PAC;\nEXPORT IMAGE '%s' %.0f;\n", P.name, img_dir + "/" + img_file, f); cmds += cmd; } } if (export && !dir_error) { dlgMessageBox(tr("Erzeugung der Package-Bilder zunächst !")); cmds += "RUN '" + argv[0] + "' -skip_exp"; // Run again without doing the export ! for (int i = 1; i <= argc; ++i) cmds += " " + argv[i]; exit(cmds); } } //------------------------------------------------------------------------ // We don't use those flags here. Set them to false DIInStock = 0; DIRoHS = 0; LibName = filename(L.name); string dev_list_head = tr("Deviceset\tPackage\tTechnologie\tDevicename\tOrdercode-Typ\tOrdercode\tHerstellercode\tBeschreibung"); L.devicesets(DS) { DS.devices(D) { if (D.package) { string t[]; int n = strsplit(t, D.technologies, ' '); for (int i = 0; i < n; i++) { string full_name = techpacvar(DS.name, D.name, t[i], D.package.name); // Same problem like for package names string description = " Deviceset: " + DS.name + " " + " Package: " + (D.package.name ? D.package.name : "---") + " Technology: " + t[i] + " Device name: " + full_name + "

" + DS.description; string image = ""; for (int j = 0; j < (both_oc ? 2 : 1); j++) { DevSet[NrDev] = DS.name; DevName[NrDev] = D.name; DevPkg[NrDev] = D.package.name; DevTech[NrDev] = t[i]; DevFullName[NrDev] = full_name; InitFarnellNewark(j); DevOCIdx[NrDev] = j; DevOC[NrDev] = NotAssigned; DevMF[NrDev] = ""; DevMPN[NrDev] = ""; D.attributes(A, t[i]) if ((A.name == DIAttOC) && (A.value != "")) DevOC[NrDev] = A.value; else if (A.name == DIAttMPN) DevMPN[NrDev] = A.value; else if (A.name == DIAttMF) DevMF[NrDev] = A.value; if (DevOC[NrDev] == NotAssigned) { DevMPN[NrDev] = ""; DevMF[NrDev] = ""; } DevDesc[NrDev] = description; // lot of memory ? DevImgLink[NrDev] = image; DevProdDesc[NrDev] = ""; // For statistic purpose: if (statistics && (st_idx >= 0)) if (DevOC[NrDev] == NotAssigned) ++st_nr_not_ass; else if (DevOC[NrDev] != DIUnknown) if (DevOCIdx[NrDev] == 0) ++st_nr_oc_f; else ++st_nr_oc_n; FillDevListRow(NrDev++); } } } } } // Process Statistics if (statistics) { string res_file = filedir(st_list) + "stat_lbr.txt"; if (st_idx >= 0) { output(res_file, "wba") printf("%-40s:%6d %6d %6d %6d %6d\n", LibName, NrDev/2, st_nr_oc_f, st_nr_oc_n, NrDev - st_nr_oc_f - st_nr_oc_n, st_nr_not_ass); st_all_nr_dev += NrDev/2; st_all_nr_oc_f += st_nr_oc_f; st_all_nr_oc_n += st_nr_oc_n; st_all_nr_not_ass += st_nr_not_ass; } else output(res_file, "wt") printf("Library Order Code Statistics.\n\n" "Name #Devices #Farnell OCs #Newark OCs #Without OCs #Not assigned\n" "-----------------------------------------------------------------------------------------------------\n"); // Read name of next library: ++st_idx; string lines[]; int nr_l = fileread(lines, st_list); int i, idx = -1; for ( ; (i < nr_l) && (idx < st_idx); ++i) if ((lines[i] != "") && (strchr(lines[i], '#') == -1)) ++idx; string next_lbr = ((idx == st_idx) ? lines[--i] : ""); // Run again with next library if (next_lbr != "") { string cmd; sprintf(cmd, "OPEN '%s';RUN '%s' %s%s %s%d %s%d %s%d %s%d %s%d ;", next_lbr, argv[0], st_opt_list, st_list, st_opt_idx, st_idx, st_opt_nr_dev, st_all_nr_dev, st_opt_nr_oc_f, st_all_nr_oc_f, st_opt_nr_oc_n, st_all_nr_oc_n, st_opt_nr_not_ass, st_all_nr_not_ass); exit(cmd); } // Print total numbers else { output(res_file, "wba") { int nr_without = 2 * st_all_nr_dev - st_all_nr_oc_f - st_all_nr_oc_n; printf("=====================================================================================================\n"); printf("%-40s:%6d %6d %6d %6d %6d\n", "Total absolute", st_all_nr_dev, st_all_nr_oc_f, st_all_nr_oc_n, nr_without, st_all_nr_not_ass); printf("%-40s: %3.1f %3.1f %3.1f %3.1f %3.1f \n", "Total percentages", 100.0, real(st_all_nr_oc_f)/st_all_nr_dev * 100, real(st_all_nr_oc_n)/st_all_nr_dev * 100, real(nr_without)/(2 * st_all_nr_dev) * 100, real(st_all_nr_not_ass)/(2 * st_all_nr_dev) *100); printf("=====================================================================================================\n"); } exit(EXIT_SUCCESS); } } // Master dialog int save = 1, sel_idx = -1; int ret = dlgDialog("DesignLink " + tr("Ordercode-Zuweisung - ") + LibName) { dlgHBoxLayout dlgSpacing(800); dlgHBoxLayout { dlgVBoxLayout dlgSpacing(400); dlgVBoxLayout { dlgListView(dev_list_head, DevList, sel_idx) SearchDev(sel_idx); dlgLabel(tr("Zur Detailansicht oder Suche und Zuweisung eines Artikels bitte Device doppelklicken !")); dlgHBoxLayout { dlgStretch(1); dlgCheckBox(tr("Ordercodes speichern"), save); dlgPushButton(tr("Exportieren") + "...") { string file = dlgFileSave(tr("Export als Textdatei"), filesetext(L.name,".txt")); if (file) output(file, "wt") { printf("%s\n", dev_list_head); for (int i = 0; i < NrDev; ++i) printf("%s\n", DevList[i]); } } dlgPushButton(tr("Beenden")) dlgAccept(); } } } }; // Warum hier der ';' ? SaveCfg(); if (ret == -1) exit(1); if (save) { status(tr("Speichere Ordercodes") + " ..."); // This can take a little time for large files exit(SaveAttributes()); } }