Collapse a level out of the zoom settings.

The APP_SETTINGS_BASE now holds the list of zoom factors, and
the old legacy (screen-based) code has been removed.
This commit is contained in:
Jeff Young 2020-06-13 22:09:02 +01:00
parent fc44506fe1
commit c48f4272f3
42 changed files with 286 additions and 651 deletions

View File

@ -27,7 +27,6 @@
#include <base_screen.h> #include <base_screen.h>
#include <base_struct.h> #include <base_struct.h>
#include <fctsys.h> #include <fctsys.h>
#include <id.h>
#include <trace_helpers.h> #include <trace_helpers.h>
@ -41,7 +40,6 @@ BASE_SCREEN::BASE_SCREEN( EDA_ITEM* aParent, KICAD_T aType ) :
m_Initialized = false; m_Initialized = false;
m_ScreenNumber = 1; m_ScreenNumber = 1;
m_NumberOfScreens = 1; // Hierarchy: Root: ScreenNumber = 1 m_NumberOfScreens = 1; // Hierarchy: Root: ScreenNumber = 1
m_Zoom = 32.0;
m_Center = true; m_Center = true;
m_FlagModified = false; // Set when any change is made on board. m_FlagModified = false; // Set when any change is made on board.
@ -72,25 +70,6 @@ void BASE_SCREEN::InitDataPoints( const wxSize& aPageSizeIU )
} }
bool BASE_SCREEN::SetZoom( double iu_per_du )
{
if( iu_per_du == m_Zoom )
return false;
wxLogTrace( traceScreen, "Zoom:%.16g 1/Zoom:%.16g", iu_per_du, 1/iu_per_du );
if( iu_per_du < GetMinAllowedZoom() )
return false;
if( iu_per_du > GetMaxAllowedZoom() )
return false;
m_Zoom = iu_per_du;
return true;
}
void BASE_SCREEN::ClearUndoRedoList() void BASE_SCREEN::ClearUndoRedoList()
{ {
ClearUndoORRedoList( m_UndoList ); ClearUndoORRedoList( m_UndoList );

View File

@ -158,13 +158,10 @@ void EDA_DRAW_PANEL_GAL::SetFocus()
void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) ) void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
{ {
// Update current zoom settings if the canvas is managed by a EDA frame // Update scroll position if the canvas is managed by a EDA frame
// (i.e. not by a preview panel in a dialog) // (i.e. not by a preview panel in a dialog)
if( GetParentEDAFrame() && GetParentEDAFrame()->GetScreen() ) if( GetParentEDAFrame() && GetParentEDAFrame()->GetScreen() )
{
GetParentEDAFrame()->GetScreen()->SetZoom( GetLegacyZoom() );
GetParentEDAFrame()->GetScreen()->m_ScrollCenter = GetView()->GetCenter(); GetParentEDAFrame()->GetScreen()->m_ScrollCenter = GetView()->GetCenter();
}
m_viewControls->UpdateScrollbars(); m_viewControls->UpdateScrollbars();
@ -355,12 +352,6 @@ void EDA_DRAW_PANEL_GAL::SetTopLayer( int aLayer )
} }
double EDA_DRAW_PANEL_GAL::GetLegacyZoom() const
{
return m_edaFrame->GetZoomLevelCoeff() / m_gal->GetZoomFactor();
}
bool EDA_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType ) bool EDA_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType )
{ {
// Do not do anything if the currently used GAL is correct // Do not do anything if the currently used GAL is correct

View File

@ -87,7 +87,6 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame
// BLACK for Pcbnew, BLACK or WHITE for eeschema // BLACK for Pcbnew, BLACK or WHITE for eeschema
m_colorSettings = nullptr; m_colorSettings = nullptr;
m_MsgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight(); m_MsgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight();
m_zoomLevelCoeff = 1.0;
m_userUnits = EDA_UNITS::MILLIMETRES; m_userUnits = EDA_UNITS::MILLIMETRES;
m_PolarCoords = false; m_PolarCoords = false;
m_findReplaceData = new wxFindReplaceData( wxFR_DOWN ); m_findReplaceData = new wxFindReplaceData( wxFR_DOWN );
@ -342,12 +341,6 @@ void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
} }
double EDA_DRAW_FRAME::GetZoom()
{
return GetScreen()->GetZoom();
}
void EDA_DRAW_FRAME::OnMove( wxMoveEvent& aEvent ) void EDA_DRAW_FRAME::OnMove( wxMoveEvent& aEvent )
{ {
// If the window is moved to a different display, the scaling factor may change // If the window is moved to a different display, the scaling factor may change
@ -458,7 +451,8 @@ const wxString EDA_DRAW_FRAME::GetZoomLevelIndicator() const
{ {
// returns a human readable value which can be displayed as zoom // returns a human readable value which can be displayed as zoom
// level indicator in dialogs. // level indicator in dialogs.
return wxString::Format( wxT( "Z %.2f" ), m_canvas->GetGAL()->GetZoomFactor() ); double zoom = m_canvas->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
return wxString::Format( wxT( "Z %.2f" ), zoom );
} }

View File

@ -255,6 +255,9 @@ void APP_SETTINGS_BASE::addParamsForWindow( WINDOW_SETTINGS* aWindow, const std:
m_params.emplace_back( new PARAM<int>( aJsonPath + ".pos_y", &aWindow->pos_y, 0 ) ); m_params.emplace_back( new PARAM<int>( aJsonPath + ".pos_y", &aWindow->pos_y, 0 ) );
m_params.emplace_back( new PARAM_LIST<double>( aJsonPath + ".zoom_factors",
&aWindow->zoom_factors, {} ) );
m_params.emplace_back( new PARAM<bool>( aJsonPath + ".grid.axes_enabled", m_params.emplace_back( new PARAM<bool>( aJsonPath + ".grid.axes_enabled",
&aWindow->grid.axes_enabled, false ) ); &aWindow->grid.axes_enabled, false ) );

View File

@ -195,30 +195,19 @@ int COMMON_TOOLS::ZoomInOutCenter( const TOOL_EVENT& aEvent )
int COMMON_TOOLS::doZoomInOut( bool aDirection, bool aCenterOnCursor ) int COMMON_TOOLS::doZoomInOut( bool aDirection, bool aCenterOnCursor )
{ {
double zoom = m_frame->GetCanvas()->GetLegacyZoom(); double zoom = getView()->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
// Step must be AT LEAST 1.3 // Step must be AT LEAST 1.3
if( aDirection ) if( aDirection )
zoom /= 1.3;
else
zoom *= 1.3; zoom *= 1.3;
else
zoom /= 1.3;
// Now look for the next closest menu step // Now look for the next closest menu step
std::vector<double>& zoomList = m_frame->GetScreen()->m_ZoomList; std::vector<double>& zoomList = m_toolMgr->GetSettings()->m_Window.zoom_factors;
int idx; int idx;
if( aDirection ) if( aDirection )
{
for( idx = zoomList.size() - 1; idx >= 0; --idx )
{
if( zoomList[idx] <= zoom )
break;
}
if( idx < 0 )
idx = 0; // if we ran off the end then peg to the end
}
else
{ {
for( idx = 0; idx < (int)zoomList.size(); ++idx ) for( idx = 0; idx < (int)zoomList.size(); ++idx )
{ {
@ -226,8 +215,19 @@ int COMMON_TOOLS::doZoomInOut( bool aDirection, bool aCenterOnCursor )
break; break;
} }
if( idx >= (int)zoomList.size() ) if( idx >= zoomList.size() )
idx = zoomList.size() - 1; // if we ran off the end then peg to the end idx = (int) zoomList.size() - 1; // if we ran off the end then peg to the end
}
else
{
for( idx = (int) zoomList.size() - 1; idx >= 0; --idx )
{
if( zoomList[idx] <= zoom )
break;
}
if( idx < 0 )
idx = 0; // if we ran off the end then peg to the end
} }
return doZoomToPreset( idx + 1, aCenterOnCursor ); return doZoomToPreset( idx + 1, aCenterOnCursor );
@ -313,15 +313,14 @@ int COMMON_TOOLS::CenterContents( const TOOL_EVENT& aEvent )
int COMMON_TOOLS::ZoomPreset( const TOOL_EVENT& aEvent ) int COMMON_TOOLS::ZoomPreset( const TOOL_EVENT& aEvent )
{ {
unsigned int idx = aEvent.Parameter<intptr_t>(); unsigned int idx = aEvent.Parameter<intptr_t>();
return doZoomToPreset( idx, false ); return doZoomToPreset( (int) idx, false );
} }
// Note: idx == 0 is Auto; idx == 1 is first entry in zoomList // Note: idx == 0 is Auto; idx == 1 is first entry in zoomList
int COMMON_TOOLS::doZoomToPreset( int idx, bool aCenterOnCursor ) int COMMON_TOOLS::doZoomToPreset( int idx, bool aCenterOnCursor )
{ {
std::vector<double>& zoomList = m_frame->GetScreen()->m_ZoomList; std::vector<double>& zoomList = m_toolMgr->GetSettings()->m_Window.zoom_factors;
KIGFX::VIEW* view = m_frame->GetCanvas()->GetView();
if( idx == 0 ) // Zoom Auto if( idx == 0 ) // Zoom Auto
{ {
@ -333,18 +332,18 @@ int COMMON_TOOLS::doZoomToPreset( int idx, bool aCenterOnCursor )
idx--; idx--;
} }
double scale = m_frame->GetZoomLevelCoeff() / zoomList[idx]; double scale = zoomList[idx] * ZOOM_COEFF;
if( aCenterOnCursor ) if( aCenterOnCursor )
{ {
view->SetScale( scale, getViewControls()->GetCursorPosition() ); getView()->SetScale( scale, getViewControls()->GetCursorPosition() );
if( getViewControls()->IsCursorWarpingEnabled() ) if( getViewControls()->IsCursorWarpingEnabled() )
getViewControls()->CenterOnCursor(); getViewControls()->CenterOnCursor();
} }
else else
{ {
view->SetScale( scale ); getView()->SetScale( scale );
} }
return 0; return 0;

View File

@ -2,8 +2,8 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015 CERN * Copyright (C) 2015 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
* Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
* @author Maciej Suminski <maciej.suminski@cern.ch>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -26,7 +26,6 @@
#include <tool/grid_menu.h> #include <tool/grid_menu.h>
#include <id.h> #include <id.h>
#include <eda_draw_frame.h> #include <eda_draw_frame.h>
#include <base_screen.h>
#include <settings/app_settings.h> #include <settings/app_settings.h>
#include <tool/actions.h> #include <tool/actions.h>
#include <bitmaps.h> #include <bitmaps.h>

View File

@ -2,6 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2015 CERN * Copyright (C) 2015 CERN
* Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
* @author Maciej Suminski <maciej.suminski@cern.ch> * @author Maciej Suminski <maciej.suminski@cern.ch>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -23,61 +24,49 @@
*/ */
#include <tool/zoom_menu.h> #include <tool/zoom_menu.h>
#include <id.h>
#include <eda_draw_frame.h> #include <eda_draw_frame.h>
#include <base_screen.h> #include <settings/app_settings.h>
#include <tool/actions.h> #include <tool/actions.h>
#include <gal/graphics_abstraction_layer.h>
#include <bitmaps.h> #include <bitmaps.h>
#include <convert_to_biu.h>
#include <functional> #include <functional>
using namespace std::placeholders; using namespace std::placeholders;
ZOOM_MENU::ZOOM_MENU( EDA_DRAW_FRAME* aParent ) : ZOOM_MENU::ZOOM_MENU( EDA_DRAW_FRAME* aParent ) :
ACTION_MENU( true ), ACTION_MENU( true ),
m_parent( aParent ) m_parent( aParent )
{ {
BASE_SCREEN* screen = aParent->GetScreen();
SetTitle( _( "Zoom" ) ); SetTitle( _( "Zoom" ) );
SetIcon( zoom_selection_xpm ); SetIcon( zoom_selection_xpm );
//int zoom = screen->GetZoom(); int i = 1; // 0 reserved for menus which support auto-zoom
int maxZoomIds = std::min( ID_POPUP_ZOOM_LEVEL_END - ID_POPUP_ZOOM_LEVEL_START,
(int) screen->m_ZoomList.size() );
for( int i = 0; i < maxZoomIds; ++i ) for( double factor : m_parent->config()->m_Window.zoom_factors )
{ Append( i++, wxString::Format( _( "Zoom: %.2f" ), factor ), wxEmptyString, wxITEM_CHECK );
Append( ID_POPUP_ZOOM_LEVEL_START+1 + i, // ID_POPUP_ZOOM_LEVEL_START == Auto
wxString::Format( _( "Zoom: %.2f" ), aParent->GetZoomLevelCoeff() / screen->m_ZoomList[i] ),
wxEmptyString, wxITEM_CHECK );
}
} }
OPT_TOOL_EVENT ZOOM_MENU::eventHandler( const wxMenuEvent& aEvent ) OPT_TOOL_EVENT ZOOM_MENU::eventHandler( const wxMenuEvent& aEvent )
{ {
OPT_TOOL_EVENT event( ACTIONS::zoomPreset.MakeEvent() ); OPT_TOOL_EVENT event( ACTIONS::zoomPreset.MakeEvent() );
intptr_t idx = aEvent.GetId() - ID_POPUP_ZOOM_LEVEL_START; event->SetParameter( (intptr_t) aEvent.GetId() );
event->SetParameter( idx );
return event; return event;
} }
void ZOOM_MENU::update() void ZOOM_MENU::update()
{ {
BASE_SCREEN* screen = m_parent->GetScreen(); double zoom = m_parent->GetCanvas()->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
double zoom = screen->GetZoom();
const std::vector<double>& zoomList = m_parent->GetScreen()->m_ZoomList;
// Check the current zoom const std::vector<double>& zoomList = m_parent->config()->m_Window.zoom_factors;
int maxZoomIds = std::min( ID_POPUP_ZOOM_LEVEL_END - ID_POPUP_ZOOM_LEVEL_START,
(int) screen->m_ZoomList.size() );
for( int i = 0; i < maxZoomIds; ++i ) for( int i = 0; i < zoomList.size(); ++i )
{ {
// Search for a value near the current zoom setting: // Search for a value near the current zoom setting:
double rel_error = std::fabs( zoomList[i] - zoom )/zoom; double rel_error = std::fabs( zoomList[i] - zoom ) / zoom;
Check( ID_POPUP_ZOOM_LEVEL_START+1 + i, rel_error < 0.1 ); // IDs start with 1 (leaving 0 for auto-zoom)
Check( i+1, rel_error < 0.1 );
} }
} }

View File

@ -146,8 +146,6 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa
auto& galOpts = GetGalDisplayOptions(); auto& galOpts = GetGalDisplayOptions();
galOpts.m_axesEnabled = true; galOpts.m_axesEnabled = true;
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
// Restore last zoom. (If auto-zooming we'll adjust when we load the footprint.) // Restore last zoom. (If auto-zooming we'll adjust when we load the footprint.)

View File

@ -103,7 +103,6 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
{ {
if( *sheetWithComponentFound != m_frame->GetCurrentSheet() ) if( *sheetWithComponentFound != m_frame->GetCurrentSheet() )
{ {
sheetWithComponentFound->LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() );
m_frame->Schematic().SetCurrentSheet( *sheetWithComponentFound ); m_frame->Schematic().SetCurrentSheet( *sheetWithComponentFound );
m_frame->DisplayCurrentSheet(); m_frame->DisplayCurrentSheet();
} }

View File

@ -361,7 +361,6 @@ void DIALOG_ERC::OnERCItemSelected( wxDataViewEvent& aEvent )
m_parent->SetCurrentSheet( sheet ); m_parent->SetCurrentSheet( sheet );
m_parent->DisplayCurrentSheet(); m_parent->DisplayCurrentSheet();
sheet.LastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() );
m_parent->RedrawScreen( (wxPoint) m_parent->GetScreen()->m_ScrollCenter, false ); m_parent->RedrawScreen( (wxPoint) m_parent->GetScreen()->m_ScrollCenter, false );
} }

View File

@ -178,7 +178,6 @@ void DIALOG_MIGRATE_BUSES::onItemSelected( wxListEvent& aEvent )
if( sheet != current ) if( sheet != current )
{ {
sheet.LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() );
sheet.UpdateAllScreenReferences(); sheet.UpdateAllScreenReferences();
m_frame->Schematic().SetCurrentSheet( sheet ); m_frame->Schematic().SetCurrentSheet( sheet );
sheet.LastScreen()->TestDanglingEnds(); sheet.LastScreen()->TestDanglingEnds();

View File

@ -422,7 +422,6 @@ bool SCH_PRINTOUT::OnBeginDocument( int startPage, int endPage )
*/ */
void SCH_PRINTOUT::PrintPage( SCH_SCREEN* aScreen ) void SCH_PRINTOUT::PrintPage( SCH_SCREEN* aScreen )
{ {
int oldZoom;
wxPoint tmp_startvisu; wxPoint tmp_startvisu;
wxSize pageSizeIU; // Page size in internal units wxSize pageSizeIU; // Page size in internal units
wxPoint old_org; wxPoint old_org;
@ -431,9 +430,8 @@ void SCH_PRINTOUT::PrintPage( SCH_SCREEN* aScreen )
wxBusyCursor dummy; wxBusyCursor dummy;
// Save current scale factor, offsets, and clip box. // Save current offsets and clip box.
tmp_startvisu = aScreen->m_StartVisu; tmp_startvisu = aScreen->m_StartVisu;
oldZoom = aScreen->GetZoom();
old_org = aScreen->m_DrawOrg; old_org = aScreen->m_DrawOrg;
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager(); SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
@ -532,7 +530,6 @@ void SCH_PRINTOUT::PrintPage( SCH_SCREEN* aScreen )
aScreen->m_StartVisu = tmp_startvisu; aScreen->m_StartVisu = tmp_startvisu;
aScreen->m_DrawOrg = old_org; aScreen->m_DrawOrg = old_org;
aScreen->SetZoom( oldZoom );
} }

View File

@ -440,6 +440,29 @@ void SCH_BASE_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
"1 mil" }; "1 mil" };
} }
if( aCfg->m_Window.zoom_factors.empty() )
{
aCfg->m_Window.zoom_factors = { 0.5,
0.7,
1.0,
1.5,
2.0,
3.0,
4.5,
6.5,
10.0,
15.0,
20.0,
30.0,
45.0,
65.0,
100.0,
150.0 };
}
for( double& factor : aCfg->m_Window.zoom_factors )
factor = std::min( factor, MAX_ZOOM_FACTOR );
wxString templateFieldNames = cfg->m_Drawing.field_names; wxString templateFieldNames = cfg->m_Drawing.field_names;
if( !templateFieldNames.IsEmpty() ) if( !templateFieldNames.IsEmpty() )

View File

@ -87,10 +87,6 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aWindo
m_defaults( &m_base_frame_defaults ) m_defaults( &m_base_frame_defaults )
{ {
createCanvas(); createCanvas();
// Adjusted to display zoom level ~ 1 when the screen shows a 1:1 image
// Obviously depends on the monitor, but this is an acceptable value
m_zoomLevelCoeff = 11.0 * IU_PER_MILS;
} }
@ -117,12 +113,6 @@ LIBEDIT_SETTINGS* SCH_BASE_FRAME::libeditconfig() const
} }
const wxString SCH_BASE_FRAME::GetZoomLevelIndicator() const
{
return EDA_DRAW_FRAME::GetZoomLevelIndicator();
}
void SCH_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings ) void SCH_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
{ {
GetScreen()->SetPageSettings( aPageSettings ); GetScreen()->SetPageSettings( aPageSettings );
@ -283,15 +273,6 @@ void SCH_BASE_FRAME::RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointe
{ {
KIGFX::GAL* gal = GetCanvas()->GetGAL(); KIGFX::GAL* gal = GetCanvas()->GetGAL();
double selectedZoom = GetScreen()->GetZoom();
double zoomFactor = gal->GetWorldScale() / gal->GetZoomFactor();
double scale = 1.0 / ( zoomFactor * selectedZoom );
if( aCenterPoint != wxPoint( 0, 0 ) )
GetCanvas()->GetView()->SetScale( scale, aCenterPoint );
else
GetCanvas()->GetView()->SetScale( scale );
GetCanvas()->GetView()->SetCenter( aCenterPoint ); GetCanvas()->GetView()->SetCenter( aCenterPoint );
if( aWarpPointer ) if( aWarpPointer )

View File

@ -130,14 +130,6 @@ public:
*/ */
virtual bool GetShowAllPins() const { return true; } virtual bool GetShowAllPins() const { return true; }
/**
* Function GetZoomLevelIndicator
* returns a human readable value which can be displayed as zoom
* level indicator in dialogs.
* Virtual from the base class
*/
const wxString GetZoomLevelIndicator() const override;
void SetPageSettings( const PAGE_INFO& aPageSettings ) override; void SetPageSettings( const PAGE_INFO& aPageSettings ) override;
const PAGE_INFO& GetPageSettings () const override; const PAGE_INFO& GetPageSettings () const override;
const wxSize GetPageSizeIU() const override; const wxSize GetPageSizeIU() const override;

View File

@ -430,8 +430,6 @@ void SCH_EDIT_FRAME::CreateScreens()
screen->SetMaxUndoItems( m_UndoRedoCountMax ); screen->SetMaxUndoItems( m_UndoRedoCountMax );
SetScreen( screen ); SetScreen( screen );
} }
GetScreen()->SetZoom( 32.0 );
} }

View File

@ -66,35 +66,6 @@
// TODO(JE) Debugging only // TODO(JE) Debugging only
#include <profile.h> #include <profile.h>
#define ZOOM_FACTOR( x ) ( x * IU_PER_MILS )
/* Default zoom values. Limited to these values to keep a decent size
* to menus
*/
static double SchematicZoomList[] =
{
ZOOM_FACTOR( 0.5 ),
ZOOM_FACTOR( 0.7 ),
ZOOM_FACTOR( 1.0 ),
ZOOM_FACTOR( 1.5 ),
ZOOM_FACTOR( 2.0 ),
ZOOM_FACTOR( 3.0 ),
ZOOM_FACTOR( 4.0 ),
ZOOM_FACTOR( 6.0 ),
ZOOM_FACTOR( 8.0 ),
ZOOM_FACTOR( 11.0 ),
ZOOM_FACTOR( 13.0 ),
ZOOM_FACTOR( 16.0 ),
ZOOM_FACTOR( 20.0 ),
ZOOM_FACTOR( 26.0 ),
ZOOM_FACTOR( 32.0 ),
ZOOM_FACTOR( 48.0 ),
ZOOM_FACTOR( 64.0 ),
ZOOM_FACTOR( 80.0 ),
ZOOM_FACTOR( 128.0 )
};
SCH_SCREEN::SCH_SCREEN( EDA_ITEM* aParent ) : SCH_SCREEN::SCH_SCREEN( EDA_ITEM* aParent ) :
BASE_SCREEN( aParent, SCH_SCREEN_T ), BASE_SCREEN( aParent, SCH_SCREEN_T ),
@ -102,11 +73,6 @@ SCH_SCREEN::SCH_SCREEN( EDA_ITEM* aParent ) :
{ {
m_modification_sync = 0; m_modification_sync = 0;
SetZoom( 32 );
for( unsigned zoom : SchematicZoomList )
m_ZoomList.push_back( zoom );
m_refCount = 0; m_refCount = 0;
// Suitable for schematic only. For libedit and viewlib, must be set to true // Suitable for schematic only. For libedit and viewlib, must be set to true

View File

@ -585,13 +585,10 @@ void SCH_EDIT_FRAME::DrawCurrentSheetToClipboard()
// Set draw offset, zoom... to values needed to draw in the memory DC // Set draw offset, zoom... to values needed to draw in the memory DC
// after saving initial values: // after saving initial values:
wxPoint tmp_startvisu = screen->m_StartVisu; wxPoint tmp_startvisu = screen->m_StartVisu;
double tmpzoom = screen->GetZoom(); wxPoint old_org = screen->m_DrawOrg;
wxPoint old_org = screen->m_DrawOrg;
screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0; screen->m_DrawOrg.x = screen->m_DrawOrg.y = 0;
screen->m_StartVisu.x = screen->m_StartVisu.y = 0; screen->m_StartVisu.x = screen->m_StartVisu.y = 0;
screen->SetZoom( 1 ); // we use zoom = 1 in draw functions.
wxMemoryDC dc; wxMemoryDC dc;
wxBitmap image( dcsize ); wxBitmap image( dcsize );
dc.SelectObject( image ); dc.SelectObject( image );
@ -620,7 +617,6 @@ void SCH_EDIT_FRAME::DrawCurrentSheetToClipboard()
screen->m_StartVisu = tmp_startvisu; screen->m_StartVisu = tmp_startvisu;
screen->m_DrawOrg = old_org; screen->m_DrawOrg = old_org;
screen->SetZoom( tmpzoom );
} }

View File

@ -433,7 +433,6 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent )
m_frame->Schematic().SetCurrentSheet( *sheet ); m_frame->Schematic().SetCurrentSheet( *sheet );
m_frame->GetCurrentSheet().UpdateAllScreenReferences(); m_frame->GetCurrentSheet().UpdateAllScreenReferences();
screen->SetZoom( m_frame->GetScreen()->GetZoom() );
screen->TestDanglingEnds(); screen->TestDanglingEnds();
m_frame->SetScreen( screen ); m_frame->SetScreen( screen );

View File

@ -30,7 +30,6 @@ set( GERBVIEW_SRCS
am_param.cpp am_param.cpp
am_primitive.cpp am_primitive.cpp
DCodeSelectionbox.cpp DCodeSelectionbox.cpp
gbr_screen.cpp
gbr_layout.cpp gbr_layout.cpp
gerber_file_image.cpp gerber_file_image.cpp
gerber_file_image_list.cpp gerber_file_image_list.cpp

View File

@ -34,6 +34,8 @@
#include <gerber_file_image_list.h> #include <gerber_file_image_list.h>
#include <gerbview_layer_widget.h> #include <gerbview_layer_widget.h>
#include <view/view.h> #include <view/view.h>
#include <base_screen.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
bool GERBVIEW_FRAME::Clear_DrawLayers( bool query ) bool GERBVIEW_FRAME::Clear_DrawLayers( bool query )

View File

@ -1,71 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012-2014 Jean-Pierre Charras jp.charras at wanadoo.fr
* Copyright (C) 1992-2020 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <fctsys.h>
#include <macros.h>
#include <gbr_screen.h>
/**
Default GerbView zoom values.
Roughly a 1.5 progression.
*/
static const double gbrZoomList[] =
{
ZOOM_FACTOR( 0.022 ),
ZOOM_FACTOR( 0.035 ),
ZOOM_FACTOR( 0.05 ),
ZOOM_FACTOR( 0.08 ),
ZOOM_FACTOR( 0.13 ),
ZOOM_FACTOR( 0.22 ),
ZOOM_FACTOR( 0.35 ),
ZOOM_FACTOR( 0.6 ),
ZOOM_FACTOR( 1.0 ),
ZOOM_FACTOR( 1.5 ),
ZOOM_FACTOR( 2.2 ),
ZOOM_FACTOR( 3.5 ),
ZOOM_FACTOR( 5.0 ),
ZOOM_FACTOR( 8.0 ),
ZOOM_FACTOR( 13.0 ),
ZOOM_FACTOR( 20.0 ),
ZOOM_FACTOR( 35.0 ),
ZOOM_FACTOR( 50.0 ),
ZOOM_FACTOR( 80.0 ),
ZOOM_FACTOR( 130.0 ),
ZOOM_FACTOR( 220.0 )
};
GBR_SCREEN::GBR_SCREEN( const wxSize& aPageSizeIU ) :
BASE_SCREEN( SCREEN_T )
{
for( unsigned i = 0; i < arrayDim( gbrZoomList ); ++i )
m_ZoomList.push_back( gbrZoomList[i] );
SetZoom( ZOOM_FACTOR( 350 ) ); // a default value for zoom
m_Active_Layer = 0; // default active layer = first graphic layer
InitDataPoints( aPageSizeIU );
}

View File

@ -1,53 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012-2014 Jean-Pierre Charras jp.charras at wanadoo.fr
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef GBR_SCREEN_H
#define GBR_SCREEN_H
#include <base_units.h>
#include <base_screen.h>
#define ZOOM_FACTOR( x ) ( x * IU_PER_MILS )
/* Handle info to display a board */
class GBR_SCREEN : public BASE_SCREEN
{
public:
int m_Active_Layer;
/**
* Constructor
* @param aPageSizeIU is the size of the initial paper page in internal units.
*/
GBR_SCREEN( const wxSize& aPageSizeIU );
/**
* Function ClearUndoORRedoList
* virtual pure in BASE_SCREEN, so it must be defined here
*/
void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 ) override
{ }
};
#endif // GBR_SCREEN_H

View File

@ -50,6 +50,7 @@
#include <tools/gerbview_selection_tool.h> #include <tools/gerbview_selection_tool.h>
#include <tools/gerbview_control.h> #include <tools/gerbview_control.h>
#include <view/view.h> #include <view/view.h>
#include <base_screen.h>
#include <gerbview_painter.h> #include <gerbview_painter.h>
#include <geometry/shape_poly_set.h> #include <geometry/shape_poly_set.h>
#include <widgets/paged_dialog.h> #include <widgets/paged_dialog.h>
@ -62,28 +63,24 @@
GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent ) GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent )
: EDA_DRAW_FRAME( aKiway, aParent, FRAME_GERBER, wxT( "GerbView" ), wxDefaultPosition, : EDA_DRAW_FRAME( aKiway, aParent, FRAME_GERBER, wxT( "GerbView" ), wxDefaultPosition,
wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, GERBVIEW_FRAME_NAME ), wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, GERBVIEW_FRAME_NAME ),
m_activeLayer( 0 ),
m_zipFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_ZIP_FILE1, m_zipFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_ZIP_FILE1,
ID_GERBVIEW_ZIP_FILE_LIST_CLEAR, _( "Clear Recent Zip Files" ) ), ID_GERBVIEW_ZIP_FILE_LIST_CLEAR, _( "Clear Recent Zip Files" ) ),
m_drillFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_DRILL_FILE1, m_drillFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_DRILL_FILE1,
ID_GERBVIEW_DRILL_FILE_LIST_CLEAR, _( "Clear Recent Drill Files" ) ), ID_GERBVIEW_DRILL_FILE_LIST_CLEAR, _( "Clear Recent Drill Files" ) ),
m_jobFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_JOB_FILE1, m_jobFileHistory( DEFAULT_FILE_HISTORY_SIZE, ID_GERBVIEW_JOB_FILE1,
ID_GERBVIEW_JOB_FILE_LIST_CLEAR, _( "Clear Recent Job Files" ) ) ID_GERBVIEW_JOB_FILE_LIST_CLEAR, _( "Clear Recent Job Files" ) ),
m_TextInfo( nullptr )
{ {
m_gerberLayout = NULL; m_gerberLayout = NULL;
m_zoomLevelCoeff = ZOOM_FACTOR( 110 ); // Adjusted to roughly displays zoom level = 1
// when the screen shows a 1:1 image
// obviously depends on the monitor,
// but this is an acceptable value
m_show_layer_manager_tools = true; m_show_layer_manager_tools = true;
m_showBorderAndTitleBlock = false; // true for reference drawings. m_showBorderAndTitleBlock = false; // true for reference drawings.
m_SelLayerBox = NULL; m_SelLayerBox = NULL;
m_DCodeSelector = NULL; m_DCodeSelector = NULL;
m_SelComponentBox = nullptr; m_SelComponentBox = nullptr;
m_SelNetnameBox = nullptr; m_SelNetnameBox = nullptr;
m_SelAperAttributesBox = nullptr; m_SelAperAttributesBox = nullptr;
m_displayMode = 0; m_displayMode = 0;
m_AboutTitle = "GerbView"; m_AboutTitle = "GerbView";
SHAPE_POLY_SET dummy; // A ugly trick to force the linker to include SHAPE_POLY_SET dummy; // A ugly trick to force the linker to include
@ -115,7 +112,7 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent )
SetVisibleLayers( LSET::AllLayersMask() ); // All draw layers visible. SetVisibleLayers( LSET::AllLayersMask() ); // All draw layers visible.
SetScreen( new GBR_SCREEN( GetPageSettings().GetSizeIU() ) ); SetScreen( new BASE_SCREEN( GetPageSettings().GetSizeIU() ) );
// Create the PCB_LAYER_WIDGET *after* SetLayout(): // Create the PCB_LAYER_WIDGET *after* SetLayout():
m_LayersManager = new GERBER_LAYER_WIDGET( this, GetCanvas() ); m_LayersManager = new GERBER_LAYER_WIDGET( this, GetCanvas() );
@ -300,35 +297,62 @@ void GERBVIEW_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{ {
EDA_DRAW_FRAME::LoadSettings( aCfg ); EDA_DRAW_FRAME::LoadSettings( aCfg );
if( aCfg->m_Window.grid.sizes.empty() )
{
aCfg->m_Window.grid.sizes = { "100 mil",
"50 mil",
"25 mil",
"20 mil",
"10 mil",
"5 mil",
"2.5 mil",
"2 mil",
"1 mil",
"0.5 mil",
"0.2 mil",
"0.1 mil",
"5.0 mm",
"2.5 mm",
"1.0 mm",
"0.5 mm",
"0.25 mm",
"0.2 mm",
"0.1 mm",
"0.05 mm",
"0.025 mm",
"0.01 mm" };
}
if( aCfg->m_Window.zoom_factors.empty() )
{
aCfg->m_Window.zoom_factors = { 0.022,
0.035,
0.05,
0.08,
0.13,
0.22,
0.35,
0.6,
1.0,
2.2,
3.5,
5.0,
8.0,
13.0,
22.0,
35.0,
50.0,
80.0,
130.0,
220.0 };
}
for( double& factor : aCfg->m_Window.zoom_factors )
factor = std::min( factor, MAX_ZOOM_FACTOR );
GERBVIEW_SETTINGS* cfg = dynamic_cast<GERBVIEW_SETTINGS*>( aCfg ); GERBVIEW_SETTINGS* cfg = dynamic_cast<GERBVIEW_SETTINGS*>( aCfg );
wxCHECK( cfg, /*void*/ ); wxCHECK( cfg, /*void*/ );
if( cfg->m_Window.grid.sizes.empty() )
{
cfg->m_Window.grid.sizes = { "100 mil",
"50 mil",
"25 mil",
"20 mil",
"10 mil",
"5 mil",
"2.5 mil",
"2 mil",
"1 mil",
"0.5 mil",
"0.2 mil",
"0.1 mil",
"5.0 mm",
"2.5 mm",
"1.0 mm",
"0.5 mm",
"0.25 mm",
"0.2 mm",
"0.1 mm",
"0.05 mm",
"0.025 mm",
"0.01 mm" };
}
SetElementVisibility( LAYER_WORKSHEET, cfg->m_Appearance.show_border_and_titleblock ); SetElementVisibility( LAYER_WORKSHEET, cfg->m_Appearance.show_border_and_titleblock );
PAGE_INFO pageInfo( wxT( "GERBER" ) ); PAGE_INFO pageInfo( wxT( "GERBER" ) );
@ -860,15 +884,9 @@ void GERBVIEW_FRAME::SetLayerColor( int aLayer, COLOR4D aColor )
} }
int GERBVIEW_FRAME::GetActiveLayer()
{
return ( (GBR_SCREEN*) GetScreen() )->m_Active_Layer;
}
void GERBVIEW_FRAME::SetActiveLayer( int aLayer, bool doLayerWidgetUpdate ) void GERBVIEW_FRAME::SetActiveLayer( int aLayer, bool doLayerWidgetUpdate )
{ {
( (GBR_SCREEN*) GetScreen() )->m_Active_Layer = aLayer; m_activeLayer = aLayer;
if( doLayerWidgetUpdate ) if( doLayerWidgetUpdate )
m_LayersManager->SelectLayer( aLayer ); m_LayersManager->SelectLayer( aLayer );
@ -886,10 +904,9 @@ void GERBVIEW_FRAME::SetActiveLayer( int aLayer, bool doLayerWidgetUpdate )
void GERBVIEW_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings ) void GERBVIEW_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
{ {
m_paper = aPageSettings; m_paper = aPageSettings;
GBR_SCREEN* screen = static_cast<GBR_SCREEN*>( GetScreen() );
if( screen ) if( GetScreen() )
screen->InitDataPoints( aPageSettings.GetSizeIU() ); GetScreen()->InitDataPoints( aPageSettings.GetSizeIU() );
auto drawPanel = static_cast<GERBVIEW_DRAW_PANEL_GAL*>( GetCanvas() ); auto drawPanel = static_cast<GERBVIEW_DRAW_PANEL_GAL*>( GetCanvas() );
@ -897,7 +914,7 @@ void GERBVIEW_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
auto worksheet = new KIGFX::WS_PROXY_VIEW_ITEM( IU_PER_MILS, &GetPageSettings(), auto worksheet = new KIGFX::WS_PROXY_VIEW_ITEM( IU_PER_MILS, &GetPageSettings(),
&Prj(), &GetTitleBlock() ); &Prj(), &GetTitleBlock() );
if( screen != NULL ) if( GetScreen() )
{ {
worksheet->SetSheetNumber( 1 ); worksheet->SetSheetNumber( 1 );
worksheet->SetSheetCount( 1 ); worksheet->SetSheetCount( 1 );
@ -987,9 +1004,7 @@ void GERBVIEW_FRAME::UpdateStatusBar()
{ {
EDA_DRAW_FRAME::UpdateStatusBar(); EDA_DRAW_FRAME::UpdateStatusBar();
GBR_SCREEN* screen = (GBR_SCREEN*) GetScreen(); if( !GetScreen() )
if( !screen )
return; return;
wxString line; wxString line;
@ -997,8 +1012,8 @@ void GERBVIEW_FRAME::UpdateStatusBar()
if( GetShowPolarCoords() ) // display relative polar coordinates if( GetShowPolarCoords() ) // display relative polar coordinates
{ {
double dx = cursorPos.x - screen->m_LocalOrigin.x; double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
double dy = cursorPos.y - screen->m_LocalOrigin.y; double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
double theta = RAD2DEG( atan2( -dy, dx ) ); double theta = RAD2DEG( atan2( -dy, dx ) );
double ro = hypot( dx, dy ); double ro = hypot( dx, dy );
wxString formatter; wxString formatter;
@ -1051,8 +1066,8 @@ void GERBVIEW_FRAME::UpdateStatusBar()
if( !GetShowPolarCoords() ) // display relative cartesian coordinates if( !GetShowPolarCoords() ) // display relative cartesian coordinates
{ {
// Display relative coordinates: // Display relative coordinates:
dXpos = To_User_Unit( GetUserUnits(), cursorPos.x - screen->m_LocalOrigin.x ); dXpos = To_User_Unit( GetUserUnits(), cursorPos.x - GetScreen()->m_LocalOrigin.x );
dYpos = To_User_Unit( GetUserUnits(), cursorPos.y - screen->m_LocalOrigin.y ); dYpos = To_User_Unit( GetUserUnits(), cursorPos.y - GetScreen()->m_LocalOrigin.y );
// We already decided the formatter above // We already decided the formatter above
line.Printf( relformatter, dXpos, dYpos, hypot( dXpos, dYpos ) ); line.Printf( relformatter, dXpos, dYpos, hypot( dXpos, dYpos ) );
@ -1063,12 +1078,6 @@ void GERBVIEW_FRAME::UpdateStatusBar()
} }
const wxString GERBVIEW_FRAME::GetZoomLevelIndicator() const
{
return EDA_DRAW_FRAME::GetZoomLevelIndicator();
}
GERBER_FILE_IMAGE* GERBVIEW_FRAME::GetGbrImage( int aIdx ) const GERBER_FILE_IMAGE* GERBVIEW_FRAME::GetGbrImage( int aIdx ) const
{ {
return m_gerberLayout->GetImagesList()->GetGbrImage( aIdx ); return m_gerberLayout->GetImagesList()->GetGbrImage( aIdx );
@ -1184,23 +1193,19 @@ void GERBVIEW_FRAME::updateZoomSelectBox()
if( m_zoomSelectBox == NULL ) if( m_zoomSelectBox == NULL )
return; return;
wxString msg; double zoom = GetCanvas()->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
m_zoomSelectBox->Clear(); m_zoomSelectBox->Clear();
m_zoomSelectBox->Append( _( "Zoom Auto" ) ); m_zoomSelectBox->Append( _( "Zoom Auto" ) );
m_zoomSelectBox->SetSelection( 0 ); m_zoomSelectBox->SetSelection( 0 );
for( unsigned i = 0; i < GetScreen()->m_ZoomList.size(); ++i ) for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); ++i )
{ {
msg = _( "Zoom " ); double current = config()->m_Window.zoom_factors[i];
double level = m_zoomLevelCoeff / (double)GetScreen()->m_ZoomList[i]; m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
wxString value = wxString::Format( wxT( "%.2f" ), level );
msg += value;
m_zoomSelectBox->Append( msg ); if( zoom == current )
if( GetScreen()->GetZoom() == GetScreen()->m_ZoomList[i] )
m_zoomSelectBox->SetSelection( i + 1 ); m_zoomSelectBox->SetSelection( i + 1 );
} }
} }

View File

@ -30,9 +30,9 @@
#include <gerbview.h> #include <gerbview.h>
#include <convert_to_biu.h> #include <convert_to_biu.h>
#include <gbr_layout.h> #include <gbr_layout.h>
#include <gbr_screen.h>
#include <page_info.h> #include <page_info.h>
#include <gbr_display_options.h> #include <gbr_display_options.h>
#include <undo_redo_container.h>
#define NO_AVAILABLE_LAYERS UNDEFINED_LAYER #define NO_AVAILABLE_LAYERS UNDEFINED_LAYER
@ -55,6 +55,7 @@ class REPORTER;
class GERBVIEW_FRAME : public EDA_DRAW_FRAME // PCB_BASE_FRAME class GERBVIEW_FRAME : public EDA_DRAW_FRAME // PCB_BASE_FRAME
{ {
GBR_LAYOUT* m_gerberLayout; GBR_LAYOUT* m_gerberLayout;
int m_activeLayer;
wxPoint m_grid_origin; wxPoint m_grid_origin;
PAGE_INFO m_paper; // used only to show paper limits to screen PAGE_INFO m_paper; // used only to show paper limits to screen
GBR_DISPLAY_OPTIONS m_DisplayOptions; GBR_DISPLAY_OPTIONS m_DisplayOptions;
@ -221,14 +222,6 @@ public:
void ReCreateMenuBar() override; void ReCreateMenuBar() override;
void UpdateStatusBar() override; void UpdateStatusBar() override;
/**
* Function GetZoomLevelIndicator
* returns a human readable value which can be displayed as zoom
* level indicator in dialogs.
* Virtual from the base class
*/
const wxString GetZoomLevelIndicator() const override;
/** /**
* Function GetDisplayMode * Function GetDisplayMode
* @return 0 for fast mode (not fully compatible with negative objects) * @return 0 for fast mode (not fully compatible with negative objects)
@ -327,7 +320,7 @@ public:
* Function SetActiveLayer * Function SetActiveLayer
* returns the active layer * returns the active layer
*/ */
int GetActiveLayer(); int GetActiveLayer() const { return m_activeLayer; }
/** /**
* Function getNextAvailableLayer * Function getNextAvailableLayer

View File

@ -55,8 +55,6 @@ private:
*/ */
wxPoint m_crossHairPosition; wxPoint m_crossHairPosition;
double m_Zoom; ///< Current zoom coefficient.
public: public:
static wxString m_PageLayoutDescrFileName; ///< the name of the page layout descr file, static wxString m_PageLayoutDescrFileName; ///< the name of the page layout descr file,
///< or emty to used the default pagelayout ///< or emty to used the default pagelayout
@ -87,11 +85,15 @@ public:
int m_ScreenNumber; int m_ScreenNumber;
int m_NumberOfScreens; int m_NumberOfScreens;
std::vector<double> m_ZoomList; ///< standard zoom (i.e. scale) coefficients.
public: public:
BASE_SCREEN( EDA_ITEM* aParent, KICAD_T aType = SCREEN_T ); BASE_SCREEN( EDA_ITEM* aParent, KICAD_T aType = SCREEN_T );
BASE_SCREEN( const wxSize& aPageSizeIU, KICAD_T aType = SCREEN_T ) :
BASE_SCREEN( nullptr, aType )
{
InitDataPoints( aPageSizeIU );
}
BASE_SCREEN( KICAD_T aType = SCREEN_T ) : BASE_SCREEN( KICAD_T aType = SCREEN_T ) :
BASE_SCREEN( nullptr, aType ) BASE_SCREEN( nullptr, aType )
{} {}
@ -114,7 +116,8 @@ public:
* old commands this will empty the list of commands. * old commands this will empty the list of commands.
* Commands are deleted from the older to the last. * Commands are deleted from the older to the last.
*/ */
virtual void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 ) = 0; virtual void ClearUndoORRedoList( UNDO_REDO_CONTAINER& aList, int aItemCount = -1 )
{ }
/** /**
* Function ClearUndoRedoList * Function ClearUndoRedoList
@ -184,40 +187,6 @@ public:
bool IsModify() const { return m_FlagModified; } bool IsModify() const { return m_FlagModified; }
bool IsSave() const { return m_FlagSave; } bool IsSave() const { return m_FlagSave; }
//----<zoom stuff>---------------------------------------------------------
/**
* Function GetZoom
* returns the current "zoom factor", which is a measure of
* "internal units per device unit", or "world units per device unit".
* A device unit is typically a pixel.
*/
double GetZoom() const { return m_Zoom; }
/**
* Function SetZoom
* adjusts the current zoom factor.
*
* @param iu_per_du is the number of internal units (world units) per
* device units (pixels typically).
*/
virtual bool SetZoom( double iu_per_du );
/**
* Function GetMaxAllowedZoom
* returns the maximum allowed zoom factor, which was established as the last entry
* in m_ZoomList.
*/
double GetMaxAllowedZoom() const { return m_ZoomList.size() ? *m_ZoomList.rbegin() : 1.0; }
/**
* Function GetMinAllowedZoom
* returns the minimum allowed zoom factor, which was established as the first entry
* in m_ZoomList.
*/
double GetMinAllowedZoom() const { return m_ZoomList.size() ? *m_ZoomList.begin() : 1.0; }
/** /**
* Function GetClass * Function GetClass
* returns the class name. * returns the class name.

View File

@ -161,12 +161,6 @@ public:
wxASSERT( false ); wxASSERT( false );
} }
/**
* Function GetLegacyZoom()
* Returns current view scale converted to zoom value used by the legacy canvas.
*/
double GetLegacyZoom() const;
/** /**
* Function GetParentEDAFrame() * Function GetParentEDAFrame()
* Returns parent EDA_DRAW_FRAME, if available or NULL otherwise. * Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.

View File

@ -122,4 +122,55 @@ constexpr inline double Iu2Millimeter( int iu )
constexpr int ARC_LOW_DEF = Millimeter2iu( 0.02 ); constexpr int ARC_LOW_DEF = Millimeter2iu( 0.02 );
constexpr int ARC_HIGH_DEF = Millimeter2iu( 0.005 ); constexpr int ARC_HIGH_DEF = Millimeter2iu( 0.005 );
/* ZOOM LIMITS
The largest distance that wx can support is INT_MAX, since it represents
distance often in a wxCoord or wxSize. As a scalar, a distance is always
positive. On most machines which run KiCad, int is 32 bits and INT_MAX is
2147483647. The most difficult distance for a virtual (world) cartesian
space is the hypotenuse, or diagonal measurement at a 45 degree angle. This
puts the most stress on the distance magnitude within the bounded virtual
space. So if we allow this distance to be our constraint of <= INT_MAX, this
constraint then propagates to the maximum distance in X and in Y that can be
supported on each axis. Remember that the hypotenuse of a 1x1 square is
sqrt( 1x1 + 1x1 ) = sqrt(2) = 1.41421356.
hypotenuse of any square = sqrt(2) * deltaX;
Let maximum supported hypotenuse be INT_MAX, then:
MAX_AXIS = INT_MAX / sqrt(2) = 2147483647 / 1.41421356 = 1518500251
This maximum distance is imposed by wxWidgets, not by KiCad. The imposition
comes in the form of the data structures used in the graphics API at the
wxDC level. Obviously when we are not interacting with wx we can use double
to compute distances larger than this. For example the computation of the
total length of a net, can and should be done in double, since it might
actually be longer than a single diagonal line.
The next choice is what to use for internal units (IU), sometimes called
world units. If nanometers, then the virtual space must be limited to
about 1.5 x 1.5 meters square. This is 1518500251 divided by 1e9 nm/meter.
The maximum zoom factor then depends on the client window size. If we ask
wx to handle something outside INT_MIN to INT_MAX, there are unreported
problems in the non-Debug build because wxRound() goes silent.
Let:
const double MAX_AXIS = 1518500251;
Then a maximum zoom factor for a screen of 1920 pixels wide is
1518500251 / 1920 = 790885.
The largest zoom factor allowed is therefore ~ 300 (which computes to 762000).
*/
#define MAX_ZOOM_FACTOR 300.0
// Adjusted to display zoom level ~ 1 when the screen shows a 1:1 image.
// Obviously depends on the monitor, but this is an acceptable value.
#define ZOOM_COEFF 1.1
#endif // CONVERT_TO_BIU_H_ #endif // CONVERT_TO_BIU_H_

View File

@ -84,9 +84,6 @@ protected:
COLOR4D m_gridColor; // Grid color COLOR4D m_gridColor; // Grid color
COLOR4D m_drawBgColor; // The background color of the draw canvas; BLACK for COLOR4D m_drawBgColor; // The background color of the draw canvas; BLACK for
// Pcbnew, BLACK or WHITE for eeschema // Pcbnew, BLACK or WHITE for eeschema
double m_zoomLevelCoeff; // A suitable value to convert the internal zoom
// scaling factor to a zoom level value which rougly
// gives 1.0 when the board/schematic is at scale = 1
int m_UndoRedoCountMax; // Default Undo/Redo command Max depth, to be handed int m_UndoRedoCountMax; // Default Undo/Redo command Max depth, to be handed
// to screens // to screens
bool m_PolarCoords; // For those frames that support polar coordinates bool m_PolarCoords; // For those frames that support polar coordinates
@ -245,17 +242,8 @@ public:
/** /**
* Return a human readable value for display in dialogs. * Return a human readable value for display in dialogs.
* this can be a percentage or other indicator.
* it is virtual because it could be different for pcbnew, gerbview or eeschema
* (different internal units and different purposes)
* note also adjust m_zoomLevelCoeff is the way to adjust the displayed value
*/ */
virtual const wxString GetZoomLevelIndicator() const; const wxString GetZoomLevelIndicator() const;
/**
* Return the coefficient to convert internal display scale factor to zoom level.
*/
inline double GetZoomLevelCoeff() const { return m_zoomLevelCoeff; }
void EraseMsgBox(); void EraseMsgBox();
@ -328,8 +316,6 @@ public:
*/ */
void FocusOnLocation( const wxPoint& aPos ); void FocusOnLocation( const wxPoint& aPos );
double GetZoom();
/** /**
* Function CreateBasicMenu * Function CreateBasicMenu
* *

View File

@ -165,34 +165,6 @@ enum main_id
ID_POPUP_ZOOM_END_RANGE, // last zoom id ID_POPUP_ZOOM_END_RANGE, // last zoom id
ID_ON_GRID_SELECT, ID_ON_GRID_SELECT,
ID_POPUP_GRID_SELECT,
ID_POPUP_GRID_FIRST,
ID_POPUP_GRID_LEVEL_1000 = ID_POPUP_GRID_FIRST, // These must be in same order as menu
ID_POPUP_GRID_LEVEL_500,
ID_POPUP_GRID_LEVEL_250,
ID_POPUP_GRID_LEVEL_200,
ID_POPUP_GRID_LEVEL_100,
ID_POPUP_GRID_LEVEL_50,
ID_POPUP_GRID_LEVEL_25,
ID_POPUP_GRID_LEVEL_20,
ID_POPUP_GRID_LEVEL_10,
ID_POPUP_GRID_LEVEL_5,
ID_POPUP_GRID_LEVEL_2,
ID_POPUP_GRID_LEVEL_1,
ID_POPUP_GRID_LEVEL_5MM,
ID_POPUP_GRID_LEVEL_2_5MM,
ID_POPUP_GRID_LEVEL_1MM,
ID_POPUP_GRID_LEVEL_0_5MM,
ID_POPUP_GRID_LEVEL_0_25MM,
ID_POPUP_GRID_LEVEL_0_2MM,
ID_POPUP_GRID_LEVEL_0_1MM,
ID_POPUP_GRID_LEVEL_0_0_5MM,
ID_POPUP_GRID_LEVEL_0_0_25MM,
ID_POPUP_GRID_LEVEL_0_0_1MM,
ID_POPUP_GRID_USER,
ID_POPUP_GRID_SEPARATOR,
ID_POPUP_GRID_SETTINGS,
ID_GRID_SETTINGS, ID_GRID_SETTINGS,
ID_ZOOM_BEGIN, ID_ZOOM_BEGIN,

View File

@ -227,12 +227,6 @@ public:
void UpdateGridSelectBox(); void UpdateGridSelectBox();
/**
* Function GetZoomLevelIndicator
* returns a human readable value for display in dialogs.
*/
const wxString GetZoomLevelIndicator() const override;
/** /**
* Shows the 3D view frame. * Shows the 3D view frame.
* If it does not exist, it is created. * If it does not exist, it is created.

View File

@ -63,6 +63,8 @@ struct WINDOW_SETTINGS
int pos_x; int pos_x;
int pos_y; int pos_y;
std::vector<double> zoom_factors;
CURSOR_SETTINGS cursor; CURSOR_SETTINGS cursor;
GRID_SETTINGS grid; GRID_SETTINGS grid;
}; };

View File

@ -147,7 +147,6 @@ void PLEDITOR_PRINTOUT::GetPageInfo( int* minPage, int* maxPage,
*/ */
void PLEDITOR_PRINTOUT::PrintPage( int aPageNum ) void PLEDITOR_PRINTOUT::PrintPage( int aPageNum )
{ {
int oldZoom;
wxPoint tmp_startvisu; wxPoint tmp_startvisu;
wxSize pageSizeIU; // Page size in internal units wxSize pageSizeIU; // Page size in internal units
wxPoint old_org; wxPoint old_org;
@ -155,9 +154,8 @@ void PLEDITOR_PRINTOUT::PrintPage( int aPageNum )
wxDC* dc = GetDC(); wxDC* dc = GetDC();
PL_EDITOR_SCREEN* screen = m_parent->GetScreen(); PL_EDITOR_SCREEN* screen = m_parent->GetScreen();
// Save current scale factor, offsets, and clip box. // Save current offsets and clip box.
tmp_startvisu = screen->m_StartVisu; tmp_startvisu = screen->m_StartVisu;
oldZoom = screen->GetZoom();
old_org = screen->m_DrawOrg; old_org = screen->m_DrawOrg;
// Change scale factor and offset to print the whole page. // Change scale factor and offset to print the whole page.
@ -205,7 +203,6 @@ void PLEDITOR_PRINTOUT::PrintPage( int aPageNum )
screen->m_StartVisu = tmp_startvisu; screen->m_StartVisu = tmp_startvisu;
screen->m_DrawOrg = old_org; screen->m_DrawOrg = old_org;
screen->SetZoom( oldZoom );
// PrintWorkSheet clears the current display list when calling BuildWorkSheetGraphicList() // PrintWorkSheet clears the current display list when calling BuildWorkSheetGraphicList()
// So rebuild and redraw it. // So rebuild and redraw it.

View File

@ -85,10 +85,6 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
KICAD_DEFAULT_DRAWFRAME_STYLE, PL_EDITOR_FRAME_NAME ) KICAD_DEFAULT_DRAWFRAME_STYLE, PL_EDITOR_FRAME_NAME )
{ {
m_userUnits = EDA_UNITS::MILLIMETRES; m_userUnits = EDA_UNITS::MILLIMETRES;
m_zoomLevelCoeff = 290.0; // Adjusted to roughly displays zoom level = 1
// when the screen shows a 1:1 image
// obviously depends on the monitor,
// but this is an acceptable value
m_showBorderAndTitleBlock = true; // true for reference drawings. m_showBorderAndTitleBlock = true; // true for reference drawings.
m_originSelectChoice = 0; m_originSelectChoice = 0;
@ -180,7 +176,6 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() ); m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
// Call Update() to fix all pane default sizes, especially the "InfoBar" pane before // Call Update() to fix all pane default sizes, especially the "InfoBar" pane before
@ -423,18 +418,45 @@ void PL_EDITOR_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{ {
EDA_DRAW_FRAME::LoadSettings( aCfg ); EDA_DRAW_FRAME::LoadSettings( aCfg );
if( aCfg->m_Window.grid.sizes.empty() )
{
aCfg->m_Window.grid.sizes = { "1.0 mm",
"0.50 mm",
"0.25 mm",
"0.20 mm",
"0.10 mm" };
}
if( aCfg->m_Window.zoom_factors.empty() )
{
aCfg->m_Window.zoom_factors = { 0.022,
0.035,
0.05,
0.08,
0.13,
0.22,
0.35,
0.6,
1.0,
2.2,
3.5,
5.0,
8.0,
13.0,
22.0,
35.0,
50.0,
80.0,
130.0,
220.0 };
}
for( double& factor : aCfg->m_Window.zoom_factors )
factor = std::min( factor, MAX_ZOOM_FACTOR );
PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg ); PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
wxCHECK( cfg, /*void*/ ); wxCHECK( cfg, /*void*/ );
if( cfg->m_Window.grid.sizes.empty() )
{
cfg->m_Window.grid.sizes = { "1.0 mm",
"0.50 mm",
"0.25 mm",
"0.20 mm",
"0.10 mm" };
}
m_propertiesFrameWidth = cfg->m_PropertiesFrameWidth; m_propertiesFrameWidth = cfg->m_PropertiesFrameWidth;
m_originSelectChoice = cfg->m_CornerOrigin; m_originSelectChoice = cfg->m_CornerOrigin;
@ -820,8 +842,3 @@ void PL_EDITOR_FRAME::OnNewPageLayout()
} }
const wxString PL_EDITOR_FRAME::GetZoomLevelIndicator() const
{
return EDA_DRAW_FRAME::GetZoomLevelIndicator();
}

View File

@ -122,12 +122,6 @@ public:
const PAGE_INFO& GetPageSettings () const override; const PAGE_INFO& GetPageSettings () const override;
const wxSize GetPageSizeIU() const override; const wxSize GetPageSizeIU() const override;
/**
* Function GetZoomLevelIndicator
* returns a human readable value which can be displayed in dialogs.
*/
const wxString GetZoomLevelIndicator() const override;
PL_DRAW_PANEL_GAL* GetCanvas() const override; PL_DRAW_PANEL_GAL* GetCanvas() const override;
PL_EDITOR_SCREEN* GetScreen() const override PL_EDITOR_SCREEN* GetScreen() const override

View File

@ -25,49 +25,14 @@
#include <fctsys.h> #include <fctsys.h>
#include <pl_editor_screen.h> #include <pl_editor_screen.h>
#include <base_units.h>
#define ZOOM_FACTOR( x ) ( x * IU_PER_MM / 1000 )
/**
Default zoom values.
Roughly a 1.5 progression.
*/
static const double pl_editorZoomList[] =
{
ZOOM_FACTOR( 10.0 ), // Zoom in
ZOOM_FACTOR( 15.0 ),
ZOOM_FACTOR( 22.0 ),
ZOOM_FACTOR( 35.0 ),
ZOOM_FACTOR( 50.0 ),
ZOOM_FACTOR( 80.0 ),
ZOOM_FACTOR( 120.0 ),
ZOOM_FACTOR( 160.0 ),
ZOOM_FACTOR( 230.0 ),
ZOOM_FACTOR( 290.0 ),
ZOOM_FACTOR( 380.0 ),
ZOOM_FACTOR( 500.0 ),
ZOOM_FACTOR( 750.0 ),
ZOOM_FACTOR( 1000.0 ),
ZOOM_FACTOR( 1500.0 ),
ZOOM_FACTOR( 2000.0 ),
ZOOM_FACTOR( 3000.0 ),
ZOOM_FACTOR( 4500.0 ), // Zoom out
};
PL_EDITOR_SCREEN::PL_EDITOR_SCREEN( const wxSize& aPageSizeIU ) : PL_EDITOR_SCREEN::PL_EDITOR_SCREEN( const wxSize& aPageSizeIU ) :
BASE_SCREEN( SCREEN_T ) BASE_SCREEN( aPageSizeIU )
{ {
for( double zoom : pl_editorZoomList )
m_ZoomList.push_back( zoom );
// pl_editor uses the same frame position as schematic and board editors // pl_editor uses the same frame position as schematic and board editors
m_Center = false; m_Center = false;
InitDataPoints( aPageSizeIU );
m_NumberOfScreens = 2; m_NumberOfScreens = 2;
} }

View File

@ -219,7 +219,6 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() ); m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
// Call Update() to fix all pane default sizes, especially the "InfoBar" pane before // Call Update() to fix all pane default sizes, especially the "InfoBar" pane before

View File

@ -263,7 +263,6 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent
// The canvas should not steal the focus from the list boxes // The canvas should not steal the focus from the list boxes
GetCanvas()->SetCanFocus( false ); GetCanvas()->SetCanFocus( false );
GetCanvas()->GetGAL()->SetAxesEnabled( true ); GetCanvas()->GetGAL()->SetAxesEnabled( true );
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
// Restore last zoom. (If auto-zooming we'll adjust when we load the footprint.) // Restore last zoom. (If auto-zooming we'll adjust when we load the footprint.)

View File

@ -211,7 +211,6 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent
galOpts.m_forceDisplayCursor = true; galOpts.m_forceDisplayCursor = true;
galOpts.m_axesEnabled = true; galOpts.m_axesEnabled = true;
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
updateView(); updateView();

View File

@ -26,9 +26,7 @@
#include <fctsys.h> #include <fctsys.h>
#include <kiface_i.h> #include <kiface_i.h>
#include <eda_base_frame.h>
#include <confirm.h> #include <confirm.h>
#include <kiface_i.h>
#include <dialog_helpers.h> #include <dialog_helpers.h>
#include <pcb_base_frame.h> #include <pcb_base_frame.h>
#include <base_units.h> #include <base_units.h>
@ -40,12 +38,10 @@
#include <fp_lib_table.h> #include <fp_lib_table.h>
#include <pcbnew_id.h> #include <pcbnew_id.h>
#include <class_board.h> #include <class_board.h>
#include <class_track.h>
#include <class_module.h> #include <class_module.h>
#include <class_drawsegment.h> #include <class_drawsegment.h>
#include <collectors.h> #include <collectors.h>
#include <pcb_draw_panel_gal.h> #include <pcb_draw_panel_gal.h>
#include <pcb_view.h>
#include <math/vector2d.h> #include <math/vector2d.h>
#include <trigo.h> #include <trigo.h>
#include <pcb_painter.h> #include <pcb_painter.h>
@ -54,7 +50,6 @@
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tool/tool_dispatcher.h> #include <tool/tool_dispatcher.h>
#include <tools/pcb_actions.h> #include <tools/pcb_actions.h>
#include <pcbnew_settings.h>
#include <tool/grid_menu.h> #include <tool/grid_menu.h>
wxDEFINE_EVENT( BOARD_CHANGED, wxCommandEvent ); wxDEFINE_EVENT( BOARD_CHANGED, wxCommandEvent );
@ -71,11 +66,6 @@ PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame
EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName ), EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName ),
m_Pcb( nullptr ) m_Pcb( nullptr )
{ {
m_zoomLevelCoeff = 11.0 * IU_PER_MILS; // Adjusted to roughly displays zoom level = 1
// when the screen shows a 1:1 image
// obviously depends on the monitor,
// but this is an acceptable value
m_Settings = static_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ); m_Settings = static_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
} }
@ -467,11 +457,11 @@ void PCB_BASE_FRAME::OnUpdateSelectZoom( wxUpdateUIEvent& aEvent )
int current = 0; // display Auto if no match found int current = 0; // display Auto if no match found
// check for a match within 1% // check for a match within 1%
double zoom = GetCanvas()->GetLegacyZoom(); double zoom = GetCanvas()->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
for( unsigned i = 0; i < GetScreen()->m_ZoomList.size(); i++ ) for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); i++ )
{ {
if( std::fabs( zoom - GetScreen()->m_ZoomList[i] ) < ( zoom / 100.0 ) ) if( std::fabs( zoom - config()->m_Window.zoom_factors[i] ) < ( zoom / 100.0 ) )
{ {
current = i + 1; current = i + 1;
break; break;
@ -663,6 +653,34 @@ void PCB_BASE_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
"0.01 mm" }; "0.01 mm" };
} }
if( aCfg->m_Window.zoom_factors.empty() )
{
aCfg->m_Window.zoom_factors = { 0.035,
0.05,
0.08,
0.13,
0.22,
0.35,
0.6,
1.0,
1.5,
2.2,
3.5,
5.0,
8.0,
13.0,
20.0,
35.0,
50.0,
80.0,
130.0,
220.0,
300.0 };
}
for( double& factor : aCfg->m_Window.zoom_factors )
factor = std::min( factor, MAX_ZOOM_FACTOR );
// Some, but not all derived classes have a PCBNEW_SETTINGS. // Some, but not all derived classes have a PCBNEW_SETTINGS.
PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ); PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
@ -731,12 +749,6 @@ void PCB_BASE_FRAME::OnModify()
} }
const wxString PCB_BASE_FRAME::GetZoomLevelIndicator() const
{
return EDA_DRAW_FRAME::GetZoomLevelIndicator();
}
void PCB_BASE_FRAME::UpdateGridSelectBox() void PCB_BASE_FRAME::UpdateGridSelectBox()
{ {
UpdateStatusBar(); UpdateStatusBar();
@ -766,23 +778,19 @@ void PCB_BASE_FRAME::updateZoomSelectBox()
if( m_zoomSelectBox == NULL ) if( m_zoomSelectBox == NULL )
return; return;
wxString msg; double zoom = GetCanvas()->GetGAL()->GetZoomFactor() / ZOOM_COEFF;
m_zoomSelectBox->Clear(); m_zoomSelectBox->Clear();
m_zoomSelectBox->Append( _( "Zoom Auto" ) ); m_zoomSelectBox->Append( _( "Zoom Auto" ) );
m_zoomSelectBox->SetSelection( 0 ); m_zoomSelectBox->SetSelection( 0 );
for( unsigned i = 0; i < GetScreen()->m_ZoomList.size(); ++i ) for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); ++i )
{ {
msg = _( "Zoom " ); double current = config()->m_Window.zoom_factors[i];
double level = m_zoomLevelCoeff / (double)GetScreen()->m_ZoomList[i]; m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
wxString value = wxString::Format( wxT( "%.2f" ), level );
msg += value;
m_zoomSelectBox->Append( msg ); if( zoom == current )
if( GetScreen()->GetZoom() == GetScreen()->m_ZoomList[i] )
m_zoomSelectBox->SetSelection( i + 1 ); m_zoomSelectBox->SetSelection( i + 1 );
} }
} }

View File

@ -311,7 +311,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
InitExitKey(); InitExitKey();
GetCanvas()->SwitchBackend( m_canvasType ); GetCanvas()->SwitchBackend( m_canvasType );
GetCanvas()->GetView()->SetScale( GetZoomLevelCoeff() / GetScreen()->GetZoom() );
ActivateGalCanvas(); ActivateGalCanvas();
// Default shutdown reason until a file is loaded // Default shutdown reason until a file is loaded

View File

@ -4,7 +4,7 @@
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr * Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com> * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net> * Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -26,101 +26,15 @@
#include <fctsys.h> #include <fctsys.h>
#include <pcb_screen.h> #include <pcb_screen.h>
#include <base_units.h>
#include <layers_id_colors_and_visibility.h> #include <layers_id_colors_and_visibility.h>
#define ZOOM_FACTOR( x ) ( x * IU_PER_MILS / 10 )
/**
Default Pcbnew zoom values.
Limited to 19 values to keep a decent size to menus.
Roughly a 1.5 progression.
The last 2 values are handy when somebody uses a library import of a module
(or foreign data) which has a bad coordinate.
Also useful in GerbView for this reason.
Zoom 5 and 10 can create artefacts when drawing (integer overflow in low level graphic
functions )
*/
static const double pcbZoomList[] =
{
ZOOM_FACTOR( 0.035 ),
ZOOM_FACTOR( 0.05 ),
ZOOM_FACTOR( 0.08 ),
ZOOM_FACTOR( 0.13 ),
ZOOM_FACTOR( 0.22 ),
ZOOM_FACTOR( 0.35 ),
ZOOM_FACTOR( 0.6 ),
ZOOM_FACTOR( 1.0 ),
ZOOM_FACTOR( 1.5 ),
ZOOM_FACTOR( 2.2 ),
ZOOM_FACTOR( 3.5 ),
ZOOM_FACTOR( 5.0 ),
ZOOM_FACTOR( 8.0 ),
ZOOM_FACTOR( 13.0 ),
ZOOM_FACTOR( 20.0 ),
ZOOM_FACTOR( 35.0 ),
ZOOM_FACTOR( 50.0 ),
ZOOM_FACTOR( 80.0 ),
ZOOM_FACTOR( 130.0 ),
ZOOM_FACTOR( 220.0 ),
ZOOM_FACTOR( 350.0 )
/*
The largest distance that wx can support is INT_MAX, since it represents
distance often in a wxCoord or wxSize. As a scalar, a distance is always
positive. On most machines which run KiCad, int is 32 bits and INT_MAX is
2147483647. The most difficult distance for a virtual (world) cartesian
space is the hypotenuse, or diagonal measurement at a 45 degree angle. This
puts the most stress on the distance magnitude within the bounded virtual
space. So if we allow this distance to be our constraint of <= INT_MAX, this
constraint then propagates to the maximum distance in X and in Y that can be
supported on each axis. Remember that the hypotenuse of a 1x1 square is
sqrt( 1x1 + 1x1 ) = sqrt(2) = 1.41421356.
hypotenuse of any square = sqrt(2) * deltaX;
Let maximum supported hypotenuse be INT_MAX, then:
MAX_AXIS = INT_MAX / sqrt(2) = 2147483647 / 1.41421356 = 1518500251
This maximum distance is imposed by wxWidgets, not by KiCad. The imposition
comes in the form of the data structures used in the graphics API at the
wxDC level. Obviously when we are not interacting with wx we can use double
to compute distances larger than this. For example the computation of the
total length of a net, can and should be done in double, since it might
actually be longer than a single diagonal line.
The next choice is what to use for internal units (IU), sometimes called
world units. If nanometers, then the virtual space must be limited to
about 1.5 x 1.5 meters square. This is 1518500251 divided by 1e9 nm/meter.
The maximum zoom factor then depends on the client window size. If we ask
wx to handle something outside INT_MIN to INT_MAX, there are unreported
problems in the non-Debug build because wxRound() goes silent.
Let:
const double MAX_AXIS = 1518500251;
Then a maximum zoom factor for a screen of 1920 pixels wide is
1518500251 / 1920 = 790885.
The largest ZOOM_FACTOR in above table is ZOOM_FACTOR( 300 ), which computes
out to 762000 just below 790885.
*/
};
PCB_SCREEN::PCB_SCREEN( const wxSize& aPageSizeIU ) : PCB_SCREEN::PCB_SCREEN( const wxSize& aPageSizeIU ) :
BASE_SCREEN( SCREEN_T ) BASE_SCREEN( aPageSizeIU )
{ {
for( double zoom : pcbZoomList )
m_ZoomList.push_back( zoom );
m_Active_Layer = F_Cu; // default active layer = front layer m_Active_Layer = F_Cu; // default active layer = front layer
m_Route_Layer_TOP = F_Cu; // default layers pair for vias (bottom to top) m_Route_Layer_TOP = F_Cu; // default layers pair for vias (bottom to top)
m_Route_Layer_BOTTOM = B_Cu; m_Route_Layer_BOTTOM = B_Cu;
InitDataPoints( aPageSizeIU );
} }