/* 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 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, 2); delete("(C> 0 0)"); delete(Point(10, hoehe)); delete(Point(50-10, hoehe)); delete(Point(50+10, hoehe)); delete(Point(100-10, hoehe)); // reproduziere die seitenkanten line(0, Point( 0, hoehe - radius), "( 0 0)"); line(0, Point(radius, hoehe), Point(25 - mittelabstand_links, hoehe)); line(0, Point(25 + mittelabstand_rechts, hoehe), Point(50 - radius, hoehe)); // 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; } // prozessiert eine seite des PCBs void side(string name, real originX, real originY, real radius, real hoehe, real abstand_l, real abstand_r) { cut(originX, originY); edit(name); clearBrd(); paste(0, 0, 0); closeBoundary(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 MR0 (100 0);\n"; // 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;\ngroup all;\ndelete (C> 0 0);\ndisplay all;\n"; str += "GRID last;\n"; // fuelle polygone str += "rats;\n"; // jlc markierung plazieren str += "LAYER 21;\nCHANGE FONT VECTOR;\nGRID mm;\nCHANGE SIZE 0.8;\nTEXT 'JLCJLCJLCJLC' R180 (98 2);\n"; write(); } // 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; // maskieren von Seite 1 str += "DISPLAY all;\n"; group(0, 110, 49.5, -10); side("SideA.brd", 0,0, radius, hoehe, 6.9, 5.7); // 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, radius, hoehe, 7.3, 5.9); // 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");