Ausführung von Eagle ULPs unzuverlässig

Gast #3309054
Lesenswert?

Hallo zusammen,

mich würde mal interessieren, wie zuverlässig die Ausführung von ULPs 
ist. Ich habe nämlich ein Problem mit einer eigenen ULP. Darin werden 
nur "move"- und "rotate"-Kommandos benutzt, um Bauteile in einem Board 
zu platzieren.
Die meisten Bauteile werden richtig platziert, es gibt aber ein paar, 
bei denen passt's nicht ganz.
1
#usage "Platziert die übrigen Bauteile in den Slots 1,3,4,5 und 6 nach dem Muster in nur-Slot.brd."
2

3
// Die Bauteile sind in einer Modulgruppe durchnummeriert. R104 bedeutet, dass der Widerstand mit der Nummer 04 in Modul 1 gemeint ist.
4
// Das x markiert die Stelle, an der die Modulnummer steht (slotNumber).
5
int slotNumber = 3;
6

7
// x und y geben die Positionen für die Bauteile. Bezogen auf ein Referenzbauteil, das im Board mit "mark" markiert wird.
8
int x[]= {378,-534,-762,-762,-762,-762,-336,-202,-114,-582,-489,-237,-576,-576,-276,84,-231,-1188,-1188,738,738,-729,-363,252,-48,-1005,399,-768,321,-909,102,-204,24,-33,-423,-231,-768,321,-363,24};
9
int y[]= {36,-222,-399,-279,-195,-96,-387,-384,-390,75,75,2529,2604,2466,2430,1260,1614,414,126,180,-21,252,2478,2481,2481,561,2481,471,2652,282,2481,2478,2580,1680,1650,1470,396,2577,2601,2658};
10

11

12
int i = 0;      // Klar... Zählvariable
13
string device;    // Enthält den Bauteilnamen für die nächste Platzierung
14
string command;    // Zwischenspeicher für ein Kommando
15
string s;      // Gibt alle Kommandos an die Kommandozeile zurück
16

17
// Bauteilname: C x08
18
// Baut den gültigen Bauteilnamen zusammen. Ersetzt quasi das x.
19
sprintf(device, "C%d08", slotNumber);
20

21
// Fügt den Move-Befehl zum string s hinzu
22
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
23
s += command;
24

25
// Fügt den Rotate-Befehl zum string s hinzu
26
sprintf(command, "rotate =R90 %s;", device);
27
s += command;
28

29
// OK x01
30
i++;
31
sprintf(device, "OK%d01", slotNumber);
32

33
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
34
s += command;
35
sprintf(command, "rotate =MR180 %s;", device);
36
s += command;
37

38
// R x13
39
i++;
40
sprintf(device, "R%d13", slotNumber);
41

42
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
43
s += command;
44
sprintf(command, "rotate =MR180 %s;", device);
45
s += command;
46

47
// R x15
48
i++;
49
sprintf(device, "R%d15", slotNumber);
50

51
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
52
s += command;
53
sprintf(command, "rotate =MR180 %s;", device);
54
s += command;
55

56
// R x19
57
i++;
58
sprintf(device, "R%d19", slotNumber);
59

60
sprintf(command, "move %s (R %d %d);", device, x[i], y[i]);
61
s += command;
62
sprintf(command, "rotate =MR180 %s;", device);
63
s += command;
64

65
// ...dann geht's hier noch ein ganzes Stück weiter
66
// wie oben.
67

68
// Kommandos an die Kommandozeile ausgeben
69
exit(s);

Das ist die erste ULP, die ich "mal schnell" zusammenschreiben wollte. 
Jetzt weiß ich einfach nicht, warum das bei manchen Bauteilen nicht 
funktioniert. Die sind mal richtig platziert aber nicht gespiegelt und 
rotiert, dann liegt eins mal nicht genau auf der Position, wie sie im 
Array steht, sondern ein paar Punkte darüber (x-Achse passt aber), usw.
Sind Probleme damit bekannt? Oder benutze ich vielleicht einen 
schlechten Stil für ULPs (keine Funktionen benutzt z.B.)?

Vielen Dank für eure Aufmerksamkeit :)
Gruß Leo
#3309062
Lesenswert?

Kannst Du die Bewegungen, die Du machen willst, mal grafisch 
beschreiben?

Wenn es um Rotationen geht (allgemein, nicht nur Eagle): Willst Du um 
ein Zentrum oder um die Mittelachse drehen? Oder um die Bauteilreferenz?

Für eine Drehung um einen beliebigen Punkt brauchst Du ja im allgemeinen 
eine Drehung und zwei Verschiebungen.
Gast #3309068
Lesenswert?

Oh, oops es handelt sich hier um Eagle-ULPs und die Rotationen und 
Positionen beziehen sich auf die Bauteil-Referenz. Eine Rotation 
beschreibt die Drehung um die Bauteilmitte. Gespiegelt (mirror-Befehl) 
bedeutet die Platzierung auf dem Bottom-Layer.
#3309126
Lesenswert?

Lasse dir vor dem ausführen einmal "s" anzeigen, der Code hier vor das 
exit(s) sollte es Bewerkstelligen.
1
    int Result = dlgDialog("Descriptions") {
2
        dlgLabel("<b>Commands</b>");
3
        dlgHBoxLayout {
4
            dlgVBoxLayout { dlgSpacing(500); }
5
            dlgTextEdit(s);
6
        }
7
        dlgHBoxLayout {
8
            dlgPushButton("+Execute") dlgAccept();
9
            dlgSpacing(100);
10
            dlgPushButton("-Cancel") dlgReject();
11
        }
12
    };
13
    if (Result == 0) exit(0);

Und dann vergleiche den Code mit den Positionen, das sollte das Debuggen 
einfacher machen.
Gast #3309172
Lesenswert?

Ah, ok. Die Fehlplatzierungen waren meine Fehler. Danke Moritz. Aber 
wenn ich mir die nicht rotierten und gespiegelten Bauteile ansehe, dann 
stimmen die Eigenschaften im Board nicht mit dem Befehl überein. Der 
Name und die Daten sind aber korrekt. Die entsprechenden Bauteile 
bleiben übrigens unberührt und scheinen alle Widerstände zu betreffen, 
die auf die Unterseite sollen.
Gast #3309175
Lesenswert?

Wenn ich das Layer von dem fehlplatzierten Bauteil ändere, dann wird das 
aber durch die ULP auch nicht zurückgesetzt. Das heißt, das Bauteil wird 
durch das Programm auch nicht wieder auf das Top-Layer gesetzt. 
Rotationen werden trotzdem nicht durchgeführt. Die Bauteile sind 
wirklich die Wiederstände M0805 aus der Bibliothek rcl.
Gast #3309264
Lesenswert?

Bei R317 und R320 sieht man z.B.: rotate =MR90 R317; bzw. rotate =MR90 
R320;

Im Schaltplan sind die aber auf dem Top-Layer und haben den Winkel 0.
1
move C308 (R 378 36);rotate =R90 C308;move OK301 (R -534 -222);rotate =MR180 OK301;move R313 (R -762 -399);rotate =MR180 R313;move R315 (R -762 -297);rotate =MR180 R315;move R319 (R -762 -195);rotate =MR180 R319;move R316 (R -762 -96);rotate =MR180 R316;move R314 (R -336 -387);rotate =MR90 R314;move IC302 (R -222 -384);rotate =MR0 IC302;move C309 (R -114 -390);rotate =MR270 C309;move R317 (R -582 75);rotate =MR90 R317;move R320 (R -489 75);rotate =MR90 R320;move LED301 (R -237 2529);rotate =R270 LED301;move LED302 (R -576 2604);rotate =R0 LED302;move R322 (R -576 2466);rotate =R90 R322;move R321 (R -276 2430);rotate =R90 R321;move R318 (R 84 1260);rotate =MR270 R318;move IC301 (R -231 1614);rotate =R90 IC301;move PTC305 (R -1188 414);rotate =MR270 PTC305;move PTC306 (R -1188 126);rotate =R270 PTC306;move PTC308 (R 738 180);rotate =MR180 PTC308;move PTC309 (R 738 -21);rotate =MR180 PTC309;move D305 (R -729 252);rotate =R0 D305;move D306 (R -363 2478);rotate =MR90 D306;move D308 (R 252 2481);rotate =MR90 D308;move D309 (R -48 2481);rotate =MR90 D309;move R305 (R -1005 561);rotate =R180 R305;move R309 (R 399 2481);rotate =MR180 R309;move R307 (R -768 471);rotate =R0 R307;move R311 (R 321 2652);rotate =MR180 R311;move R306 (R -909 282);rotate =R270 R306;move R310 (R 102 2481);rotate =MR180 R310;move R308 (R -204 2478);rotate =MR0 R308;move R312 (R 24 2580);rotate =MR180 R312;move C301 (R -33 1680);rotate =R90 C301;move C303 (R -423 1650);rotate =R270 C303;move C302 (R -231 1470);rotate =R0 C302;move C304 (R -768 396);rotate =R180 C304;move C306 (R 321 2577);rotate =MR0 C306;move C305 (R -363 2601);rotate =MR0 C305;move C307 (R 24 2658);rotate =MR0 C307;
Gast #3309278
Lesenswert?

So nochmal besser lesbar:
1
move C308 (R 378 36);rotate =R90 C308;
2
move OK301 (R -534 -222);rotate =MR180 OK301;
3
move R313 (R -762 -399);rotate =MR180 R313;
4
move R315 (R -762 -297);rotate =MR180 R315;
5
move R319 (R -762 -195);rotate =MR180 R319;
6
move R316 (R -762 -96);rotate =MR180 R316;
7
move R314 (R -336 -387);rotate =MR90 R314;
8
move IC302 (R -222 -384);rotate =MR0 IC302;
9
move C309 (R -114 -390);rotate =MR270 C309;
10
move R317 (R -582 75);rotate =MR90 R317;
11
move R320 (R -489 75);rotate =MR90 R320;
12
move LED301 (R -237 2529);rotate =R270 LED301;
13
move LED302 (R -576 2604);rotate =R0 LED302;
14
move R322 (R -576 2466);rotate =R90 R322;
15
move R321 (R -276 2430);rotate =R90 R321;
16
move R318 (R 84 1260);rotate =MR270 R318;
17
move IC301 (R -231 1614);rotate =R90 IC301;
18
move PTC305 (R -1188 414);rotate =MR270 PTC305;
19
move PTC306 (R -1188 126);rotate =R270 PTC306;
20
move PTC308 (R 738 180);rotate =MR180 PTC308;
21
move PTC309 (R 738 -21);rotate =MR180 PTC309;
22
move D305 (R -729 252);rotate =R0 D305;
23
move D306 (R -363 2478);rotate =MR90 D306;
24
move D308 (R 252 2481);rotate =MR90 D308;
25
move D309 (R -48 2481);rotate =MR90 D309;
26
move R305 (R -1005 561);rotate =R180 R305;
27
move R309 (R 399 2481);rotate =MR180 R309;
28
move R307 (R -768 471);rotate =R0 R307;
29
move R311 (R 321 2652);rotate =MR180 R311;
30
move R306 (R -909 282);rotate =R270 R306;
31
move R310 (R 102 2481);rotate =MR180 R310;
32
move R308 (R -204 2478);rotate =MR0 R308;
33
move R312 (R 24 2580);rotate =MR180 R312;
34
move C301 (R -33 1680);rotate =R90 C301;
35
move C303 (R -423 1650);rotate =R270 C303;
36
move C302 (R -231 1470);rotate =R0 C302;
37
move C304 (R -768 396);rotate =R180 C304;
38
move C306 (R 321 2577);rotate =MR0 C306;
39
move C305 (R -363 2601);rotate =MR0 C305;
40
move C307 (R 24 2658);rotate =MR0 C307;
#3309567
Lesenswert?

Dann stellt sich natürlich die Frage, was passiert, wenn du
1
move R317 (R -582 75);rotate =MR90 R317;
manuell über die Kommandozeile ausführst. Ist dein Ergebnis dann 
richtig? Ich habe bisher auch nicht so ganz nachvollzogen, wann Eagle 
die Bauteilnamen gerne in '' hätte, daher mache ich das mittlerweile 
einfach grundsätzlich.
Gast #3309615
Lesenswert?

Das ist's! Rotate kommt anscheinend wegen dem =R und R aus dem 
Bauteilnamen durcheinander. Ich habe gedacht, das = dient als 
Steuerzeichen, sodass der ULP-Interpreter weiß, dass die nachfolgende 
Zeichenkette die Orientierungsinformation beinhaltet. Aber man kann das 
Bauteil ja auch relativ zur aktuellen Orientierung rotieren, wobei dann 
= weggelassen wird. "rotate =MR90 R270" würde dann also interpretiert 
werden als: Rotation absolut: 90°, gespiegelt; Rotation relativ: 270° 
bezogen auf kein Bauteil.  Warum muss ich nochmal diese Software 
benutzen?
#3309869
Lesenswert?

Leo schrieb:
> "rotate =MR90 R270" würde dann also interpretiert
> werden als: Rotation absolut: 90°, gespiegelt; Rotation relativ: 270°
> bezogen auf kein Bauteil.

Eher "bezogen auf das Bauteil, das du als nächstes anklickst." Nur 
überschreibst du den Befehl einfach danach wieder, anstatt ihn auf 
irgendwas anzuwenden.

Ich rufe so mittlerweile ganz gerne Befehle auf, anstatt mich durch 
irgendwelche Menüs zu hangeln. Ein "change width 10mil" klick ist 
einfach flotter als alles andere :)

An der Stelle würde es auch helfen, einfach mal die Hilfe zu lesen. Da 
steht sogar genau dein Problem beschrieben:
1
Syntax 
2
    ROTATE orientation • ..
3
    ROTATE orientation 'name' .. 
4
5
Die Hochkommas um name sind nötig zur Unterscheidung vom Wert der Orientierung wie in 
6
    ROTATE R45 'R1'
7
Sie können weggelassen werden, wenn der Kontext klar ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren