Hallo zusammen, ihr kennt bestimmt das Problem. Ihr habt mehrere kleine Platinen erstellt. Das Mindestmaß (Platinengröße) ist aber nicht erreicht, um die Platinen bei einem Leiterplatten-hersteller machen zu lassen. Also muss man die kleinen Platinen mit Panelize.ulp vorbehandeln und in ein neues Board eingefügt werden, was dann schlussendlich zum Leiterplattenhersteller geht. So weit auch gut. Doch wenn nun die Einzel-Platinen auf der größeren gedreht werden sollen, werden die Texte falsch mitgedreht. Wenn man die Platinen vom Hersteller erhält wundert man sich, warum manche Texte auf dem Kopf stehen usw. Grund hierfür ist das Flag SPIN. Nur Texte und auch Bauteil-Namen und Werte, die gesmashed sind, werden richtig mitgedreht, wenn das SPIN-Flag sesetzt ist. Nun meine Frage. Hat jemand eine gute Idee, wie man auf einer Board-Datei alle Texte mit dem Flag SPIN versehen kann? Gibt es da vielleicht ein ULP uder ein Script? Bei den Bauteilen in der Bibliothek ist dieses Flag standard mäßig nicht gesetzt. Und ich will auch nicht die ganzen Bibliotheken ändern. Kann mir hier jemand einen guten Tip geben? Gruß Mitch.
Ein gut gemeinter Rat, vergiss Panelize.ulp Teilweise werden dort Namen umgeändert usw. . Ein besseres Tool, gerbmerge.
Danke für die Antwort. Aber gerbmerge sagt mir nicht viel. Handelt es sich hierbei um eine UPL oder ein eigenständiges Programm? Und wo kann man das beziehen? Mitch.
Gerbmerge scheidet aus. Da ich keine Gerberfiles zum Platinenhersteller sende. Ich brauche etwas, um die Board-Datei zu gestalten. am besten ein ulp oder script. Mitch.
dann ändere doch mal if (Tspin) spin = "S"; else spin = ""; zu if (Tspin) spin = "S"; else spin = "S"; sollte das das Problem sein, ansonsten Poste ein Beispiel, daß man dir durch ändern des ULP helfen kann.
Die Idee ist grundsätzlich schon mal nicht schlecht. Leider werde dann Texte, die zuvor schon gesmahed waren wieder falsch mitgedreht. Wenn man das Script so umbauen kann, dass die Spinflags nicht in den neu angelegten Layern von panelize gesetzt werden, sondern in der Original-Layer tValue, tNames und auch auf der Unterseite, dann wäre das super. Kann jemand einen solchen Script schreiben? Mitch.
Da ich das skript nich benutze, poste bitte Beispieldaten, mit kurzer Beschreibung.
Das UPL-Script ist auf der Seite von Cadsoft offiziel zum Download angeboten. Name: panelize.exe Aber ich kann es hier mal posten: #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 // 28.06.2006 accept Sigle-Quote on end of name of element 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; string check_single_quote(string s) { // 2006.06.28 int l = strlen(s); if (s[l-1] == '\'') s+="'"; return s; } 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", check_single_quote(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); }
Eine Board-Datei zu posten macht wenig Sinn. Einfach Schaltplan neu und 4 Widerstände drauf. (R1 bis R4) Denen einen Wert geben (Value). Jetzt zum Board wechseln. Die 4 Widerstände auf der Platine positionieren von links nach rechts R1 bis R4. Wenn man nun R1 rotiert, wird Name und Value immer von unten oder von rechts lesbar sein. Jetzt Rechtsklick auf R2 und Eigenschaften auswählen. Spinflag setzen und Fenster Schließen. Jetzt mal R2 rotieren. Bei R2 wird Name und Wert mitgedreht. Genau so brauche ich das Spin-Flag für alle Bauteile auf dem Board. Ein Script ähnlich dem panelize-Script soll alle Bauteile auf dem Board finden und dieses Spin-Flag setzen. Dafür gibt es 2 Gründe. 1. Wird das Spin-Flag bereits in der Original-Platine gesetzt, werden Teilweise Texte schon verdreht. Das ist auch gut so. Denn dann werden die im Original korrigiert und bleiben dann so. Auch beim Einfügen in die Zielplatine mit mehreren Einzelplatinen. 2. Wird das Spin-Flag innerhalb der panelize.ulp gesetzt, so werden diese Texte ebenfalls (zumindest) Teilweise verdreht zum Original dargestellt. Das hat zur Folge, dass ich 2x Bord-Dateien korrigieren muss. Das will ich eigentlich vermeiden. Nochmal zurück zu den Widerständen. Flags setzen Smash SPIN R1: nein nein R2: ja nein R3: nein ja R4: ja ja Jetzt panelize drüber laufen lassen. Jetzt sieht man an den letzteren Widerständen, dass Texte nicht stimmen. Probierts mal aus.
So ich habe jetzt hier mal Eagle-Files gepostet. Bei der Datei 'Test_Panelize.*' handelt es sich um die Datei wie oben beschrieben mit den 4 Widerständen R1 bis R4 mit der zugehörigen Board-Datei. Die Flags Smash und Spin wurden wie oben beschrieben in der Board-Datei gesetzt (nicht im Schaltplan). Dann wurde das original Panelize drüber laufen lassen. Das Board wurde per Group und Cut in die Zwischenablage kopiert und in der Datei 'Test_NewBoard.brd' mit Paste eingefügt. Es wurde das Board einmal 1:1 (Original) eingesetzt und ein 2. mal daneben (Kopie). Dann nochmal eingefügt nach Rotation um links und ein letztes mal eingefügt mit weiteren 90° Rotation (also 180° gedreht) eingefügt. Jetzt kann man R1 bis R4 bei den Drehungen beobachten Bei dem Board das um 90° gedreht wurde, sollten alle Values und Names von oben lesbar sein. Tun sie das?
Dachte an eine Board Datei, die letze Antwort geht gut, gehe jetzt Essen, in ca 2 Stunden kann ich dir dann Antworten.
Hier ein weiteres Beispiel, wie es richtig aussehen sollte. Für die bessere Darstellung wurden die Widerstände anders angeordnet. Auch hier wurde die Platine (Quelle Test_panelize2.brd) ind die Zielplatine Test_NewBoard2.brd eingesetzt mit Rotation 0°, 90°, 180° und 270°. Schön zu sehen, dass Bauteilnamen richtig mitdrehen. Hier sind bei allen Bauteilen die Smash und Spin-Flags gesetzt worden. In Test_panelize2.brd wurden die Namen und Werte nur einmal ausgerichtet, bevor panelize.ulp gestartet wurde. Dann einfach einkopiert in Zielplatine.
Sorry, ist was dazwischengekommen, Ev. normalize-text.ulp, macht ein smash von allen Texten. Leider weiß ich nicht, wie man diese SPIN Flag über ULP oder SCRipt setzt. Frag beim Hersteller von Eagle nach, mittels Email. Wenn du das weißt, dann ist das Problem gleich behoben.
Im Handbuch steht, dass das Spinflag zusammen mit Text gesetzt werden kann. Auch Rotate und Move läßt sich dazu verwenden. So ein Beispiel aus dem Handbuch: ROTATE =MR90 IC1 Durch Zusatz von 'S' (vor dem MR90) läßt sich das SpinFlag gleich mit setzen. Also: ROTATE =SMR90 IC1 In dem Fall wird der Rotate-Befehl ausgeführt. S=Spin-Bit setzen, M weis ich nicht und R90 vermutlich Rechts 90°. Bauteil ist IC1 So funktioniert das per Script. Per ulp weis ich es auch nicht. in einem ULP müßte zuerst der aktuelle Winkel des Bauteils ermittelt werden. Um dann Anschließend auf diesen Winkel zu rotieren (also nicht ändern) und zusätzlich das Spin-Flag setzen. Und wie das Spin-Flag gesetzt wird beim penelize ULP müßte in diesem Abschnitt stehen: 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", check_single_quote(Ename), spin, mirr, Tangle, u2mil(Tx), u2mil(Ty)); cmd += h; return; } Das ist ein Auszug aus panelize. Mitch.
Hallo, hier ist nun ein ULP, welches ein smash sowie das flag spin setzt. Sollte das sein, was du haben wolltest, und das über das Orginal drüberlassen. /// hier das ULP, Einleitung fehlt // Author: Christoph Schrott string cmd = "SET UNDO_LOG OFF;\n GRID mil 1;\n"; // Script command to execute /* ------------- UTILITY FUNCTIONS --------------- */ /* ------------- MAIN ROUTINE --------------- */ if (board) { board(B) { B.elements(E) { // smashed texts E.texts(T) { if (T.value == E.name) { if (!T.spin) sprintf(cmd,"%sROTATE SR0 '%s';\n",cmd,E.name); } } E.package.texts(T) { // unsmashed texts if (T.value == E.name) { sprintf(cmd,"%sSMASH '%s';\n",cmd,E.name); if (!T.spin) sprintf(cmd,"%sROTATE SR0 '%s';\n",cmd,E.name); } } } B.texts(T) { if (!T.spin) sprintf(cmd,"%sROTATE SR0 (%f %f);\n",cmd,u2mil(T.x),u2mil(T.y)); } } cmd += "GRID LAST;\nSET UNDO_LOG ON;\n"; exit(cmd); } else { dlgMessageBox(":You must run this ULP in board !"); exit(1); }
Perfect! Vielen, vielen Dank. Das habe ich schon lange gebraucht. Funktioniert so wie ich es haben wollte. Wenn ich dir auch mal einen Stein in den Garten schmeißen kann, lass es mich wissen. Gruß Mitch.
Hier nochmals eingeloggt, ev, wenn du/jemand kleine Änderungen brauchst. Chris
Micha R. schrieb: > Hallo zusammen, > > ihr kennt bestimmt das Problem. Ihr habt mehrere kleine Platinen > erstellt. Das Mindestmaß (Platinengröße) ist aber nicht erreicht, um die > Platinen bei einem Leiterplatten-hersteller machen zu lassen. Hmmm, ich hatte einen bei Frankfurt gefunden, der sogar 20x20mm kleine macht. Auf den Platinen sind nur ein TSSOP, und 4 TQFN Teile sowie ein paar Wiederstände, 3 Kondensatoren und eine Induction... Außerdem macht er auch die Bestückung. Jetzt wo ich in Produktion gehen wollte finde ich die Adresse nicht mehr... :-/ Grüße Michelle
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.