From bf21640ae567b9d4f69171e283b61a234997c9ab Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 5 Apr 2017 16:29:53 +0200 Subject: [PATCH] Fix a few issues when changing a color in render, in GAL mode. Now colors of ratsnest, vias, not plated holes and anchors can be set. However not plated holes still have a color issue. --- include/layers_id_colors_and_visibility.h | 18 ++++---- pcbnew/class_pcb_layer_widget.cpp | 13 +++--- pcbnew/pcb_draw_panel_gal.cpp | 7 ++-- pcbnew/pcb_painter.cpp | 51 +++++++++++++++-------- 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h index 5104f4cabf..8c0a2af1bf 100644 --- a/include/layers_id_colors_and_visibility.h +++ b/include/layers_id_colors_and_visibility.h @@ -167,16 +167,16 @@ enum GAL_LAYER_ID: int GAL_LAYER_ID_START = NETNAMES_LAYER_ID_END, LAYER_VIAS = GAL_LAYER_ID_START, - LAYER_VIA_MICROVIA, - LAYER_VIA_BBLIND, - LAYER_VIA_THROUGH, - LAYER_NON_PLATED, + LAYER_VIA_MICROVIA, ///< to draw micro vias + LAYER_VIA_BBLIND, ///< to draw blind/buried vias + LAYER_VIA_THROUGH, ///< to draw usual through hole vias + LAYER_NON_PLATED, ///< handle color for not plated holes LAYER_MOD_TEXT_FR, LAYER_MOD_TEXT_BK, LAYER_MOD_TEXT_INVISIBLE, ///< text marked as invisible - LAYER_ANCHOR, - LAYER_PAD_FR, - LAYER_PAD_BK, + LAYER_ANCHOR, ///< anchor of items having an anchor point (texts, footprints) + LAYER_PAD_FR, ///< smd pads, front layer + LAYER_PAD_BK, ///< smd pads, back layer LAYER_RATSNEST, LAYER_GRID, LAYER_GRID_AXES, @@ -187,8 +187,8 @@ enum GAL_LAYER_ID: int LAYER_MOD_REFERENCES, ///< show modules references (when texts are visibles) LAYER_TRACKS, LAYER_PADS, ///< multilayer pads, usually with holes - LAYER_PADS_HOLES, - LAYER_VIAS_HOLES, + LAYER_PADS_HOLES, ///< to draw pad holes (plated or not plated) + LAYER_VIAS_HOLES, ///< to draw via holes (pad holes do not use this layer) LAYER_DRC, ///< drc markers LAYER_WORKSHEET, ///< worksheet frame LAYER_GP_OVERLAY, ///< general purpose overlay diff --git a/pcbnew/class_pcb_layer_widget.cpp b/pcbnew/class_pcb_layer_widget.cpp index 71f5e0a8ca..f33c61d9d3 100644 --- a/pcbnew/class_pcb_layer_widget.cpp +++ b/pcbnew/class_pcb_layer_widget.cpp @@ -61,7 +61,7 @@ const LAYER_WIDGET::ROW PCB_LAYER_WIDGET::s_render_rows[] = { RR( _( "Through Via" ), LAYER_VIA_THROUGH, WHITE, _( "Show through vias" ) ), RR( _( "Bl/Buried Via" ), LAYER_VIA_BBLIND, WHITE, _( "Show blind or buried vias" ) ), RR( _( "Micro Via" ), LAYER_VIA_MICROVIA, WHITE, _( "Show micro vias") ), - RR( _( "Non Plated" ), LAYER_NON_PLATED, WHITE, _( "Show non plated holes") ), + RR( _( "Non Plated Holes" ),LAYER_NON_PLATED, WHITE, _( "Show non plated holes in specific color") ), RR( _( "Ratsnest" ), LAYER_RATSNEST, WHITE, _( "Show unconnected nets as a ratsnest") ), RR( _( "Pads Front" ), LAYER_PAD_FR, WHITE, _( "Show footprint pads on board's front" ) ), @@ -518,14 +518,17 @@ void PCB_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal void PCB_LAYER_WIDGET::OnRenderColorChange( int aId, COLOR4D aColor ) { wxASSERT( aId > GAL_LAYER_ID_START && aId < GAL_LAYER_ID_END ); - myframe->GetBoard()->SetVisibleElementColor( static_cast( aId ), aColor ); + + BOARD* brd = myframe->GetBoard(); + brd->SetVisibleElementColor( static_cast( aId ), aColor ); EDA_DRAW_PANEL_GAL* galCanvas = myframe->GetGalCanvas(); if( galCanvas && myframe->IsGalCanvasActive() ) { KIGFX::VIEW* view = galCanvas->GetView(); - view->GetPainter()->GetSettings()->ImportLegacyColors( myframe->GetBoard()->GetColorsSettings() ); + view->GetPainter()->GetSettings()->ImportLegacyColors( brd->GetColorsSettings() ); + view->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); // useful to update rastnest view->UpdateLayerColor( aId ); galCanvas->Refresh(); } @@ -560,8 +563,8 @@ void PCB_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled ) galCanvas->Refresh(); } - else - myframe->GetCanvas()->Refresh(); + + myframe->GetCanvas()->Refresh(); } //----------------------------------------------- diff --git a/pcbnew/pcb_draw_panel_gal.cpp b/pcbnew/pcb_draw_panel_gal.cpp index 92d82e65b2..2081b27bfc 100644 --- a/pcbnew/pcb_draw_panel_gal.cpp +++ b/pcbnew/pcb_draw_panel_gal.cpp @@ -50,7 +50,7 @@ const LAYER_NUM GAL_LAYER_ORDER[] = LAYER_MOD_REFERENCES, LAYER_MOD_VALUES, LAYER_RATSNEST, LAYER_ANCHOR, - LAYER_VIAS_HOLES, LAYER_PADS_HOLES, + LAYER_VIAS_HOLES, LAYER_PADS_HOLES, LAYER_NON_PLATED, LAYER_VIA_THROUGH, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_PADS, @@ -195,7 +195,7 @@ void PCB_DRAW_PANEL_GAL::SetHighContrastLayer( PCB_LAYER_ID aLayer ) LAYER_NUM layers[] = { GetNetnameLayer( aLayer ), LAYER_VIA_THROUGH, LAYER_VIAS_HOLES, LAYER_PADS, - LAYER_PADS_HOLES, LAYER_PADS_NETNAMES, + LAYER_PADS_HOLES, LAYER_NON_PLATED, LAYER_PADS_NETNAMES, LAYER_GP_OVERLAY, LAYER_RATSNEST }; @@ -231,7 +231,7 @@ void PCB_DRAW_PANEL_GAL::SetTopLayer( PCB_LAYER_ID aLayer ) const LAYER_NUM layers[] = { LAYER_VIA_THROUGH, LAYER_VIAS_HOLES, LAYER_PADS, - LAYER_PADS_HOLES, LAYER_PADS_NETNAMES, + LAYER_PADS_HOLES, LAYER_NON_PLATED, LAYER_PADS_NETNAMES, LAYER_GP_OVERLAY, LAYER_RATSNEST, Dwgs_User, LAYER_DRC }; @@ -401,6 +401,7 @@ void PCB_DRAW_PANEL_GAL::setDefaultLayerDeps() // Some more required layers settings m_view->SetRequired( LAYER_VIAS_HOLES, LAYER_VIA_THROUGH ); m_view->SetRequired( LAYER_PADS_HOLES, LAYER_PADS ); + m_view->SetRequired( LAYER_NON_PLATED, LAYER_PADS ); m_view->SetRequired( LAYER_PADS_NETNAMES, LAYER_PADS ); // Front modules diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 34750f2968..9f0a266555 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -65,32 +65,34 @@ PCB_RENDER_SETTINGS::PCB_RENDER_SETTINGS() void PCB_RENDER_SETTINGS::ImportLegacyColors( const COLORS_DESIGN_SETTINGS* aSettings ) { + // Init board layers colors: for( int i = 0; i < PCB_LAYER_ID_COUNT; i++ ) { m_layerColors[i] = aSettings->GetLayerColor( i ); m_layerColors[i].a = 0.8; // slightly transparent } + // Init specific graphic layers colors: for( int i = GAL_LAYER_ID_START; i < GAL_LAYER_ID_END; i++ ) m_layerColors[i] = aSettings->GetItemColor( i ); - m_layerColors[LAYER_MOD_TEXT_FR] = m_layerColors[F_SilkS]; - m_layerColors[LAYER_MOD_TEXT_BK] = m_layerColors[B_SilkS]; + // Default colors for specific layers (not really board layers). + m_layerColors[LAYER_VIAS_HOLES] = COLOR4D( 0.5, 0.4, 0.0, 0.8 ); + m_layerColors[LAYER_PADS_HOLES] = COLOR4D( 0.0, 0.0, 0.0, 1.0 ); + m_layerColors[LAYER_PADS] = COLOR4D( 0.6, 0.6, 0.0, 0.8 ); + m_layerColors[LAYER_PADS_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); + m_layerColors[LAYER_PAD_FR_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); + m_layerColors[LAYER_PAD_BK_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); + m_layerColors[LAYER_WORKSHEET] = COLOR4D( 0.5, 0.0, 0.0, 0.8 ); + m_layerColors[LAYER_DRC] = COLOR4D( 1.0, 0.0, 0.0, 0.8 ); - // Default colors for specific layers - m_layerColors[LAYER_VIAS_HOLES] = COLOR4D( 0.5, 0.4, 0.0, 0.8 ); - m_layerColors[LAYER_PADS_HOLES] = COLOR4D( 0.0, 0.5, 0.5, 0.8 ); - m_layerColors[LAYER_VIA_THROUGH] = COLOR4D( 0.6, 0.6, 0.6, 0.8 ); - m_layerColors[LAYER_VIA_BBLIND] = COLOR4D( 0.6, 0.6, 0.6, 0.8 ); - m_layerColors[LAYER_VIA_MICROVIA] = COLOR4D( 0.4, 0.4, 0.8, 0.8 ); - m_layerColors[LAYER_PADS] = COLOR4D( 0.6, 0.6, 0.6, 0.8 ); - m_layerColors[LAYER_PADS_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); - m_layerColors[LAYER_PAD_FR_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); - m_layerColors[LAYER_PAD_BK_NETNAMES] = COLOR4D( 1.0, 1.0, 1.0, 0.9 ); - m_layerColors[LAYER_ANCHOR] = COLOR4D( 0.3, 0.3, 1.0, 0.9 ); - m_layerColors[LAYER_RATSNEST] = COLOR4D( 0.4, 0.4, 0.4, 0.8 ); - m_layerColors[LAYER_WORKSHEET] = COLOR4D( 0.5, 0.0, 0.0, 0.8 ); - m_layerColors[LAYER_DRC] = COLOR4D( 1.0, 0.0, 0.0, 0.8 ); + // LAYER_NON_PLATED, LAYER_ANCHOR],LAYER_RATSNEST, + // LAYER_VIA_THROUGH], LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA + // are initialized from aSettings + + // These colors are not actually used. Set just in case... + m_layerColors[LAYER_MOD_TEXT_FR] = m_layerColors[F_SilkS]; + m_layerColors[LAYER_MOD_TEXT_BK] = m_layerColors[B_SilkS]; // Make ratsnest lines slightly transparent m_layerColors[LAYER_RATSNEST].a = 0.8; @@ -599,7 +601,20 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) } // Pad drawing - const COLOR4D& color = m_pcbSettings.GetColor( aPad, aLayer ); + COLOR4D color = m_pcbSettings.GetColor( aPad, aLayer ); + + // Pad holes color is specific + if( aLayer == LAYER_PADS_HOLES || aLayer == LAYER_NON_PLATED ) + { + // Hole color is the background color for plated holes, but a specific color + // for not plated holes (LAYER_NON_PLATED color layer ) + if( aPad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED /*&& + brd->IsElementVisible( LAYER_NON_PLATED )*/ ) + color = m_pcbSettings.GetColor( nullptr, LAYER_NON_PLATED ); + else + color = m_pcbSettings.GetBackgroundColor(); + } + VECTOR2D size; if( m_pcbSettings.m_sketchMode[LAYER_PADS] ) @@ -623,7 +638,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer ) m_gal->Rotate( -aPad->GetOrientationRadians() ); // Choose drawing settings depending on if we are drawing a pad itself or a hole - if( aLayer == LAYER_PADS_HOLES ) + if( aLayer == LAYER_PADS_HOLES || aLayer == LAYER_NON_PLATED ) { // Drawing hole: has same shape as PAD_CIRCLE or PAD_OVAL size = VECTOR2D( aPad->GetDrillSize() ) / 2.0;