Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

192 рядки
5.0 KiB

  1. /* dieses Program macht die Seitenpanele aus dem Masterboard-design fuer jlcpcb */
  2. string str = "";
  3. // erstellt einen Punkt als string
  4. string Point(real X, real Y)
  5. {
  6. string temp = "";
  7. sprintf(temp, "(%f %f)", X,Y);
  8. return temp;
  9. }
  10. // kopiert eine selektierte Gruppe in die zwischenablage
  11. void cut(real originX, real originY)
  12. {
  13. string temp = "";
  14. sprintf(temp, "GRID mm 1;\nCUT (%f %f);\nGRID last;\nDISPLAY last;\n", originX, originY);
  15. str += temp;
  16. }
  17. // gruppiert elemente in einem rechteck
  18. void group(real upperLeftX, real upperLeftY, real lowerRightX, real lowerRightY)
  19. {
  20. string a = Point(upperLeftX, lowerRightY);
  21. string b = Point(upperLeftX, upperLeftY);
  22. string c = Point(lowerRightX, upperLeftY);
  23. string d = Point(lowerRightX, lowerRightY);
  24. string temp = "";
  25. sprintf(temp, "GROUP %s %s %s %s %s;\n", a,b,c,d,a);
  26. str += temp;
  27. }
  28. // oeffnet ein neues board zum editieren
  29. void edit(string name)
  30. {
  31. string temp = "";
  32. sprintf(temp, "SET CONFIRM YES;\nEDIT %s;\nSET CONFIRM OFF;\n", name);
  33. str += temp;
  34. }
  35. // loescht alle elemente auf einem board
  36. void clearBrd()
  37. {
  38. str += "DISPLAY ALL;\nSET CONFIRM YES;\nRIP;\nGROUP ALL;\nDELETE (C> 0 0);\nSET CONFIRM OFF;\nDISPLAY last;\n";
  39. }
  40. // speichert das board
  41. void write()
  42. {
  43. str += "SET CONFIRM YES;\nWRITE;\nSET CONFIRM OFF;\n";
  44. }
  45. // fuegt letzte kopierte sektion in das board an der gewaehlten stelle ein
  46. void paste(int offset, real originX, real originY)
  47. {
  48. string temp = "";
  49. sprintf(temp, "GRID mm;\nPASTE %d (%f %f);\nGRID last;\n", offset, originX, originY);
  50. str += temp;
  51. }
  52. // zeichnet eine linie mit dicke width
  53. void line(real width, string A, string B)
  54. {
  55. string temp = "";
  56. sprintf(temp, "LINE %f %s %s;\n", width, A, B);
  57. str += temp;
  58. }
  59. // zeichnet eine runde linie zwischen den Punkten A und B
  60. void arc(int width, string A, string B, real angle)
  61. {
  62. string temp = "";
  63. sprintf(temp, "LINE %d %s %f %s;\n", width, A, angle, B);
  64. str += temp;
  65. }
  66. // loescht dinge um gegebenen Punkt
  67. void delete(string atPoint)
  68. {
  69. string temp = "";
  70. sprintf(temp, "DELETE %s;\n", atPoint);
  71. str += temp;
  72. }
  73. // schliesst die outline
  74. void closeBoundary(real radius, real hoehe, real mittelabstand_links, real mittelabstand_rechts)
  75. {
  76. str += "LAYER 20;\nDISPLAY NONE;\nDISPLAY 20;\n";
  77. // setzt das grid auf mm fuer folgende operationen
  78. str += "GRID mm 0.1;\n";
  79. group(0, hoehe - 0.1, 100, 2);
  80. delete("(C> 0 0)");
  81. delete(Point(10, hoehe));
  82. delete(Point(50-10, hoehe));
  83. delete(Point(50+10, hoehe));
  84. delete(Point(100-10, hoehe));
  85. // reproduziere die seitenkanten
  86. line(0, Point( 0, hoehe - radius), "( 0 0)");
  87. line(0, Point(radius, hoehe), Point(25 - mittelabstand_links, hoehe));
  88. line(0, Point(25 + mittelabstand_rechts, hoehe), Point(50 - radius, hoehe));
  89. // reproduziere die abgerundeten ecken
  90. arc(0, Point(0, hoehe - radius), Point(radius, hoehe) , -90);
  91. arc(0, Point(50-radius, hoehe), Point(50, hoehe - radius), -90);
  92. str += "GRID last;\nDISPLAY ALL;\n";
  93. }
  94. // ergaenzt ein Bohrloch
  95. void hole(real drill, string point)
  96. {
  97. string temp = "";
  98. sprintf(temp, "HOLE %f %s;\n", drill, point);
  99. str += temp;
  100. }
  101. // prozessiert eine seite des PCBs
  102. void side(string name, real originX, real originY, real radius, real hoehe, real abstand_l, real abstand_r) {
  103. cut(originX, originY);
  104. edit(name);
  105. clearBrd();
  106. paste(0, 0, 0);
  107. closeBoundary(radius, hoehe, abstand_l, abstand_r);
  108. // sie panele sollen seitensymmetrisch sein
  109. // damit die zerbrochen platine die trennungsartifakte
  110. // immer auf der rechten bzw. linken seite aufweist
  111. str += "GRID mm;\nGROUP ALL;\nCUT (0 0);\nPASTE MR0 (100 0);\n";
  112. // trennungshilfen setzten
  113. real holedrill = 0.5;
  114. real slotwidth = 0.5;
  115. int numholes = 4;
  116. for (int i = 0; i < numholes; ++i)
  117. {
  118. hole(holedrill, Point(50, i));
  119. hole(holedrill, Point(50, hoehe-radius-1-i));
  120. }
  121. str += "LAYER 20;\n";
  122. line(slotwidth, Point(50, hoehe-radius-1-numholes), Point(50, numholes));
  123. // alle dimensionsmarken loeschen
  124. str += "DISPLAY none;\ndisplay 47;\ngroup all;\ndelete (C> 0 0);\ndisplay all;\n";
  125. str += "GRID last;\n";
  126. // fuelle polygone
  127. str += "rats;\n";
  128. // jlc markierung plazieren
  129. str += "LAYER 21;\nCHANGE FONT VECTOR;\nGRID mm;\nCHANGE SIZE 0.8;\nTEXT 'JLCJLCJLCJLC' R180 (98 2);\n";
  130. write();
  131. }
  132. // verhindert, dass das skript auf was anderes als boards angewendet wird
  133. if(board)
  134. board(B){
  135. real radius = 1.5; // radius der abrundungen an der unteren fusskante
  136. real hoehe = 21.2; // hoehe der unteren fusskante
  137. // man merke sich das master-design
  138. // um es spaeter wieder zu oeffnen
  139. string master = B.name;
  140. // maskieren von Seite 1
  141. str += "DISPLAY all;\n";
  142. group(0, 110, 49.5, -10);
  143. side("SideA.brd", 0,0, radius, hoehe, 6.9, 5.7);
  144. // zurueck zum master fuer seite 2
  145. edit(master);
  146. str += "DISPLAY all;\n";
  147. // maskieren von Seite 2
  148. group(50.5, 110, 100, -10);
  149. side("SideB.brd", 50,0, radius, hoehe, 7.3, 5.9);
  150. // master wieder oeffnen
  151. edit(master);
  152. // generierten code als skript zu eagle zurueckgeben
  153. exit(str);
  154. }
  155. dlgMessageBox(":Dies ist kein Board-context!\nBitte das ulp im Masterboard ausfuehren", "O&K");