/****************************************************************************** * PART2HTM.ULP - please send any comments to hv@itec-audio.com * * This EAGLE User Language Program produces an html file * of a board's Partlist for publishing on an intranet * * V1.3 28.04.00 Angabe des Rasters (mm, mil, ...), preformattet text * * FormatCoord = Yes|No * * V1.2 27.03.00 href auf Schaltplan, Schematic file info * V1.1 19.01.00 Board verification, href auf Best.Plan * * AllWires = No: Output only unrouted signals * = Yes: Output all signals, untuted marked with "*" * * V1.0 01.06.99 Helmut Vaupotitsch - hv@itec-audio.com * * SkipPartsNoValue = Yes: Don´t count parts with no value * Output summary * * V0.4 ??.??.97 Sean D. Alcorn(Avion International) - sdalcorn@avion.com.tw * * Errorlevel -1: Drawing is not a board * *****************************************************************************/ enum {Yes, No}; int SkipPartsNoValue = Yes; int AllWires = No; int FormatCoord = Yes; string H1Col = "#6666FF", // Title H2Col = "#6666CC";; // Section enum { OK=0, NotABoard=-1 }; int ExitCode; string orientation(real Angle, int Mirror) { string s; sprintf(s, "R%.1f", Angle); for (int i = 0; s[i]; i++) if (s[i] == '.') { if (s[i + 1] == '0') s[i] = 0; break; } if (Mirror) s = "M" + s; return s; } void OutUnit(int grid) { string UnitString[] = { "mic","mm", "mil", "inch" }; printf("%s", UnitString[grid]); } void Out(string tab, int grid, int x1, int y1, int x2, int y2) { int UnitWidth[] = { 6, 6, 5, 6 }; if (FormatCoord == Yes) int Width=UnitWidth[grid]; else Width=0; if (grid == 2) printf("%s(%*.0f,%*.0f) (%*.0f,%*.0f)\n", tab, Width,u2mil(x1), Width,u2mil(y1), Width,u2mil(x2), Width,u2mil(y2)); if (grid == 3) printf("%s(%*.3f,%*.3f) (%*.3f,%*.3f)\n", tab, Width,u2inch(x1), Width,u2inch(y1), Width,u2inch(x2), Width,u2inch(y2)); if (grid == 1) printf("%s(%*.2f,%*.2f) (%*.2f,%*.2f)\n", tab, Width,u2mm(x1), Width,u2mm(y1), Width,u2mm(x2), Width,u2mm(y2)); if (grid == 0) printf("%s(%*.0f,%*.0f) (%*.0f,%*.0f)\n", tab, Width,u2mic(x1), Width,u2mic(y1), Width,u2mic(x2), Width,u2mic(y2)); } ExitCode = NotABoard; if (board) board(B) { ExitCode = OK; output(filesetext(B.name, ".htm")) { printf("\n\n"); printf("\n"); printf("\n"); printf("\n"); printf("Parts Listing for %s\n", B.name); printf("\n\n"); printf("\n\n"); printf("

Parts List for

\n", H1Col); printf("

%s

\n", H1Col, B.name); printf("
\n"); printf("Board last modified: %s    Board size: %d\n", t2string(filetime(B.name)), filesize(B.name) ); printf("    (Schematic: %s / %d)
\n", t2string(filetime(filesetext(B.name,".sch"))), filesize(filesetext(B.name,".sch")) ); printf("Bestückungsplan,\n",filesetext(filename(B.name),".gif")); printf("  Schaltplan Seite 1\n",filesetext(strsub(filename(B.name),0,strlen(filename(B.name))-4)+" Sheet1",".gif")); printf(" (Schaltplan Seite 2)

\n",filesetext(strsub(filename(B.name),0,strlen(filename(B.name))-4)+" Sheet2",".gif")); printf("File generated at: %s
\n", t2string(time())); string YesNo[] = {"Yes", "No"}; printf("Settings: SkipPartsNoValue=%s\n", YesNo[SkipPartsNoValue]); printf("
\n"); // Collect elements numeric string ename[], evalue[], pname[], lname[], PInch[], PMM[], Orient[]; int cnt = 0, index[]; string Pos; B.elements(E) { ename[cnt] = E.name; evalue[cnt] = E.value; pname[cnt] = E.package.name; lname[cnt] = E.package.library; sprintf(PInch[cnt], "(%6.3f %6.3f)", u2inch(E.x), u2inch(E.y)); sprintf(PMM[cnt], "(%6.2f %6.2f)", u2mm(E.x), u2mm(E.y)); Orient[cnt] = orientation(E.angle, E.mirror); cnt++; } printf("
\n\n"); printf("
\n"); printf("

Parts Listing

\n", H2Col); printf("
\n\n"); // *** Detailed printf("
\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); sort(cnt, index, ename); for (int i = 0; i < cnt; i++) { if (SkipPartsNoValue == No || (evalue[index[i]] != "" && evalue[index[i]] != " ")) { printf(" \n"); printf("\n", ename[index[i]]); printf("\n", evalue[index[i]]); printf("\n", pname[index[i]]); printf("\n", lname[index[i]]); printf(" \n"); } } printf("
PartValuePackageLibrary
%s%s%s%s
\n"); printf("
\n\n"); printf("
\n"); printf(" %d Parts on board.\n", cnt-1); printf("
\n\n"); printf("

\n\n"); printf("
\n\n"); printf("
\n"); printf("

Summary

\n", H2Col); printf("
\n\n"); // *** Summary printf("
\n"); printf("\n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); printf(" \n"); int n1, n2, i1, i2, offset, p; string quantity, Parts; sort(cnt, index, evalue, ename); for (n1 = 0, n2 = 0, p = 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; } if (SkipPartsNoValue == Yes && (evalue[i1] == "" || evalue[i1] == " ")) n1 = n2; else { sprintf(Pos, "%3d", ++p); sprintf(quantity, "%d", n2 - n1); Parts = ""; for (;;) { Parts = Parts + ename[i1]; if (++n1 < n2) { i1 = index[n1]; Parts = Parts + ", "; } else break; } // for printf(" \n"); printf("\n", Pos); printf("\n", quantity); printf("\n", evalue[i1]); printf("\n", Parts); printf(" \n"); } // else } // for printf("
Pos Qty  Value Parts
%s %s  %s %s
\n"); printf("
\n\n"); //*** Technical printf("

\n\n"); printf("
\n\n"); printf("
\n"); printf("

Board Verification

\n", H2Col); int airw = 0; int sig = 0; int wir = 0; int sigwir = 0; int aw=0; string ur=" "; string UnitString[] = { "Mic","mm", "mil", "inch" }; if (AllWires==No) printf("Unrouted wires (in %s):
",UnitString[B.grid.unit]);
                  else printf("All wires (Unrouted marked with * - in %s):
",UnitString[B.grid.unit]);
          
     B.signals(S) {
      ++sig; 
      if (AllWires==Yes) {
        sigwir=0;
        aw=0;
        printf("\nSignal = %s     \n", S.name);
      }
      S.wires(W) {
        ++wir;
        if (AllWires==Yes) { 
          ++sigwir; 
          if (W.layer == 19) { 
            ++aw;
            ++airw;
            ur="*";
          }
          else ur=" ";
          Out("  "+ur+" ", B.grid.unit, W.x1,W.y1, W.x2,W.y2); 
        }
        else 
          if (W.layer == 19) {
            ++airw;
            printf("Signal = %-8s", S.name);
            Out(" ", B.grid.unit, W.x1,W.y1, W.x2,W.y2);
          }
        
      }
      if (AllWires==Yes) printf("  Signal = %s: %d of %d wires unrouted.\n",S.name,aw,sigwir);
     }
     printf("
\n%d airwires.",airw); printf("
\n%d signals, %d wires.
\n",sig,wir); printf("
\n\n"); printf("
\n\n"); //*** Footer printf("

\n\n"); printf("
\n"); printf("

Generated by PART2HTM v1.3 by Helmut Vaupotitsch
\n"); printf(" © 1997-2000 Helmut Vaupotitsch, "); printf(" \n"); printf(" ITEC Tontechnik und Industrieelektronik.
\n"); printf(" A-8200 Lassnitzthal 300 &\#149; Austria &\#149; Europe

\n"); printf("
\n"); printf("\n"); printf(""); } } exit(ExitCode);