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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
|
// Generiere Liste als EAGLE-Script
string Version = "Listenausgabe Version 1.0";
#require 4.9206
#usage "<b>Erstellen von Listen auf EAGLE-Schaltplanseiten (nicht mit EAGLE Light)</b>\n<p> "
"Mit diesem ULP erstellen Sie aus den Dateien, die von den Programmen "
"<i>e-klemmenplan</i> und <i>e-brueckenverwaltung</i> erzeugt wurden, "
"Listen, die Bestandteil eines Schaltplans sind.<p>"
"Außerdem können Sie mit diesem Programm Schaltplanseiten ab einer "
"bestimmten Seite bequem löschen.<p>"
"<author>Author: support@cadsoft.de</author>"
int NrLines, i, j, np, maxlen[], PrintOff[], xstart, ystart, xtextpos, ypos, size;
int shnr, linedist, layer, lowmargin, linelength, fieldmarginchar, width, width_head;
int x_margin, y_margin, xright, MaxSize, linemil, delpage;
numeric string lines[], head[], item[];
string FileName, FileTmp, Cmd, s, t, headline, fext, MaxSizeStr, CmdDel;
///////////////////////////////////////////////////////////////////////////////////////
// Folgende Parameter können vom Benutzer angepasst werden
// Alle Maße in mil = 1/1000 Zoll; 40 mil ist ca. 1 mm
fext = ".vbd";
xstart = 150; // Trennlinien-Abstand vom linken Rand
xright = 11200; // x-Koordinate für Trennlinie rechts
ystart = 7750; // y-Koordinate für erste (obere) Trennlinie
lowmargin = 435; // y-Koordinate für letztmögliche (unterste) Trennlinie
linedist = 200; // Zeilenabstand
fieldmarginchar = 2; // zusätzliche Zeichen pro Feld (Abstand)
size = 140; // Texthöhe (wird intern optimiert)
width = 7; // Strichstärke für Trennlinien
width_head = 10; // Strichstärke für Trennlinien der Kopfzeile
layer = 94; // wenn ein anderer Layer angegeben wird, muss er definiert sein
///////////////////////////////////////////////////////////////////////////////////////
xtextpos = xstart + size;
ypos = ystart;
x_margin = size * fieldmarginchar/2; // Abstand zu Linien in mil
y_margin = (linedist - size)/2; // Versatz der Linien gegen Text vertikal
// shnr wird in SetFileNames auf höchste Seitennummer + 1 gesetzt
string HelpText =
"<b>Erstellen von Listen auf EAGLE-Schaltplanseiten (nicht mit EAGLE Light)</b><p> "
"Mit diesem ULP erstellen Sie aus den Dateien, die von den Programmen "
"<i>e-klemmenplan</i> und <i>e-brueckenverwaltung</i> erzeugt wurden, "
"Listen, die Bestandteil eines Schaltplans sind.<p>"
"Nach dem Start des Programms wählen Sie, ob Sie eine Liste erstellen "
"oder eine vorher erstellte Liste ab einer bestimmten Seite löschen wollen.<p>"
"<b>Liste erstellen</b><p>"
"Wählen Sie eine Datei, die Sie vorher mit den oben genannten Programmen erzeugt haben "
"(*.brk oder *.vbd).<p>"
"Im Menü links können Sie selektieren, welche Spalten der Datei nicht ausgegeben werden sollen. "
"Das Programm errechnet den Maximalwert der Textgröße (in mil), damit die Tabelle auf eine "
"Schaltplanseite passt. "
"Sie können den Wert innerhalb bestimmter Grenzen im Menü rechts verändern. "
"Ein Klick auf <i>Liste erzeugen</i> hängt die Liste an den bisherigen Schaltplan an. "
"Dabei wird auf den neuen Seiten jeweils der Rahmen von Seite 1 des Schaltplans verwendet. "
"<b>Voraussetzung: er muss am Koordinatennullpunkt platziert sein</b>.<p>"
"Anpassungen an andere Rahmen können Sie direkt im Programm vornehmen (siehe Kommentare).<p>"
"<b>Achtung! Alle Maße in mil (40 mil ist ca. 1 mm)</b><p>"
"<b>Seiten löschen</b><p>"
"Tragen Sie in das Textfeld die Seitennummer ein, ab der (inklusive) die restlichen Seiten "
"des Schaltplans gelöscht werden sollen, und klicken Sie auf <i>Seiten löschen</i>. "
"Bestätigen Sie dann die Fragen des Programms alle mit <i>Ja</i>, bis alle Seiten gelöscht sind.<p>"
"Die Seitennummer muss 2 oder größer sein.<p>"
;
void ShowHelp(void) {
dlgDialog("Hilfe\t\t\t\t\t") {
dlgHBoxLayout dlgSpacing(500);
dlgHBoxLayout{
dlgVBoxLayout dlgSpacing(600);
dlgTextView(HelpText);
}
dlgHBoxLayout {
}
dlgHBoxLayout {
dlgStretch(1);
dlgPushButton("+OK") dlgAccept();
}
};
}
void SetFileNames(void) { // in Schematic-Kontext aufrufen
if (!schematic) {
exit(1);
}
schematic(SCH) {
FileName = filesetext(SCH.name, fext);
FileTmp = filesetext(SCH.name, ".scr");
i = 0;
SCH.sheets(SH) {
i++;
}
shnr = i + 1;
}
}
void ReadFile(void) {
if (FileName != "")
NrLines = fileread(lines, FileName);
}
int GetMaxSize(void) {
if (FileName == "") return MaxSize;
np = strsplit(head, lines[0], '\t');
// Breite der Felder feststellen
for (i = 0; i < NrLines; i++) {
strsplit(item, lines[i], '\t');
linelength = 0; // max # Zeichen
for (j = 0; j < np; j++) {
maxlen[j] = max(maxlen[j], strlen(item[j]));
if (!PrintOff[j]) {
linelength += maxlen[j] + fieldmarginchar; // linelength in Zeichen
}
}
}
// Höhe zu Breite = 100/85
MaxSize = min (180, 11000 * 100 / (linelength * 85)); // max. 180 Mil
sprintf(MaxSizeStr, "Zeichengröße/mil (max. %d)\t", MaxSize);
return MaxSize;
}
int GenerateScr(void) {
// Header
Cmd = ""; ypos = ystart;
GetMaxSize();
if (size > MaxSize) return 0; // Zeilen zu lang (11050 ist max., aber 50 mil Sicherheit)
//Kommandostring erzeugen
sprintf(s, "grid mil 100 1;\n"); Cmd += s;
sprintf(s, "group (-1 -1) (-1 1) (1 1) (1 -1) (> -1 -1);\ncut (0 0);\n"); Cmd += s;
sprintf(s, "display -98;\n"); Cmd += s;
sprintf(s, "edit .S%d;\n", shnr); Cmd += s;
sprintf(s, "paste (0 0);\nwindow fit;\n"); Cmd += s;
sprintf(s, "change layer %d;\n", layer); Cmd += s;
sprintf(s, "change font fixed;\n"); Cmd += s;
sprintf(s, "change size %d;\n", size); Cmd += s;
sprintf(s, "change width %d;\n", width_head); Cmd += s;
sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
for (i = 0; i < NrLines; i++) {
if (ypos > lowmargin + linedist) {
ypos -= linedist;
}
else { // neue Seite
ypos = ystart;
shnr++;
sprintf(s, "edit .S%d;\n", shnr); Cmd += s;
sprintf(s, "paste (0 0);\nwindow fit;\n"); Cmd += s;
sprintf(s, "change width %d;\n", width_head); Cmd += s;
sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
ypos -= linedist;
sprintf (s, "text '%s' R0 (%d %d);\n", headline, xtextpos, ypos + y_margin); Cmd += s;
sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
ypos -= linedist;
sprintf(s, "change width %d;\n", width); Cmd += s;
}
strsplit(item, lines[i], '\t');
t = "";
for (j = 0; j < np; j++) {
maxlen[j] = max(maxlen[j], strlen(item[j]));
if (!PrintOff[j]) {
sprintf (s, "%-*s", maxlen[j]+fieldmarginchar, item[j]); t += s; // t ist Textzeile
}
}
sprintf (s, "text '%s' R0 (%d %d);\n", t, xtextpos, ypos + y_margin); Cmd += s;
sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
if (i == 0) {
headline = t;
sprintf(s, "change width %d;\n", width); Cmd += s;
}
}
Cmd += "grid last;\n";
return 1;
}
void OutputScr(string Cmd) {
output(FileTmp, "wtD") {
printf ("%s", Cmd);
}
exit("script '" + FileTmp + "';\n");
}
void DelSheets(int page) {
CmdDel = "";
if (page == 0) return;
schematic(SCH) {
SCH.sheets(SH) {
if (SH.number >= page) {
sprintf(s, "remove .S%d;\n", page);
CmdDel += s;
}
}
}
}
//--------------------------------------------------------------------------------------
void GetFileName(void) {
dlgDialog("Ausgangsdatei wählen") {
dlgHBoxLayout dlgSpacing(+450);
dlgTextView("Wählen Sie die Ausgangsdatei für die Listenausgabe, "
"normalerweise *.vbd oder *.brk, wie von den Programmen "
"e-klemmenplan oder e-brueckenverwaltung erzeugt.<p>"
"Oder wählen Sie <i>Seiten löschen</i>, wenn Sie "
"Seiten Ihres Schaltplans löschen wollen."
);
dlgHBoxLayout {
dlgStretch(1);
dlgPushButton("&Seiten löschen") {FileName = ""; dlgAccept();}
dlgPushButton("+&Liste erzeugen") {
FileName = dlgFileOpen("Datei wählen", FileName,
"Klemmenplan (*.vbd);;Brückenplan (*.brk);;Alle Dateien (*)");
if (FileName != "") dlgAccept();
}
dlgPushButton("-&Beenden") exit(0);
}
};
}
void ShowUserInterface(void) {
dlgDialog(Version) {
dlgHBoxLayout dlgSpacing(100);
dlgHBoxLayout {
if (FileName != "") {
dlgGroup("Nicht drucken") {
for (i = 0; i < np; i++) {
dlgHBoxLayout {
dlgCheckBox(head[i], PrintOff[i]) if (GetMaxSize() < size) size = MaxSize;
}
}
dlgSpacing(10);
}
}
dlgGroup("") {
if (FileName != "")
dlgHBoxLayout {
dlgLabel(MaxSizeStr, 1);
dlgIntEdit(size, 40, 180);
}
else
dlgHBoxLayout {
dlgLabel("Löschen ab Seite\t");
dlgIntEdit(delpage, 0, 999);
}
}
}
dlgSpacing(10);
dlgHBoxLayout {
}
dlgHBoxLayout {
dlgPushButton("&Hilfe") ShowHelp();
dlgStretch(1);
if (FileName == "")
dlgPushButton("&Seiten Löschen") if (delpage > 1){DelSheets(delpage); OutputScr(CmdDel);}
else dlgMessageBox("Löschen erst ab Seite 2 möglich!", "OK");
else
dlgPushButton("&Liste erzeugen") if (GenerateScr()) OutputScr(Cmd);
else dlgMessageBox("Wert für Textgröße zu hoch!", "OK");
dlgPushButton("&Beenden") dlgReject();
}
};
}
//--------------------------------------------------------------------------------------
SetFileNames();
GetFileName();
ReadFile();
if (!GenerateScr()) size = MaxSize;
ShowUserInterface();
|