diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e129717c9a..0d1c407bd6 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -5,6 +5,14 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2009-Feb-25 UPDATE Dick Hollenbeck +================================================================================ +++pcbnew + Markers were now shown when on top of a high-lighted pad. Moved highlight + drawing function into class BOARD and out of Frame. Call BOARD::DrawHighLight() from + within BOARD::Draw() to fix. + + 2009-Feb-24 UPDATE Dick Hollenbeck ================================================================================ ++pcbnew diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 89b387574f..490d1cbc0b 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -495,7 +495,6 @@ public: // Hightlight functions: int Select_High_Light( wxDC* DC ); void Hight_Light( wxDC* DC ); - void DrawHightLight( wxDC* DC, int NetCode ); // Track and via edition: void DisplayTrackSettings(); diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index 9197cdfd5d..81b14633c6 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -263,6 +263,15 @@ public: void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int aDrawMode, const wxPoint& offset = ZeroOffset ); + /** + * Function DrawHighLight + * redraws the objects in the board that are associated with the given aNetCode + * and turns on or off the brilliance associated with that net according to the + * current value of global g_HightLigt_Status + * @param aDrawPanel is needed for the clipping support. + * @param aNetCode is the net number to highlight or to dim. + */ + void DrawHighLight( WinEDA_DrawPanel* aDrawPanel, wxDC* DC, int aNetCode ); /** * Function Visit diff --git a/pcbnew/move_or_drag_track.cpp b/pcbnew/move_or_drag_track.cpp index eed7cea3f3..aa4d326b28 100644 --- a/pcbnew/move_or_drag_track.cpp +++ b/pcbnew/move_or_drag_track.cpp @@ -60,8 +60,7 @@ static void Abort_MoveTrack( WinEDA_DrawPanel* Panel, wxDC* DC ) Panel->GetScreen()->m_Curseur = oldpos; g_HightLigt_Status = FALSE; - - ( (WinEDA_PcbFrame*) Panel->m_Parent )->DrawHightLight( DC, g_HightLigth_NetCode ); + ( (WinEDA_PcbFrame*) Panel->m_Parent )->GetBoard()->DrawHighLight( Panel, DC, g_HightLigth_NetCode ); if( NewTrack ) { @@ -119,7 +118,7 @@ static void Abort_MoveTrack( WinEDA_DrawPanel* Panel, wxDC* DC ) g_HightLigth_NetCode = Old_HightLigth_NetCode; g_HightLigt_Status = Old_HightLigt_Status; if( g_HightLigt_Status ) - ( (WinEDA_PcbFrame*) Panel->m_Parent )->DrawHightLight( DC, g_HightLigth_NetCode ); + ( (WinEDA_PcbFrame*) Panel->m_Parent )->GetBoard()->DrawHighLight( Panel, DC, g_HightLigth_NetCode ); EraseDragListe(); } @@ -688,7 +687,8 @@ void WinEDA_PcbFrame::Start_MoveOneNodeOrSegment( TRACK* track, wxDC* DC, int co g_HightLigth_NetCode = track->GetNet(); g_HightLigt_Status = TRUE; - DrawHightLight( DC, g_HightLigth_NetCode ); + + GetBoard()->DrawHighLight( DrawPanel, DC, g_HightLigth_NetCode ); DrawPanel->ManageCurseur( DrawPanel, DC, TRUE ); } void SortTrackEndPoints(TRACK* track) @@ -844,7 +844,7 @@ void WinEDA_PcbFrame::Start_DragTrackSegmentAndKeepSlope( TRACK* track, wxDC* DC g_HightLigth_NetCode = track->GetNet(); g_HightLigt_Status = TRUE; - DrawHightLight( DC, g_HightLigth_NetCode ); + GetBoard()->DrawHighLight( DrawPanel, DC, g_HightLigth_NetCode ); if( !InitialiseDragParameters() ) { diff --git a/pcbnew/surbrill.cpp b/pcbnew/surbrill.cpp index 109157e16f..6f7bf5400c 100644 --- a/pcbnew/surbrill.cpp +++ b/pcbnew/surbrill.cpp @@ -15,11 +15,6 @@ #define Pad_fill (Pad_Fill_Item.State == RUN) -static void Pad_Surbrillance( WinEDA_DrawPanel* panel, wxDC* DC, MODULE* Module, int NetCode ); - -/* variables locales : */ -static int draw_mode; - /*********************************************************/ void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event ) @@ -99,16 +94,14 @@ int WinEDA_PcbFrame::Select_High_Light( wxDC* DC ) if( g_HightLigt_Status ) Hight_Light( DC ); - // use this scheme because of pad is higher priority than tracks in the + // use this scheme because a pad is a higher priority than a track in the // search, and finding a pad, instead of a track on a pad, // allows us to fire a message to eeschema. GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide(); - // optionally, modify the "guide" here as needed using its member functions - m_Collector->Collect( GetBoard(), GENERAL_COLLECTOR::PadsTracksOrZones, GetScreen()->RefPos( true ), guide ); @@ -158,74 +151,7 @@ void WinEDA_PcbFrame::Hight_Light( wxDC* DC ) */ { g_HightLigt_Status = !g_HightLigt_Status; - DrawHightLight( DC, g_HightLigth_NetCode ); + + GetBoard()->DrawHighLight( DrawPanel, DC, g_HightLigth_NetCode ); } - -/****************************************************************/ -void WinEDA_PcbFrame::DrawHightLight( wxDC* DC, int NetCode ) -/****************************************************************/ - -/* Turn On or OFF the HightLight for trcak and pads with the netcode "NetCode' - */ -{ - if( g_HightLigt_Status ) - draw_mode = GR_SURBRILL | GR_OR; - else - draw_mode = GR_AND | GR_SURBRILL; - -#if 0 // does not unhighlight properly - // redraw the zones with the NetCode - for( SEGZONE* zone = GetBoard()->m_Zone; zone; zone = zone->Next() ) - { - if( zone->GetNet() == NetCode ) - { - zone->Draw( DrawPanel, DC, draw_mode ); - } - } -#endif - - // Redraw ZONE_CONTAINERS - BOARD::ZONE_CONTAINERS& zones = GetBoard()->m_ZoneDescriptorList; - for( BOARD::ZONE_CONTAINERS::iterator zc = zones.begin(); zc!=zones.end(); ++zc ) - { - if( (*zc)->GetNet() == NetCode ) - { - (*zc)->Draw( DrawPanel, DC, draw_mode ); - } - } - - /* Redraw pads */ - for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() ) - { - Pad_Surbrillance( DrawPanel, DC, module, NetCode ); - } - - /* Redraw track and vias: */ - for( TRACK* pts = GetBoard()->m_Track; pts; pts = pts->Next() ) - { - if( pts->GetNet() == NetCode ) - { - pts->Draw( DrawPanel, DC, draw_mode ); - } - } -} - - -/*******************************************************/ -static void Pad_Surbrillance( WinEDA_DrawPanel* panel, - wxDC* DC, MODULE* Module, int NetCode ) -/*******************************************************/ -/* Mise en Surbrillance des Pads */ -{ - D_PAD* pt_pad; - - /* trace des pastilles */ - for( pt_pad = Module->m_Pads; pt_pad; pt_pad = pt_pad->Next() ) - { - if( pt_pad->GetNet() == NetCode ) - { - pt_pad->Draw( panel, DC, draw_mode ); - } - } -} diff --git a/pcbnew/tracepcb.cpp b/pcbnew/tracepcb.cpp index 66120fdc3b..8f8b9d4da5 100644 --- a/pcbnew/tracepcb.cpp +++ b/pcbnew/tracepcb.cpp @@ -43,7 +43,7 @@ void WinEDA_ModuleEditFrame::RedrawActiveWindow( wxDC* DC, bool EraseBg ) DrawPanel->DrawBackGround( DC ); TraceWorkSheet( DC, screen, 0 ); - /* Redraw the footprint */ + /* Redraw the footprints */ for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() ) { module->Draw( DrawPanel, DC, GR_OR ); @@ -84,8 +84,6 @@ void WinEDA_PcbFrame::RedrawActiveWindow( wxDC* DC, bool EraseBg ) TraceWorkSheet( DC, GetScreen(), 0 ); GetBoard()->Draw( DrawPanel, DC, GR_OR ); - if( g_HightLigt_Status ) - DrawHightLight( DC, g_HightLigth_NetCode ); DrawGeneralRatsnest( DC ); @@ -107,6 +105,9 @@ void BOARD::Draw( WinEDA_DrawPanel* aPanel, wxDC* DC, /********************************************************************/ /* Redraw the BOARD items but not cursors, axis or grid */ { + + + for( MODULE* module = m_Modules; module; module = module->Next() ) { bool display = true; @@ -135,7 +136,6 @@ void BOARD::Draw( WinEDA_DrawPanel* aPanel, wxDC* DC, Trace_Pads_Only( aPanel, DC, module, 0, 0, layerMask, aDrawMode ); } - // Draw the graphic items for( BOARD_ITEM* item = m_Drawings; item; item = item->Next() ) { @@ -184,19 +184,76 @@ void BOARD::Draw( WinEDA_DrawPanel* aPanel, wxDC* DC, } } - - // draw the BOARD's markers. - for( unsigned i=0; i < m_markers.size(); ++i ) - { - m_markers[i]->Draw( aPanel, DC, aDrawMode ); - } - // Draw equipots info for( EQUIPOT* net = m_Equipots; net; net = net->Next() ) { if ( net->GetNet() != 0 ) // no net if 0 net->Draw( aPanel, DC, aDrawMode ); } + + // @todo: this high-light functionality could be built into me. + if( g_HightLigt_Status ) + DrawHighLight( aPanel, DC, g_HightLigth_NetCode ); + + // draw the BOARD's markers last, otherwise the high light will erase any marker on a pad + for( unsigned i=0; i < m_markers.size(); ++i ) + { + m_markers[i]->Draw( aPanel, DC, aDrawMode ); + } } +/******************************************************************************/ +void BOARD::DrawHighLight( WinEDA_DrawPanel* aDrawPanel, wxDC* DC, int aNetCode ) +/******************************************************************************/ +{ + int draw_mode; + + if( g_HightLigt_Status ) + draw_mode = GR_SURBRILL | GR_OR; + else + draw_mode = GR_AND | GR_SURBRILL; + +#if 0 // does not unhighlight properly + // redraw the zones with the aNetCode + for( SEGZONE* zone = m_Zone; zone; zone = zone->Next() ) + { + if( zone->GetNet() == aNetCode ) + { + zone->Draw( aDrawPanel, DC, draw_mode ); + } + } +#endif + + // Redraw ZONE_CONTAINERS + BOARD::ZONE_CONTAINERS& zones = m_ZoneDescriptorList; + for( BOARD::ZONE_CONTAINERS::iterator zc = zones.begin(); zc!=zones.end(); ++zc ) + { + if( (*zc)->GetNet() == aNetCode ) + { + (*zc)->Draw( aDrawPanel, DC, draw_mode ); + } + } + + // Redraw any pads that have aNetCode + for( MODULE* module = m_Modules; module; module = module->Next() ) + { + for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() ) + { + if( pad->GetNet() == aNetCode ) + { + pad->Draw( aDrawPanel, DC, draw_mode ); + } + } + } + + // Redraw track and vias that have aNetCode + for( TRACK* seg = m_Track; seg; seg = seg->Next() ) + { + if( seg->GetNet() == aNetCode ) + { + seg->Draw( aDrawPanel, DC, draw_mode ); + } + } +} +