Added support for multiple active layers (colored ones in the high contrast mode).

Added separate layers for pad netnames (now these are divided into multilayer/top/bottom pads).
More appropriate layers are selecting a copper layer in the high contrast mode (now it shows the copper layer itself, vias & multilayer pads and netnames).
This commit is contained in:
Maciej Suminski 2013-07-16 13:40:53 +02:00
parent 0544134ae3
commit 7739cfef2f
10 changed files with 115 additions and 77 deletions

View File

@ -39,7 +39,6 @@ RENDER_SETTINGS::RENDER_SETTINGS()
m_highlightEnabled = false; m_highlightEnabled = false;
m_hiContrastEnabled = false; m_hiContrastEnabled = false;
m_hiContrastFactor = 0.2; m_hiContrastFactor = 0.2;
m_activeLayer = 0;
m_outlineWidth = 1; m_outlineWidth = 1;
// Store the predefined colors used in KiCad in format used by GAL // Store the predefined colors used in KiCad in format used by GAL

View File

@ -431,6 +431,9 @@ void VIEW::EnableTopLayer( bool aEnable )
for( it = m_topLayers.begin(); it != m_topLayers.end(); ++it ) for( it = m_topLayers.begin(); it != m_topLayers.end(); ++it )
m_layers[*it].renderingOrder -= TOP_LAYER_MODIFIER; m_layers[*it].renderingOrder -= TOP_LAYER_MODIFIER;
} }
UpdateAllLayersOrder();
UpdateAllLayersColor();
} }

View File

@ -236,6 +236,8 @@ enum PCB_VISIBLE
LAYER_14_NETNAMES_VISIBLE, LAYER_14_NETNAMES_VISIBLE,
LAYER_15_NETNAMES_VISIBLE, LAYER_15_NETNAMES_VISIBLE,
LAYER_16_NETNAMES_VISIBLE, // Top layer LAYER_16_NETNAMES_VISIBLE, // Top layer
PAD_FR_NETNAMES_VISIBLE,
PAD_BK_NETNAMES_VISIBLE,
PADS_NETNAMES_VISIBLE, PADS_NETNAMES_VISIBLE,
END_PCB_VISIBLE_LIST // sentinel END_PCB_VISIBLE_LIST // sentinel
@ -264,7 +266,7 @@ const int GalLayerOrder[] =
ITEM_GAL_LAYER( VIAS_HOLES_VISIBLE ), ITEM_GAL_LAYER( PADS_HOLES_VISIBLE ), ITEM_GAL_LAYER( VIAS_HOLES_VISIBLE ), ITEM_GAL_LAYER( PADS_HOLES_VISIBLE ),
ITEM_GAL_LAYER( VIAS_VISIBLE ), ITEM_GAL_LAYER( PADS_VISIBLE ), ITEM_GAL_LAYER( VIAS_VISIBLE ), ITEM_GAL_LAYER( PADS_VISIBLE ),
ITEM_GAL_LAYER( PAD_FR_VISIBLE ), ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE ), ITEM_GAL_LAYER( PAD_FR_VISIBLE ),
ITEM_GAL_LAYER( LAYER_16_NETNAMES_VISIBLE ), LAYER_N_FRONT, ITEM_GAL_LAYER( LAYER_16_NETNAMES_VISIBLE ), LAYER_N_FRONT,
ITEM_GAL_LAYER( LAYER_15_NETNAMES_VISIBLE ), LAYER_N_15, ITEM_GAL_LAYER( LAYER_15_NETNAMES_VISIBLE ), LAYER_N_15,
ITEM_GAL_LAYER( LAYER_14_NETNAMES_VISIBLE ), LAYER_N_14, ITEM_GAL_LAYER( LAYER_14_NETNAMES_VISIBLE ), LAYER_N_14,
@ -281,7 +283,7 @@ const int GalLayerOrder[] =
ITEM_GAL_LAYER( LAYER_3_NETNAMES_VISIBLE ), LAYER_N_3, ITEM_GAL_LAYER( LAYER_3_NETNAMES_VISIBLE ), LAYER_N_3,
ITEM_GAL_LAYER( LAYER_2_NETNAMES_VISIBLE ), LAYER_N_2, ITEM_GAL_LAYER( LAYER_2_NETNAMES_VISIBLE ), LAYER_N_2,
ITEM_GAL_LAYER( LAYER_1_NETNAMES_VISIBLE ), LAYER_N_BACK, ITEM_GAL_LAYER( LAYER_1_NETNAMES_VISIBLE ), LAYER_N_BACK,
ITEM_GAL_LAYER( PAD_BK_VISIBLE ), ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE ), ITEM_GAL_LAYER( PAD_BK_VISIBLE ),
SOLDERMASK_N_BACK, ADHESIVE_N_BACK, SOLDERPASTE_N_BACK, SILKSCREEN_N_BACK, SOLDERMASK_N_BACK, ADHESIVE_N_BACK, SOLDERPASTE_N_BACK, SILKSCREEN_N_BACK,
ITEM_GAL_LAYER( MOD_TEXT_BK_VISIBLE ) ITEM_GAL_LAYER( MOD_TEXT_BK_VISIBLE )
@ -408,6 +410,10 @@ inline LAYER_NUM GetNetnameLayer( LAYER_NUM aLayer )
} }
else if( aLayer == ITEM_GAL_LAYER( PADS_VISIBLE ) ) else if( aLayer == ITEM_GAL_LAYER( PADS_VISIBLE ) )
return ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE ); return ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE );
else if( aLayer == ITEM_GAL_LAYER( PAD_FR_VISIBLE ) )
return ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE );
else if( aLayer == ITEM_GAL_LAYER( PAD_BK_VISIBLE ) )
return ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE );
// Fallback // Fallback
return COMMENT_N; return COMMENT_N;

View File

@ -27,8 +27,8 @@
#ifndef __CLASS_PAINTER_H #ifndef __CLASS_PAINTER_H
#define __CLASS_PAINTER_H #define __CLASS_PAINTER_H
#include <vector>
#include <map> #include <map>
#include <set>
#include <gal/color4d.h> #include <gal/color4d.h>
#include <colors.h> #include <colors.h>
@ -51,8 +51,6 @@ class VIEW_ITEM;
* - drawing quality control (sketch/outline mode) * - drawing quality control (sketch/outline mode)
* The class acts as an interface between the PAINTER object and the GUI (i.e. Layers/Items * The class acts as an interface between the PAINTER object and the GUI (i.e. Layers/Items
* widget or display options dialog). * widget or display options dialog).
*
* Todo: properties/introspection
*/ */
class RENDER_SETTINGS class RENDER_SETTINGS
{ {
@ -81,9 +79,21 @@ public:
* (eg. highlighted, so it differs from other layers). * (eg. highlighted, so it differs from other layers).
* @param aLayerId is a layer number that should be displayed in a specific mode. * @param aLayerId is a layer number that should be displayed in a specific mode.
*/ */
inline void SetActiveLayer( int aLayerId ) inline void SetActiveLayer( int aLayerId, bool aEnabled = true )
{ {
m_activeLayer = aLayerId; if( aEnabled )
m_activeLayers.insert( aLayerId );
else
m_activeLayers.erase( aLayerId );
}
/**
* Function ClearActiveLayers
* Clears the list of active layers.
*/
inline void ClearActiveLayers()
{
m_activeLayers.clear();
} }
/** /**
@ -112,8 +122,7 @@ public:
} }
protected: protected:
std::set<unsigned int> m_activeLayers; /// Stores active layers number
int m_activeLayer; /// Stores active layer number
/// Parameters for display modes /// Parameters for display modes
bool m_hiContrastEnabled; /// High contrast display mode on/off bool m_hiContrastEnabled; /// High contrast display mode on/off

View File

@ -133,7 +133,15 @@ protected:
* will change the currently active layer to \a aLayer and also * will change the currently active layer to \a aLayer and also
* update the PCB_LAYER_WIDGET. * update the PCB_LAYER_WIDGET.
*/ */
void setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate = true ); void setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate = true )
{
( (PCB_SCREEN*) GetScreen() )->m_Active_Layer = aLayer;
setHighContrastLayer( aLayer );
if( doLayerWidgetUpdate )
syncLayerWidgetLayer();
}
/** /**
* Function getActiveLayer * Function getActiveLayer
@ -144,6 +152,12 @@ protected:
return ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer; return ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer;
} }
/**
* Function setHighContrastLayer
* takes care of display settings for the given layer to be displayed in high contrast mode.
*/
void setHighContrastLayer( LAYER_NUM aLayer );
/** /**
* Function syncLayerWidgetLayer * Function syncLayerWidgetLayer
* updates the currently layer "selection" within the PCB_LAYER_WIDGET. * updates the currently layer "selection" within the PCB_LAYER_WIDGET.

View File

@ -203,11 +203,10 @@ void PCB_BASE_FRAME::SetBoard( BOARD* aBoard )
// Netnames are drawn only when scale is sufficient (level of details) // Netnames are drawn only when scale is sufficient (level of details)
// so there is no point in caching them // so there is no point in caching them
for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer ) for( LAYER_NUM layer = FIRST_NETNAME_LAYER; layer <= LAST_NETNAME_LAYER; ++layer )
{ {
view->SetLayerCached( GetNetnameLayer( layer ), false ); view->SetLayerCached( layer, false );
} }
view->SetLayerCached( ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE ), false );
// Load layer & elements visibility settings // Load layer & elements visibility settings
for( unsigned int i = 0; i < NB_LAYERS; ++i ) for( unsigned int i = 0; i < NB_LAYERS; ++i )

View File

@ -748,48 +748,32 @@ void D_PAD::ViewGetLayers( int aLayers[], int& aCount ) const
{ {
aCount = 0; aCount = 0;
if( m_Attribute == PAD_SMD || m_Attribute == PAD_CONN ) if( IsOnLayer( LAYER_N_FRONT ) && IsOnLayer( LAYER_N_BACK ) )
{ {
// Single layer pad (smd) without hole // Multi layer pad
if( IsOnLayer( LAYER_N_FRONT ) ) aLayers[aCount++] = ITEM_GAL_LAYER( PADS_VISIBLE );
aLayers[aCount++] = ITEM_GAL_LAYER( PAD_FR_VISIBLE ); aLayers[aCount++] = ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE );
else if( IsOnLayer( LAYER_N_BACK ) )
aLayers[aCount++] = ITEM_GAL_LAYER( PAD_BK_VISIBLE );
#ifdef __WXDEBUG__
else // Should not occur
{
wxLogWarning( wxT("D_PAD::ViewGetLayers():PAD on layer different than FRONT/BACK") );
}
#endif
} }
else else if( IsOnLayer( LAYER_N_FRONT ) )
{ {
if( IsOnLayer( LAYER_N_FRONT ) && IsOnLayer( LAYER_N_BACK ) ) aLayers[aCount++] = ITEM_GAL_LAYER( PAD_FR_VISIBLE );
{ aLayers[aCount++] = ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE );
// Multi layer pad }
aLayers[aCount++] = ITEM_GAL_LAYER( PADS_VISIBLE ); else if( IsOnLayer( LAYER_N_BACK ) )
} {
else if( IsOnLayer( LAYER_N_FRONT ) ) aLayers[aCount++] = ITEM_GAL_LAYER( PAD_BK_VISIBLE );
{ aLayers[aCount++] = ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE );
aLayers[aCount++] = ITEM_GAL_LAYER( PAD_FR_VISIBLE ); }
}
else if( IsOnLayer( LAYER_N_BACK ) )
{
aLayers[aCount++] = ITEM_GAL_LAYER( PAD_BK_VISIBLE );
}
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
else // Should not occur else // Should not occur
{ {
wxLogWarning( wxT("D_PAD::ViewGetLayers():PAD on layer different than FRONT/BACK") ); wxLogWarning( wxT("D_PAD::ViewGetLayers():PAD on layer different than FRONT/BACK") );
} }
#endif #endif
// Draw a hole // These types of pads contain a hole
if( m_Attribute == PAD_STANDARD || m_Attribute == PAD_HOLE_NOT_PLATED )
aLayers[aCount++] = ITEM_GAL_LAYER( PADS_HOLES_VISIBLE ); aLayers[aCount++] = ITEM_GAL_LAYER( PADS_HOLES_VISIBLE );
}
// Pad description layer (number & net)
aLayers[aCount++] = ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE );
} }
@ -805,7 +789,7 @@ void D_PAD::ViewGetRequiredLayers( int aLayers[], int& aCount ) const
unsigned int D_PAD::ViewGetLOD( int aLayer ) const unsigned int D_PAD::ViewGetLOD( int aLayer ) const
{ {
// Netnames will be shown only if zoom is appropriate // Netnames will be shown only if zoom is appropriate
if( aLayer == ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE ) ) if( IsNetnameLayer( aLayer ) )
{ {
return ( 100000000 / std::max( m_Size.x, m_Size.y ) ); return ( 100000000 / std::max( m_Size.x, m_Size.y ) );
} }

View File

@ -199,35 +199,35 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
case ID_TB_OPTIONS_SHOW_ZONES: case ID_TB_OPTIONS_SHOW_ZONES:
DisplayOpt.DisplayZonesMode = 0; DisplayOpt.DisplayZonesMode = 0;
recache = true; recache = true;
if( !IsGalCanvasActive() ) if( !m_galCanvasActive )
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
case ID_TB_OPTIONS_SHOW_ZONES_DISABLE: case ID_TB_OPTIONS_SHOW_ZONES_DISABLE:
DisplayOpt.DisplayZonesMode = 1; DisplayOpt.DisplayZonesMode = 1;
recache = true; recache = true;
if( !IsGalCanvasActive() ) if( !m_galCanvasActive )
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
case ID_TB_OPTIONS_SHOW_ZONES_OUTLINES_ONLY: case ID_TB_OPTIONS_SHOW_ZONES_OUTLINES_ONLY:
DisplayOpt.DisplayZonesMode = 2; DisplayOpt.DisplayZonesMode = 2;
recache = true; recache = true;
if( !IsGalCanvasActive() ) if( !m_galCanvasActive )
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
case ID_TB_OPTIONS_SHOW_VIAS_SKETCH: case ID_TB_OPTIONS_SHOW_VIAS_SKETCH:
m_DisplayViaFill = DisplayOpt.DisplayViaFill = !state; m_DisplayViaFill = DisplayOpt.DisplayViaFill = !state;
recache = true; recache = true;
if( !IsGalCanvasActive() ) if( !m_galCanvasActive )
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
case ID_TB_OPTIONS_SHOW_TRACKS_SKETCH: case ID_TB_OPTIONS_SHOW_TRACKS_SKETCH:
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill = !state; m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill = !state;
recache = true; recache = true;
if( !IsGalCanvasActive() ) if( !m_galCanvasActive )
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
@ -238,19 +238,12 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
// Apply new display options to the GAL canvas (this is faster than recaching) // Apply new display options to the GAL canvas (this is faster than recaching)
settings->LoadDisplayOptions( DisplayOpt ); settings->LoadDisplayOptions( DisplayOpt );
KiGfx::VIEW* view = m_galCanvas->GetView(); setHighContrastLayer( getActiveLayer() );
LAYER_NUM layer = getActiveLayer(); m_galCanvas->GetView()->EnableTopLayer( state );
view->GetPainter()->GetSettings()->SetActiveLayer( layer ); if( m_galCanvasActive )
view->UpdateAllLayersColor(); m_galCanvas->Refresh();
view->EnableTopLayer( state );
view->ClearTopLayers();
view->SetTopLayer( layer );
view->UpdateAllLayersOrder();
if( !IsGalCanvasActive() )
m_canvas->Refresh();
break; break;
} }

View File

@ -73,6 +73,8 @@ void PCB_RENDER_SETTINGS::ImportLegacyColors( COLORS_DESIGN_SETTINGS* aSettings
m_itemColors[VIAS_VISIBLE] = COLOR4D( 0.7, 0.7, 0.7, 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[PADS_VISIBLE] = COLOR4D( 0.7, 0.7, 0.7, 1.0 );
m_itemColors[PADS_NETNAMES_VISIBLE] = COLOR4D( 0.8, 0.8, 0.8, 0.7 ); m_itemColors[PADS_NETNAMES_VISIBLE] = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
m_itemColors[PAD_FR_NETNAMES_VISIBLE] = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
m_itemColors[PAD_BK_NETNAMES_VISIBLE] = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
// Netnames for copper layers // Netnames for copper layers
for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer ) for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer )
{ {
@ -156,7 +158,7 @@ const COLOR4D& PCB_PAINTER::GetColor( const VIEW_ITEM* aItem, int aLayer )
const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode ) const const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode ) const
{ {
if( m_pcbSettings->m_hiContrastEnabled && m_pcbSettings->m_activeLayer != aLayer ) if( m_pcbSettings->m_hiContrastEnabled && m_pcbSettings->m_activeLayers.count( aLayer ) == 0 )
{ {
return m_pcbSettings->m_hiContrastColor; return m_pcbSettings->m_hiContrastColor;
} }
@ -376,7 +378,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
orientation = orientation * M_PI / 1800.0; orientation = orientation * M_PI / 1800.0;
// Draw description layer // Draw description layer
if( aLayer == ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE ) ) if( IsNetnameLayer( aLayer ) )
{ {
size = VECTOR2D( aPad->GetSize() / 2 ); size = VECTOR2D( aPad->GetSize() / 2 );
double scale = m_gal->GetZoomFactor(); double scale = m_gal->GetZoomFactor();

View File

@ -743,28 +743,57 @@ bool PCB_EDIT_FRAME::IsMicroViaAcceptable( void )
} }
void PCB_EDIT_FRAME::setActiveLayer( LAYER_NUM aLayer, bool doLayerWidgetUpdate ) void PCB_EDIT_FRAME::setHighContrastLayer( LAYER_NUM aLayer )
{ {
( (PCB_SCREEN*) GetScreen() )->m_Active_Layer = aLayer;
// Set display settings for high contrast mode // Set display settings for high contrast mode
KiGfx::VIEW* view = m_galCanvas->GetView(); KiGfx::VIEW* view = m_galCanvas->GetView();
KiGfx::RENDER_SETTINGS* rSettings = view->GetPainter()->GetSettings();
if( DisplayOpt.ContrastModeDisplay ) if( DisplayOpt.ContrastModeDisplay )
{ {
view->GetPainter()->GetSettings()->SetActiveLayer( aLayer );
view->UpdateAllLayersColor();
view->ClearTopLayers(); view->ClearTopLayers();
view->SetTopLayer( aLayer ); view->SetTopLayer( aLayer );
rSettings->ClearActiveLayers();
rSettings->SetActiveLayer( aLayer );
if( IsCopperLayer( aLayer ) )
{
// Bring some other layers to the front in case of copper layers and make them colored
LAYER_NUM layers[] = {
GetNetnameLayer( aLayer ), ITEM_GAL_LAYER( VIAS_VISIBLE ),
ITEM_GAL_LAYER( VIAS_HOLES_VISIBLE ), ITEM_GAL_LAYER( PADS_VISIBLE ),
ITEM_GAL_LAYER( PADS_HOLES_VISIBLE ), ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE )
};
for( unsigned int i = 0; i < sizeof( layers ) / sizeof( LAYER_NUM ); ++i )
{
view->SetTopLayer( layers[i] );
rSettings->SetActiveLayer( layers[i] );
}
// Pads should be shown too
if( aLayer == FIRST_COPPER_LAYER )
{
view->SetTopLayer( ITEM_GAL_LAYER( PAD_BK_VISIBLE ) );
view->SetTopLayer( ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE ) );
rSettings->SetActiveLayer( ITEM_GAL_LAYER( PAD_BK_VISIBLE ) );
rSettings->SetActiveLayer( ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE ) );
}
else if( aLayer == LAST_COPPER_LAYER )
{
view->SetTopLayer( ITEM_GAL_LAYER( PAD_FR_VISIBLE ) );
view->SetTopLayer( ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE ) );
rSettings->SetActiveLayer( ITEM_GAL_LAYER( PAD_FR_VISIBLE ) );
rSettings->SetActiveLayer( ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE ) );
}
}
view->UpdateAllLayersOrder(); view->UpdateAllLayersOrder();
view->UpdateAllLayersColor();
if( m_galCanvasActive ) if( m_galCanvasActive )
m_galCanvas->Refresh(); m_galCanvas->Refresh();
} }
if( doLayerWidgetUpdate )
syncLayerWidgetLayer();
} }