From 79b2eb0ff762e2e191a09c5d86a0a028efefc796 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 17 Jul 2013 13:38:56 +0200 Subject: [PATCH] Display preferences for showing netnames applies to the GAL backend. --- pcbnew/dialogs/dialog_display_options.cpp | 17 ++- pcbnew/pcb_painter.cpp | 175 ++++++++++++++-------- pcbnew/pcb_painter.h | 5 +- 3 files changed, 128 insertions(+), 69 deletions(-) diff --git a/pcbnew/dialogs/dialog_display_options.cpp b/pcbnew/dialogs/dialog_display_options.cpp index 90891d7bcc..be9bc04d40 100644 --- a/pcbnew/dialogs/dialog_display_options.cpp +++ b/pcbnew/dialogs/dialog_display_options.cpp @@ -18,6 +18,10 @@ #include #include +#include +#include +#include + void PCB_EDIT_FRAME::InstallDisplayOptionsDialog( wxCommandEvent& aEvent ) { @@ -165,7 +169,18 @@ void DIALOG_DISPLAY_OPTIONS::OnOkClick(wxCommandEvent& event) DisplayOpt.DisplayDrawItems = m_OptDisplayDrawings->GetSelection(); DisplayOpt.DisplayNetNamesMode = m_ShowNetNamesOption->GetSelection(); - m_Parent->GetCanvas()->Refresh(); + // Apply changes to the GAL + KiGfx::VIEW* view = m_Parent->GetGalCanvas()->GetView(); + KiGfx::PCB_PAINTER* painter = static_cast( view->GetPainter() ); + KiGfx::PCB_RENDER_SETTINGS* settings = + static_cast( painter->GetSettings() ); + settings->LoadDisplayOptions( DisplayOpt ); + view->RecacheAllItems(); + + if( m_Parent->IsGalCanvasActive() ) + m_Parent->GetGalCanvas()->Refresh(); + else + m_Parent->GetCanvas()->Refresh(); EndModal( 1 ); } diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index c43848d30a..d57bdabe82 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -90,12 +90,36 @@ void PCB_RENDER_SETTINGS::ImportLegacyColors( COLORS_DESIGN_SETTINGS* aSettings void PCB_RENDER_SETTINGS::LoadDisplayOptions( const DISPLAY_OPTIONS& aOptions ) { m_hiContrastEnabled = aOptions.ContrastModeDisplay; + m_padNumbers = aOptions.DisplayPadNum; // Whether to draw tracks, vias & pads filled or as outlines m_sketchModeSelect[PADS_VISIBLE] = !aOptions.DisplayPadFill; m_sketchModeSelect[VIAS_VISIBLE] = !aOptions.DisplayViaFill; m_sketchModeSelect[TRACKS_VISIBLE] = !aOptions.DisplayPcbTrackFill; + switch( aOptions.DisplayNetNamesMode ) + { + case 0: + m_netNamesOnPads = false; + m_netNamesOnTracks = false; + break; + + case 1: + m_netNamesOnPads = true; + m_netNamesOnTracks = false; + break; + + case 2: + m_netNamesOnPads = false; + m_netNamesOnTracks = true; + break; + + case 3: + m_netNamesOnPads = true; + m_netNamesOnTracks = true; + break; + } + switch( aOptions.DisplayZonesMode ) { case 0: @@ -264,7 +288,7 @@ void PCB_PAINTER::draw( const TRACK* aTrack, int aLayer ) int netNumber = aTrack->GetNet(); COLOR4D color; - if( IsNetnameLayer( aLayer ) ) + if( m_pcbSettings->m_netNamesOnTracks && IsNetnameLayer( aLayer ) ) { // If there is a net name - display it on the track if( netNumber != 0 ) @@ -378,73 +402,92 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) // Draw description layer if( IsNetnameLayer( aLayer ) ) { - size = VECTOR2D( aPad->GetSize() / 2 ); - double scale = m_gal->GetZoomFactor(); - double maxSize = PCB_RENDER_SETTINGS::MAX_FONT_SIZE / scale; - - // Font size limits - if( size.x > maxSize ) - size.x = maxSize; - if( size.y > maxSize ) - size.y = maxSize; - - // Keep the size ratio for the font, but make it smaller - if( size.x < size.y ) + // Is anything that we can display enabled? + if( m_pcbSettings->m_netNamesOnPads || m_pcbSettings->m_padNumbers ) { - orientation -= M_PI / 2; - size.y = size.x * 4.0 / 3.0; + bool displayNetname = ( m_pcbSettings->m_netNamesOnPads && + !aPad->GetNetname().empty() ); + size = VECTOR2D( aPad->GetSize() / 2 ); + double scale = m_gal->GetZoomFactor(); + double maxSize = PCB_RENDER_SETTINGS::MAX_FONT_SIZE / scale; + + // Font size limits + if( size.x > maxSize ) + size.x = maxSize; + if( size.y > maxSize ) + size.y = maxSize; + + // Keep the size ratio for the font, but make it smaller + if( size.x < size.y ) + { + orientation -= M_PI / 2.0; + size.y = size.x * 4.0 / 3.0; + } + else if( size.x == size.y ) + { + // If the text is displayed on a symmetrical pad, do not rotate it + orientation = 0.0; + } + else + { + size.x = size.y * 3.0 / 4.0; + } + + m_gal->Save(); + m_gal->Translate( position ); + m_gal->Rotate( -orientation ); + + // Default font settings + m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER ); + m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER ); + m_gal->SetBold( false ); + m_gal->SetItalic( false ); + m_gal->SetMirrored( false ); + + // Set a proper color for the label + color = getLayerColor( aPad->GetParent()->GetLayer(), aPad->GetNet(), + aPad->ViewIsHighlighted() ); + + if( color.GetBrightness() > 0.5 ) + m_gal->SetStrokeColor( color.Darkened( 0.8 ) ); + else + m_gal->SetStrokeColor( color.Highlighted( 0.8 ) ); + + if( displayNetname && m_pcbSettings->m_padNumbers ) + { + // Divide the space, when both pad numbers and netnames are enabled + size = size / 2.0; + m_gal->SetGlyphSize( size ); + m_gal->SetLineWidth( size.y / 8.0 ); + + m_gal->StrokeText( std::string( aPad->GetNetname().mb_str() ), + VECTOR2D( 0.0, size.y ), 0.0 ); + + m_gal->StrokeText( std::string( aPad->GetPadName().mb_str() ), + VECTOR2D( 0.0, -size.y / 2.0 ), 0.0 ); + } + else + { + // There is only one thing to display + if( displayNetname ) + { + m_gal->SetGlyphSize( size / 2.0 ); + m_gal->SetLineWidth( size.y / 12.0 ); + m_gal->StrokeText( std::string( aPad->GetNetname().mb_str() ), + VECTOR2D( 0.0, 0.0 ), 0.0 ); + } + + if( m_pcbSettings->m_padNumbers ) + { + m_gal->SetGlyphSize( size ); + m_gal->SetLineWidth( size.y / 10.0 ); + m_gal->StrokeText( std::string( aPad->GetPadName().mb_str() ), + VECTOR2D( 0.0, 0.0 ), 0.0 ); + } + } + + m_gal->Restore(); } - else if( size.x == size.y ) - { - // If the text is displayed on a symmetrical pad, do not rotate it - orientation = 0.0; - } - else - { - size.x = size.y * 3.0 / 4.0; - } - - m_gal->Save(); - m_gal->Translate( position ); - m_gal->Rotate( -orientation ); - - // Default font settings - m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER ); - m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER ); - m_gal->SetBold( false ); - m_gal->SetItalic( false ); - m_gal->SetMirrored( false ); - - // Set a proper color for the label - color = getLayerColor( aPad->GetParent()->GetLayer(), aPad->GetNet(), - aPad->ViewIsHighlighted() ); - - if( color.GetBrightness() > 0.5 ) - m_gal->SetStrokeColor( color.Darkened( 0.8 ) ); - else - m_gal->SetStrokeColor( color.Highlighted( 0.8 ) ); - - // Let's make some space for a netname too, if there's one to display - if( !aPad->GetNetname().empty() ) - { - size = size / 2.0; - m_gal->SetGlyphSize( size ); - m_gal->SetLineWidth( size.y / 10.0 ); - - m_gal->StrokeText( std::string( aPad->GetNetname().mb_str() ), - VECTOR2D( 0, size.y ), 0.0 ); - m_gal->Translate( VECTOR2D( 0.0, -size.y / 2.0 ) ); - } - else - { - // In case when there's no netname assigned - m_gal->SetGlyphSize( size ); - m_gal->SetLineWidth( size.y / 10.0 ); - } - - m_gal->StrokeText( std::string( aPad->GetPadName().mb_str() ), VECTOR2D( 0, 0 ), 0.0 ); - - m_gal->Restore(); return; } diff --git a/pcbnew/pcb_painter.h b/pcbnew/pcb_painter.h index a91ffbbea2..50740889ef 100644 --- a/pcbnew/pcb_painter.h +++ b/pcbnew/pcb_painter.h @@ -102,8 +102,9 @@ protected: COLOR4D m_itemColorsDark [END_PCB_VISIBLE_LIST]; bool m_sketchModeSelect[END_PCB_VISIBLE_LIST]; - bool m_visibleLayers [NB_LAYERS]; - bool m_visibleItems [END_PCB_VISIBLE_LIST]; + bool m_padNumbers; + bool m_netNamesOnPads; + bool m_netNamesOnTracks; static const double MAX_FONT_SIZE = 100000000;