From 5fda7bf32fa4e44b9daf5a68446a8c3df452b3a0 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Tue, 9 Apr 2013 16:12:20 +0200 Subject: [PATCH] Netnames and pad numbers are displayed on pads (using GAL) --- include/layers_id_colors_and_visibility.h | 1 + pcbnew/basepcbframe.cpp | 1 + pcbnew/class_pad.cpp | 13 ++-- pcbnew/pcb_painter.cpp | 74 +++++++++++++++++++++-- pcbnew/pcb_painter.h | 3 + 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h index 77f2e87f0c..7149519b9b 100644 --- a/include/layers_id_colors_and_visibility.h +++ b/include/layers_id_colors_and_visibility.h @@ -147,6 +147,7 @@ enum PCB_VISIBLE PADS_VISIBLE, VIA_HOLES_VISIBLE, PAD_HOLES_VISIBLE, + NETNAME_VISIBLE, END_PCB_VISIBLE_LIST // sentinel }; diff --git a/pcbnew/basepcbframe.cpp b/pcbnew/basepcbframe.cpp index 165f6644ab..8b926fa0de 100644 --- a/pcbnew/basepcbframe.cpp +++ b/pcbnew/basepcbframe.cpp @@ -95,6 +95,7 @@ const int m_galLayerOrder[] = ITEM_GAL_LAYER( MOD_REFERENCES_VISIBLE), ITEM_GAL_LAYER( MOD_VALUES_VISIBLE ), SILKSCREEN_N_FRONT, SOLDERPASTE_N_FRONT, ADHESIVE_N_FRONT, SOLDERMASK_N_FRONT, + ITEM_GAL_LAYER( NETNAME_VISIBLE ), ITEM_GAL_LAYER( VIA_HOLES_VISIBLE ), ITEM_GAL_LAYER( PAD_HOLES_VISIBLE ), ITEM_GAL_LAYER( VIAS_VISIBLE ), ITEM_GAL_LAYER( PADS_VISIBLE ), diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 6ed89c4efd..01c40a9119 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -852,18 +852,21 @@ EDA_ITEM* D_PAD::Clone() const void D_PAD::ViewGetLayers( int aLayers[], int& aCount ) const { + // Pad description layer (number / net) + aLayers[0] = ITEM_GAL_LAYER( NETNAME_VISIBLE ); + if( m_Attribute == PAD_SMD || m_Attribute == PAD_CONN) { // Single layer pad (smd) without hole - aLayers[0] = GetParent()->GetLayer(); - aCount = 1; + aLayers[1] = GetParent()->GetLayer(); + aCount = 2; } else { // Multi layer pad with hole - pad is shown on one common layer, hole on the other - aLayers[0] = ITEM_GAL_LAYER( PADS_VISIBLE ); - aLayers[1] = ITEM_GAL_LAYER( PAD_HOLES_VISIBLE ); - aCount = 2; + aLayers[1] = ITEM_GAL_LAYER( PADS_VISIBLE ); + aLayers[2] = ITEM_GAL_LAYER( PAD_HOLES_VISIBLE ); + aCount = 3; } } diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 2eea8002e0..24e4c393da 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -71,6 +71,7 @@ void PCB_RENDER_SETTINGS::ImportLegacyColors( COLORS_DESIGN_SETTINGS* aSettings m_itemColors[PAD_HOLES_VISIBLE] = COLOR4D( 0.0, 0.5, 0.5, 1.0 ); m_itemColors[VIAS_VISIBLE] = COLOR4D( 0.7, 0.7, 0.7, 1.0 ); m_itemColors[PADS_VISIBLE] = COLOR4D( 0.7, 0.7, 0.7, 1.0 ); + m_itemColors[NETNAME_VISIBLE] = COLOR4D( 0.9, 0.9, 0.9, 1.0 ); Update(); } @@ -111,6 +112,8 @@ void PCB_RENDER_SETTINGS::Update() } +const double PCB_PAINTER::MAX_FONT_SIZE = 1500000; + PCB_PAINTER::PCB_PAINTER( GAL* aGal ) : PAINTER( aGal ) { @@ -307,11 +310,78 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) { COLOR4D color; VECTOR2D size; + VECTOR2D position( aPad->GetPosition() ); PAD_SHAPE_T shape; double m, n; + double orientation = aPad->GetOrientation(); + NORMALIZE_ANGLE_90( orientation ); // do not display descriptions upside down + orientation = orientation * M_PI / 1800.0; color = getLayerColor( aLayer, aPad->GetNet() ); + // Draw description layer + if( aLayer == ITEM_GAL_LAYER( NETNAME_VISIBLE ) ) + { + size = VECTOR2D( aPad->GetSize() / 2 ); + + // Font size limits + if( size.x > MAX_FONT_SIZE ) + size.x = MAX_FONT_SIZE; + if( size.y > MAX_FONT_SIZE ) + size.y = MAX_FONT_SIZE; + + // Keep the size ratio for the font, but make it smaller + if( size.x < size.y ) + { + orientation -= M_PI / 2; + size.y = size.x * 4.0 / 3.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_stroke_font->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER ); + m_stroke_font->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER ); + m_stroke_font->SetBold( false ); + m_stroke_font->SetItalic( false ); + m_stroke_font->SetMirrored( false ); + m_gal->SetStrokeColor( color ); + + // Let's make some space for a netname too, if there's one to display + if( !aPad->GetNetname().empty() ) + { + size = size / 2.0; + m_stroke_font->SetGlyphSize( size ); + m_gal->SetLineWidth( size.y / 10.0 ); + + m_stroke_font->Draw( 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_stroke_font->SetGlyphSize( size ); + m_gal->SetLineWidth( size.y / 10.0 ); + } + + m_stroke_font->Draw( std::string( aPad->GetPadName().mb_str() ), VECTOR2D( 0, 0 ), 0.0 ); + + m_gal->Restore(); + return; + } + + // Pad/hole drawing + m_gal->Save(); + m_gal->Translate( position ); + m_gal->Rotate( -orientation ); + if( m_pcbSettings->m_sketchModeSelect[PADS_VISIBLE] ) { // Outline mode @@ -330,10 +400,6 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) m_gal->SetFillColor( color ); } - m_gal->Save(); - m_gal->Translate( VECTOR2D( aPad->GetPosition() ) ); - m_gal->Rotate( -aPad->GetOrientation() * M_PI / 1800.0 ); // orientation is in tenths of degree - // Choose drawing settings depending on if we are drawing a pad itself or a hole if( aLayer == ITEM_GAL_LAYER( PAD_HOLES_VISIBLE ) ) { diff --git a/pcbnew/pcb_painter.h b/pcbnew/pcb_painter.h index d66f3c6ed4..c48ed8b64f 100644 --- a/pcbnew/pcb_painter.h +++ b/pcbnew/pcb_painter.h @@ -151,6 +151,9 @@ protected: void draw( const ZONE_CONTAINER* ); void draw( const DIMENSION* ); void draw( const PCB_TARGET* ); + + /// Maximum font size for drawing descriptions + static const double MAX_FONT_SIZE; }; } // namespace KiGfx