/* dieses Program macht die Seitenpanele aus dem Masterboard-design fuer jlcpcb */ string str = ""; // erstellt einen Punkt als string string Point(real X, real Y) { string temp = ""; sprintf(temp, "(%f %f)", X,Y); return temp; } // kopiert eine selektierte Gruppe in die zwischenablage void cut(real originX, real originY) { string temp = ""; sprintf(temp, "GRID mm 1;\nCUT (%f %f);\nGRID last;\nDISPLAY last;\n", originX, originY); str += temp; } // gruppiert elemente in einem rechteck void group(real upperLeftX, real upperLeftY, real lowerRightX, real lowerRightY) { string a = Point(upperLeftX, lowerRightY); string b = Point(upperLeftX, upperLeftY); string c = Point(lowerRightX, upperLeftY); string d = Point(lowerRightX, lowerRightY); string temp = ""; sprintf(temp, "GROUP %s %s %s %s %s;\n", a,b,c,d,a); str += temp; } // oeffnet ein neues board zum editieren void edit(string name) { string temp = ""; sprintf(temp, "SET CONFIRM YES;\nEDIT %s;\nSET CONFIRM OFF;\n", name); str += temp; } // loescht alle elemente auf einem board void clearBrd() { str += "DISPLAY ALL;\nSET CONFIRM YES;\nRIP;\nGROUP ALL;\nDELETE (C> 0 0);\nSET CONFIRM OFF;\nDISPLAY last;\n"; } // speichert das board void write() { str += "SET CONFIRM YES;\nWRITE;\nSET CONFIRM OFF;\n"; } // fuegt letzte kopierte sektion in das board an der gewaehlten stelle ein void paste(int offset, real originX, real originY) { string temp = ""; sprintf(temp, "GRID mm;\nPASTE %d (%f %f);\nGRID last;\n", offset, originX, originY); str += temp; } // zeichnet eine linie mit dicke width void line(real width, string A, string B) { string temp = ""; sprintf(temp, "LINE %f %s %s;\n", width, A, B); str += temp; } // zeichnet eine runde linie zwischen den Punkten A und B void arc(int width, string A, string B, real angle) { string temp = ""; sprintf(temp, "LINE %d %s %f %s;\n", width, A, angle, B); str += temp; } // loescht dinge um gegebenen Punkt void delete(string atPoint) { string temp = ""; sprintf(temp, "DELETE %s;\n", atPoint); str += temp; } // schliesst die outline void closeBoundary(real slotwidth, real radius, real hoehe, real mittelabstand_links, real mittelabstand_rechts) { str += "LAYER 20;\nDISPLAY NONE;\nDISPLAY 20;\n"; // setzt das grid auf mm fuer folgende operationen str += "GRID mm 0.1;\n"; group(0, hoehe - 0.1, 100, 4); delete("(C> 0 0)"); delete(Point(10, hoehe)); delete(Point(50-10, hoehe)); delete(Point(50+10, hoehe)); delete(Point(100-10, hoehe)); delete(Point(0,0)); delete(Point(50,0)); line(0, Point(radius, hoehe), Point(25 - mittelabstand_links, hoehe)); line(0, Point(25 + mittelabstand_rechts, hoehe), Point(50 - radius, hoehe)); line(0, Point(0,0), Point(25-slotwidth/2, 0)); line(0, Point(50, 0), Point(25+slotwidth/2, 0)); // reproduziere die abgerundeten ecken arc(0, Point(0, hoehe - radius), Point(radius, hoehe) , -90); arc(0, Point(50-radius, hoehe), Point(50, hoehe - radius), -90); str += "GRID last;\nDISPLAY ALL;\n"; } // ergaenzt ein Bohrloch void hole(real drill, string point) { string temp = ""; sprintf(temp, "HOLE %f %s;\n", drill, point); str += temp; } void placeJlcMark() { str += "LAYER 22;\nCHANGE FONT VECTOR;\nGRID mm;\nCHANGE SIZE 0.8;\nCHANGE ALIGN bottom-right;\nTEXT 'JLCJLCJLCJLC' MR0 (51 1);\n"; } // prozessiert eine seite des PCBs void side(string name, real originX, real originY, real slot, real radius, real hoehe, real abstand_l, real abstand_r) { cut(originX, originY); edit(name); clearBrd(); paste(0, 0, 0); closeBoundary(slot, radius, hoehe, abstand_l, abstand_r); // sie panele sollen seitensymmetrisch sein // damit die zerbrochen platine die trennungsartifakte // immer auf der rechten bzw. linken seite aufweist str += "GRID mm;\nGROUP ALL;\nCUT (0 0);\nPASTE R0 (50 0);\n"; // reproduziere die seitenkanten line(0, Point( 0, hoehe - radius), "( 0 0)"); line(0, Point(100, hoehe - radius), "(100 0)"); // trennungshilfen setzten real holedrill = 0.5; real slotwidth = 0.5; int numholes = 4; for (int i = 0; i < numholes; ++i) { hole(holedrill, Point(50, i)); hole(holedrill, Point(50, hoehe-radius-1-i)); } str += "LAYER 20;\n"; line(slotwidth, Point(50, hoehe-radius-1-numholes), Point(50, numholes)); // alle dimensionsmarken loeschen str += "DISPLAY none;\ndisplay 47 48;\nGROUP all;\nDELETE (C> 0 0);\nDISPLAY all;\n"; str += "GRID last;\n"; // fuelle polygone //str += "rats;\n"; // jlc markierung plazieren placeJlcMark(); } // verhindert, dass das skript auf was anderes als boards angewendet wird if(board) board(B){ real radius = 1.5; // radius der abrundungen an der unteren fusskante real hoehe = 21.2; // hoehe der unteren fusskante // man merke sich das master-design // um es spaeter wieder zu oeffnen string master = B.name; // save drc settings string drcfile = ""; sprintf(drcfile, "%s/master_drc_settings", filedir(master)); str += "SET CONFIRM YES; DRC SAVE '" + drcfile + "'; SET CONFIRM OFF;"; // maskieren von Seite 1 str += "DISPLAY all;\n"; group(0, 110, 49.5, -10); side("SideA.brd", 0,0, 1.7, radius, hoehe, 6.9, 5.7); // drc einstellungen laden str += "DRC LOAD '" + drcfile + "';"; // datei speichern write(); // zurueck zum master fuer seite 2 edit(master); str += "DISPLAY all;\n"; // maskieren von Seite 2 group(50.5, 110, 100, -10); side("SideB.brd", 50,0, 0, radius, hoehe, 7.3, 5.9); // DRC einstellungen laden str += "DRC LOAD '" + drcfile + "';"; // datei speichern write(); // master wieder oeffnen edit(master); // generierten code als skript zu eagle zurueckgeben exit(str); } dlgMessageBox(":Dies ist kein Board-context!\nBitte das ulp im Masterboard ausfuehren", "O&K");