306 lines
8.8 KiB
C++
306 lines
8.8 KiB
C++
/******************************************************/
|
||
/* Fonctions diverses (swap..) relatives au pistes */
|
||
/* et fonctions de test */
|
||
/******************************************************/
|
||
|
||
/* Fichier PCBPISTE.CPP */
|
||
|
||
#include "fctsys.h"
|
||
#include "gr_basic.h"
|
||
#include "common.h"
|
||
#include "pcbnew.h"
|
||
#include "autorout.h"
|
||
|
||
#include "protos.h"
|
||
|
||
/* Variables locales */
|
||
static int New_Layer[32];
|
||
|
||
enum swap_layer_id {
|
||
ID_SWAP_LAYER_EXECUTE = 1800,
|
||
ID_SWAP_LAYER_CANCEL,
|
||
ID_SWAP_LAYER_BUTTON_SELECT,
|
||
ID_SWAP_LAYER_DESELECT,
|
||
ID_SWAP_LAYER_SELECT
|
||
};
|
||
|
||
|
||
/***********************************************/
|
||
/* classe pour la frame de selection de layers */
|
||
/***********************************************/
|
||
|
||
class WinEDA_SwapLayerFrame : public wxDialog
|
||
{
|
||
private:
|
||
WinEDA_BasePcbFrame* m_Parent;
|
||
wxRadioBox* m_LayerList;
|
||
|
||
public:
|
||
|
||
// Constructor and destructor
|
||
WinEDA_SwapLayerFrame( WinEDA_BasePcbFrame * parent );
|
||
~WinEDA_SwapLayerFrame() { };
|
||
|
||
private:
|
||
void Sel_Layer( wxCommandEvent& event );
|
||
void Cancel( wxCommandEvent& event );
|
||
void Execute( wxCommandEvent& event );
|
||
|
||
DECLARE_EVENT_TABLE()
|
||
};
|
||
/* Table des evenements pour WinEDA_SwapLayerFrame */
|
||
BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog )
|
||
EVT_BUTTON( ID_SWAP_LAYER_EXECUTE, WinEDA_SwapLayerFrame::Execute )
|
||
EVT_BUTTON( ID_SWAP_LAYER_CANCEL, WinEDA_SwapLayerFrame::Cancel )
|
||
EVT_BUTTON( ID_SWAP_LAYER_DESELECT, WinEDA_SwapLayerFrame::Sel_Layer )
|
||
EVT_BUTTON( ID_SWAP_LAYER_BUTTON_SELECT, WinEDA_SwapLayerFrame::Sel_Layer )
|
||
EVT_RADIOBOX( ID_SWAP_LAYER_SELECT, WinEDA_SwapLayerFrame::Sel_Layer )
|
||
END_EVENT_TABLE()
|
||
|
||
|
||
WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( WinEDA_BasePcbFrame* parent ) :
|
||
wxDialog( parent, -1, _( "Swap Layers:" ), wxPoint( -1, -1 ),
|
||
wxSize( 470, 450 ), DIALOG_STYLE )
|
||
{
|
||
#define START_Y 15
|
||
wxButton* Button;
|
||
int ii;
|
||
wxPoint pos;
|
||
wxString g_Layer_Name_Pair[32];
|
||
wxSize winsize;
|
||
|
||
m_Parent = parent;
|
||
SetFont( *g_DialogFont );
|
||
|
||
for( ii = 0; ii < NB_LAYERS; ii++ )
|
||
{
|
||
g_Layer_Name_Pair[ii] = ReturnPcbLayerName( ii ) + wxT( " -> " ) + _( "No Change" );
|
||
}
|
||
|
||
pos.x = 5; pos.y = START_Y;
|
||
m_LayerList = new wxRadioBox( this, ID_SWAP_LAYER_SELECT, _( "Layers" ),
|
||
pos, wxSize( -1,
|
||
-1 ), 29, g_Layer_Name_Pair, 16, wxRA_SPECIFY_ROWS );
|
||
|
||
winsize.y = m_LayerList->GetRect().GetBottom();
|
||
|
||
pos.x = m_LayerList->GetRect().GetRight() + 12;
|
||
Button = new wxButton( this, ID_SWAP_LAYER_CANCEL,
|
||
_( "Cancel" ), pos );
|
||
|
||
Button->SetForegroundColour( *wxRED );
|
||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||
|
||
pos.y += Button->GetSize().y + 5;
|
||
Button = new wxButton( this, ID_SWAP_LAYER_EXECUTE,
|
||
_( "OK" ), pos );
|
||
|
||
Button->SetForegroundColour( *wxBLUE );
|
||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||
|
||
pos.y += Button->GetSize().y + 15;
|
||
Button = new wxButton( this, ID_SWAP_LAYER_DESELECT,
|
||
_( "Deselect" ), pos );
|
||
|
||
Button->SetForegroundColour( wxColour( 0, 100, 0 ) );
|
||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||
|
||
pos.y += Button->GetSize().y + 5;
|
||
Button = new wxButton( this, ID_SWAP_LAYER_BUTTON_SELECT,
|
||
_( "Select" ), pos );
|
||
|
||
Button->SetForegroundColour( wxColour( 0, 100, 100 ) );
|
||
winsize.x = MAX( winsize.x, Button->GetRect().GetRight() );
|
||
|
||
winsize.x += 10; winsize.y += 10;
|
||
SetClientSize( winsize );
|
||
}
|
||
|
||
|
||
/***************************************************************/
|
||
void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event )
|
||
/***************************************************************/
|
||
{
|
||
int ii, jj;
|
||
|
||
ii = m_LayerList->GetSelection();
|
||
|
||
switch( event.GetId() )
|
||
{
|
||
case ID_SWAP_LAYER_DESELECT:
|
||
if( New_Layer[ii] != -1 )
|
||
{
|
||
New_Layer[ii] = -1;
|
||
m_LayerList->SetString( ii, ReturnPcbLayerName( ii ) +
|
||
+ wxT( " -> " ) + _( "No Change" ) );
|
||
}
|
||
break;
|
||
|
||
case ID_SWAP_LAYER_BUTTON_SELECT:
|
||
case ID_SWAP_LAYER_SELECT:
|
||
jj = m_Parent->SelectLayer( ii, -1, -1 );
|
||
if( (jj < 0) || (jj >= 29) )
|
||
return;
|
||
|
||
if( ii != jj )
|
||
{
|
||
New_Layer[ii] = jj;
|
||
m_LayerList->SetString( ii,
|
||
ReturnPcbLayerName( ii ) + wxT( " -> " ) +
|
||
ReturnPcbLayerName( jj ) );
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
/*********************************************************/
|
||
void WinEDA_SwapLayerFrame::Cancel( wxCommandEvent& event )
|
||
/*********************************************************/
|
||
{
|
||
EndModal( -1 );
|
||
}
|
||
|
||
|
||
/*********************************************************/
|
||
void WinEDA_SwapLayerFrame::Execute( wxCommandEvent& event )
|
||
/*********************************************************/
|
||
{
|
||
EndModal( 1 );
|
||
}
|
||
|
||
|
||
/********************************************************/
|
||
void WinEDA_PcbFrame::Swap_Layers( wxCommandEvent& event )
|
||
/********************************************************/
|
||
/* Swap layers */
|
||
{
|
||
int ii, jj;
|
||
TRACK* pt_segm;
|
||
DRAWSEGMENT* pt_drawsegm;
|
||
EDA_BaseStruct* PtStruct;
|
||
|
||
|
||
/* Init default values */
|
||
for( ii = 0; ii < 32; ii++ )
|
||
New_Layer[ii] = -1;
|
||
|
||
WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this );
|
||
|
||
ii = frame->ShowModal(); frame->Destroy();
|
||
|
||
if( ii != 1 )
|
||
return;
|
||
|
||
/* Modifications des pistes */
|
||
pt_segm = (TRACK*) m_Pcb->m_Track;
|
||
for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext )
|
||
{
|
||
m_CurrentScreen->SetModify();
|
||
if( pt_segm->Type() == TYPEVIA )
|
||
{
|
||
SEGVIA* Via = (SEGVIA*) pt_segm;
|
||
if( Via->Shape() == VIA_NORMALE )
|
||
continue;
|
||
int top_layer, bottom_layer;
|
||
Via->ReturnLayerPair( &top_layer, &bottom_layer );
|
||
if( New_Layer[bottom_layer] >= 0 )
|
||
bottom_layer = New_Layer[bottom_layer];
|
||
if( New_Layer[top_layer] >= 0 )
|
||
top_layer = New_Layer[top_layer];
|
||
Via->SetLayerPair( top_layer, bottom_layer );
|
||
}
|
||
else
|
||
{
|
||
jj = pt_segm->m_Layer;
|
||
if( New_Layer[jj] >= 0 )
|
||
pt_segm->m_Layer = New_Layer[jj];
|
||
}
|
||
}
|
||
|
||
/* Modifications des zones */
|
||
pt_segm = (TRACK*) m_Pcb->m_Zone;
|
||
for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext )
|
||
{
|
||
m_CurrentScreen->SetModify();
|
||
jj = pt_segm->m_Layer;
|
||
if( New_Layer[jj] >= 0 )
|
||
pt_segm->m_Layer = New_Layer[jj];
|
||
}
|
||
|
||
/* Modifications des autres segments */
|
||
PtStruct = m_Pcb->m_Drawings;
|
||
for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext )
|
||
{
|
||
if( PtStruct->Type() == TYPEDRAWSEGMENT )
|
||
{
|
||
m_CurrentScreen->SetModify();
|
||
pt_drawsegm = (DRAWSEGMENT*) PtStruct;
|
||
jj = pt_drawsegm->m_Layer;
|
||
if( New_Layer[jj] >= 0 )
|
||
pt_drawsegm->m_Layer = New_Layer[jj];
|
||
}
|
||
}
|
||
|
||
DrawPanel->Refresh( TRUE );
|
||
}
|
||
|
||
|
||
/*********************************************************/
|
||
void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event )
|
||
/*********************************************************/
|
||
{
|
||
EQUIPOT* Equipot;
|
||
wxString msg;
|
||
WinEDA_TextFrame* List;
|
||
int ii, jj;
|
||
|
||
msg = wxT( "*" );
|
||
Get_Message( _( "Filter for net names:" ), msg, this );
|
||
if( msg.IsEmpty() )
|
||
return;
|
||
|
||
List = new WinEDA_TextFrame( this, _( "List Nets" ) );
|
||
|
||
Equipot = (EQUIPOT*) m_Pcb->m_Equipots;
|
||
for( ; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Pnext )
|
||
{
|
||
wxString Line;
|
||
/* calcul adr relative du nom de la pastille reference de la piste */
|
||
if( !WildCompareString( msg, Equipot->m_Netname, FALSE ) )
|
||
continue;
|
||
|
||
Line.Printf( wxT( "net_code = %3.3d [%.16s] " ), Equipot->m_NetCode,
|
||
Equipot->m_Netname.GetData() );
|
||
List->Append( Line );
|
||
}
|
||
|
||
ii = List->ShowModal(); List->Destroy();
|
||
if( ii < 0 )
|
||
return;
|
||
|
||
/* Recherche du numero de net rellement selectionn<6E> */
|
||
Equipot = (EQUIPOT*) m_Pcb->m_Equipots;
|
||
for( jj = 0; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Pnext )
|
||
{
|
||
/* calcul adr relative du nom de la pastille reference de la piste */
|
||
if( !WildCompareString( msg, Equipot->m_Netname, FALSE ) )
|
||
continue;
|
||
if( ii == jj )
|
||
{
|
||
ii = Equipot->m_NetCode;
|
||
break;
|
||
}
|
||
jj++;
|
||
}
|
||
|
||
wxClientDC dc( DrawPanel );
|
||
|
||
DrawPanel->PrepareGraphicContext( &dc );
|
||
|
||
if( g_HightLigt_Status )
|
||
Hight_Light( &dc );
|
||
g_HightLigth_NetCode = ii;
|
||
Hight_Light( &dc );
|
||
}
|