Kombination von Handrouting und Auto-Routing in Eagle; selektives Aufreißen in einem Eagle ULP

8

In Eagle ziehe ich es oft vor, einige Kabel selbst zu verlegen (Strom, XTAL, UBS usw.) und den Rest dem Autorouter zu überlassen. Wenn ich mit dem Ergebnis nicht zufrieden bin, route ich selbst noch etwas und lasse den Autorouter einen weiteren Versuch machen.

Mein Problem besteht darin, die Arbeit des Autorouters rückgängig zu machen, ohne meine eigene Arbeit rückgängig zu machen. Der grundlegende Weg, dies zu tun, besteht einfach darin, die autorouterte Version nicht zu speichern und die Karte dann erneut zu laden. Aber wenn ich den Fehler gemacht habe, die autorisierte Version zu speichern (und die Backups zu löschen), möchte ich immer noch in der Lage sein, zur vorautorisierten Version zurückzukehren.

Ein Versuch, dies zu tun, besteht darin, alle autorouted Drähte in einem ULP zu identifizieren und die Befehlszeichenfolge zum RIPUP dieser Segmente zu erstellen. Ich kann veranlassen, dass das ULP die autorisierten Drähte identifiziert, indem ich ihnen beispielsweise eine andere Breite gebe. Der Befehl RIPUP scheint jedoch das ausgewählte Drahtsegment UND die angrenzenden Segmente zu zerreißen. Bisher habe ich keinen Befehl gefunden, der nur das ausgewählte Drahtsegment zerreißt.

Ich habe also zwei Fragen: - Wie kombinieren Sie Hand-Routing und Auto-Routing iterativ (Versuch und Irrtum)? - Gibt es eine Möglichkeit (wahrscheinlich unter Verwendung von ULP und Befehlen), eine Teilmenge von Drahtsegmenten zu zerreißen?

(Update) Ich habe den umgekehrten Ansatz versucht: Sammeln Sie in einem ULP alle Drahtsegmente, die ich behalten möchte, führen Sie eine vollständige Auffrischung durch und stellen Sie dann die Drahtsegmente wieder her (mit dem Befehl ROUTE). Kein Erfolg, die Segmente müssen in einer bestimmten Reihenfolge für die Routenbefehle sein (nicht in der Reihenfolge, in der der ULP sie findet :(), die Via müssen zuerst erstellt werden und einige weitere Probleme.

GRRRR, es muss einen einfachen Weg geben, oder bin ich zu optimistisch?

Wouter van Ooijen
quelle
Wenn die Datendatei von Eagle dem gleichen Ansatz folgt wie die älteren, mit denen ich gespielt habe (z. B. das alte DOS Autotrax), hat jedes Spursegment eine eigene Linie. Wenn die Spurbreiten eindeutig sind, sollte es [tm] einfach sein, Spursegmente zu identifizieren und die betreffenden Linien zu löschen. Dim Memory sagt mir, dass ich zu einem bestimmten Zeitpunkt eine Routine geschrieben habe, um Komponentenbeschriftungen zu identifizieren und ihre Größe zu ändern, zu drehen und relativ zum Komponentenkörper zu verschieben. Die Spuridentifikation klingt im Vergleich einfach. Speichern Sie eine Kopie, bevor Sie das Programm ausführen !!! :-).
Russell McMahon
Dies ist eine großartige Frage. Darf ich vorschlagen, dass Sie sie auch an den Element14-Experten unter Eagle element14.com/community/message/5177 senden . Wenn Sie dies tun und etwas finden, posten Sie es bitte hier zurück!
Vicatcu
OK, fertig. Wenn das fehlschlägt, kann ich die Adlerforen ausprobieren.
Wouter van Ooijen

Antworten:

4

Ich hasse es, meine eigene Frage zu beantworten, aber jetzt gehe ich. Ich hoffe, ich bekomme keine Punkte für die Beantwortung, das wäre komisch, nur für die Annahme einer Antwort? (Übrigens habe ich im Element14-Forum keine Antwort erhalten.)

Die Lösung besteht darin, den Befehl DRAW und nicht ROUTE zu verwenden. DRAW platziert ein Kabelsegment genau dort, wo Sie es angegeben haben (im Gegensatz zu ROUTE, bei dem versucht wird, eine Verbindung zu einem nicht gerouteten Airwire herzustellen. ROUTE ist in einem Skript im Wesentlichen nutzlos.). Das nächste Problem ist die Via: Ich kann (oder möchte) nicht zwischen einer manuellen Via und einer autorisierten Via unterscheiden, daher behalte ich alle Via, die zwei (oder mehr) manuelle Kabelsegmente verbinden. Andere Via werden gelöscht.

Was mein letztes Skript macht, ist:

prepare a ripup command
for all copper segments that are not 0.01 wide (the width I use for autorouting)
   check both endpoints for a via at that location
      prepare the via to be resurrected when it is visited the 2nd time
   prepare a command that resurrects the copper segment
execute the prepared commands

Beachten Sie, dass es wahrscheinlich nicht für mehr als zwei Schichten oder für andere Dinge als Drahtsegmente an der Kupferschicht funktioniert.

IMHO ist das gesamte Konzept der Adler-ULP und der Befehlssprachen problematisch. Ein ULP wird in einer schreibgeschützten Umgebung ausgeführt. Die einzige Möglichkeit, die Schaltung, Karte oder Bibliothek zu beeinflussen, besteht darin, eine Liste von Befehlen zu erstellen. Dies eliminiert einige nützliche Programmiertechniken, aber schlimmer ist, dass die Befehle nicht so konzipiert wurden, dass sie einfach aus einem ULP erstellt werden können. Sie benötigen alle Arten von Transformationen (in diesem Fall: Koordinaten, Formnamen), um von der ULP-Welt in die CMD-Welt zu übersetzen.

(Bearbeiten) Bevor Sie dieses ULP ausführen, stellen Sie die Auswahl "Drahtbiegung" so ein, dass beliebige Winkel zulässig sind. Andernfalls versucht Eagle, die auferstandenen Drähte an die zulässigen Winkel anzupassen, was zu einem blutigen Durcheinander führen kann. IMHO ist dies ein weiteres Beispiel für das Problem mit ULP / SCR.

Dies ist der ULP-Code:

// gather the commands that must be run on exit
string RunOnExit = "";
void cmd( string s ) { RunOnExit += s + "\n"; }

// return an x or y position in the form that can be used in a command
real f( int x ){
   board( B ) switch( B.grid.unit ) {
      case 0: return u2mic(x);
      case 1: return u2mm(x);
      case 2: return u2mil(x);
      case 3: return u2inch(x);
   }
}   

// return the string form of the a via's shape
string sn( int x ){
   if( x == VIA_SHAPE_SQUARE )  return "square";
   if( x == VIA_SHAPE_ROUND )   return "round";
   if( x == VIA_SHAPE_OCTAGON   ) return "octagon";
   if( x == VIA_SHAPE_ANNULUS   ) return "annulus";
   if( x == VIA_SHAPE_THERMAL   ) return "thermal";
   return "unknown-via-shape";
}

// count the number of times x occurs in s
int n_ocurrences( string s, string x ){
   int i, n = 0;
   while( 1 ){
      i = strstr( s, x );
      if( i == -1 ) return n;
      s = strsub( s, i + strlen( x ));
      n++;
   }
}

// add a via, but only when it is visited the second time
string via_list = "";
void add_via( int a, int b ){

   // for all via's
   board( B ) B.signals( S ) S.vias( V ){

      // if the via is at the current location
      if(( V.x == a ) && ( V.y == b )){
         string s, coo;

         // the coordinates of the via are used as its identification
         sprintf( coo, "(%.6f %.6f)", f( V.x ), f( V.y ));         

         // if this is the second visit to this via
         via_list += coo;
         if( n_ocurrences( via_list, coo ) == 2 ){

            // resurrect this via
            sprintf( s, "VIA '%s' %f %s %s;", 
            S.name, f( V.drill ), sn( V.shape[ 1 ] ), coo );
            cmd( s );      
         }
      }
   }         
}

if( !board ){
   dlgMessageBox("start this ULP in Board", "OK");
   exit( 0 );
}

board( B ){ 

   // first delete all coper segments, 
   // later we will resurrect what we want to keep 
   cmd( "RIPUP;" );

   // for all wire segments in the top and bottom copper layers
   B.signals(S) S.wires(W) {
      if( ( W.layer == 1 ) || ( W.layer == 16 ) ){ 

         // that are not 0.01 width (that is what the autorouter uses)
         if( f( W.width ) != 0.01 ){
            string s;

            // resurrect via's adjacent to this wire segment
            add_via( W.x1, W.y1 );
            add_via( W.x2, W.y2 );

            sprintf( s, "CHANGE LAYER %d;", W.layer );
            cmd( s );      

            // resurrect this wire segment                 
            sprintf( 
               s, "WIRE '%s' %f (%.6f %.6f) (%.6f %.6f);", 
               S.name, f( W.width),
               f(W.x1), f(W.y1), f(W.x2), f(W.y2));
            cmd( s );   
         }   
      }
   }
   // dlgMessageBox( RunOnExit, "OK");
   exit( RunOnExit );
}
Wouter van Ooijen
quelle
Das ULP / SCR von Eagle ist eine der leistungsstärksten Funktionen. Wie Sie festgestellt haben, werden ULPs verwendet, um das Board abzufragen und Skripte zu schreiben, die absolut alles sein können, was Sie selbst tun können. Das ist seine Kraft. Trotzdem wünschte ich mir, es wäre in einer "normalen" Sprache, vielleicht Python oder sogar Lua, aber selbst Sie müssen zugeben, dass es ein gutes Gefühl ist, etwas tun zu können, an das die Autoren der Software nicht gedacht haben.
Akohlsmith
Sicher, aber ihre Macht muss auf arkane Weise eingesetzt werden: ULPs sind mächtig, können aber den Schaltplan / die Grenze nicht ändern. SCR ist eine verkrüppelte Variante der GUI. Zusammen können sie nützliche Arbeit leisten, aber die Dinge hätten viel einfacher gemacht werden können! Und für mein spezielles Problem wäre es schön gewesen, wenn die vom Autorouter hinzugefügten Dinge irgendwie identifizierbar wären.
Wouter van Ooijen
2
In EAGLE v6.3 lautet der Befehl WIRE not DRAW (es gibt keinen DRAW-Befehl).
2

Wouter. Ich habe deine Frage nicht früher gesehen, weil ich letzte Woche beim Masters war.

Ich gehe damit um, indem ich eine Kopie der Karte unter einem anderen Namen speichere, bevor ich den Autorouter ausführe. Ich nenne es immer SAVE.BRD, das sicher gelöscht werden kann, wenn alles erledigt ist.

Mein Routing-Workflow scheint Ihrem sehr ähnlich zu sein. Ich leite die kritischen Teile manuell weiter, stelle sicher, dass die Netzklassen angemessen eingerichtet sind, und führe dann den Autorouter aus. Dann suche ich nach Problemen, bei denen der Autorouter keine Lösung finden konnte, etwas Unangenehmes tat usw. Ich gehe zurück zur gespeicherten Version (vor der Autoroute) und nehme hoffentlich einige manuelle Änderungen vor, damit der Autorouter keine bekommt in Schwierigkeiten, dann versuchen Sie es erneut. Dies kann je nach Komplexität der Platine 5-10 Mal wiederholt werden. Die ersten paar Autoroute-Durchgänge dienen hauptsächlich dazu, festzustellen, ob es eine Lösung gibt, und grob die Problemstellen zu finden. Dafür verwende ich nicht einmal Optimierungspässe. Die späteren Autorouten sind vollständig optimiert, was für mich normalerweise 8 Durchgänge sind, wobei sich die Kosten über diese Durchgänge ändern, um die gewünschten Eigenschaften zu erhalten.

Obwohl ich vor jedem Autoroute-Durchlauf in SAVE.BRD speichere (und dann die Originaldatei erneut öffne, um damit fortzufahren), versuche ich, das autorouted-Ergebnis erst dann zu speichern, wenn ich mit der ganzen Sache zufrieden bin. Das Speichern des Schnappschusses in SAVE.BRD ist jedes Mal eine Sicherheitssicherung für den Fall, dass meine Finger versehentlich speichern, bevor ich darüber nachdenke.

Es wäre schön, wenn Eagle eine Ripup-Option für den letzten Autoroute-Pass hätte, aber so etwas gibt es nicht.

Olin Lathrop
quelle
Ihre Disziplin wird für eine Person arbeiten, die immer diszipliniert ist. Sie könnten vermuten, dass ich nicht bin. Sobald ich das Autorouting durchgeführt habe, habe ich einige Änderungen an der Schaltung vorgenommen, dann das brd gelöscht und versucht, wieder auf die vorautorouted Version umzuschalten. Keine gute Idee ... Jetzt habe ich mehr oder weniger die Möglichkeit, die Autoroute aufzuheben, vorausgesetzt, ich kann die autorouted-Spuren nach Breite unterscheiden. Es wäre schön, wenn autorouted Traces ein Attribut hätten, das sie als solche identifiziert.
Wouter van Ooijen
Seltsamerweise hatte ich zu Beginn meines Beitrags "Hi, Wouter" geschrieben, aber der Teil "Hi" scheint abgestreift worden zu sein.
Olin Lathrop
Ich glaube, das ist eine "Funktion", die der Stapelaustausch hat. Sie denken, dass "Hallo" am Anfang eines Beitrags nicht benötigt wird und entfernt werden sollte, um die Dinge "sauber" zu halten. Ähnlich wie sie in einigen Fällen @username entfernen ... und genau wie in diesem Fall, in dem ich @ Olin (ohne Leerzeichen) und @ username nicht im selben Kommentar eingeben konnte.
Kellenjb
1

Wenn die Datendatei von Eagle dem gleichen Ansatz folgt wie die älteren, mit denen ich gespielt habe (z. B. das alte DOS Autotrax), hat jedes Spursegment eine eigene Linie. Zeilen sind "eigenständig" und können bearbeitet oder gelöscht werden, ohne dass dies Auswirkungen hat. Neuere "bessere" Systeme sind möglicherweise nicht so einfach.

Wenn die Spuren wie oben unabhängig sind und die Spurbreiten eindeutig sind, sollte es [tm] einfach sein, Spursegmente zu identifizieren und die betreffenden Linien zu löschen.

Dim Memory sagt mir, dass ich zu einem bestimmten Zeitpunkt eine Routine geschrieben habe, um Komponentenbeschriftungen zu identifizieren und ihre Größe zu ändern, zu drehen und relativ zum Komponentenkörper zu verschieben. Die Spuridentifikation klingt im Vergleich einfach. Speichern Sie eine Kopie, bevor Sie das Programm ausführen !!! :-).

Russell McMahon
quelle
Über welches Dateiformat sprechen Sie? Die Eagle-BRD-Datei ist keine Textdatei. Mein Problem mit den Spursegmenten ist nicht, dass ich sie nicht identifizieren kann, sondern dass der einzige mir bekannte Befehl, den ich verwenden kann, zu viel bewirkt: RIPUP zerreißt nicht nur das Segment, sondern (einige) benachbarte Segmente.
Wouter van Ooijen
@Wouter van Ouijen - YMMV :-). Nicht Text an sich zu sein bedeutet nicht, dass er nicht gehackt werden kann - aber es kann sein. Ich weiß nicht, wie die Eagle .brd-Datei im Inneren aussieht, und ich weiß nicht, ob Sie ganze Spursegmente herausreißen und den Rest sicher verketten können - wahrscheinlich nicht. Einen Blick wert. Möglicherweise können Sie einen Dateireader und -umschreiber schreiben, der die Datei auf intelligente Weise neu erstellt, abzüglich der unerwünschten Teile. Dies hängt davon ab, wie bekannt oder bekannt das Dateiformat ist.
Russell McMahon
Mir ist klar, dass dies zum Zeitpunkt des Schreibens der Frage wahr war, aber die Dateiformate von Eagle sind jetzt einfache XML-Textdateien.
Akohlsmith