/* * This EAGLE User Language Program prints a board's * Partlist and its "Bill Of Material" */ void PartLine(string Name, string Value, string Package, string Library, string Mirror) { printf("%-*s %-*s %-*s %-*s %s\n", ELEMENT_NAME_LENGTH, Name, ELEMENT_VALUE_LENGTH, Value, PACKAGE_NAME_LENGTH, Package, LIBRARY_NAME_LENGTH, Library, Mirror); } int ValueLine(string Quantity, string Value, string Package, string Library, string Parts) { return printf("%-4s %-*s %-*s %-*s %s%s", Quantity, ELEMENT_VALUE_LENGTH, Value, PACKAGE_NAME_LENGTH, Package, LIBRARY_NAME_LENGTH, Library, Parts, Parts != "" ? "\n" : ""); } if (board) board(B) { output(filesetext(B.name, ".BOM")) { printf("%s\n\n", EAGLE_SIGNATURE); printf("Partlist exported from %s at %s\n\n", B.name, t2string(time())); PartLine("Part", "Value", "Package", "Library", "TB-Side"); printf("\n"); numeric string ename[], evalue[], pname[], lname[], emir[]; int cnt = 0, index[]; B.elements(E) { // entweder diese Zeile **** sprintf(emir[cnt], "%d", E.mirror); // int in string wandeln // oder die nächsten 2 Zeilen *** if (E.mirror) emir[cnt] = "Bottom"; else emir[cnt] = "Top"; // erste oder zweite Lösung ?? ename[cnt] = E.name; evalue[cnt] = E.value; pname[cnt] = E.package.name; lname[cnt] = E.package.library; cnt++; } sort(cnt, index, ename, emir); output(filesetext(B.name, ".TOP")) { for (int i = 0; i < cnt; i++) { if (emir[index[i]] == "Top") { PartLine(ename[index[i]], evalue[index[i]], pname[index[i]], lname[index[i]], emir[index[i]]); } } } output(filesetext(B.name, ".BOT")) { for (int i = 0; i < cnt; i++) { if (emir[index[i]] == "Bottom") { PartLine(ename[index[i]], evalue[index[i]], pname[index[i]], lname[index[i]], emir[index[i]]); } } } // printf("\n"); int n1, n2, i1, i2, offset; string quantity; ValueLine("Qty", "Value", "Package", "Library", "Parts"); printf("\n"); sort(cnt, index, evalue, pname, lname, ename); for (n1 = 0, n2 = 0; ++n2 <= cnt; ) { i1 = index[n1]; if (n2 < cnt) { i2 = index[n2]; if (evalue[i1] == evalue[i2] && pname[i1] == pname[i2] && lname[i1] == lname[i2]) continue; } sprintf(quantity, "%d", n2 - n1); offset = ValueLine(quantity, evalue[i1], pname[i1], lname[i1], ""); for (;;) { offset += printf(ename[i1]); if (++n1 < n2) { i1 = index[n1]; offset += printf(", "); if (offset + strlen(ename[i1]) > 77) { printf("\n"); offset = ValueLine("", "", "", "", ""); } } else break; } printf("\n"); } } }