/* * This EAGLE User Language Program creates the proper format * Centroid file for assembly at Screaming Circuits including * the reference designator, position, layer and orientation * of each part * * www.screamingcircuits.com * */ #usage "Create Centroid file for Screaming Circuits assembly

" "Author www.screamingcircuits.com" string Version = "1.2.0"; // Version 1.2, March 22, 2012 string fileMessage; string rotation(real Angle) { string s; sprintf(s, "%.1f", Angle); int pos = strchr(s, '.'); if (pos >= 0) if (s[pos + 1] == '0') s[pos] = 0; return s; } string side(int Mirror) { string s; if (Mirror){ s = "Bottom"; } else { s = "Top"; } return s; } if (!board) { dlgMessageBox("


ERROR: This ULP will only operate in the board layout view.

Switch to the board layout editor and re-run."); exit(1); } if (board) board(B) { output(filesetext(B.name, "_centroid.csv")) { printf("Screaming Circuits SMD component position file.\n"); printf("Created by Centroid_ScreamingCircuits_smd.ulp %s.\n\n", Version); printf("Centroid Data for pc board: \"%s\" as of: %s\n", filename(B.name), t2string(time())); printf("Measurements are in inches. Comma delimited\n"); printf("Only surface mount components included\n\n"); printf("%s,%s,%s,%s,%s\n", "RefDes", "Layer", "LocationX", "LocationY", "Rotation"); B.elements(E) { int isSmd; isSmd = 0; E.package.contacts(C) { if (C.smd) isSmd = 1; } if (isSmd) printf("%s,%s,%5.3f,%5.3f,%s\n", E.name, side(E.mirror), u2inch(E.x), u2inch(E.y), rotation(E.angle)); } } fileMessage = "


Centroid file for Screaming Circuits PCB assembly.

Include this file in the .ZIP file along with your GERBER files and Bill of Materials:

" + filesetext(B.name, "_centroid.csv\n"); dlgMessageBox(fileMessage); }