|
- /* 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");
|