#usage "Exports a schematic drawing.\n" "

" "This ULP exports all elements of a schematic drawing so that it may be regenerated with a script file." "

" "Author: klcallan@yahoo.com" if (schematic) schematic(S) { string partlist[]; // holds an array of which reference designators have been ADDed int partlistindex; int x; string key; string options; partlistindex = 0; key = ""; string wirestyle; string p = ""; string s = ""; string e = ""; s = S.name; char c = '/'; int pos = strrchr(s, c); if (pos >= 0) { p = strsub(s, 0, pos + 1); } string fileName = p + "temp.scr"; output(fileName) { printf("GRID INCH 0.005\n"); S.layers(LAY) { printf("LAYER %d %s;\n", LAY.number, LAY.name); } printf("DISPLAY -PINS\n\n"); S.sheets(SH) { printf("EDIT .S%d\n", SH.number); SH.circles(CIR) { printf("LAYER %d;\n", CIR.layer); printf("CIRCLE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", u2inch(CIR.width), u2inch(CIR.x), u2inch(CIR.y), u2inch(CIR.x + CIR.radius), u2inch(CIR.y)); } SH.rectangles(REC) { printf("LAYER %d;\n", REC.layer); printf("RECT %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", REC.angle, u2inch(REC.x1), u2inch(REC.y1), u2inch(REC.x2), u2inch(REC.y2)); } SH.texts(TEX) { printf("LAYER %d\n", TEX.layer); printf("TEXT '%s' R%f (%5.3f %5.3f);\n", TEX.value, TEX.angle, u2inch(TEX.x), u2inch(TEX.y)); printf("CHANGE SIZE %5.3f (%5.3f %5.3f);\n", u2inch(TEX.size), u2inch(TEX.x), u2inch(TEX.y)); } printf("SET WIRE_BEND 2;\n"); SH.wires(WIR) { printf("LAYER %d\n", WIR.layer); switch (WIR.style) { case 0: wirestyle = "Continuous"; break; case 1: wirestyle = "LongDash"; break; case 2: wirestyle = "ShortDash"; break; case 3: wirestyle = "DashDot"; break; default: wirestyle = "Continuous"; break; } printf("CHANGE STYLE '%s';\n", wirestyle); printf("WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", u2inch(WIR.width), u2inch(WIR.x1), u2inch(WIR.y1), u2inch(WIR.x2), u2inch(WIR.y2)); } printf("CHANGE STYLE 'Continuous'\n"); SH.parts(PAR) { options = ""; PAR.instances(PARINS) { if(PARINS.mirror) { options = "MR"; } else { options = "R"; } key = lookup(partlist, PAR.name, 1); if(key == "") { // part has not been added yet printf("ADD '%s' '%s' %s@%s %s%5.3f (%5.3f %5.3f);\n", PAR.name, PARINS.gate.name, PAR.device.name, PAR.device.library, options, PARINS.angle, u2inch(PARINS.x), u2inch(PARINS.y)); if((PAR.device.value == "On") && (PARINS.value != "")) { printf("VALUE '%s' (%5.3f %5.3f);\n", PARINS.value, u2inch(PARINS.x), u2inch(PARINS.y)); } partlist[partlistindex] = PAR.name + '\t' + '1'; // the part has been seen now so next time use INVOKE partlistindex += 1; } else { printf("INVOKE '%s' '%s' %s%5.3f (%5.3f %5.3f);\n", PAR.name, PARINS.gate.name, options, PARINS.angle, u2inch(PARINS.x), u2inch(PARINS.y)); } } } SH.busses(BUS) { BUS.segments(BUSSEG) { int bsx, bsy; printf("SET WIRE_BEND 2;\n"); BUSSEG.wires(BUSSEGWIR) { printf("BUS '%s' (%5.3f %5.3f) (%5.3f %5.3f);\n", BUS.name, u2inch(BUSSEGWIR.x1), u2inch(BUSSEGWIR.y1), u2inch(BUSSEGWIR.x2), u2inch(BUSSEGWIR.y2)); bsx = BUSSEGWIR.x1; bsy = BUSSEGWIR.y1; } printf("NAME '%s' (%5.3f %5.3f);\n", BUS.name, u2inch(bsx), u2inch(bsy)); BUSSEG.texts(BUSSEGTEX) { printf("LABEL (%5.3f %5.3f) (%5.3f %5.3f);\n", u2inch(bsx), u2inch(bsy), u2inch(BUSSEGTEX.x), u2inch(BUSSEGTEX.y)); printf("CHANGE SIZE %5.3f (%5.3f %5.3f);\n", u2inch(BUSSEGTEX.size), u2inch(BUSSEGTEX.x), u2inch(BUSSEGTEX.y)); } } } SH.nets(NET) { NET.segments(NETSEG) { int nsx, nsy; printf("SET WIRE_BEND 2;\n"); NETSEG.wires(NETSEGWIR) { printf("NET '%s' (%5.3f %5.3f) (%5.3f %5.3f);\n", NET.name, u2inch(NETSEGWIR.x1), u2inch(NETSEGWIR.y1), u2inch(NETSEGWIR.x2), u2inch(NETSEGWIR.y2)); nsx = NETSEGWIR.x1; nsy = NETSEGWIR.y1; } printf("NAME '%s' (%5.3f %5.3f);\n", NET.name, u2inch(nsx), u2inch(nsy)); NETSEG.texts(NETSEGTEX) { printf("LABEL (%5.3f %5.3f) (%5.3f %5.3f);\n", u2inch(nsx), u2inch(nsy), u2inch(NETSEGTEX.x), u2inch(NETSEGTEX.y)); printf("CHANGE SIZE %5.3f (%5.3f %5.3f);\n", u2inch(NETSEGTEX.size), u2inch(NETSEGTEX.x), u2inch(NETSEGTEX.y)); } } } } printf("GRID LAST\n"); } // sprintf(e, "SCRIPT '%s'", fileName); // exit(e); } else { dlgMessageBox("\n Start this ULP in a schematic \n"); exit(0); }