Combinando enrutamiento manual y enrutamiento automático en Eagle; desgarro selectivo en un Eagle ULP

8

En Eagle, a menudo prefiero enrutar algunos cables (power, xtal, UBS, etc.) y dejar el resto en la ruta automática. Cuando no estoy satisfecho con el resultado, enruto un poco más y dejo que la ruta automática vuelva a intentarlo.

Mi problema es deshacer el trabajo de la ruta automática, sin deshacer mi propio trabajo. La forma básica de hacer esto es simplemente no guardar la versión autorrutada y luego volver a cargar la placa. Pero una vez que cometo el error de guardar la versión autorrutada (y purgar las copias de seguridad) todavía quiero poder volver a la versión preautorizada.

Un intento de hacer esto es identificar todos los cables enrutados automáticamente en un ULP y crear la cadena de comando para RIPUPAR estos segmentos. Puedo hacer arreglos para que el ULP identifique los cables enrutados automáticamente, por ejemplo, dándoles un ancho diferente. Pero el comando RIPUP parece rasgar el segmento de cable seleccionado Y LOS SEGMENTOS ADJACENTES. Hasta ahora no he encontrado un comando que rasgue solo el segmento de cable seleccionado.

Así que supongo que tengo dos preguntas: - ¿Cómo se combinan el enrutamiento manual y el enrutamiento automático de forma iterativa (prueba y error)? - ¿Hay alguna manera (probablemente usando ULP y comandos) para extraer un subconjunto de segmentos de cable?

(actualización) Intenté el enfoque opuesto: en un ULP, reúna todos los segmentos de cables que quiero conservar, realice una extracción completa y luego restaure los segmentos de cables (usando el comando ROUTE). Sin éxito, los segmentos deben estar en un orden específico para los comandos de ruta (no en el orden en que ULP los encuentra :(), primero se deben realizar las vías y algunos problemas más.

GRRRR, debe haber una manera fácil de hacer esto, ¿o soy demasiado optimista?

Wouter van Ooijen
fuente
Si el archivo de datos de Eagle sigue el mismo enfoque que los anteriores con los que he jugado (p. Ej., El antiguo Autotrax de DOS), cada segmento de pista tiene una línea en sí mismo. Si los anchos de las pistas son únicos, debería [tm] identificar fácilmente los segmentos de las pistas y eliminar las líneas correspondientes. La memoria tenue me dice que en una etapa escribí una rutina para identificar las etiquetas de los componentes y redimensionarlos, rotarlos y moverlos en relación con el cuerpo del componente. La identificación de pistas suena fácil en comparación. ¡Guarde una copia antes de ejecutar el programa! :-).
Russell McMahon
Esta es una pregunta excelente, ¿puedo sugerirle que también la publique al experto de Element14 en Eagle element14.com/community/message/5177 ? Si lo hace y encuentra algo, ¡vuelva a publicar aquí!
vicatcu
OK hecho. Si eso falla, puedo probar los foros de Eagle.
Wouter van Ooijen

Respuestas:

4

Odio responder mi propia pregunta, pero aquí voy. Espero no obtener puntos por responder, eso sería extraño, ¿solo por aceptar una respuesta? (Por cierto, no recibí ninguna respuesta en el foro Element14).

La solución es usar el comando DRAW, no ROUTE. DIBUJO colocará un segmento de cable, exactamente donde lo especifique (a diferencia de RUTA, que intenta conectarse a un cable aéreo no enrutado. RUTA es esencialmente inútil en un guión). El siguiente problema es la vía: no puedo (o no quiero) distinguir entre una vía manual y una vía autorutada, así que mantengo todas las vías que conectan dos (o más) segmentos de cable manual. Se eliminan otras vías.

Entonces, lo que hace mi guión final es:

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

Tenga en cuenta que probablemente no funcionará para más de dos capas, ni para otras cosas que no sean segmentos de alambre en la capa de cobre.

En mi humilde opinión, todo el concepto del águila ULP y los lenguajes de comando es problemático. Un ULP se ejecuta en un entorno de solo lectura, la única forma en que puede afectar el circuito, la placa o la biblioteca es creando una lista de comandos. Esto elimina algunas técnicas de programación útiles, pero lo peor es que los comandos no fueron diseñados para crearse fácilmente desde un ULP. Necesita todo tipo de transformaciones (en este caso: coordenadas, nombres de formas) para traducir del mundo ULP al mundo CMD.

(editar) Antes de ejecutar este ULP, configure la selección de 'curva de alambre' para permitir ángulos arbitrarios, de lo contrario, Eagle intentará adaptar los alambres resucitados a los ángulos permitidos, lo que puede provocar un desorden sangriento. En mi humilde opinión, este es otro ejemplo del problema con ULP / SCR.

Este es el código ULP:

// 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
fuente
Eagle ULP / SCR son una de sus características más potentes. Como ha encontrado, los ULP se utilizan para consultar el tablero y escribir secuencias de comandos que pueden ser absolutamente cualquier cosa que pueda hacer usted mismo. Ese es su poder. Habiendo dicho eso, desearía que estuviera en un lenguaje 'normal', tal vez Python o incluso Lua, pero incluso debes admitir que ser capaz de hacer algo que los autores del software no pensaron es una buena sensación.
akohlsmith
Claro, pero su poder debe ejercerse de una manera arcana: los ULP son poderosos, pero no pueden cambiar el esquema / bord, SCR es una variación paralizada de la GUI. Juntos pueden hacer un trabajo útil, ¡pero las cosas podrían haberse hecho mucho más fáciles! Y para mi problema particular, hubiera sido bueno si las cosas agregadas por el enrutador automático fueran identificables de alguna manera.
Wouter van Ooijen
2
En EAGLE v6.3, el comando es WIRE, no DRAW (no hay comando DRAW).
2

Wouter No vi tu pregunta antes porque estaba en Masters la semana pasada.

La forma en que trato esto es guardar una copia de la placa con un nombre diferente justo antes de ejecutar el enrutador automático. Siempre lo llamo SAVE.BRD, que se puede eliminar de forma segura una vez hecho todo.

Mi flujo de trabajo de enrutamiento parece ser muy similar al suyo. Enruto las partes críticas manualmente, me aseguro de que las clases de red estén configuradas razonablemente, luego ejecuto el enrutador automático. Luego busco problemas como cuando el enrutador automático no pudo encontrar una solución, terminó haciendo algo inconveniente, etc. Vuelvo a la versión guardada (antes del enrutamiento automático), hago algunos cambios manuales con suerte para que el enrutador automático no obtenga en problemas, luego intente nuevamente. Esto puede repetirse 5-10 veces, dependiendo de la complejidad del tablero. Los primeros pocos pases de ruta automática son principalmente para ver si hay una solución y aproximadamente para encontrar los puntos problemáticos. Para eso ni siquiera uso ningún pase de optimización. Las rutas automáticas posteriores tienen una optimización completa, que para mí suele ser de 8 pases con costos que cambian sobre esos pases para obtener las características que quiero.

Aunque guardo en SAVE.BRD antes de cada paso de ruta automática (y luego vuelvo a abrir el archivo original para continuar con eso), trato de no guardar el resultado en ruta automática hasta que estoy contento con todo. Guardar la instantánea en SAVE.BRD cada vez es una copia de seguridad en caso de que mis dedos accidentalmente salven antes de pensarlo.

Sería bueno si Eagle tuviera una opción de extracción para el último pase de ruta automática, pero no existe tal cosa.

Olin Lathrop
fuente
Su disciplina funcionará para una persona que siempre es disciplinada. Podrías adivinar que no lo soy. Una vez que autorouteé, hice algunos cambios en el circuito, luego eliminé el brd e intenté volver a la versión preautorizada. No es una buena idea ... Así que ahora tengo más o menos una forma de desautorizar, siempre que pueda distinguir las trazas autorrutadas por ancho. Sería bueno si las trazas autorutadas tuvieran algún atributo que las identificara como tales.
Wouter van Ooijen
Extraño, había escrito "Hola, Wouter" al comienzo de mi publicación, pero la parte de "Hola" parece haberse despojado.
Olin Lathrop
Creo que esa es una "característica" que tiene el intercambio de pila. Piensan que decir "Hola" al comienzo de una publicación no es necesario y debe eliminarse para mantener las cosas "limpias". Similar a ellos quitando @username en algunos casos ... y al igual que este caso donde no podía escribir @ Olin (sin espacio) y @ username en el mismo comentario.
Kellenjb
1

Si el archivo de datos de Eagle sigue el mismo enfoque que los anteriores con los que he jugado (p. Ej., El viejo Autotrax de DOS), entonces cada segmento de pista tiene una línea en sí mismo. Las líneas son "independientes" y pueden editarse o eliminarse sin afectar a nada más. Los sistemas "mejores" más nuevos pueden no tener una simplicidad tan poderosa.

Si las pistas son independientes, como se indicó anteriormente, y si los anchos de las pistas son únicos, [tm] debería ser fácil identificar los segmentos de las pistas y eliminar las líneas correspondientes.

La memoria tenue me dice que en una etapa escribí una rutina para identificar las etiquetas de los componentes y cambiarles el tamaño, rotarlos y moverlos en relación con el cuerpo del componente. La identificación de pistas suena fácil en comparación. ¡Guarde una copia antes de ejecutar el programa! :-).

Russell McMahon
fuente
¿De qué formato de archivo estás hablando? El archivo .brd eagle no es un archivo de texto. Mi problema con los segmentos de seguimiento no es que no pueda identificarlos, sino que el único comando que conozco que puedo usar hará demasiado: RIPUP rasga no solo el segmento sino también (algunos) segmentos adyacentes.
Wouter van Ooijen
@Wouter van Ouijen - YMMV :-). No ser texto per se no significa que no se pueda hackear, pero sí se puede. No sé cómo se ve el archivo Eagle .brd en el interior y no sé si puede arrancar segmentos de pista completos y concatenar el resto de forma segura, probablemente no. Vale la pena echarle un vistazo. Es posible que pueda escribir un lector de archivos y una reescritura que reconstruya de manera inteligente el archivo menos las partes no deseadas. Dependería de qué tan conocido o conocible sea el formato del archivo.
Russell McMahon
Me doy cuenta de que al momento de escribir la pregunta esto era cierto, pero los formatos de archivo de Eagle ahora son archivos de texto XML sencillos.
akohlsmith