Y bueno amigos reviviendo viejos temas...
Quisiera pedir su ayuda para poder implementar aquello que han comentado pero via un boton. Es decir, mediante un Script.
Tras varias horas de estar leyendo y re-leyendo las sintaxis y los ejemplos del Scripting en Protel, me llego la iluminacion a mi cabeza -bueno no aquella que resolveria el problema- me dije: "que no mas cabezas piensan mejor que una?" Y por ello empece a escribir este tema, bueno revivirlo.
Vamos a poner en la mesa las ideas o por lo menos mi idea:
1.- Lo que se requiere principalmente es hacer un script que al estar la PCB -a 2 layers- ya ruteada identifique los pads que hacen funcion de vias, dicho de otro modo, que encuentre aquellos pads que poseen tracks tanto en la bottom layer como en la top layer.
2.- Una vez que identifico esos pads romper el ruteo del track -en un principio y pensando mas en los componentes TH, seria el de la top layer- Poner una via sobre el track onTop a unos milimetros del pad y rutear esa via onBotom hacia el pad.
Ahora bien habra que identificar los procesos y los objetos que podemos usar. Para ello podemos basarnos en algunos ejemplos del DXP o Altium como quieran llamarle. El primero en el que me estaba basando es el de COUNTPAD.PAS y es el siguiente:
Procedure Display(Const AString : AnsiString);
Begin
DisplayFormDialog.Label1.Caption := AString;
DisplayFormDialog.ShowModal;
End;
Procedure PadCount;
Var
BoardHandle : IPCB_Board;
Pad : IPCB_Primitive;
Iterator : IPCB_BoardIterator;
PadNumber : Integer;
Begin
PadNumber := 0;
// retrieve the current board
Board := PCBServer.GetCurrentPCBBoard;
// retrieve the iterator
Iterator := Board.BoardIterator_Create;
Iterator.AddFilter_ObjectSet(MkSet(ePadObject));
Iterator.AddFilter_LayerSet(AllLayers);
Iterator.AddFilter_Method(eProcessAll);
// search and count pads
Pad := Iterator.FirstPCBObject;
While (Pad <> Nil) Do
Begin
Inc(PadNumber);
Pad := Iterator.NextPCBObject;
End;
Board.BoardIterator_Destroy(Iterator);
// Display the count result on a dialog.
Display('Pad Count = ' + IntToStr(PadNumber));
End;
Se que esta demas que lo comente pues es muy claro lo que se hace pero nos podria ayudar. Lo que nos interesa realmente es esta parte del codigo
// retrieve the iterator
Iterator := Board.BoardIterator_Create;
Iterator.AddFilter_ObjectSet(MkSet(ePadObject));
Iterator.AddFilter_LayerSet(AllLayers);
Iterator.AddFilter_Method(eProcessAll);
// search and count pads
Pad := Iterator.FirstPCBObject;
While (Pad <> Nil) Do
Begin
Inc(PadNumber);
Pad := Iterator.NextPCBObject;
End;
Donde se crean los filtros de busqueda y los iteradores de nuestra placa. El ITERATOR es una variable que apunta -si se le puede llamar asi- a una interfaz de nuestro sistema en este caso es a IPCB_BoardIterator, Lo mismo pasa con la varibale Pad la cual "apunta" a otra interfaz de sistema ahora a IPC_Primitive.
Segun lei en la ayuda los iteradores nos ayudan a accesar a todos los componentes de nuestra PCB sin generar arreglos o bases de datos, segun esto existen 4 tipos: "espaciales", "de placa", "de grupo" y "de librerias".
"de placa": son usados para hacer busquedas globales en la placa
"espaciales": son usados para hacer busquedas dentro de limites especificos.
"de grupo": son usados para hacer busquedas dentro de un grupo de objetos como componentes
"de libreria": son usados para buscardentro de un documento de PCB library.
En este ejemplo usamos un iterador de Placa, ya que es definido aqui:
Iterator:=board.BoardIterator_Create;Despues a ese Iterador le añade los filtros que son estos 3
Iterator.AddFilter_ObjectSet(MkSet(ePadObject));
Iterator.AddFilter_LayerSet(AllLayers);
Iterator.AddFilter_Method(eProcessAll);
Donde el primero y mas importante es que el objeto a buscar es el PAD definido por
ePadObject, despues le dice que en todas las layers y cualquier proceso.
Ahora bien lo que no hayo aun es como añadir un filtro referente a la conexion. Tenemos una interfaz de sistema que se llama IPCB_Connection la cual nos permitiria buscar conexiones en top y bottom layer sobre un mismo pad. Antes de eso tendriamos que asignar alguna variable como lo hacen arriba algo como
conn : IPCB_Connection; y podriamos meter un IF que dependiendo si esa conexion se cumple haga la siguiente busqueda.
El problema es que no me hayo de como sacar los filtros ya que la ayuda es muy escueta y los ejemplos ni se digan.
Esta misera idea solo resolveria el primer punto de esta idea, despues podriamos usar los ejemplos de PLACEVIA para poner lo que queremos pero por ahora llevo medio dia y no he podido dar con la solucion, espero alguien se anime y podamos avanzar juntos en este tema.
Saludos