25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

genpanel.ulp 5.6 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 slotwidth, 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, 4);
  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. delete(Point(0,0));
  86. delete(Point(50,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. line(0, Point(0,0), Point(25-slotwidth/2, 0));
  90. line(0, Point(50, 0), Point(25+slotwidth/2, 0));
  91. // reproduziere die abgerundeten ecken
  92. arc(0, Point(0, hoehe - radius), Point(radius, hoehe) , -90);
  93. arc(0, Point(50-radius, hoehe), Point(50, hoehe - radius), -90);
  94. str += "GRID last;\nDISPLAY ALL;\n";
  95. }
  96. // ergaenzt ein Bohrloch
  97. void hole(real drill, string point)
  98. {
  99. string temp = "";
  100. sprintf(temp, "HOLE %f %s;\n", drill, point);
  101. str += temp;
  102. }
  103. void placeJlcMark()
  104. {
  105. str += "LAYER 22;\nCHANGE FONT VECTOR;\nGRID mm;\nCHANGE SIZE 0.8;\nCHANGE ALIGN bottom-right;\nTEXT 'JLCJLCJLCJLC' MR0 (51 1);\n";
  106. }
  107. // prozessiert eine seite des PCBs
  108. void side(string name, real originX, real originY, real slot, real radius, real hoehe, real abstand_l, real abstand_r) {
  109. cut(originX, originY);
  110. edit(name);
  111. clearBrd();
  112. paste(0, 0, 0);
  113. closeBoundary(slot, radius, hoehe, abstand_l, abstand_r);
  114. // sie panele sollen seitensymmetrisch sein
  115. // damit die zerbrochen platine die trennungsartifakte
  116. // immer auf der rechten bzw. linken seite aufweist
  117. str += "GRID mm;\nGROUP ALL;\nCUT (0 0);\nPASTE R0 (50 0);\n";
  118. // reproduziere die seitenkanten
  119. line(0, Point( 0, hoehe - radius), "( 0 0)");
  120. line(0, Point(100, hoehe - radius), "(100 0)");
  121. // trennungshilfen setzten
  122. real holedrill = 0.5;
  123. real slotwidth = 0.5;
  124. int numholes = 4;
  125. for (int i = 0; i < numholes; ++i)
  126. {
  127. hole(holedrill, Point(50, i));
  128. hole(holedrill, Point(50, hoehe-radius-1-i));
  129. }
  130. str += "LAYER 20;\n";
  131. line(slotwidth, Point(50, hoehe-radius-1-numholes), Point(50, numholes));
  132. // alle dimensionsmarken loeschen
  133. str += "DISPLAY none;\ndisplay 47 48;\nGROUP all;\nDELETE (C> 0 0);\nDISPLAY all;\n";
  134. str += "GRID last;\n";
  135. // fuelle polygone
  136. //str += "rats;\n";
  137. // jlc markierung plazieren
  138. placeJlcMark();
  139. }
  140. // verhindert, dass das skript auf was anderes als boards angewendet wird
  141. if(board)
  142. board(B){
  143. real radius = 1.5; // radius der abrundungen an der unteren fusskante
  144. real hoehe = 21.2; // hoehe der unteren fusskante
  145. // man merke sich das master-design
  146. // um es spaeter wieder zu oeffnen
  147. string master = B.name;
  148. // save drc settings
  149. string drcfile = "";
  150. sprintf(drcfile, "%s/master_drc_settings", filedir(master));
  151. str += "SET CONFIRM YES; DRC SAVE '" + drcfile + "'; SET CONFIRM OFF;";
  152. // maskieren von Seite 1
  153. str += "DISPLAY all;\n";
  154. group(0, 110, 49.5, -10);
  155. side("SideA.brd", 0,0, 1.7, radius, hoehe, 6.9, 5.7);
  156. // drc einstellungen laden
  157. str += "DRC LOAD '" + drcfile + "';";
  158. // datei speichern
  159. write();
  160. // zurueck zum master fuer seite 2
  161. edit(master);
  162. str += "DISPLAY all;\n";
  163. // maskieren von Seite 2
  164. group(50.5, 110, 100, -10);
  165. side("SideB.brd", 50,0, 0, radius, hoehe, 7.3, 5.9);
  166. // DRC einstellungen laden
  167. str += "DRC LOAD '" + drcfile + "';";
  168. // datei speichern
  169. write();
  170. // master wieder oeffnen
  171. edit(master);
  172. // generierten code als skript zu eagle zurueckgeben
  173. exit(str);
  174. }
  175. dlgMessageBox(":Dies ist kein Board-context!\nBitte das ulp im Masterboard ausfuehren", "O&K");