/******************************************************/ /* 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é */ 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 ); }