File: panelize.ulp

package info (click to toggle)
eagle 4.16-5
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 36,508 kB
  • sloc: sh: 82; makefile: 32
file content (124 lines) | stat: -rw-r--r-- 3,622 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#usage "<b>Generate name layers to panelize board</b>\n"
       "<p>"
       "Generates a command sequence which copies the name texts (support spin-flag) "
       "of all elements of your layout into newly generated layers (125 and 126). "
       "After running the ULP you can GROUP, CUT and PASTE your layout "
       "to get an array of several boards. Make sure all layers are displayed before."
       "<p>"
       "The duplicated name texts in the new layers will not be changed. "
       "Please notice that you have to deactivate layers 25 and 26 if you use "
       "the CAM processor e.g. for generating gerber data. Instead, you have to activate "
       "the new layers 125 and 126. Thus you get an identical silk screen for all "
       "your layouts in this array."
       "<p>"
       "<b>Texts must be SMASHed before we can duplicate them!</b> "
       "<p>"
       "<author>Author: support@cadsoft.de</author>"

// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED

#require 4.1106;

// 6.12.2004 Text with Spin-Flag support@cadsoft.de

int  offset = 100;
string tcolor = "yellow";
string bcolor = "magenta";
int    used_name_layers[];
string used_name_[];

string cmd_header;
string cmd = "\nSET UNDO_LOG OFF;\nGRID MIL;\n"; // advisable for speed reasons
string h;

void test(void) {
  string txt = "Used Layers for >NAME\n";
  for (int n = 0; n < 256; n++) {
    if(used_name_layers[n]) {
      sprintf(h, "Layer %3d count %d\t%s\n", n, used_name_layers[n], used_name_[n]);
      txt += h;
    }
  }
  if (dlgMessageBox(txt, "OK", "Cancel") != 0) exit(-1);
  return;
}

void header(void) {
  for (int n = 0; n < 256; n++) {
    if(used_name_layers[n]) {
      sprintf(h, "layer %d _%s;\n", n + offset, used_name_[n]);
      cmd_header += h;
      if (n & 1) sprintf(h, "set color_layer %d %s;\n",  n + offset, tcolor);
      else       sprintf(h, "set color_layer %d %s;\n",  n + offset, bcolor);
      cmd_header += h;
    }
  }
}

void Text(string Ename, int Tlayer, int Tx, int Ty, int Tsize, real Tangle, int Tratio, int Tmirror, int Tspin) {
  sprintf(h, "Change Layer %d;\n", Tlayer + offset);
  cmd += h;
  sprintf(h, "Change Size %5.3f;\n", u2mil(Tsize));
  cmd += h;
  sprintf(h, "Change Ratio %d;\n", Tratio);
  cmd += h;
  string mirr, spin;
  if (Tmirror) mirr = "M";
  else mirr = "";
  if (Tspin) spin = "S";
  else spin = "";
  sprintf(h, "Text '%s' %s%sR%.1f (%5.3f %5.3f);\n", Ename, spin, mirr, Tangle, u2mil(Tx), u2mil(Ty));
  cmd += h;
  return;
}



if (board) {
  board(B) {
    B.layers(L) {
      used_name_[L.number] = L.name;
    }
    header();
    B.elements(E) {  // smashed texts
      E.texts(T) {
        if (T.value == E.name) {
          used_name_layers[T.layer]++;
          Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, T.mirror, T.spin);
        }
      }
      E.package.texts(T) {  // unsmashed texts
        if (T.value == E.name) {
          used_name_layers[T.layer]++;
          Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, T.mirror, T.spin);
        }
      }
    }
  }
  // test();

  cmd += "SET UNDO_LOG ON;\nGRID LAST;\n";
  header();
  cmd_header += cmd;
  cmd = cmd_header;

  //  EditBox
  int Result = dlgDialog("Descriptions") {
    dlgHBoxLayout {
      dlgVBoxLayout { dlgSpacing(500); }
      dlgTextEdit(cmd);
    }
    dlgHBoxLayout {
      dlgPushButton("+Execute") dlgAccept();
      dlgSpacing(100);
      dlgPushButton("-Cancel") dlgReject();
      }
    };
  if (Result == 0) exit(0);
  exit(cmd);
}

else {
   dlgMessageBox("\n Start this ULP in a Board \n");
   exit (0);
}