Forum: Platinen Hilfe EAGLE ULP - Attribut auf constant ändern


von Balthasar (Gast)


Lesenswert?

hallo zusammen,

ich erstelle eine allgemeingültige Attribute Liste füe meine Bauteile in 
den Bibliotheken.
Dabei verwende ich die ULP set-all-devices-attribute.ulp

Leider fehlt in dieser ULP die Möglichkeit ein Attribut als "constant 
"bzw. "variable" zu setzen.

Kann mir jemand helfen, diesen teil zu integrieren?

Ich habe mir die EAGLE ULP-Programmierung rudimentär angeeignet, aber 
das schaffe ich leider nicht.

Gerne kann ich - wenn nötig - die ulp als Code hochladen, aber ich 
denke, man kann das Original von EAGLE auf dem Rechner mit einem Editor 
anschauen.

Diese ULP wurde von alf@cadsoft erstellt.

: Verschoben durch User
von X4U (Gast)


Lesenswert?

Balthasar schrieb:
> Leider fehlt in dieser ULP die Möglichkeit ein Attribut als "constant
> "bzw. "variable" zu setzen.

Im Attribut kannst du constant auf 0 setzen

> Ich habe mir die EAGLE ULP-Programmierung rudimentär angeeignet, aber
> das schaffe ich leider nicht.

Die Sprache ist recht einfach wenn man das Prinzip versteht (und C 
Syntax schreiben kann)

Alles ist objektorientiert. Das bedeutet nichts weiter als das ein 
Objekt (z.B. Schaltplan, Board oder Lib) Eigenschaften und Mitglieder 
hat.

Die Eigenschaften nennen sich "data members" und die Mitglieder "loop 
members".

Loop members deshalb weil sie innerhalb des ulp programms alle einmal 
durchlaufen werden.

Diese loop members haben dann wieder Eigenschaften und auch loop members 
die dann auch durchlaufen werden.

Klingt kompliziert ist es aber nicht. Das ist nur eine Schleife in einer 
Schleife, mehr nicht. Die Schleife wird über eine C Funktion abgebildet. 
Deshalb sind da Funktionen in Funktionen in Funktionen (nennt man glaub 
ich rekursiv). Im inneren der Schleife tauchen dann alle members(z.B. 
Gatter Technologien Attribute etc.) einmal auf und du kannst Sie 
abfragen und ändern.

Das sieht dann in deinem Fall etwa so aus:
1
library(L) {    // die lib, muss natürlich vorher geladen werden
2
  L.devicesets(S) {   // Ein Bauteileset* z.B eines mit Gattern
3
    S.devices(D) {    // Das eigentliche Bauteil*. Das Attribut ist 
4
                      // ein loop member da es ja mehrere geben kann 
5
      D.attributes(A){  // hier sind jetzt die Atrribute*
6
       constant = 0;    // das Kommando um das Attribut variabel zu machen
7
      }
8
    }
9
  }

das ist jetzt nur das Prinzip aus m Kopf, Hoffe aber es ist klar was 
gemeint ist.

Die Hilfe (F1) ist übrigens ziemlich gut wenn man erstmal verstanden hat 
wie das ganze gemeint ist. Damit man die ULP Teile in der Hilfe 
identifizieren kann fangen Sie da alle mit ul_ an z.B. UL_LIBRARY eben 
für eine lib.

Hope this helps

* Das ist in Mehrzahl geschrieben weil halt alle loop_members 
durchlaufen werden. Da kann man dann auch mit if (Bedingung) selektieren 
oder drucken oder sonstwas mit machen.

von X4U (Gast)


Lesenswert?

1
       D.attributes(A){      // hier sind jetzt die Atrribute*
2
          A.constant = 0;    // das Kommando um das Attribut variabel zu 
3
       }

Sollte natürlich A.constant heißen da Eigenschaft (constant) des 
Objektes (Attribut)

von Balthasar (Gast)


Lesenswert?

Vielen Dank für eure Tipps.
C ist mir geläufig, jedoch der objektorientierte Ansatz ist mir fremd.

Die Hilfe benutze ich natürlich auch, die hat mir schon sehr geholfen.

Ich habe es jetzt aber geschafft - war mühsam, erst mal durchzublicken.

Auf jeden fall habe ich die Stelle gefunden, wo der Eintrag hin muss.

Danke noch mal

Hier noch einmal zusammengefasst, falls jemand das Gleiche Problem hat:

- Erst mal habe ich das Script um die Option constant bzw variable 
erweitert.
1
void readScript(void) {
2
  cntl = fileread(Lines, ScriptFile);
3
  for (int n = 0; n < cntl; n++) {
4
    if (strstr(Lines[n], "ATTRIBUTE") == 0) {
5
      string a[];
6
      int cnta = strsplit(a, Lines[n], ' ');
7
      Attribut[cntAtt] = a[1];
8
>>>    AttOption[cntAtt] = a[2];  <<<
9
      AttValue[cntAtt] = a[3];
10
      for (int an = 4; an < cnta; an++) { // complete parameter with space
11
        AttValue[cntAtt] += " "+a[an];
12
      }
13
      cntAtt++;
14
    }
15
  }
16
  return;
17
}

- Anschließend muss dieser Teil (Option constant bzw. variable) 
eingefügt werden, dass passiert hier:
1
if  (library) {
2
  library(L) {
3
[...]
4
    for (n = 0; n < cntAtt; n ++) {
5
            if (setAtt[n] || AttValue[n] == "DELETE") {
6
              sprintf(s, "ATTRIBUTE %s %s %s;\n", Attribut[n], >>>AttOption[n]<<<, AttValue[n]);
7
              cmd+=s;
8
              s="";
9
            }
10
          }
11
[...]
12
  }
13
}
Die eingefügte Stellen habe ich mit >>> und <<< markiert, die müssen im 
Code natürlich entfernt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.